PyKubeGrader 0.2.32__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.32.dist-info → PyKubeGrader-0.2.34.dist-info}/METADATA +1 -1
- {PyKubeGrader-0.2.32.dist-info → PyKubeGrader-0.2.34.dist-info}/RECORD +10 -10
- pykubegrader/initialize.py +6 -3
- pykubegrader/telemetry.py +43 -14
- pykubegrader/tokens/tokens.py +5 -1
- pykubegrader/validate.py +6 -3
- {PyKubeGrader-0.2.32.dist-info → PyKubeGrader-0.2.34.dist-info}/LICENSE.txt +0 -0
- {PyKubeGrader-0.2.32.dist-info → PyKubeGrader-0.2.34.dist-info}/WHEEL +0 -0
- {PyKubeGrader-0.2.32.dist-info → PyKubeGrader-0.2.34.dist-info}/entry_points.txt +0 -0
- {PyKubeGrader-0.2.32.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
@@ -3,6 +3,7 @@ import datetime
|
|
3
3
|
import json
|
4
4
|
import logging
|
5
5
|
import os
|
6
|
+
import socket
|
6
7
|
from typing import Any, Optional
|
7
8
|
|
8
9
|
import nacl.public
|
@@ -12,6 +13,10 @@ from requests import Response
|
|
12
13
|
from requests.auth import HTTPBasicAuth
|
13
14
|
from requests.exceptions import RequestException
|
14
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
|
+
|
15
20
|
#
|
16
21
|
# Logging setup
|
17
22
|
#
|
@@ -125,11 +130,11 @@ def update_responses(key: str, value) -> dict:
|
|
125
130
|
#
|
126
131
|
|
127
132
|
|
128
|
-
def score_question(
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
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"
|
133
138
|
|
134
139
|
responses = ensure_responses()
|
135
140
|
|
@@ -143,7 +148,9 @@ def score_question(
|
|
143
148
|
}
|
144
149
|
|
145
150
|
try:
|
146
|
-
res = requests.post(
|
151
|
+
res = requests.post(
|
152
|
+
url, json=payload, auth=HTTPBasicAuth(student_user, student_pw)
|
153
|
+
)
|
147
154
|
res.raise_for_status()
|
148
155
|
|
149
156
|
res_data: dict[str, tuple[float, float]] = res.json()
|
@@ -169,9 +176,11 @@ def submit_question(
|
|
169
176
|
question: str,
|
170
177
|
responses: dict,
|
171
178
|
score: dict,
|
172
|
-
base_url: str = "https://engr-131-api.eastus.cloudapp.azure.com/",
|
173
179
|
) -> Response:
|
174
|
-
|
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"
|
175
184
|
|
176
185
|
payload = {
|
177
186
|
"student_email": student_email,
|
@@ -182,17 +191,37 @@ def submit_question(
|
|
182
191
|
"score": score,
|
183
192
|
}
|
184
193
|
|
185
|
-
res = requests.post(url, json=payload, auth=HTTPBasicAuth(
|
194
|
+
res = requests.post(url, json=payload, auth=HTTPBasicAuth(student_user, student_pw))
|
186
195
|
|
187
196
|
return res
|
188
197
|
|
189
198
|
|
190
199
|
# TODO: Refine
|
191
|
-
def verify_server(
|
192
|
-
|
193
|
-
|
194
|
-
) -> 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")
|
195
203
|
params = {"jhub_user": jhub_user} if jhub_user else {}
|
196
|
-
res = requests.get(
|
204
|
+
res = requests.get(api_base_url, params=params)
|
197
205
|
message = f"status code: {res.status_code}"
|
198
206
|
return message
|
207
|
+
|
208
|
+
|
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
|
+
|
213
|
+
from_hostname = socket.gethostname().removeprefix("jupyter-")
|
214
|
+
from_env = os.getenv("JUPYTERHUB_USER")
|
215
|
+
if from_hostname != from_env:
|
216
|
+
raise ValueError("Problem with JupyterHub username")
|
217
|
+
|
218
|
+
params = {"username": from_env}
|
219
|
+
res = requests.get(
|
220
|
+
url=api_base_url.rstrip("/") + "/my-grades",
|
221
|
+
params=params,
|
222
|
+
auth=HTTPBasicAuth(student_user, student_pw),
|
223
|
+
)
|
224
|
+
res.raise_for_status()
|
225
|
+
|
226
|
+
grades = res.json()
|
227
|
+
return grades
|
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
|