guix_mirror_bot pushed a commit to branch master
in repository guix.

commit 46d8a6a80937fb4bbe7711ce278c2edfdf9c2f44
Author: Nicolas Graves <[email protected]>
AuthorDate: Sun Oct 26 17:41:08 2025 +0100

    gnu: python-online-judge-api-client: Update to 10.10.1-0.615c345.
    
    * gnu/packages/patches/python-online-judge-api-client-tests.patch: Refresh 
patch.
    * gnu/packages/python-xyz.scm (python-online-judge-api-client): Update to 
10.10.1-0.615c345.
    [build-system]: Switch to pyproject-build-system.
    [arguments]<#:test-flags>: Update them.
    <#:phases>: Add phase 'configure-tests.
    [native-inputs]: Add python-pytest, python-setuptools.
    [propagated-inputs]: Remove python-toml.
    [description]: Improve style.
    
    Change-Id: Ie1e6d6f88dff9c2893893fa83d5c768e974eda59
    Signed-off-by: Sharlatan Hellseher <[email protected]>
---
 .../python-online-judge-api-client-tests.patch     | 498 ++++++++++++---------
 gnu/packages/python-xyz.scm                        |  97 ++--
 2 files changed, 336 insertions(+), 259 deletions(-)

diff --git a/gnu/packages/patches/python-online-judge-api-client-tests.patch 
b/gnu/packages/patches/python-online-judge-api-client-tests.patch
index f999828ab3..424789d2ce 100644
--- a/gnu/packages/patches/python-online-judge-api-client-tests.patch
+++ b/gnu/packages/patches/python-online-judge-api-client-tests.patch
@@ -2,428 +2,510 @@ Skip tests which requires network connections.
 
 --- a/tests/dispatch.py
 +++ b/tests/dispatch.py
-@@ -4,6 +4,7 @@ from onlinejudge import dispatch, service
+@@ -1,9 +1,12 @@
+ import unittest
  
++from tests.utils import NETWORK_ACCESSIBLE
+ from onlinejudge import dispatch, service
+ 
++print("XXX: Network accessible is" , NETWORK_ACCESSIBLE)
  
  class DispatchAtCoderTest(unittest.TestCase):
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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)
-
+diff --git a/tests/login_service.py b/tests/login_service.py
+index 263673a..186443d 100644
+--- a/tests/login_service.py
++++ b/tests/login_service.py
+@@ -6,6 +6,7 @@ import unittest
+ from typing import *
+ 
+ from onlinejudge_api.main import main
++from tests.utils import NETWORK_ACCESSIBLE
+ 
+ ATCODER_USERNAME = 'ATCODER_USERNAME'
+ ATCODER_PASSWORD = 'ATCODER_PASSWORD'
+@@ -45,6 +46,7 @@ class LoginServiceAtCoderTest(unittest.TestCase):
+                 actual = main(['--cookie', str(cookie_path), 'login-service', 
url], debug=True)
+         self.assertEqual(expected, actual)
+ 
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
+     def test_login_failure(self) -> None:
+         url = 'https://atcoder.jp/'
+         expected = {"status": "error", "messages": 
["onlinejudge.type.LoginError: failed to login"], "result": None}
+@@ -70,6 +72,7 @@ class LoginServiceCodeforcesTest(unittest.TestCase):
+                 actual = main(['--cookie', str(cookie_path), 'login-service', 
url], debug=True)
+         self.assertEqual(expected, actual)
+ 
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
+     def test_login_failure(self) -> None:
+         url = 'https://codeforces.com/'
+         expected = {'status': 'error', 'messages': 
['onlinejudge.type.LoginError: Invalid handle or password.'], 'result': None}
+diff --git a/tests/service_anarchygolf.py b/tests/service_anarchygolf.py
+index 9c30096..d0e7922 100644
 --- a/tests/service_anarchygolf.py
 +++ b/tests/service_anarchygolf.py
-@@ -10,6 +10,7 @@ class AnarchyGolfServiceTest(unittest.TestCase):
+@@ -2,6 +2,7 @@ import unittest
+ 
+ from onlinejudge.service.anarchygolf import AnarchyGolfProblem, 
AnarchyGolfService
+ from onlinejudge.type import TestCase
++from tests.utils import NETWORK_ACCESSIBLE
+ 
+ 
+ class AnarchyGolfServiceTest(unittest.TestCase):
+@@ -10,6 +11,7 @@ class AnarchyGolfServiceTest(unittest.TestCase):
          
