Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#464: breaking changes #484

Merged
merged 4 commits into from
Aug 21, 2019
Merged

#464: breaking changes #484

merged 4 commits into from
Aug 21, 2019

Conversation

kmyk
Copy link
Member

@kmyk kmyk commented Jul 21, 2019

#464

放置すると拡大してしまう系の設計ミスなのではやめに修正します。
#461 とかが上手くいくようになるはずです。

(大規模な破壊的変更なので他のプルリクを巻き込んで衝突しないように develop branch に向けてのプルリクにしてあります)

@kmyk kmyk added this to the v7.0.0 milestone Jul 21, 2019
@kmyk kmyk requested a review from fukatani July 21, 2019 16:51
@fukatani fukatani assigned kmyk and unassigned fukatani Jul 22, 2019
@fukatani
Copy link
Contributor

テストは落ちていますが、差分はいいと思います。

@kmyk kmyk force-pushed the issue/464 branch 3 times, most recently from fb34d18 to 9107721 Compare August 18, 2019 16:38
@kmyk kmyk changed the title [WIP] #464: breaking changes #464: breaking changes Aug 18, 2019
@kmyk
Copy link
Member Author

kmyk commented Aug 18, 2019

@fukatani レビューお願いします。
すこし大きいですが、これ以上分けると各時点ではまったく動かなくなってしまうのでひとつのプルリクになっています。流れとしては以下のようになります。

  1. onlinejudge/type.py を修正する (前回見てもらった時点とほぼ同様)
  2. それにあわせて onlinejudge/service/atcoder.py を修正する
  3. AtCoder 以外の onlinejudge/service/*.py を修正する
  4. Python 3.5 対応

@kmyk kmyk assigned fukatani and unassigned kmyk Aug 18, 2019
@@ -117,13 +117,13 @@ def from_url(cls, url: str) -> Optional['HackerRankProblem']:
and result.netloc in ('hackerrank.com', 'www.hackerrank.com'):
m = re.match(r'^/contests/([0-9A-Za-z-]+)/challenges/([0-9A-Za-z-]+)$', utils.normpath(result.path))
if m:
return cls(m.group(1), m.group(2))
return cls(contest_slug=m.group(1), challenge_slug=m.group(2))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(PRのスコープ外ですがジャストコメント)csacademyはcontest_nameなのにここがslugなの、なにが違うんだろうと少し気になりました。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これは HackerRank 側がそう呼んでいるのをそのまま借りてきたためです (修整が落ち着いたらコメント足しておきます)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なんか前も聞いたかもですね。HackerRankでつかっているならそのままの変数名でいいと思います。


return None

@classmethod
def _from_table_row(cls, tr: bs4.Tag, lang: str) -> 'AtCoderContest':
def _from_table_row(cls, tr: bs4.Tag, *, lang: str) -> AtCoderContestContentPartial:
Copy link
Contributor

@fukatani fukatani Aug 19, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AtCoderContestのクラスメソッドの_fromなのに、ここでAtCoderContestContentPartial型を返すのは少し意外かもしれません。ちゃんと型まで読んでれば大丈夫ですが、なんとなく読んでるとミスります。

AtCoderSubmissionTestSet._from_table_row()が'AtCoderSubmissionTestSet'を返すのはだいぶわかりやすいです。(fromというからには自分自身の型を返すコンストラクタなのかと、)

Copy link
Contributor

@fukatani fukatani Aug 19, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

今回の変更の表面的なところしかわかっていませんが、
AtCoderContestContentPartial._from_table_rowにするか、
_fromではなくて、extract_contest_content_partialとかそういう名前にするのが良いのかなと思います。

ただ、該当箇所が多いので、この大きくなってしまったPRでやるより今後の課題かもですね。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この指摘はまったくその通りです。
修整はしたいですが、この部分はひとまず見逃してほしいです。プルリクがすでに大きくなってるのと、他に同時で修整したい部分がある (...ContentNamedTuple でなく class を切るべきだった) ので別のプルリクとして出したいためです。

@fukatani
Copy link
Contributor

Partialがセッションなしでも取れる情報で、そうじゃないのは取得にセッションが必要な情報、であってます?

@kmyk
Copy link
Member Author

kmyk commented Aug 19, 2019

Partial もセッションは必要です。
たとえば AtCoder への submissions を列挙するため提出一覧のページ (例: https://atcoder.jp/contests/abc138/submissions ) を読んだとき、実際のコードなどは分かりませんが、 AC したかどうかなどは分かります。個別の提出ページを読めばすべて分かります。この差のために Partial とそうでないものとがあります。

@kmyk
Copy link
Member Author

kmyk commented Aug 19, 2019

とりあえず AtCoderProblemContentPartial AtCoderProblemContent などの名前にしたけれど、それぞれ AtCoderProblemData AtCoderProblemDetailedData に変えたい気がしています。これはよさそうでしょうか? あるいはより良い名前があるでしょうか?

これらのクラスの役割は「問題に関する (URL だけからでは分からない) データ」を表現することです。しかしこれを1語で表すものはなさそうで、 DownloadedContent などは長すぎるし download に注目しすぎてて (画像とか CSS とかまで取得してそうな感じがあって) 好きでなく、同様に Response Downloaded Model Result Cache Description などはいずれも微妙に違う感じがあります。現在は atcoder-tools を真似て単に Content になっています。しかしこれもやはり曖昧であり、加えて Contest と紛らわしいという問題があります。なので単に Data の方がよかった気がしています。
一般に Data は「やばい」名前ですが (役割が曖昧になって肥大化しがち)、実は Content とさほど情報量が変わりませんし、役割を明確に認識した上でちゃんとコメントを付けて定義する分には安全なはずです。

(ただしこれは変更するにしても次のプルリクにしたいです。)

@fukatani
Copy link
Contributor

fukatani commented Aug 20, 2019

Partial もセッションは必要です。
たとえば AtCoder への submissions を列挙するため提出一覧のページ (例: https://atcoder.jp/contests/abc138/submissions ) を読んだとき、実際のコードなどは分かりませんが、 AC したかどうかなどは分かります。個別の提出ページを読めばすべて分かります。この差のために Partial とそうでないものとがあります。

ありがとうございます。そういうことであれば、一覧からとれる情報である、と一言コメントがあると私としては嬉しいです。いい場所があれば、、

@fukatani
Copy link
Contributor

fukatani commented Aug 20, 2019

名前に関しては答えがないときは仕方がないですね。明確によくなるときは変えればいいんですけど、悩むということはどっちも大差ないということなので、時間や体力を使いすぎるべきところではないかもしれません、kmykさんのお気持ちで最後は決めちゃってください。

Contentは辞書的には広い言葉なんですけど、webの文脈的にはページで表示されている内容みたいな意味があって、悪くない気もします。ただ実際、Contestと見間違えました。
この局面でのDataも否定しません。なんでもかんでもDataになっているコードはよくないんですけど。

あえて一つ候補を足すとすれば、ContestPropertyですかね?ペナルティとかレートとか時間とかはプロパティっぽいですよね。
http://e-words.jp/w/%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3.html

ただ、sessionとかrespはpropertyっぽくないんですよね。
(Webの文脈でのContentっぽくもない)

@fukatani fukatani assigned kmyk and unassigned fukatani Aug 20, 2019
@kmyk
Copy link
Member Author

kmyk commented Aug 21, 2019

課題は残ってますがどれも別のプルリクにしたいものなので、とりあえずマージしちゃいますね (これはまだ develop 宛てなので)

@kmyk kmyk merged commit 734f3de into develop Aug 21, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants