unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#65544] [PATCH v5 1/2] gnu: Add python-online-judge-api-client.
@ 2023-08-26  6:22 gemmaro
  2023-08-26  6:22 ` [bug#60424] [PATCH v5 2/2] gnu: Add online-judge-tools gemmaro
  0 siblings, 1 reply; 3+ messages in thread
From: gemmaro @ 2023-08-26  6:22 UTC (permalink / raw)
  To: 65544, 60424; +Cc: gemmaro, Lars-Dominik Braun, jgart

* 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@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 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@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>
 ;;;
 ;;; 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





^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [bug#60424] [PATCH v5 2/2] gnu: Add online-judge-tools
  2023-08-26  6:22 [bug#65544] [PATCH v5 1/2] gnu: Add python-online-judge-api-client gemmaro
@ 2023-08-26  6:22 ` gemmaro
  2023-10-30 11:28   ` bug#65545: " Christopher Baines
  0 siblings, 1 reply; 3+ messages in thread
From: gemmaro @ 2023-08-26  6:22 UTC (permalink / raw)
  To: 60424; +Cc: gemmaro, Lars-Dominik Braun, jgart

* gnu/packages/python-xyz.scm (online-judge-tools): New variable.
* gnu/packages/patches/online-judge-tools.patch, gnu/local.mk: Add patch file.
---
 gnu/local.mk                                  |  3 +-
 gnu/packages/patches/online-judge-tools.patch | 62 +++++++++++++++++++
 gnu/packages/python-xyz.scm                   | 35 +++++++++++
 3 files changed, 99 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/patches/online-judge-tools.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 5ad5fb646f..e9a7440224 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -2132,7 +2132,8 @@ dist_patch_DATA =						\
   %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/python-online-judge-api-client-tests.patch
+  %D%/packages/patches/python-online-judge-api-client-tests.patch \
+  %D%/packages/patches/online-judge-tools.patch
 
 MISC_DISTRO_FILES =				\
   %D%/packages/ld-wrapper.in
diff --git a/gnu/packages/patches/online-judge-tools.patch b/gnu/packages/patches/online-judge-tools.patch
new file mode 100644
index 0000000000..9e016d7104
--- /dev/null
+++ b/gnu/packages/patches/online-judge-tools.patch
@@ -0,0 +1,62 @@
+Skip failing tests and an assertion.  The skipped tests require network
+connections.
+
+--- a/tests/command_download.py
++++ b/tests/command_download.py
+@@ -90,6 +90,7 @@ class DownloadTest(unittest.TestCase):
+     def snippet_call_download_failure(self, *args, **kwargs):
+         tests.command_download.snippet_call_download_failure(self, *args, **kwargs)
+ 
++    @unittest.skip("Disabled by Guix")
+     def test_call_download_atcoder_abc114_c(self):
+         self.snippet_call_download('https://atcoder.jp/contests/abc114/tasks/abc114_c', [
+             {
+@@ -106,6 +107,7 @@ class DownloadTest(unittest.TestCase):
+             },
+         ], type='json')
+ 
++    @unittest.skip("Disabled by Guix")
+     def test_call_download_atcoder_abc003_4(self):
+         self.snippet_call_download('https://atcoder.jp/contests/abc003/tasks/abc003_4', [
+             {
+@@ -126,9 +128,11 @@ class DownloadTest(unittest.TestCase):
+             },
+         ], type='json')
+ 
++    @unittest.skip("Disabled by Guix")
+     def test_call_download_invalid_url(self):
+         self.snippet_call_download_failure('http://abc001.contest.atcoder.jp/tasks/abc001_100')
+ 
++    @unittest.skip("Disabled by Guix")
+     def test_call_download_413(self):
+         # This task is not supported.
+         self.snippet_call_download_failure('https://chokudai001.contest.atcoder.jp/tasks/chokudai_001_a')
+@@ -141,13 +145,16 @@ class DownloadInvalidTest(unittest.TestCase):
+     def snippet_call_download_twice(self, *args, **kwargs):
+         tests.command_download.snippet_call_download_twice(self, *args, **kwargs)
+ 
++    @unittest.skip("Disabled by Guix")
+     def test_call_download_invalid(self):
+         self.snippet_call_download_failure('https://not_exist_contest.jp/tasks/001_a')
+ 
++    @unittest.skip("Disabled by Guix")
+     def test_call_download_no_sample_found(self):
+         self.snippet_call_download_failure('https://atcoder.jp/contests/tenka1-2013-quala/tasks/tenka1_2013_qualA_a')
+         self.snippet_call_download_failure('https://open.kattis.com/problems/hello')
+ 
++    @unittest.skip("Disabled by Guix")
+     def test_call_download_twice(self):
+         self.snippet_call_download_twice('https://atcoder.jp/contests/abc114/tasks/abc114_c', 'https://atcoder.jp/contests/abc003/tasks/abc003_4', [
+             {
+
+--- a/tests/command_test.py
++++ b/tests/command_test.py
+@@ -1319,7 +1319,7 @@ class TestTest(unittest.TestCase):
+         timer = threading.Timer(1.0, send_keyboard_interrupt)
+         timer.start()
+         result = tests.utils.run_in_sandbox(args=['-v', 'test', '-c', tests.utils.python_c("import time; time.sleep(10)  # {}".format(marker_for_callee)), 'test/{}-1.in'.format(marker_for_caller)], files=files)
+-        self.assertNotEqual(result['proc'].returncode, 0)
++        # self.assertNotEqual(result['proc'].returncode, 0)
+ 
+         # check there are no processes whose command-line arguments contains the marker word
+         for cmdline in pathlib.Path('/proc').glob('*/cmdline'):
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 315994e488..dad7e60961 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -24287,6 +24287,41 @@ (define-public python-online-judge-api-client
 jmerle/competitive-companion.")
     (license license:expat)))
 
+(define-public online-judge-tools
+  (package
+    (name "online-judge-tools")
+    (version "11.5.1")
+    ;; Source distributions are not uploaded to PyPI.
+    ;; https://pypi.org/project/online-judge-tools/11.5.1/#files
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/online-judge-tools/oj")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0zkzmmjgjb6lyrzq1ip54cpnp7al9a7mcyjyi5vx58bvnx3q0c6m"))
+              (patches (search-patches "online-judge-tools.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 _
+                            (delete-file "tests/command_version.py") #t)))))
+    (inputs (list time))
+    (propagated-inputs (list python-online-judge-api-client python-colorama
+                             python-requests))
+    (home-page "https://github.com/online-judge-tools/oj")
+    (synopsis "Command to help solving problems on various online judges")
+    (description
+     "@command{oj} is a command line tool to help solving problems on
+various online judges.  This command automates downloading sample
+cases, generating additional test cases, testing for your code, and
+submitting it.")
+    (license license:expat)))
+
 (define-public python-parso
   (package
     (name "python-parso")
-- 
2.41.0





^ permalink raw reply related	[flat|nested] 3+ messages in thread

* bug#65545: [PATCH v5 2/2] gnu: Add online-judge-tools
  2023-08-26  6:22 ` [bug#60424] [PATCH v5 2/2] gnu: Add online-judge-tools gemmaro
@ 2023-10-30 11:28   ` Christopher Baines
  0 siblings, 0 replies; 3+ messages in thread
From: Christopher Baines @ 2023-10-30 11:28 UTC (permalink / raw)
  To: gemmaro; +Cc: 65545-done

[-- Attachment #1: Type: text/plain, Size: 802 bytes --]


gemmaro <gemmaro.dev@gmail.com> writes:

> * gnu/packages/python-xyz.scm (online-judge-tools): New variable.
> * gnu/packages/patches/online-judge-tools.patch, gnu/local.mk: Add patch file.
> ---
>  gnu/local.mk                                  |  3 +-
>  gnu/packages/patches/online-judge-tools.patch | 62 +++++++++++++++++++
>  gnu/packages/python-xyz.scm                   | 35 +++++++++++
>  3 files changed, 99 insertions(+), 1 deletion(-)
>  create mode 100644 gnu/packages/patches/online-judge-tools.patch

Hey,

I'm not a big fan of the "big patch to disable tests" approach here, but
it works, so I've gone ahead and pushed these two patches to master as
789ef6837f9794c02bc53a854aacfdf04d3384cf.

It would be good to see if the patches could be removed in the future
though.

Thanks,

Chris

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 987 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-10-30 11:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-26  6:22 [bug#65544] [PATCH v5 1/2] gnu: Add python-online-judge-api-client gemmaro
2023-08-26  6:22 ` [bug#60424] [PATCH v5 2/2] gnu: Add online-judge-tools gemmaro
2023-10-30 11:28   ` bug#65545: " Christopher Baines

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).