gnu: Add python-online-judge-api-client.

* gnu/packages/python-xyz.scm (python-online-judge-api-client): New variable.
* gnu/packages/patches/python-online-judge-api-client-tests.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add patch file.

Signed-off-by: Christopher Baines <mail@cbaines.net>
Change-Id: If407a070a52e66c723d042217a5ff6e1589efce1
This commit is contained in:
gemmaro 2023-08-26 15:22:40 +09:00 committed by Christopher Baines
parent db5c83e83b
commit 9524ff9f3a
No known key found for this signature in database
GPG key ID: 5E28A33B0B84F577
3 changed files with 493 additions and 0 deletions

View file

@ -60,6 +60,7 @@
# Copyright © 2023 Ivana Drazovic <iv.dra@hotmail.com>
# Copyright © 2023 Andy Tai <atai@atai.org>
# Copyright © 2023 B. Wilson <elaexuotee@wilsonb.com>
# Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
#
# This file is part of GNU Guix.
#
@ -1861,6 +1862,7 @@ dist_patch_DATA = \
%D%/packages/patches/python-fixtures-remove-monkeypatch-test.patch \
%D%/packages/patches/python-hiredis-fix-header.patch \
%D%/packages/patches/python-hiredis-use-system-hiredis.patch \
%D%/packages/patches/python-online-judge-api-client-tests.patch \
%D%/packages/patches/python-pdoc3-tests.patch \
%D%/packages/patches/python-peachpy-determinism.patch \
%D%/packages/patches/python-pep8-stdlib-tokenize-compat.patch \

View file