self.assertIsInstance(AnarchyGolfService.from_url('http://golf.shinh.org/p.rb?Indent+Space+Alignment'),
 AnarchyGolfService)
  
  
[email protected]("Disabled by Guix")
[email protected](not NETWORK_ACCESSIBLE, "Network access required but not 
available")
  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(),
 [
-
+diff --git a/tests/service_aoj.py b/tests/service_aoj.py
+index 0ee4eb6..e17dbb7 100644
 --- a/tests/service_aoj.py
 +++ b/tests/service_aoj.py
-@@ -20,6 +20,7 @@ class AOJProblemTest(unittest.TestCase):
+@@ -2,6 +2,7 @@ import unittest
+ 
+ from onlinejudge.service.aoj import AOJArenaProblem, AOJProblem, AOJService
+ from onlinejudge.type import TestCase
++from tests.utils import NETWORK_ACCESSIBLE
+ 
+ 
+ class AOJSerivceTest(unittest.TestCase):
+@@ -20,6 +21,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+@@ -39,6 +41,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+@@ -57,11 +60,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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(),
 [
-
+diff --git a/tests/service_atcoder.py b/tests/service_atcoder.py
+index e7a1b1d..81b6650 100644
 --- a/tests/service_atcoder.py
 +++ b/tests/service_atcoder.py
-@@ -15,6 +15,7 @@ class AtCoderSerivceTest(unittest.TestCase):
+@@ -6,9 +6,10 @@ import requests
+ 
+ from onlinejudge.service.atcoder import AtCoderContest, AtCoderProblem, 
AtCoderProblemDetailedData, AtCoderService, AtCoderSubmission
+ from onlinejudge.type import TestCase
++from tests.utils import NETWORK_ACCESSIBLE
+ 
+ 
+-class AtCoderSerivceTest(unittest.TestCase):
++class AtCoderServiceTest(unittest.TestCase):
+     def test_from_url(self):
+         self.assertIsInstance(AtCoderService.from_url('https://atcoder.jp/'), 
AtCoderService)
+         
self.assertIsInstance(AtCoderService.from_url('https://beta.atcoder.jp/'), 
AtCoderService)
+@@ -16,6 +17,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+@@ -38,6 +40,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+         time.sleep(0.5)
+@@ -67,11 +70,13 @@ class AtCoderContestTest(unittest.TestCase):
          self.assertEqual(data.rated_range, '-')
          self.assertEqual(data.penalty.total_seconds(), 5 * 60)
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      def test_get_penalty_a_singular_form(self):
          contest = 
AtCoderContest.from_url('https://atcoder.jp/contests/chokudai_S002')
+         time.sleep(0.5)
          self.assertEqual(contest.download_data().penalty.total_seconds(), 60) 
 # Penalty is written as "1 minute", not  "1 minutes"
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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')
+         time.sleep(0.5)
+@@ -94,6 +99,7 @@ class AtCoderContestTest(unittest.TestCase):
+         time.sleep(0.5)
          self.assertEqual(problems[6].problem_id, 'agc028_f2')
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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)
+@@ -112,6 +118,7 @@ class AtCoderContestTest(unittest.TestCase):
+         time.sleep(0.5)
          self.assertEqual(problems[1].download_data().memory_limit_byte, 512 * 
1000 * 1000)
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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)
+         time.sleep(0.5)
+@@ -127,6 +134,7 @@ class AtCoderContestTest(unittest.TestCase):
+         time.sleep(0.5)
          self.assertEqual(problems[4].download_data().time_limit_msec, 2000)
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+         time.sleep(0.5)
+@@ -144,6 +152,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+         time.sleep(0.5)
+@@ -188,6 +197,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+         time.sleep(0.5)
+@@ -198,18 +208,21 @@ class AtCoderProblemTest(unittest.TestCase):
          self.assertEqual(data.memory_limit_byte, 1024 * 1000 * 1000)
          self.assertEqual(data.score, 100)
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      def test_get_alphabet(self):
+         time.sleep(0.5)
          
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/agc028/tasks/agc028_f').download_data().alphabet,
 'F')
