Skip to content

Commit

Permalink
#464: add stars to argument list of methods
Browse files Browse the repository at this point in the history
  • Loading branch information
kmyk committed Aug 21, 2019
1 parent 1411b1d commit 0a822ef
Show file tree
Hide file tree
Showing 12 changed files with 104 additions and 79 deletions.
6 changes: 3 additions & 3 deletions onlinejudge/service/anarchygolf.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@ def from_url(cls, url: str) -> Optional['AnarchyGolfService']:


class AnarchyGolfProblem(onlinejudge.type.Problem):
def __init__(self, problem_id: str):
def __init__(self, *, problem_id: str):
self.problem_id = problem_id

def download_sample_cases(self, session: Optional[requests.Session] = None) -> List[onlinejudge.type.TestCase]:
def download_sample_cases(self, *, session: Optional[requests.Session] = None) -> List[onlinejudge.type.TestCase]:
session = session or utils.get_default_session()
# get
resp = utils.request('GET', self.get_url(), session=session)
Expand Down Expand Up @@ -81,7 +81,7 @@ def from_url(cls, url: str) -> Optional['AnarchyGolfProblem']:
and result.netloc == 'golf.shinh.org' \
and utils.normpath(result.path) == '/p.rb' \
and result.query:
return cls(result.query)
return cls(problem_id=result.query)
return None


Expand Down
30 changes: 18 additions & 12 deletions onlinejudge/service/aoj.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ class AOJProblem(onlinejudge.type.Problem):
"""
:ivar problem_id: :py:class:`str` like `DSL_1_A` or `2256`
"""
def __init__(self, problem_id):
def __init__(self, *, problem_id):
self.problem_id = problem_id

def download_sample_cases(self, session: Optional[requests.Session] = None) -> List[TestCase]:
def download_sample_cases(self, *, session: Optional[requests.Session] = None) -> List[TestCase]:
session = session or utils.get_default_session()
# get samples via the official API
# reference: http://developers.u-aizu.ac.jp/api?key=judgedat%2Ftestcases%2Fsamples%2F%7BproblemId%7D_GET
Expand All @@ -62,7 +62,7 @@ def download_sample_cases(self, session: Optional[requests.Session] = None) -> L
)]
return samples

def download_system_cases(self, session: Optional[requests.Session] = None) -> List[TestCase]:
def download_system_cases(self, *, session: Optional[requests.Session] = None) -> List[TestCase]:
session = session or utils.get_default_session()

# get header
Expand Down Expand Up @@ -103,7 +103,7 @@ def from_url(cls, url: str) -> Optional['AOJProblem']:
and querystring.get('id') \
and len(querystring['id']) == 1:
n, = querystring['id']
return cls(n)
return cls(problem_id=n)

# example: https://onlinejudge.u-aizu.ac.jp/challenges/sources/JAG/Prelim/2881
# example: https://onlinejudge.u-aizu.ac.jp/courses/library/4/CGL/3/CGL_3_B
Expand All @@ -112,7 +112,7 @@ def from_url(cls, url: str) -> Optional['AOJProblem']:
and result.netloc == 'onlinejudge.u-aizu.ac.jp' \
and m:
n = m.group(5)
return cls(n)
return cls(problem_id=n)

return None