@ -0,0 +1,429 @@
Skip tests which requires network connections.
--- a/tests/dispatch.py
+++ b/tests/dispatch.py
@@ -4,6 +4,7 @@ from onlinejudge import dispatch, service
class DispatchAtCoderTest(unittest.TestCase):
+ @unittest.skip("Disabled by Guix")
def test_problem_from_url(self):
problem = dispatch.problem_from_url('https://atcoder.jp/contests/arc001/tasks/arc001_1')
self.assertIsInstance(problem, service.atcoder.AtCoderProblem)
--- a/tests/service_anarchygolf.py
+++ b/tests/service_anarchygolf.py
@@ -10,6 +10,7 @@ class AnarchyGolfServiceTest(unittest.TestCase):
self.assertIsInstance(AnarchyGolfService.from_url('http://golf.shinh.org/p.rb?Indent+Space+Alignment'), AnarchyGolfService)
+@unittest.skip("Disabled by Guix")
class AnarchyGolfProblemTest(unittest.TestCase):
def test_download_sample_cases(self):
self.assertEqual(AnarchyGolfProblem.from_url('http://golf.shinh.org/p.rb?last+non+zero').download_sample_cases(), [
--- a/tests/service_aoj.py
+++ b/tests/service_aoj.py
@@ -20,6 +20,7 @@ class AOJProblemTest(unittest.TestCase):
self.assertEqual(AOJProblem.from_url('https://onlinejudge.u-aizu.ac.jp/challenges/sources/JAG/Spring/2394?year=2011').problem_id, '2394')
self.assertIsNone(AOJProblem.from_url('https://onlinejudge.u-aizu.ac.jp/services/room.html#RitsCamp19Day2/problems/A'))
+ @unittest.skip("Disabled by Guix")
def test_download_sample_cases(self):
self.assertEqual(AOJProblem.from_url('http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_1_A').download_sample_cases(), [
TestCase(name='sample-1', input_name='1', input_data=b'5 12\n0 1 4\n0 2 3\n1 1 2\n1 3 4\n1 1 4\n1 3 2\n0 1 3\n1 2 4\n1 3 0\n0 0 4\n1 0 2\n1 3 0\n', output_name='1', output_data=b'0\n0\n1\n1\n1\n0\n1\n1\n'),
@@ -39,6 +40,7 @@ class AOJProblemTest(unittest.TestCase):
TestCase(name='sample-1', input_name='1', input_data=b'4\n0 0\n10 0\n10 10\n0 10\n3\n0 0\n1 0\n0 1\n0\n', output_name='1', output_data=b'Case 1: 14.142135624\nCase 2: 1.41421356\n'),
])
+ @unittest.skip("Disabled by Guix")
def test_download_sample_cases_not_registered(self):
# see: https://github.com/kmyk/online-judge-tools/issues/207
self.assertEqual(AOJProblem.from_url('https://onlinejudge.u-aizu.ac.jp/challenges/sources/ICPC/Regional/1399').download_sample_cases(), [
@@ -57,11 +59,13 @@ class AOJArenaProblemTest(unittest.TestCase):
self.assertEqual(AOJArenaProblem.from_url('https://onlinejudge.u-aizu.ac.jp/services/room.html#ACPC2018Day2/problems/d').alphabet, 'D')
self.assertIsNone(AOJArenaProblem.from_url('http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_1_A'))
+ @unittest.skip("Disabled by Guix")
def test_download_sample_cases(self):
self.assertEqual(AOJArenaProblem.from_url('https://onlinejudge.u-aizu.ac.jp/services/room.html#yupro/problems/A').download_sample_cases(), [
TestCase(name='sample-1', input_name='1', input_data=b'koukyoukoukokukikou\nabrakadabra\nacmicpc\njapaque\nhelloworld\n#\n', output_name='1', output_data=b'0\n2\n4\n5\n7\n'),
])
+ @unittest.skip("Disabled by Guix")
def test_download_sample_cases_not_registered(self):
# see: https://github.com/kmyk/online-judge-tools/issues/207
self.assertEqual(AOJArenaProblem.from_url('https://onlinejudge.u-aizu.ac.jp/services/room.html#RitsCamp18Day3/problems/B').download_sample_cases(), [
--- a/tests/service_atcoder.py
+++ b/tests/service_atcoder.py
@@ -15,6 +15,7 @@ class AtCoderSerivceTest(unittest.TestCase):
self.assertIsInstance(AtCoderService.from_url('https://atcoder.jp/contests/agc001/submissions/806160'), AtCoderService)
self.assertIsNone(AtCoderService.from_url('https://codeforces.com/'))
+ @unittest.skip("Disabled by Guix")
def test_iterate_contests(self):
contests = list(AtCoderService().iterate_contests())
contest_ids = [contest.contest_id for contest in contests]
@@ -37,6 +38,7 @@ class AtCoderContestTest(unittest.TestCase):
self.assertEqual(AtCoderContest.from_url('https://atcoder.jp/contests/agc030').contest_id, 'agc030')
self.assertIsNone(AtCoderContest.from_url('https://atcoder.jp/contests/'))
+ @unittest.skip("Disabled by Guix")
def test_load_details(self):
contest = AtCoderContest.from_url('https://atcoder.jp/contests/keyence2019')
self.assertEqual(contest.download_data(lang='en').name, 'KEYENCE Programming Contest 2019')
@@ -62,10 +64,12 @@ class AtCoderContestTest(unittest.TestCase):
self.assertEqual(data.rated_range, '-')
self.assertEqual(data.penalty.total_seconds(), 5 * 60)
+ @unittest.skip("Disabled by Guix")
def test_get_penalty_a_singular_form(self):
contest = AtCoderContest.from_url('https://atcoder.jp/contests/chokudai_S002')
self.assertEqual(contest.download_data().penalty.total_seconds(), 60) # Penalty is written as "1 minute", not "1 minutes"
+ @unittest.skip("Disabled by Guix")
def test_list_problems(self):
contest = AtCoderContest.from_url('https://atcoder.jp/contests/agc028')
problems = contest.list_problems()
@@ -79,6 +83,7 @@ class AtCoderContestTest(unittest.TestCase):
self.assertEqual(problems[6].download_data().alphabet, 'F2')
self.assertEqual(problems[6].problem_id, 'agc028_f2')
+ @unittest.skip("Disabled by Guix")
def test_list_problems_with_float_values(self):
"""
.. seealso:
@@ -92,6 +97,7 @@ class AtCoderContestTest(unittest.TestCase):
self.assertEqual(problems[1].download_data().time_limit_msec, 5252)
self.assertEqual(problems[1].download_data().memory_limit_byte, 512 * 1000 * 1000)
+ @unittest.skip("Disabled by Guix")
def test_list_problems_time_limit_is_less_than_msec(self):
contest = AtCoderContest.from_url('https://atcoder.jp/contests/joi2019ho')
problems = contest.list_problems()
@@ -101,12 +107,14 @@ class AtCoderContestTest(unittest.TestCase):
self.assertEqual(problems[3].download_data().time_limit_msec, 1000)
self.assertEqual(problems[4].download_data().time_limit_msec, 2000)
+ @unittest.skip("Disabled by Guix")
def test_list_problems_memory_limit_is_zero(self):
contest = AtCoderContest.from_url('https://atcoder.jp/contests/future-contest-2019-final-open')
problems = contest.list_problems()
self.assertEqual(problems[0].download_data().memory_limit_byte, 1024 * 1000 * 1000) # 1024 MB
self.assertEqual(problems[1].download_data().memory_limit_byte, 0) # 0 KB
+ @unittest.skip("Disabled by Guix")
def test_iterate_submissions(self):
contest = AtCoderContest.from_url('https://atcoder.jp/contests/code-festival-2014-exhibition-open')
submissions = list(contest.iterate_submissions())
@@ -114,6 +122,7 @@ class AtCoderContestTest(unittest.TestCase):
self.assertEqual(submissions[0].get_url(), 'https://atcoder.jp/contests/code-festival-2014-exhibition-open/submissions/272697')
self.assertEqual(submissions[1].get_url(), 'https://atcoder.jp/contests/code-festival-2014-exhibition-open/submissions/272700')
+ @unittest.skip("Disabled by Guix")
def test_get_contest_without_penalty(self):
contest = AtCoderContest.from_url('https://atcoder.jp/contests/otemae2019')
self.assertEqual(contest.download_data(lang='ja').name, '大手前プロコン 2019')
@@ -154,6 +163,7 @@ class AtCoderProblemTest(unittest.TestCase):
self.assertEqual(AtCoderProblem.from_url('https://kupc2014.contest.atcoder.jp/tasks/kupc2014_d'), AtCoderProblem.from_url('https://atcoder.jp/contests/kupc2014/tasks/kupc2014_d'))
self.assertNotEqual(AtCoderProblem.from_url('https://kupc2014.contest.atcoder.jp/tasks/kupc2014_d'), AtCoderProblem.from_url('https://atcoder.jp/contests/agc030/tasks/agc030_c'))
+ @unittest.skip("Disabled by Guix")
def test_load_details(self):
problem = AtCoderProblem.from_url('https://atcoder.jp/contests/abc118/tasks/abc118_a')
data = problem.download_data()
@@ -163,14 +173,17 @@ class AtCoderProblemTest(unittest.TestCase):
self.assertEqual(data.memory_limit_byte, 1024 * 1000 * 1000)
self.assertEqual(data.score, 100)
+ @unittest.skip("Disabled by Guix")
def test_get_alphabet(self):
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/agc028/tasks/agc028_f').download_data().alphabet, 'F')
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/agc028/tasks/agc028_f2').download_data().alphabet, 'F2')
+ @unittest.skip("Disabled by Guix")
def test_get_score(self):
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/future-contest-2018-final/tasks/future_contest_2018_final_a').download_data().score, 50000000)
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/abc001/tasks/abc001_4').download_data().score, None)
+ @unittest.skip("Disabled by Guix")
def test_get_score_latex(self):
"""
.. seealso::
@@ -179,13 +192,16 @@ class AtCoderProblemTest(unittest.TestCase):
self.assertIsNone(AtCoderProblem.from_url('https://atcoder.jp/contests/wupc2019/tasks/wupc2019_a').download_data().score)
+ @unittest.skip("Disabled by Guix")
def test_get_time_limit_is_less_than_msec(self):
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/joi2019ho/tasks/joi2019ho_c').download_data().time_limit_msec, 500)
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/future-contest-2019-qual/tasks/future_contest_2019_qual_b').download_data().time_limit_msec, 0)
+ @unittest.skip("Disabled by Guix")
def test_get_memory_limit_is_zero(self):
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/future-contest-2019-qual/tasks/future_contest_2019_qual_b').download_data().memory_limit_byte, 0)
+ @unittest.skip("Disabled by Guix")
def test_iterate_submissions(self):
problem = AtCoderProblem.from_url('https://atcoder.jp/contests/abc119/tasks/abc119_c')
submissions = problem.iterate_submissions()
@@ -204,6 +220,7 @@ class AtCoderSubmissionTest(unittest.TestCase):
class AtCoderProblemDataTest(unittest.TestCase):
+ @unittest.skip("Disabled by Guix")
def test_from_html_very_old(self):
url = 'https://atcoder.jp/contests/utpc2011/tasks/utpc2011_1'
resp = requests.get(url)
@@ -225,6 +242,7 @@ class AtCoderProblemDataTest(unittest.TestCase):
self.assertEqual(data.score, None)
self.assertEqual(data.time_limit_msec, 1 * 1000)
+ @unittest.skip("Disabled by Guix")
def test_from_html_old(self):
url = 'https://atcoder.jp/contests/abc003/tasks/abc003_4'
resp = requests.get(url)
@@ -247,6 +265,7 @@ class AtCoderProblemDataTest(unittest.TestCase):
self.assertEqual(data.score, None)
self.assertEqual(data.time_limit_msec, 2 * 1000)
+ @unittest.skip("Disabled by Guix")
def test_from_html_standard(self):
url = 'https://atcoder.jp/contests/abc114/tasks/abc114_d'
resp = requests.get(url)
@@ -268,6 +287,7 @@ class AtCoderProblemDataTest(unittest.TestCase):
self.assertEqual(data.score, 400)
self.assertEqual(data.time_limit_msec, 2 * 1000)
+ @unittest.skip("Disabled by Guix")
def test_from_html_with_empty_output(self):
url = 'https://atcoder.jp/contests/agc036/tasks/agc036_b'
resp = requests.get(url)
@@ -290,6 +310,7 @@ class AtCoderProblemDataTest(unittest.TestCase):
self.assertEqual(data.score, 700)
self.assertEqual(data.time_limit_msec, 2 * 1000)
+ @unittest.skip("Disabled by Guix")
def test_from_html_without_sample_cases(self):
url = 'https://atcoder.jp/contests/tenka1-2013-quala/tasks/tenka1_2013_qualA_a'
resp = requests.get(url)
@@ -307,6 +328,7 @@ class AtCoderProblemDataTest(unittest.TestCase):
self.assertEqual(data.score, None)
self.assertEqual(data.time_limit_msec, 2 * 1000)
+ @unittest.skip("Disabled by Guix")
def test_from_html_issue_414(self):
url = 'https://atcoder.jp/contests/fuka5/tasks/fuka_graphcut'
resp = requests.get(url)
@@ -399,6 +421,7 @@ class AtCoderProblemDataTest(unittest.TestCase):
self.assertEqual(data.score, None)
self.assertEqual(data.time_limit_msec, 5 * 1000)
+ @unittest.skip("Disabled by Guix")
def test_download_sample_cases_pre_without_prettyprint_insection(self):
# see: https://github.com/kmyk/online-judge-tools/issues/625
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/tdpc/tasks/tdpc_fibonacci').download_sample_cases(), [
@@ -406,6 +429,7 @@ class AtCoderProblemDataTest(unittest.TestCase):
TestCase(name='sample-2', input_name='Sample Input 2', input_data=b'3 10\n', output_name='Sample Output 2', output_data=b'105\n'),
])
+ @unittest.skip("Disabled by Guix")
def test_download_sample_cases_s8pc_broken_html(self):
# see: https://github.com/kmyk/online-judge-tools/issues/615
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/s8pc-4/tasks/s8pc_4_d').download_sample_cases(), [
@@ -427,6 +451,7 @@ class AtCoderProblemDataTest(unittest.TestCase):
class AtCoderProblemGetInputFormatTest(unittest.TestCase):
+ @unittest.skip("Disabled by Guix")
def test_normal(self):
"""
.. code-block:: html
@@ -456,6 +481,7 @@ class AtCoderProblemGetInputFormatTest(unittest.TestCase):
self.assertEqual(AtCoderProblem.from_url('https://beta.atcoder.jp/contests/arc083/tasks/arc083_a').download_data().input_format, '<var>A</var> <var>B</var> <var>C</var> <var>D</var> <var>E</var> <var>F</var>\r\n')
+ @unittest.skip("Disabled by Guix")
def test_old_problem(self):
"""
:note: https://github.com/kmyk/online-judge-tools/issues/380
@@ -475,6 +501,7 @@ class AtCoderProblemGetInputFormatTest(unittest.TestCase):
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/arc002/tasks/arc002_3').download_data().input_format, '\r\n<var>N</var>\r\n<var>c_{1}c_{2}...c_{N}</var>\r\n')
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/arc034/tasks/arc034_4').download_data().input_format, '\r\n<var>A</var> <var>B</var> <var>C</var>\r\n<var>a_1</var> <var>a_2</var> .. <var>a_A</var>\r\n<var>b_1</var> <var>b_2</var> .. <var>b_B</var>\r\n')
+ @unittest.skip("Disabled by Guix")
def test_dwacon_problem(self):
"""
:note: https://github.com/kmyk/online-judge-tools/issues/142
@@ -493,9 +520,11 @@ class AtCoderProblemGetInputFormatTest(unittest.TestCase):
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/dwacon2018-final/tasks/dwacon2018_final_a').download_data().input_format, '\r\n<var>H</var> <var>M</var> <var>S</var>\r\n<var>C_1</var> <var>C_2</var>\r\n')
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/dwacon2018-final/tasks/dwacon2018_final_b').download_data().input_format, '\r\n<var>N</var> <var>K</var>\r\n<var>v_1</var> <var>...</var> <var>v_N</var>\r\n')
+ @unittest.skip("Disabled by Guix")
def test_problem_without_input(self):
self.assertIsNone(AtCoderProblem.from_url('https://atcoder.jp/contests/tenka1-2013-quala/tasks/tenka1_2013_qualA_a').download_data().input_format)
+ @unittest.skip("Disabled by Guix")
def test_problem_without_input_format(self):
self.assertIsNone(AtCoderProblem.from_url('https://atcoder.jp/contests/joi2006ho/tasks/joi2006ho_a').download_data().input_format)
--- a/tests/service_codechef.py
+++ b/tests/service_codechef.py
@@ -15,6 +15,7 @@ class CodeChefProblemTest(unittest.TestCase):
self.assertEqual(CodeChefProblem.from_url('https://www.codechef.com/COOK113A/problems/DAND').contest_id, 'COOK113A')
self.assertEqual(CodeChefProblem.from_url('https://www.codechef.com/COOK113A/problems/DAND').problem_id, 'DAND')
+ @unittest.skip("Disabled by Guix")
def test_download_samples_chfgcd(self):
url = 'https://www.codechef.com/COOK131B/problems/CHFGCD'
expected = [
--- a/tests/service_codeforces.py
+++ b/tests/service_codeforces.py
@@ -25,6 +25,7 @@ class CodeforcesContestTest(unittest.TestCase):
self.assertEqual(CodeforcesContest.from_url('http://m3.codeforces.com/contest/1333').get_url(), CodeforcesContest.from_url('https://codeforces.com/contest/1333').get_url())
self.assertIsNone(CodeforcesContest.from_url('http://m4.codeforces.com/contest/1333'))
+ @unittest.skip("Disabled by Guix")
def test_list_problems_data(self):
contest = CodeforcesContest.from_url('https://codeforces.com/contest/1157')
problems = contest.list_problem_data()
@@ -38,6 +39,7 @@ class CodeforcesContestTest(unittest.TestCase):
self.assertEqual(problems[6].tags, ['constructive algorithms', 'dp', 'greedy', 'two pointers'])
self.assertEqual(problems[7].tags, ['brute force', 'constructive algorithms'])
+ @unittest.skip("Disabled by Guix")
def test_list_problems(self):
contest = CodeforcesContest.from_url('https://codeforces.com/contest/1157')
problems = contest.list_problems()
@@ -46,6 +48,7 @@ class CodeforcesContestTest(unittest.TestCase):
self.assertEqual(problems[6].get_url(), 'https://codeforces.com/contest/1157/problem/F')
self.assertEqual(problems[7].download_data().tags, ['brute force', 'constructive algorithms'])
+ @unittest.skip("Disabled by Guix")
def test_download_data(self):
contest = CodeforcesContest.from_url('http://codeforces.com/contest/1200')
data = contest.download_data()
@@ -85,6 +88,7 @@ class CodeforcesProblemTest(unittest.TestCase):
self.assertEqual(CodeforcesProblem.from_url('https://codeforces.com/contest/1133/problem/F1').index, 'F1')
self.assertEqual(CodeforcesProblem.from_url('https://codeforces.com/contest/1133/problem/F2').index, 'F2')
+ @unittest.skip("Disabled by Guix")
def test_download_problem(self):
problem = CodeforcesProblem.from_url('http://codeforces.com/contest/1205/problem/D')
data = problem.download_data()
--- a/tests/service_google.py
+++ b/tests/service_google.py
@@ -42,6 +42,7 @@ class GoogleCodeJamProblemTest(unittest.TestCase):
self.assertEqual(problem.contest_id, '8404486')
self.assertEqual(problem.problem_id, 'p0')
+ @unittest.skip("Disabled by Guix")
def test_download_samples_codejam(self):
problem = GoogleCodeJamProblem.from_url('https://codingcompetitions.withgoogle.com/codejam/round/000000000019fd27/000000000020993c')
sample_input = textwrap.dedent("""\
@@ -76,6 +77,7 @@ class GoogleCodeJamProblemTest(unittest.TestCase):
),
])
+ @unittest.skip("Disabled by Guix")
def test_download_samples_kickstart(self):
problem = GoogleCodeJamProblem.from_url('https://codingcompetitions.withgoogle.com/kickstart/round/000000000019ffc7/00000000001d3f56')
sample_input = textwrap.dedent("""\
@@ -102,6 +104,7 @@ class GoogleCodeJamProblemTest(unittest.TestCase):
),
])
+ @unittest.skip("Disabled by Guix")
def test_download_multiple_samples(self):
problem = GoogleCodeJamProblem.from_url('https://codingcompetitions.withgoogle.com/kickstart/round/000000000019ffc7/00000000001d3ff3')
sample_input1 = textwrap.dedent("""\
--- a/tests/service_library_checker.py
+++ b/tests/service_library_checker.py
@@ -29,13 +29,13 @@ class LibraryCheckerProblemTest(unittest.TestCase):
def test_from_url(self):
self.assertEqual(LibraryCheckerProblem.from_url('https://judge.yosupo.jp/problem/point_add_range_sum').problem_id, 'point_add_range_sum')
- @unittest.skipIf(os.name == 'nt', "Library Checker is not supported on Windows")
+ @unittest.skip("Disabled by Guix")
def test_download_samples(self):
self.assertEqual(LibraryCheckerProblem.from_url('https://judge.yosupo.jp/problem/unionfind').download_sample_cases(), [
TestCase(name='example_00', input_name='example_00.in', input_data=b'4 7\n1 0 1\n0 0 1\n0 2 3\n1 0 1\n1 1 2\n0 0 2\n1 1 3\n', output_name='example_00.out', output_data=b'0\n1\n0\n1\n'),
])
- @unittest.skipIf(os.name == 'nt', "Library Checker is not supported on Windows")
+ @unittest.skip("Disabled by Guix")
def test_pull_repository(self):
# reset
LibraryCheckerService.is_repository_updated = False
--- a/tests/service_spoj.py
+++ b/tests/service_spoj.py
@@ -14,11 +14,13 @@ class SPOJProblemTest(unittest.TestCase):
def test_from_url(self):
self.assertEqual(SPOJProblem.from_url('https://www.spoj.com/problems/ACARGO/').problem_id, 'ACARGO')
+ @unittest.skip("Disabled by Guix")
def test_download_samples(self):
self.assertEqual(SPOJProblem.from_url('https://www.spoj.com/problems/ACARGO/').download_sample_cases(), [
TestCase(name='sample-1', input_name='Sample Input:', input_data=b'3 5\n0\n1\n3\n2 3\n0\n1\n5 20\n2\n7\n12\n9\n13\n0 0\n', output_name='Sample Output:', output_data=b'1\n0\n10\n'),
])
+ @unittest.skip("Disabled by Guix")
def test_download_samples_todo(self):
# No samples found.
self.assertFalse(SPOJProblem.from_url('https://www.spoj.com/problems/MKLABELS/').download_sample_cases())
--- a/tests/service_yukicoder.py
+++ b/tests/service_yukicoder.py
@@ -20,6 +20,7 @@ class YukicoderProblemTest(unittest.TestCase):
self.assertEqual(YukicoderProblem.from_url('http://yukicoder.me/problems/no/123/').problem_no, 123)
self.assertEqual(YukicoderProblem.from_url('http://yukicoder.me/problems/123').problem_id, 123)
+ @unittest.skip("Disabled by Guix")
def test_download_sample_cases(self):
self.assertEqual(YukicoderProblem.from_url('http://yukicoder.me/problems/no/9000').download_sample_cases(), [
TestCase(name='sample-1', input_name='サンプル1 入力', input_data=b'yukicoder\n', output_name='サンプル1 出力', output_data=b'Hello World!\n'),
@@ -45,6 +46,7 @@ class YukicoderProblemTest(unittest.TestCase):
TestCase(name='sample-4', input_name='サンプル4 入力', input_data=b'\n', output_name='サンプル4 出力', output_data=b'1\n'),
])
+ @unittest.skip("Disabled by Guix")
def test_download_sample_cases_issue_355(self):
# see https://github.com/kmyk/online-judge-tools/issues/355
self.assertEqual(YukicoderProblem.from_url('https://yukicoder.me/problems/no/649').download_sample_cases(), [
@@ -54,6 +56,7 @@ class YukicoderProblemTest(unittest.TestCase):
TestCase(name='sample-4', input_name='サンプル4 入力', input_data=b'1 1\n2\n', output_name='サンプル4 出力', output_data=b'-1\n'),
])
+ @unittest.skip("Disabled by Guix")
def test_download_sample_cases_issue_192(self):
# see https://github.com/kmyk/online-judge-tools/issues/192
self.assertEqual(YukicoderProblem.from_url('https://yukicoder.me/problems/no/750').download_sample_cases(), [
@@ -133,6 +136,7 @@ class YukicoderContestTest(unittest.TestCase):
self.assertEqual(YukicoderContest.from_url('https://yukicoder.me/contests/276').contest_id, 276)
self.assertEqual(YukicoderContest.from_url('http://yukicoder.me/contests/276/all').contest_id, 276)
+ @unittest.skip("Disabled by Guix")
def test_list_problems(self):
self.assertEqual(YukicoderContest.from_url('https://yukicoder.me/contests/276').list_problems(), [
YukicoderProblem(problem_id=4401),
@@ -145,6 +149,7 @@ class YukicoderContestTest(unittest.TestCase):
class YukicoderProblemGetInputFormatTest(unittest.TestCase):
+ @unittest.skip("Disabled by Guix")
def test_normal(self):
self.assertEqual(YukicoderProblem.from_url('https://yukicoder.me/problems/no/1').get_input_format(), '\\(N\\)\n\\(C\\)\n\\(V\\)\n\\(S_1\\ S_2\\ S_3\\ \\dots\\ S_V\\)\n\\(T_1\\ T_2\\ T_3\\ \\dots\\ T_V\\)\n\\(Y_1\\ Y_2\\ Y_3\\ \\dots\\ Y_V\\)\n\\(M_1\\ M_2\\ M_3\\ \\dots\\ M_V\\)\n')
self.assertEqual(YukicoderProblem.from_url('https://yukicoder.me/problems/no/2').get_input_format(), 'N\n')
@@ -154,6 +159,7 @@ class YukicoderProblemGetInputFormatTest(unittest.TestCase):
self.assertEqual(YukicoderProblem.from_url('https://yukicoder.me/problems/no/512').get_input_format(), '$X$ $Y$\n$N$\n$A_1$ $\\cdots$ $A_N$\n')
self.assertEqual(YukicoderProblem.from_url('https://yukicoder.me/problems/no/777').get_input_format(), '$N$\n$A_1$ $B_1$ $C_1$\n$A_2$ $B_2$ $C_2$\n…\n$A_N$ $B_N$ $C_N$\n')
+ @unittest.skip("Disabled by Guix")
def test_problem_without_input(self):
self.assertIsNone(YukicoderProblem.from_url('https://yukicoder.me/problems/no/3003').get_input_format())

View file

@ -139,6 +139,7 @@
;;; Copyright © 2023 Dominik Delgado Steuter <d@delgado.nrw>
;;; Copyright © 2023 Ivan Vilata-i-Balaguer <ivan@selidor.net>
;;; Copyright © 2023 Ontje Lünsdorf <ontje.luensdorf@dlr.de>
;;; Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
;;; Copyright © 2023 Parnikkapore <poomklao@yahoo.com>
;;; Copyright © 2023 Foundation Devices, Inc. <hello@foundationdevices.com>
;;; Copyright © c4droid <c4droid@foxmail.com>
@ -24568,6 +24569,67 @@ (define-public python-onetimepass
time-based (TOTP) passwords.")
(license license:expat)))
(define-public python-online-judge-api-client
(package
(name "python-online-judge-api-client")
(version "10.10.1")
;; Source distributions are not uploaded to PyPI.
;; https://pypi.org/project/online-judge-api-client/10.10.1/#files
(source (origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/online-judge-tools/api-client")
(commit (string-append "v" version))))
(file-name (git-file-name name version))
(sha256
(base32
"0yjqhh44va5nawd9rpqcjyf0g7rjlkvn7s90fmwmwjyqvy6lhjiz"))
(patches (search-patches
"python-online-judge-api-client-tests.patch"))))
(build-system python-build-system)
(arguments
(list #:phases #~(modify-phases %standard-phases
;; These tests require network connections
(add-after 'unpack 'remove-failing-test
(lambda _
(for-each delete-file
'("tests/get_contest_atcoder.py"
"tests/get_contest_atcoder_problems.py"
"tests/get_contest_codechef.py"
"tests/get_contest_codeforces.py"
"tests/get_contest_yukicoder.py"
"tests/get_problem_anarchygolf.py"
"tests/get_problem_aoj.py"
"tests/get_problem_atcoder.py"
"tests/get_problem_codechef.py"
"tests/get_problem_codeforces.py"
"tests/get_problem_csacademy.py"
"tests/get_problem_facebook.py"
"tests/get_problem_hackerrank.py"
"tests/get_problem_kattis.py"
"tests/get_problem_library_checker.py"
"tests/get_problem_poj.py"
"tests/get_problem_topcoder.py"
"tests/get_problem_toph.py"
"tests/get_problem_yukicoder.py"
"tests/login_service.py")) #t)))))
(propagated-inputs (list python-appdirs
python-beautifulsoup4
python-colorlog
python-lxml
python-requests
python-toml
python-jsonschema))
(home-page "https://github.com/online-judge-tools/api-client")
(synopsis "API client for various online judges")
(description
"This is an API client for various online judges, used as the backend
library of @code{oj} command. You can use the Python
library (@code{onlinejudge} module) and the command-line
interface (@command{oj-api} command) which talks JSON compatible with
jmerle/competitive-companion.")
(license license:expat)))
(define-public python-parso
(package
(name "python-parso")