+         time.sleep(0.5)
          
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/agc028/tasks/agc028_f2').download_data().alphabet,
 'F2')
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      def test_get_score(self):
+         time.sleep(0.5)
          
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/future-contest-2018-final/tasks/future_contest_2018_final_a').download_data().score,
 50000000)
+         time.sleep(0.5)
          
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/abc001/tasks/abc001_4').download_data().score,
 None)
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      def test_get_score_latex(self):
          """
          .. seealso::
-@@ -179,13 +192,16 @@ class AtCoderProblemTest(unittest.TestCase):
- 
+@@ -219,12 +232,14 @@ class AtCoderProblemTest(unittest.TestCase):
+         time.sleep(0.5)
          
self.assertIsNone(AtCoderProblem.from_url('https://atcoder.jp/contests/wupc2019/tasks/wupc2019_a').download_data().score)
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      def test_get_time_limit_is_less_than_msec(self):
+         time.sleep(0.5)
          
self.assertEqual(AtCoderProblem.from_url('https://atcoder.jp/contests/joi2019ho/tasks/joi2019ho_c').download_data().time_limit_msec,
 500)
+         time.sleep(0.5)
          
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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      def test_get_memory_limit_is_zero(self):
+         time.sleep(0.5)
          
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):
+@@ -247,6 +262,7 @@ class AtCoderSubmissionTest(unittest.TestCase):
+         
self.assertEqual(AtCoderSubmission.from_url('https://qupc2014.contest.atcoder.jp/submissions/1444440').submission_id,
 1444440)
  
  
[email protected](not NETWORK_ACCESSIBLE, "Network access required but not 
available")
  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'),
+@@ -479,6 +495,7 @@ class AtCoderProblemDataTest(unittest.TestCase):
          ])
  
-+    @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):
- 
  
[email protected](not NETWORK_ACCESSIBLE, "Network access required but not 
available")
  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')
+diff --git a/tests/service_codechef.py b/tests/service_codechef.py
+index c65f08d..0a538e4 100644
+--- a/tests/service_codechef.py
++++ b/tests/service_codechef.py
+@@ -2,9 +2,10 @@ import unittest
  
-+    @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)
+ from onlinejudge.service.codechef import CodeChefProblem, CodeChefService
+ from onlinejudge.type import TestCase
++from tests.utils import NETWORK_ACCESSIBLE
  
-+    @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):
+-class CodeChefSerivceTest(unittest.TestCase):
++class CodeChefServiceTest(unittest.TestCase):
+     def test_from_url(self):
+         
self.assertIsInstance(CodeChefService.from_url('https://www.codechef.com/'), 
CodeChefService)
+         
self.assertIsNone(CodeChefService.from_url('https://www.facebook.com/'))
+@@ -15,6 +16,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      def test_download_samples_chfgcd(self):
          url = 'https://www.codechef.com/COOK131B/problems/CHFGCD'
          expected = [
-
+@@ -23,6 +25,7 @@ class CodeChefProblemTest(unittest.TestCase):
+         
self.assertEqual(CodeChefProblem.from_url(url).download_sample_cases(), 
expected)
+ 
+     # TODO: support problems with an old format
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
+     @unittest.expectedFailure
+     def test_download_samples_dand(self):
+         url = 'https://www.codechef.com/COOK113A/problems/DAND'
+@@ -32,6 +35,7 @@ class CodeChefProblemTest(unittest.TestCase):
+         
self.assertEqual(CodeChefProblem.from_url(url).download_sample_cases(), 
expected)
+ 
+     # TODO: support problems with an old format
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
+     @unittest.expectedFailure
+     def test_download_samples_cntset(self):
+         url = 'https://www.codechef.com/PLIN2020/problems/CNTSET'
+@@ -41,6 +45,7 @@ class CodeChefProblemTest(unittest.TestCase):
+         
self.assertEqual(CodeChefProblem.from_url(url).download_sample_cases(), 
expected)
+ 
+     # TODO: support problems with an old format
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
+     @unittest.expectedFailure
+     def test_download_samples_acesqn(self):
+         url = 'https://www.codechef.com/CNES2017/problems/ACESQN'
+diff --git a/tests/service_codeforces.py b/tests/service_codeforces.py
+index 39eb452..0dbc6ad 100644
 --- a/tests/service_codeforces.py
 +++ b/tests/service_codeforces.py
-@@ -25,6 +25,7 @@ class CodeforcesContestTest(unittest.TestCase):
+@@ -2,6 +2,7 @@
+ import unittest
+ 
+ from onlinejudge.service.codeforces import CodeforcesContest, 
CodeforcesProblem, CodeforcesService
++from tests.utils import NETWORK_ACCESSIBLE
+ 
+ 
+ class CodeforcesSerivceTest(unittest.TestCase):
+@@ -25,6 +26,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+@@ -38,6 +40,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+@@ -46,6 +49,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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()
-
+@@ -57,6 +61,7 @@ class CodeforcesContestTest(unittest.TestCase):
+         self.assertEqual(data.type, 'CF')
+ 
+ 
[email protected](not NETWORK_ACCESSIBLE, "Network access required but not 
available")
+ class CodeforcesProblemTest(unittest.TestCase):
+     def test_from_url(self):
+         
self.assertEqual(CodeforcesProblem.from_url('http://codeforces.com/problemset/problem/700/B').contest_id,
 700)
+diff --git a/tests/service_google.py b/tests/service_google.py
+index d26220d..2cc8544 100644
 --- a/tests/service_google.py
 +++ b/tests/service_google.py
-@@ -42,6 +42,7 @@ class GoogleCodeJamProblemTest(unittest.TestCase):
+@@ -3,6 +3,7 @@ import unittest
+ 
+ from onlinejudge.service.google import GoogleCodeJamProblem, 
GoogleCodeJamService
+ from onlinejudge.type import TestCase
++from tests.utils import NETWORK_ACCESSIBLE
+ 
+ 
+ class GoogleCodeJamSerivceTest(unittest.TestCase):
+@@ -42,6 +43,7 @@ class GoogleCodeJamProblemTest(unittest.TestCase):
          self.assertEqual(problem.contest_id, '8404486')
          self.assertEqual(problem.problem_id, 'p0')
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+@@ -76,6 +78,7 @@ class GoogleCodeJamProblemTest(unittest.TestCase):
              ),
          ])
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+@@ -102,6 +105,7 @@ class GoogleCodeJamProblemTest(unittest.TestCase):
              ),
          ])
  
-+    @unittest.skip("Disabled by Guix")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      def test_download_multiple_samples(self):
          problem = 
GoogleCodeJamProblem.from_url('https://codingcompetitions.withgoogle.com/kickstart/round/000000000019ffc7/00000000001d3ff3')
          sample_input1 = textwrap.dedent("""\
-
+diff --git a/tests/service_library_checker.py 
b/tests/service_library_checker.py
+index d731df2..e1c9a6d 100644
 --- 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):
+@@ -6,6 +6,7 @@ import unittest
+ import onlinejudge.utils
+ from onlinejudge.service.library_checker import LibraryCheckerProblem, 
LibraryCheckerService
+ from onlinejudge.type import TestCase
++from tests.utils import NETWORK_ACCESSIBLE
+ 
+ 
+ @contextlib.contextmanager
+@@ -30,12 +31,14 @@ class LibraryCheckerProblemTest(unittest.TestCase):
          
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")
+     @unittest.skipIf(os.name == 'nt', "Library Checker is not supported on 
Windows")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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")
+     @unittest.skipIf(os.name == 'nt', "Library Checker is not supported on 
Windows")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      def test_pull_repository(self):
          # reset
          LibraryCheckerService.is_repository_updated = False
-
+diff --git a/tests/service_spoj.py b/tests/service_spoj.py
+index 804b1c2..b39947f 100644
 --- a/tests/service_spoj.py
 +++ b/tests/service_spoj.py
-@@ -14,11 +14,13 @@ class SPOJProblemTest(unittest.TestCase):
+@@ -2,6 +2,7 @@ import unittest
+ 
+ from onlinejudge.service.spoj import SPOJProblem, SPOJService
+ from onlinejudge.type import TestCase
++from tests.utils import NETWORK_ACCESSIBLE
+ 
+ 
+ class SPOJSerivceTest(unittest.TestCase):
+@@ -14,11 +15,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      def test_download_samples_todo(self):
          # No samples found.
          
self.assertFalse(SPOJProblem.from_url('https://www.spoj.com/problems/MKLABELS/').download_sample_cases())
-
+diff --git a/tests/service_yukicoder.py b/tests/service_yukicoder.py
+index 658fea2..b971743 100644
 --- a/tests/service_yukicoder.py
 +++ b/tests/service_yukicoder.py
-@@ -20,6 +20,7 @@ class YukicoderProblemTest(unittest.TestCase):
+@@ -4,6 +4,7 @@ import unittest
+ from onlinejudge.service.yukicoder import YukicoderContest, YukicoderProblem, 
YukicoderService
+ from onlinejudge.type import *
+ from tests.implementation_utils import get_handmade_sample_cases
++from tests.utils import NETWORK_ACCESSIBLE
+ 
+ 
+ class YukicoderServiceTest(unittest.TestCase):
+@@ -20,6 +21,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+@@ -45,6 +47,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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):
+@@ -54,6 +57,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")
++    @unittest.skipIf(not NETWORK_ACCESSIBLE, "Network access required but not 
available")
      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)