Expand All @@ -127,14 +127,14 @@ class AOJArenaProblem(onlinejudge.type.Problem):
.. versionadded:: 6.1.0
"""
def __init__(self, arena_id, alphabet):
def __init__(self, *, arena_id, alphabet):
assert alphabet in string.ascii_uppercase
self.arena_id = arena_id
self.alphabet = alphabet

self._problem_id = None # Optional[str]

def get_problem_id(self, session: Optional[requests.Session] = None) -> str:
def get_problem_id(self, *, session: Optional[requests.Session] = None) -> str:
"""
:note: use http://developers.u-aizu.ac.jp/api?key=judgeapi%2Farenas%2F%7BarenaId%7D%2Fproblems_GET
"""
Expand All @@ -151,12 +151,18 @@ def get_problem_id(self, session: Optional[requests.Session] = None) -> str:
break
return self._problem_id

def download_sample_cases(self, session: Optional[requests.Session] = None) -> List[TestCase]:
def download_sample_cases(self, *, session: Optional[requests.Session] = None) -> List[TestCase]:
log.warning("most of problems in arena have no registered sample cases.")
return AOJProblem(self.get_problem_id()).download_sample_cases(session=session)
return AOJProblem(problem_id=self.get_problem_id()).download_sample_cases(session=session)

def download_system_cases(self, session: Optional[requests.Session] = None) -> List[TestCase]:
return AOJProblem(self.get_problem_id()).download_system_cases(session=session)
def download_system_cases(self, *, session: Optional[requests.Session] = None) -> List[TestCase]:
return AOJProblem(problem_id=self.get_problem_id()).download_system_cases(session=session)

def download_content(self, *, session: Optional[requests.Session] = None):
"""
:raise NotImplementedError:
"""
raise NotImplementedError

def get_url(self) -> str:
return 'https://onlinejudge.u-aizu.ac.jp/services/room.html#{}/problems/{}'.format(self.arena_id, self.alphabet)
Expand All @@ -170,7 +176,7 @@ def from_url(cls, url: str) -> Optional['AOJArenaProblem']:
and utils.normpath(result.path) == '/services/room.html':
fragment = result.fragment.split('/')
if len(fragment) == 3 and fragment[1] == 'problems':
return cls(fragment[0], fragment[2].upper())
return cls(arena_id=fragment[0], alphabet=fragment[2].upper())
return None

def get_service(self) -> AOJService:
Expand Down
33 changes: 26 additions & 7 deletions onlinejudge/service/codeforces.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@


class CodeforcesService(onlinejudge.type.Service):
def login(self, get_credentials: onlinejudge.type.CredentialsProvider, session: Optional[requests.Session] = None) -> None:
def login(self, *, get_credentials: onlinejudge.type.CredentialsProvider, session: Optional[requests.Session] = None) -> None:
"""
:raises LoginError:
"""
Expand Down Expand Up @@ -50,7 +50,7 @@ def login(self, get_credentials: onlinejudge.type.CredentialsProvider, session:
log.failure('Invalid handle or password.')
raise LoginError('Invalid handle or password.')

def is_logged_in(self, session: Optional[requests.Session] = None) -> bool:
def is_logged_in(self, *, session: Optional[requests.Session] = None) -> bool:
session = session or utils.get_default_session()
url = 'https://codeforces.com/enter'
resp = utils.request('GET', url, session=session, allow_redirects=False)
Expand All @@ -73,14 +73,22 @@ def from_url(cls, url: str) -> Optional['CodeforcesService']:
return None


# TODO: use the new style of NamedTuple added from Pyhon 3.6
CodeforcesProblemContent = NamedTuple('CodeforcesProblemContent', [
('name', str),
('problem', 'CodeforcesProblem'),
('sample_cases', Optional[List[TestCase]]),
])


# NOTE: Codeforces has its API: https://codeforces.com/api/help
class CodeforcesProblem(onlinejudge.type.Problem):
"""
:ivar contest_id: :py:class:`int`
:ivar index: :py:class:`str`
:ivar kind: :py:class:`str` must be `contest` or `gym`
"""
def __init__(self, contest_id: int, index: str, kind: Optional[str] = None):
def __init__(self, *, contest_id: int, index: str, kind: Optional[str] = None):
assert isinstance(contest_id, int)
assert 1 <= len(index) <= 2
assert index[0] in string.ascii_uppercase
Expand All @@ -96,7 +104,7 @@ def __init__(self, contest_id: int, index: str, kind: Optional[str] = None):
kind = 'gym'
self.kind = kind # It seems 'gym' is specialized, 'contest' and 'problemset' are the same thing

def download_sample_cases(self, session: Optional[requests.Session] = None) -> List[onlinejudge.type.TestCase]:
def download_sample_cases(self, *, session: Optional[requests.Session] = None) -> List[onlinejudge.type.TestCase]:
session = session or utils.get_default_session()
# get
resp = utils.request('GET', self.get_url(), session=session)
Expand All @@ -119,7 +127,7 @@ def download_sample_cases(self, session: Optional[requests.Session] = None) -> L
samples.add(s.encode(), title.string)
return samples.get()

def get_available_languages(self, session: Optional[requests.Session] = None) -> List[Language]:
def get_available_languages(self, *, session: Optional[requests.Session] = None) -> List[Language]:
"""
:raises NotLoggedInError:
"""
Expand All @@ -137,7 +145,7 @@ def get_available_languages(self, session: Optional[requests.Session] = None) ->
languages += [Language(option.attrs['value'], option.string)]
return languages

def submit_code(self, code: bytes, language_id: LanguageId, filename: Optional[str] = None, session: Optional[requests.Session] = None) -> onlinejudge.type.Submission:
def submit_code(self, code: bytes, language_id: LanguageId, *, filename: Optional[str] = None, session: Optional[requests.Session] = None) -> onlinejudge.type.Submission:
"""
:raises NotLoggedInError:
:raises SubmissionError:
Expand Down Expand Up @@ -203,9 +211,20 @@ def from_url(cls, url: str) -> Optional['CodeforcesProblem']:
index = 'A' # NOTE: This is broken if there was "A1".
else:
index = m.group(2).upper()
return cls(int(m.group(1)), index, kind=kind)
return cls(contest_id=int(m.group(1)), index=index, kind=kind)
return None

