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.
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/PKG-INFO +2 -2
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/README.md +1 -1
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/pyproject.toml +1 -1
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_setup.py +75 -8
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/main.py +1 -1
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/LICENSE +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/.kattis-cli.toml +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/__init__.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/client.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/download.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/fireworks.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/__init__.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/main/c.txt +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/main/cpp.txt +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/main/java.txt +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/main/python.txt +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/main/python3.txt +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/c/Makefile +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/c/src/problemid/problemid.c +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/c/tests/test_problemid.c +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/cpp/Makefile +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/cpp/src/problemid.cpp +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/cpp/tests/test_problemid.cpp +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/java/src/problemid.java +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/java/tests/tests_problemid.java +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python/Makefile +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python/src/problemid.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python/tests/__init__.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python/tests/test_problemid.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python3/Makefile +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python3/src/problemid.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python3/tests/__init__.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/python3/tests/test_problemid.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/settings.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/solution_tester.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/template.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/ui.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/utils/__init__.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/utils/config.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/utils/languages.py +0 -0
- {kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/utils/run_program.py +0 -0
- {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.
|
|
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
|
|
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
|
|
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
|
|
|
@@ -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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
timeout=10,
|
|
167
|
+
kattisrc_text = self._download_kattisrc(
|
|
168
|
+
response.cookies,
|
|
169
|
+
username,
|
|
170
|
+
password,
|
|
106
171
|
)
|
|
107
|
-
if
|
|
172
|
+
if kattisrc_text is not None:
|
|
108
173
|
with open(_KATTISRC, "w", encoding='utf-8') as f:
|
|
109
|
-
f.write(
|
|
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"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/c/Makefile
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kattis_cli-1.2.7 → kattis_cli-1.2.8}/src/kattis_cli/kattis_templates/project_structure/cpp/Makefile
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|