PyKubeGrader 0.2.33__py3-none-any.whl → 0.2.34__py3-none-any.whl
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.
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.34.dist-info}/METADATA +1 -1
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.34.dist-info}/RECORD +10 -10
- pykubegrader/initialize.py +6 -3
- pykubegrader/telemetry.py +27 -17
- pykubegrader/tokens/tokens.py +5 -1
- pykubegrader/validate.py +6 -3
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.34.dist-info}/LICENSE.txt +0 -0
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.34.dist-info}/WHEEL +0 -0
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.34.dist-info}/entry_points.txt +0 -0
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.34.dist-info}/top_level.txt +0 -0
@@ -1,8 +1,8 @@
|
|
1
1
|
pykubegrader/__init__.py,sha256=AoAkdfIjDDZGWLlsIRENNq06L9h46kDGBIE8vRmsCfg,311
|
2
|
-
pykubegrader/initialize.py,sha256=
|
3
|
-
pykubegrader/telemetry.py,sha256
|
2
|
+
pykubegrader/initialize.py,sha256=oA97fRQXNaQiqHThvwgm90t-6Qp--BXTA4t1mzZhluU,3998
|
3
|
+
pykubegrader/telemetry.py,sha256=-OfdtD4rzkrPnvVWv3bUDwB0Nnl5RVToU7LREbp9wVk,6350
|
4
4
|
pykubegrader/utils.py,sha256=T3GYnLnTL9VXjTZNPr00sUgMgobQYsNTGwynMyXdvHk,696
|
5
|
-
pykubegrader/validate.py,sha256=
|
5
|
+
pykubegrader/validate.py,sha256=OKnItGyd-L8QPKcsE0KRuwBI_IxKiJzMLJKZiA2j3II,11184
|
6
6
|
pykubegrader/build/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
7
7
|
pykubegrader/build/api_notebook_builder.py,sha256=dlcVrGgsvxnt6GlAUN3e-FrpsPNJKXSHni1fstRCBik,20311
|
8
8
|
pykubegrader/build/build_folder.py,sha256=5jl_TAnxfd9sqWvggJr4i3E7mrEf03cmFDotVrgTZWQ,82697
|
@@ -13,7 +13,7 @@ pykubegrader/log_parser/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YB
|
|
13
13
|
pykubegrader/log_parser/parse.ipynb,sha256=5e-9dzUbJk2M8kPP55lVeksm86lSY5ocKfWOP2RSWH0,11921
|
14
14
|
pykubegrader/log_parser/parse.py,sha256=dXzTEOTI6VTRNoHFDAjg6hZUhvB3kHtMb10_KW3NPrw,7641
|
15
15
|
pykubegrader/submit/submit_assignment.py,sha256=UgJXKWw5b8-bRSFnba4iHAyXnujULHcWIask7hKx9ik,3421
|
16
|
-
pykubegrader/tokens/tokens.py,sha256=
|
16
|
+
pykubegrader/tokens/tokens.py,sha256=T8-Q_YeSxPdB0Om4HTNJUFYVczPCBPZc3Biqc8ieP9s,1200
|
17
17
|
pykubegrader/tokens/validate_token.py,sha256=MQtgz_USvSZ9JahJ48ybjp74F5aYz64lhtvuwVc4kQw,2712
|
18
18
|
pykubegrader/widgets/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
19
19
|
pykubegrader/widgets/multiple_choice.py,sha256=NjD3-uXSnibpUQ0mO3hRp_O-rynFyl0Dz6IXE4tnCRI,2078
|
@@ -27,9 +27,9 @@ pykubegrader/widgets_base/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-
|
|
27
27
|
pykubegrader/widgets_base/multi_select.py,sha256=Cl0IN21wXLZuFu-zC65aS9tD4jMfzCRJ2DPjHao5_Ak,4044
|
28
28
|
pykubegrader/widgets_base/reading.py,sha256=xmvN1UIXwk32v9S-JhsXwDc7axPlgpvoxSeM3II8sxY,5393
|
29
29
|
pykubegrader/widgets_base/select.py,sha256=Fw3uFNOIWo1a3CvlzSx23bvi6bSmA3TqutuRbhD4Dp8,2525
|
30
|
-
PyKubeGrader-0.2.
|
31
|
-
PyKubeGrader-0.2.
|
32
|
-
PyKubeGrader-0.2.
|
33
|
-
PyKubeGrader-0.2.
|
34
|
-
PyKubeGrader-0.2.
|
35
|
-
PyKubeGrader-0.2.
|
30
|
+
PyKubeGrader-0.2.34.dist-info/LICENSE.txt,sha256=YTp-Ewc8Kems8PJEE27KnBPFnZSxoWvSg7nnknzPyYw,1546
|
31
|
+
PyKubeGrader-0.2.34.dist-info/METADATA,sha256=FMMZd7Q_vSU-1VCPgYdaN5jIGsCsmYMNkIGxJwhqDms,2779
|
32
|
+
PyKubeGrader-0.2.34.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
33
|
+
PyKubeGrader-0.2.34.dist-info/entry_points.txt,sha256=UPMdTT46fQwTYJWtrUwIWIbXbwyOPfNQgBFRa0frWzw,138
|
34
|
+
PyKubeGrader-0.2.34.dist-info/top_level.txt,sha256=e550Klfze6higFxER1V62fnGOcIgiKRbsrl9CC4UdtQ,13
|
35
|
+
PyKubeGrader-0.2.34.dist-info/RECORD,,
|
pykubegrader/initialize.py
CHANGED
@@ -6,17 +6,18 @@ from typing import Optional
|
|
6
6
|
|
7
7
|
import panel as pn
|
8
8
|
import requests
|
9
|
-
from IPython import get_ipython
|
9
|
+
from IPython.core.getipython import get_ipython
|
10
10
|
|
11
11
|
from .telemetry import ensure_responses, log_variable, telemetry, update_responses
|
12
12
|
|
13
|
+
api_base_url = os.getenv("DB_URL")
|
14
|
+
|
13
15
|
|
14
16
|
# TODO: could cleanup to remove redundant imports
|
15
17
|
def initialize_assignment(
|
16
18
|
name: str,
|
17
19
|
week: str,
|
18
20
|
assignment_type: str,
|
19
|
-
url: str = "https://engr-131-api.eastus.cloudapp.azure.com/",
|
20
21
|
verbose: bool = False,
|
21
22
|
assignment_points: Optional[float] = None,
|
22
23
|
assignment_tag: Optional[str] = None,
|
@@ -72,8 +73,10 @@ def initialize_assignment(
|
|
72
73
|
pn.extension(silent=True)
|
73
74
|
|
74
75
|
# Check connection to API server
|
76
|
+
if not api_base_url:
|
77
|
+
raise Exception("Environment variable for API URL not set")
|
75
78
|
params = {"jhub_user": responses["jhub_user"]}
|
76
|
-
response = requests.get(
|
79
|
+
response = requests.get(api_base_url, params=params)
|
77
80
|
if verbose:
|
78
81
|
print(f"status code: {response.status_code}")
|
79
82
|
data = response.json()
|
pykubegrader/telemetry.py
CHANGED
@@ -13,6 +13,10 @@ from requests import Response
|
|
13
13
|
from requests.auth import HTTPBasicAuth
|
14
14
|
from requests.exceptions import RequestException
|
15
15
|
|
16
|
+
student_user = os.getenv("user_name_student")
|
17
|
+
student_pw = os.getenv("keys_student")
|
18
|
+
api_base_url = os.getenv("DB_URL")
|
19
|
+
|
16
20
|
#
|
17
21
|
# Logging setup
|
18
22
|
#
|
@@ -126,11 +130,11 @@ def update_responses(key: str, value) -> dict:
|
|
126
130
|
#
|
127
131
|
|
128
132
|
|
129
|
-
def score_question(
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
url =
|
133
|
+
def score_question(term: str = "winter_2025") -> None:
|
134
|
+
if not student_user or not student_pw or not api_base_url:
|
135
|
+
raise ValueError("Necessary environment variables not set")
|
136
|
+
|
137
|
+
url = api_base_url.rstrip("/") + "/live-scorer"
|
134
138
|
|
135
139
|
responses = ensure_responses()
|
136
140
|
|
@@ -144,7 +148,9 @@ def score_question(
|
|
144
148
|
}
|
145
149
|
|
146
150
|
try:
|
147
|
-
res = requests.post(
|
151
|
+
res = requests.post(
|
152
|
+
url, json=payload, auth=HTTPBasicAuth(student_user, student_pw)
|
153
|
+
)
|
148
154
|
res.raise_for_status()
|
149
155
|
|
150
156
|
res_data: dict[str, tuple[float, float]] = res.json()
|
@@ -170,9 +176,11 @@ def submit_question(
|
|
170
176
|
question: str,
|
171
177
|
responses: dict,
|
172
178
|
score: dict,
|
173
|
-
base_url: str = "https://engr-131-api.eastus.cloudapp.azure.com/",
|
174
179
|
) -> Response:
|
175
|
-
|
180
|
+
if not student_user or not student_pw or not api_base_url:
|
181
|
+
raise ValueError("Necessary environment variables not set")
|
182
|
+
|
183
|
+
url = api_base_url.rstrip("/") + "/submit-question"
|
176
184
|
|
177
185
|
payload = {
|
178
186
|
"student_email": student_email,
|
@@ -183,33 +191,35 @@ def submit_question(
|
|
183
191
|
"score": score,
|
184
192
|
}
|
185
193
|
|
186
|
-
res = requests.post(url, json=payload, auth=HTTPBasicAuth(
|
194
|
+
res = requests.post(url, json=payload, auth=HTTPBasicAuth(student_user, student_pw))
|
187
195
|
|
188
196
|
return res
|
189
197
|
|
190
198
|
|
191
199
|
# TODO: Refine
|
192
|
-
def verify_server(
|
193
|
-
|
194
|
-
|
195
|
-
) -> str:
|
200
|
+
def verify_server(jhub_user: Optional[str] = None) -> str:
|
201
|
+
if not api_base_url:
|
202
|
+
raise ValueError("Environment variable for API URL not set")
|
196
203
|
params = {"jhub_user": jhub_user} if jhub_user else {}
|
197
|
-
res = requests.get(
|
204
|
+
res = requests.get(api_base_url, params=params)
|
198
205
|
message = f"status code: {res.status_code}"
|
199
206
|
return message
|
200
207
|
|
201
208
|
|
202
209
|
def get_my_grades() -> dict[str, float]:
|
210
|
+
if not student_user or not student_pw or not api_base_url:
|
211
|
+
raise ValueError("Necessary environment variables not set")
|
212
|
+
|
203
213
|
from_hostname = socket.gethostname().removeprefix("jupyter-")
|
204
214
|
from_env = os.getenv("JUPYTERHUB_USER")
|
205
215
|
if from_hostname != from_env:
|
206
|
-
raise ValueError("Problem with
|
216
|
+
raise ValueError("Problem with JupyterHub username")
|
207
217
|
|
208
218
|
params = {"username": from_env}
|
209
219
|
res = requests.get(
|
210
|
-
"
|
220
|
+
url=api_base_url.rstrip("/") + "/my-grades",
|
211
221
|
params=params,
|
212
|
-
auth=HTTPBasicAuth(
|
222
|
+
auth=HTTPBasicAuth(student_user, student_pw),
|
213
223
|
)
|
214
224
|
res.raise_for_status()
|
215
225
|
|
pykubegrader/tokens/tokens.py
CHANGED
@@ -3,6 +3,8 @@ import os
|
|
3
3
|
import requests
|
4
4
|
from requests.auth import HTTPBasicAuth
|
5
5
|
|
6
|
+
api_base_url = os.getenv("DB_URL")
|
7
|
+
|
6
8
|
|
7
9
|
def build_token_payload(token: str, duration: int) -> dict:
|
8
10
|
jhub_user = os.getenv("JUPYTERHUB_USER")
|
@@ -21,7 +23,9 @@ def add_token(token: str, duration: int = 20) -> None:
|
|
21
23
|
Sends a POST request to mint a token
|
22
24
|
"""
|
23
25
|
|
24
|
-
|
26
|
+
if not api_base_url:
|
27
|
+
raise ValueError("Environment variable for API URL not set")
|
28
|
+
url = api_base_url.rstrip("/") + "/tokens"
|
25
29
|
|
26
30
|
payload = build_token_payload(token=token, duration=duration)
|
27
31
|
|
pykubegrader/validate.py
CHANGED
@@ -20,11 +20,14 @@ def validate_logfile(
|
|
20
20
|
assignment_id: str,
|
21
21
|
question_max_scores: dict[int, int],
|
22
22
|
free_response_questions: int = 0,
|
23
|
-
username: str = "student",
|
24
|
-
password: str = "capture",
|
25
|
-
base_url: str = "https://engr-131-api.eastus.cloudapp.azure.com",
|
26
23
|
key_box=None,
|
27
24
|
) -> None:
|
25
|
+
username = os.getenv("user_name_student")
|
26
|
+
password = os.getenv("keys_student")
|
27
|
+
base_url = os.getenv("DB_URL")
|
28
|
+
if not username or not password or not base_url:
|
29
|
+
sys.exit("Necessary environment variables are not set")
|
30
|
+
|
28
31
|
login_data = {
|
29
32
|
"username": username,
|
30
33
|
"password": password,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|