def download_content(self, *, session: Optional[requests.Session] = None) -> CodeforcesProblemContent:
try:
sample_cases = self.download_sample_cases(session=session) # type: Optional[List[TestCase]]
except SampleParsingError:
sample_cases = None
return CodeforcesProblemContent(
name=self.get_url(),
problem=self,
sample_cases=sample_cases,
)


onlinejudge.dispatch.services += [CodeforcesService]
onlinejudge.dispatch.problems += [CodeforcesProblem]
6 changes: 3 additions & 3 deletions onlinejudge/service/csacademy.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@ def from_url(cls, url: str) -> Optional['CSAcademyService']:


class CSAcademyProblem(onlinejudge.type.Problem):
def __init__(self, contest_name: str, task_name: str):
def __init__(self, *, contest_name: str, task_name: str):
self.contest_name = contest_name
self.task_name = task_name

def download_sample_cases(self, session: Optional[requests.Session] = None) -> List[TestCase]:
def download_sample_cases(self, *, session: Optional[requests.Session] = None) -> List[TestCase]:
session = session or utils.get_default_session()
base_url = self.get_url()

Expand Down Expand Up @@ -115,7 +115,7 @@ def from_url(cls, url: str) -> Optional['CSAcademyProblem']:
and result.netloc in ('csacademy.com', 'www.csacademy.com'):
m = re.match(r'^/contest/([0-9A-Za-z_-]+)/task/([0-9A-Za-z_-]+)(|/statement|/solution|/discussion|/statistics|/submissions)/?$', utils.normpath(result.path))
if m:
return cls(m.group(1), m.group(2))
return cls(contest_name=m.group(1), task_name=m.group(2))
return None


Expand Down
2 changes: 1 addition & 1 deletion onlinejudge/service/facebook.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class FacebookHackerCupProblem(onlinejudge.type.Problem):
def __init__(self, *, problem_id: int):
self.problem_id = problem_id

def download_sample_cases(self, session: Optional[requests.Session] = None) -> List[TestCase]:
def download_sample_cases(self, *, session: Optional[requests.Session] = None) -> List[TestCase]:
session = session or utils.get_default_session()
url_format = 'https://www.facebook.com/hackercup/example/?problem_id={}&type={}'
resp_in = utils.request('GET', url_format.format(self.problem_id, 'input'), session=session)
Expand Down
20 changes: 10 additions & 10 deletions onlinejudge/service/hackerrank.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@


class HackerRankService(onlinejudge.type.Service):
def login(self, get_credentials: onlinejudge.type.CredentialsProvider, session: Optional[requests.Session] = None) -> None:
def login(self, *, get_credentials: onlinejudge.type.CredentialsProvider, session: Optional[requests.Session] = None) -> None:
"""
:raises LoginError:
"""
Expand Down Expand Up @@ -55,7 +55,7 @@ def login(self, get_credentials: onlinejudge.type.CredentialsProvider, session:
log.failure('You failed to sign in. Wrong user ID or password.')
raise LoginError('You failed to sign in. Wrong user ID or password.')

def is_logged_in(self, session: Optional[requests.Session] = None) -> bool:
def is_logged_in(self, *, session: Optional[requests.Session] = None) -> bool:
session = session or utils.get_default_session()
url = 'https://www.hackerrank.com/auth/login'
resp = utils.request('GET', url, session=session)
Expand All @@ -82,14 +82,14 @@ def __init__(self, contest_slug: str, challenge_slug: str):
self.contest_slug = contest_slug
self.challenge_slug = challenge_slug

def download_sample_cases(self, session: Optional[requests.Session] = None) -> List[TestCase]:
def download_sample_cases(self, *, session: Optional[requests.Session] = None) -> List[TestCase]:
"""
:raises NotImplementedError:
"""
log.warning('use --system option')
raise NotImplementedError

def download_system_cases(self, session: Optional[requests.Session] = None) -> List[TestCase]:
def download_system_cases(self, *, session: Optional[requests.Session] = None) -> List[TestCase]:
session = session or utils.get_default_session()
# example: https://www.hackerrank.com/rest/contests/hourrank-1/challenges/beautiful-array/download_testcases
url = 'https://www.hackerrank.com/rest/contests/{}/challenges/{}/download_testcases'.format(self.contest_slug, self.challenge_slug)
Expand Down Expand Up @@ -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))
m = re.match(r'^/challenges/([0-9A-Za-z-]+)$', utils.normpath(result.path))
if m:
return cls('master', m.group(1))
return cls(contest_slug='master', challenge_slug=m.group(1))
return None