+@@ -128,6 +132,7 @@ class YukicoderProblemTest(unittest.TestCase):
+         ])
  
-+    @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):
+ 
[email protected](not NETWORK_ACCESSIBLE, "Network access required but not 
available")
+ class YukicoderContestTest(unittest.TestCase):
+     def test_from_url(self):
+         
self.assertEqual(YukicoderContest.from_url('https://yukicoder.me/contests/276').contest_id,
 276)
+@@ -144,6 +149,7 @@ class YukicoderContestTest(unittest.TestCase):
+         ])
  
  
[email protected](not NETWORK_ACCESSIBLE, "Network access required but not 
available")
  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/tests/utils.py b/tests/utils.py
+index 6a34fa3..e858f70 100644
+--- a/tests/utils.py
++++ b/tests/utils.py
+@@ -1,3 +1,8 @@
++import os
++import socket
++
++import requests
++
+ import onlinejudge.dispatch as dispatch
+ from onlinejudge_api.main import main
+ 
+@@ -12,3 +17,15 @@ def is_logged_in(url: str, *, memo={}) -> bool:
+         result = main(['login-service', '--check', url], debug=True)
+         memo[url] = bool((result.get('result') or {}).get('loggedIn'))
+     return memo[url]
++
++
++def can_reach_internet():
++    """Check if we can actually reach the internet"""
++    try:
++        socket.create_connection(("google.com", 443), timeout=5)
++        return True
++    except Exception:
++        return False
++
++
++NETWORK_ACCESSIBLE = os.getenv("RUN_NETWORK_TESTS", "1") == "1" and 
can_reach_internet()
+-- 
+2.51.0
+
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 89d6c5a7ee..4de31cb152 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -27003,62 +27003,57 @@ You can simply type pybtex instead of bibtex.")
 (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)
+    (properties '((commit . "615c345f169e2603e0b907287559a4535fc3c6f9")
+                  (revision . "0")))
+    (version (git-version "10.10.1"
+                          (assoc-ref properties 'revision)
+                          (assoc-ref properties 'commit)))
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+              (url "https://github.com/online-judge-tools/api-client";)
+              (commit (assoc-ref properties 'commit))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "13m3cxv6bd3igj6649149xb27ljmzqzpli6hpfrywvgbm238hbws"))
+       (patches
+        (search-patches "python-online-judge-api-client-tests.patch"))
+       ))
+    (build-system pyproject-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))
+     (list
+      #:test-flags
+      #~(list "--ignore-glob=tests/get_contest_*.py"
+              "--ignore-glob=tests/get_problem_*.py")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'check 'configure-tests
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (delete-file-recursively
+               (string-append (site-packages inputs outputs)
+                              "/tests"))
+              (call-with-output-file "pytest.ini"
+                (lambda (port)
+                  (format port "\
+[pytest]
+python_files = tests/*.py"))))))))
+    (native-inputs (list python-pytest python-setuptools))
+    (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.")
+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 online-judge-tools


Reply via email to