[PATCH v5 1/2] gnu: Add python-online-judge-api-client.

  • Done
  • quality assurance status badge
Details
2 participants
  • gemmaro
  • Steve George
Owner
unassigned
Submitted by
gemmaro
Severity
normal
G
G
gemmaro wrote on 26 Aug 2023 08:22
(name . gemmaro)(address . gemmaro.dev@gmail.com)
eba62fbbcf43f93b019c3dea4a06e2ed92fd6cea.1693030921.git.gemmaro.dev@gmail.com
* gnu/packages/python-xyz.scm (python-online-judge-api-client): New variable.
* gnu/packages/patches/python-online-judge-api-client-tests.patch,
gnu/local.mk: Add patch file.
---
gnu/local.mk | 4 +-
...python-online-judge-api-client-tests.patch | 429 ++++++++++++++++++
gnu/packages/python-xyz.scm | 62 +++
3 files changed, 494 insertions(+), 1 deletion(-)
create mode 100644 gnu/packages/patches/python-online-judge-api-client-tests.patch

Toggle diff (336 lines)
diff --git a/gnu/local.mk b/gnu/local.mk
index ee4567c857..5ad5fb646f 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -59,6 +59,7 @@
# Copyright © 2023 Zheng Junjie <873216071@qq.com>
# Copyright © 2023 Ivana Drazovic <iv.dra@hotmail.com>
# Copyright © 2023 Andy Tai <atai@atai.org>
+# Copyright © 2023 gemmaro <gemmaro.dev@gmail.com>
#
# This file is part of GNU Guix.
#
@@ -2130,7 +2131,8 @@ dist_patch_DATA = \
%D%/packages/patches/zig-0.9-riscv-support.patch \
%D%/packages/patches/zig-do-not-link-against-librt.patch \
%D%/packages/patches/zig-use-system-paths.patch \
- %D%/packages/patches/zsh-egrep-failing-test.patch
+ %D%/packages/patches/zsh-egrep-failing-test.patch \
+ %D%/packages/patches/python-online-judge-api-client-tests.patch
MISC_DISTRO_FILES = \
%D%/packages/ld-wrapper.in
diff --git a/gnu/packages/patches/python-online-judge-api-client-tests.patch b/gnu/packages/patches/python-online-judge-api-client-tests.patch
new file mode 100644
index 0000000000..f999828ab3
--- /dev/null
+++ b/gnu/packages/patches/python-online-judge-api-client-tests.patch
@@ -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 Code
This message was truncated. Download the full message here.
S
S
Steve George wrote on 5 Mar 11:49 +0100
closing 65544
(address . control@debbugs.gnu.org)(address . 65544-submitter@debbugs.gnu.org)
1709635747-1266-bts-steve@futurile.net
close 65544
thanks
?
Your comment

This issue is archived.

To comment on this conversation send an email to 65544@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 65544
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch