GNU bug report logs - #65544
[PATCH v5 1/2] gnu: Add python-online-judge-api-client.

Previous Next

Package: guix-patches;

Reported by: gemmaro <gemmaro.dev <at> gmail.com>

Date: Sat, 26 Aug 2023 06:26:02 UTC

Severity: normal

Tags: patch

Done: Steve George <steve <at> futurile.net>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 65544 in the body.
You can then email your comments to 65544 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to lars <at> 6xq.net, jgart <at> dismail.de, guix-patches <at> gnu.org:
bug#65544; Package guix-patches. (Sat, 26 Aug 2023 06:26:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to gemmaro <gemmaro.dev <at> gmail.com>:
New bug report received and forwarded. Copy sent to lars <at> 6xq.net, jgart <at> dismail.de, guix-patches <at> gnu.org. (Sat, 26 Aug 2023 06:26:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: gemmaro <gemmaro.dev <at> gmail.com>
To: guix-patches <at> gnu.org,
	60424 <at> debbugs.gnu.org
Cc: gemmaro <gemmaro.dev <at> gmail.com>
Subject: [PATCH v5 1/2] gnu: Add python-online-judge-api-client.
Date: Sat, 26 Aug 2023 15:22:40 +0900
* 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

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 <at> qq.com>
 # Copyright © 2023 Ivana Drazovic <iv.dra <at> hotmail.com>
 # Copyright © 2023 Andy Tai <atai <at> atai.org>
+# Copyright © 2023 gemmaro <gemmaro.dev <at> 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 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())
+ 
\ No newline at end of file
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 385426671e..315994e488 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -139,6 +139,7 @@
 ;;; Copyright © 2023 Dominik Delgado Steuter <d <at> delgado.nrw>
 ;;; Copyright © 2023 Ivan Vilata-i-Balaguer <ivan <at> selidor.net>
 ;;; Copyright © 2023 Ontje Lünsdorf <ontje.luensdorf <at> dlr.de>
+;;; Copyright © 2023 gemmaro <gemmaro.dev <at> gmail.com>
 ;;; Copyright © 2023 Parnikkapore <poomklao <at> yahoo.com>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -24225,6 +24226,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")

base-commit: eeb71d778f149834015858467fbeeb1276d96d1d
-- 
2.41.0





Message sent on to gemmaro <gemmaro.dev <at> gmail.com>:
bug#65544. (Tue, 05 Mar 2024 10:51:02 GMT) Full text and rfc822 format available.

Message #8 received at 65544-submitter <at> debbugs.gnu.org (full text, mbox):

From: Steve George <steve <at> futurile.net>
To: control <at> debbugs.gnu.org
Cc: 65544-submitter <at> debbugs.gnu.org
Subject: closing 65544
Date: Tue, 5 Mar 2024 10:49:18 +0000
close 65544 
thanks





bug closed, send any further explanations to 65544 <at> debbugs.gnu.org and gemmaro <gemmaro.dev <at> gmail.com> Request was from Steve George <steve <at> futurile.net> to control <at> debbugs.gnu.org. (Tue, 05 Mar 2024 10:53:02 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Tue, 02 Apr 2024 11:24:18 GMT) Full text and rfc822 format available.

This bug report was last modified 1 year and 36 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.