kattis-cli 1.2.7__tar.gz → 1.2.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/PKG-INFO +2 -2
  2. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/README.md +1 -1
  3. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/pyproject.toml +1 -1
  4. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_setup.py +75 -8
  5. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/main.py +1 -1
  6. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/LICENSE +0 -0
  7. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/.kattis-cli.toml +0 -0
  8. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/__init__.py +0 -0
  9. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/client.py +0 -0
  10. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/download.py +0 -0
  11. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/fireworks.py +0 -0
  12. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis.py +0 -0
  13. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/__init__.py +0 -0
  14. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/main/c.txt +0 -0
  15. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/main/cpp.txt +0 -0
  16. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/main/java.txt +0 -0
  17. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/main/python.txt +0 -0
  18. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/main/python3.txt +0 -0
  19. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/c/Makefile +0 -0
  20. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/c/src/problemid/problemid.c +0 -0
  21. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/c/tests/test_problemid.c +0 -0
  22. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/cpp/Makefile +0 -0
  23. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/cpp/src/problemid.cpp +0 -0
  24. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/cpp/tests/test_problemid.cpp +0 -0
  25. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/java/src/problemid.java +0 -0
  26. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/java/tests/tests_problemid.java +0 -0
  27. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python/Makefile +0 -0
  28. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python/src/problemid.py +0 -0
  29. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python/tests/__init__.py +0 -0
  30. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python/tests/test_problemid.py +0 -0
  31. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python3/Makefile +0 -0
  32. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python3/src/problemid.py +0 -0
  33. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python3/tests/__init__.py +0 -0
  34. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python3/tests/test_problemid.py +0 -0
  35. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/settings.py +0 -0
  36. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/solution_tester.py +0 -0
  37. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/template.py +0 -0
  38. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/ui.py +0 -0
  39. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/utils/__init__.py +0 -0
  40. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/utils/config.py +0 -0
  41. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/utils/languages.py +0 -0
  42. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/utils/run_program.py +0 -0
  43. {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/utils/utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kattis-cli
3
- Version: 1.2.7
3
+ Version: 1.2.8
4
4
  Summary: A command-line tool for Kattis
5
5
  License-File: LICENSE
6
6
  Author: Ram Basnet
@@ -168,7 +168,7 @@ kattis template -l python3 -p cold -s
168
168
 
169
169
  ```bash
170
170
  cd <problem_id>
171
- kattis test # for exact comparion of answers (string and int)
171
+ kattis test # for exact comparison of answers (works with string and int)
172
172
  kattis test -a 6 # Answer accepted upto 6 decimal places of accuracy
173
173
  ```
174
174
 
@@ -145,7 +145,7 @@ kattis template -l python3 -p cold -s
145
145
 
146
146
  ```bash
147
147
  cd <problem_id>
148
- kattis test # for exact comparion of answers (string and int)
148
+ kattis test # for exact comparison of answers (works with string and int)
149
149
  kattis test -a 6 # Answer accepted upto 6 decimal places of accuracy
150
150
  ```
151
151
 
@@ -2,7 +2,7 @@
2
2
  # PEP 621 metadata table for tools that expect [project].
3
3
  [project]
4
4
  name = "kattis-cli"
5
- version = "1.2.7"
5
+ version = "1.2.8"
6
6
  description = "A command-line tool for Kattis"
7
7
  readme = "README.md"
8
8
  authors = [
@@ -7,10 +7,11 @@ original API used by the CLI.
7
7
  """
8
8
 
9
9
  from pathlib import Path
10
+ import configparser
10
11
  import requests
11
12
  from rich.console import Console
12
13
  from rich.prompt import Prompt, Confirm
13
- from typing import Optional
14
+ from typing import Optional, Any
14
15
  from .client import KattisClient
15
16
  from .utils import config
16
17
 
@@ -47,6 +48,71 @@ class SetupManager:
47
48
  def __init__(self, client: Optional[KattisClient] = None) -> None:
48
49
  self.client = client or KattisClient()
49
50
 
51
+ @staticmethod
52
+ def _is_valid_kattisrc(content: str) -> bool:
53
+ """Return True when downloaded text looks like a .kattisrc file."""
54
+ parser = configparser.ConfigParser()
55
+ try:
56
+ parser.read_string(content)
57
+ except configparser.Error:
58
+ return False
59
+ if not parser.has_section('user') or not parser.has_section('kattis'):
60
+ return False
61
+ if not parser.has_option('user', 'username'):
62
+ return False
63
+ has_secret = (
64
+ parser.has_option('user', 'token') or parser.has_option(
65
+ 'user', 'password')
66
+ )
67
+ return has_secret and parser.has_option('kattis', 'hostname')
68
+
69
+ def _download_kattisrc(
70
+ self,
71
+ cookies: requests.cookies.RequestsCookieJar,
72
+ username: str = '',
73
+ password: str = '',
74
+ ) -> Optional[Any | str]:
75
+ """Download and validate kattisrc using cookies or a fresh session."""
76
+ header_candidates = [
77
+ getattr(self.client, '_HEADERS', {}),
78
+ _HEADERS,
79
+ ]
80
+ for headers in header_candidates:
81
+ try:
82
+ res = requests.get(
83
+ _KATTISRCURL,
84
+ cookies=cookies,
85
+ headers=headers,
86
+ timeout=10,
87
+ )
88
+ except requests.RequestException:
89
+ continue
90
+ if (res.status_code == 200) and \
91
+ (self._is_valid_kattisrc(res.text)):
92
+ return res.text
93
+
94
+ # Fallback: build a fresh authenticated web session and retry.
95
+ if username and password:
96
+ try:
97
+ with requests.Session() as session:
98
+ session.post(
99
+ _LOGIN_URL,
100
+ data={'user': username, 'password': password},
101
+ headers=_HEADERS,
102
+ timeout=10,
103
+ )
104
+ res = session.get(
105
+ _KATTISRCURL,
106
+ headers=_HEADERS,
107
+ timeout=10,
108
+ )
109
+ if res.status_code == 200 and \
110
+ self._is_valid_kattisrc(res.text):
111
+ return res.text
112
+ except requests.RequestException:
113
+ pass
114
+ return None
115
+
50
116
  def check_kattisrc(self) -> bool:
51
117
  """Check if kattisrc file exists and is valid.
52
118
 
@@ -98,19 +164,20 @@ class SetupManager:
98
164
  response = self.client.login(_LOGIN_URL, username, password)
99
165
  if response.status_code == 200:
100
166
  console.print(":rocket: Login successful!")
101
- res = requests.get(
102
- _KATTISRCURL,
103
- cookies=response.cookies,
104
- headers=_HEADERS,
105
- timeout=10,
167
+ kattisrc_text = self._download_kattisrc(
168
+ response.cookies,
169
+ username,
170
+ password,
106
171
  )
107
- if res.status_code == 200:
172
+ if kattisrc_text is not None:
108
173
  with open(_KATTISRC, "w", encoding='utf-8') as f:
109
- f.write(res.text)
174
+ f.write(kattisrc_text)
175
+ _KATTISRC.chmod(0o600)
110
176
  console.print(
111
177
  f":rocket: kattisrc downloaded and saved to "
112
178
  f"{str(_KATTISRC)}"
113
179
  )
180
+ return
114
181
  else:
115
182
  text = (
116
183
  ":loudly_crying_face:\n"
@@ -2,7 +2,7 @@
2
2
 
3
3
  Change the __version__ to match in pyproject.toml
4
4
  """
5
- __version__ = '1.2.7'
5
+ __version__ = '1.2.8'
6
6
 
7
7
  from math import inf
8
8
  import os
File without changes