def _get_model(self, session: Optional[requests.Session] = None) -> Dict[str, Any]:
def _get_model(self, *, session: Optional[requests.Session] = None) -> Dict[str, Any]:
"""
:raises SubmissionError:
"""
Expand All @@ -140,7 +140,7 @@ def _get_model(self, session: Optional[requests.Session] = None) -> Dict[str, An
raise SubmissionError
return it['model']

def _get_lang_display_mapping(self, session: Optional[requests.Session] = None) -> Dict[str, str]:
def _get_lang_display_mapping(self, *, session: Optional[requests.Session] = None) -> Dict[str, str]:
session = session or utils.get_default_session()
# get
url = 'https://hrcdn.net/hackerrank/assets/codeshell/dist/codeshell-cdffcdf1564c6416e1a2eb207a4521ce.js' # at "Mon Feb 4 14:51:27 JST 2019"
Expand All @@ -159,7 +159,7 @@ def _get_lang_display_mapping(self, session: Optional[requests.Session] = None)
log.debug('lang_display_mapping (parsed): %s', lang_display_mapping)
return lang_display_mapping

def get_available_languages(self, session: Optional[requests.Session] = None) -> List[Language]:
def get_available_languages(self, *, session: Optional[requests.Session] = None) -> List[Language]:
session = session or utils.get_default_session()
info = self._get_model(session=session)
lang_display_mapping = self._get_lang_display_mapping()
Expand All @@ -172,7 +172,7 @@ def get_available_languages(self, session: Optional[requests.Session] = None) ->
result += [Language(lang, descr)]
return result

def submit_code(self, code: bytes, language_id: LanguageId, filename: Optional[str] = None, session: Optional[requests.Session] = None) -> onlinejudge.type.Submission:
def submit_code(self, code: bytes, language_id: LanguageId, *, filename: Optional[str] = None, session: Optional[requests.Session] = None) -> onlinejudge.type.Submission:
"""
:raises NotLoggedInError:
:raises SubmissionError:
Expand Down
8 changes: 4 additions & 4 deletions onlinejudge/service/kattis.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ def from_url(cls, url: str) -> Optional['KattisService']:


class KattisProblem(onlinejudge.type.Problem):
def __init__(self, problem_id: str, contest_id: Optional[str] = None, domain: str = 'open.kattis.com'):
def __init__(self, *, problem_id: str, contest_id: Optional[str] = None, domain: str = 'open.kattis.com'):
self.domain = domain
self.contest_id = contest_id
self.problem_id = problem_id

def download_sample_cases(self, session: Optional[requests.Session] = None) -> List[onlinejudge.type.TestCase]:
def download_sample_cases(self, *, session: Optional[requests.Session] = None) -> List[onlinejudge.type.TestCase]:
session = session or utils.get_default_session()
# get
url = self.get_url(contests=False) + '/file/statement/samples.zip'
Expand All @@ -58,7 +58,7 @@ def download_sample_cases(self, session: Optional[requests.Session] = None) -> L
# parse
return onlinejudge._implementation.testcase_zipper.extract_from_zip(resp.content, '%s.%e', out='ans')

def get_url(self, contests: bool = True) -> str:
def get_url(self, *, contests: bool = True) -> str:
if contests and self.contest_id is not None:
# the URL without "/contests/{}" also works
return 'https://{}/contests/{}/problems/{}'.format(self.domain, self.contest_id, self.problem_id)
Expand All @@ -80,7 +80,7 @@ def from_url(cls, url: str) -> Optional['KattisProblem']:
if m:
contest_id = m.group(1) or None
problem_id = m.group(2)
return cls(problem_id, contest_id=contest_id, domain=result.netloc)
return cls(problem_id=problem_id, contest_id=contest_id, domain=result.netloc)
return None


Expand Down
6 changes: 3 additions & 3 deletions onlinejudge/service/poj.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ def from_url(cls, url: str) -> Optional['POJService']:


class POJProblem(onlinejudge.type.Problem):
def __init__(self, problem_id: int):
def __init__(self, *, problem_id: int):
self.problem_id = problem_id

def download_sample_cases(self, session: Optional[requests.Session] = None) -> List[TestCase]:
def download_sample_cases(self, *, session: Optional[requests.Session] = None) -> List[TestCase]:
session = session or utils.get_default_session()
# get
resp = utils.request('GET', self.get_url(), session=session)
Expand Down Expand Up @@ -99,7 +99,7 @@ def from_url(cls, url: str) -> Optional['POJProblem']:
if 'id' in query and len(query['id']) == 1:
try:
n = int(query['id'][0])
return cls(n)
return cls(problem_id=n)
except ValueError:
pass
return None
Expand Down
Loading

0 comments on commit 0a822ef

Please sign in to comment.