PyKubeGrader 0.2.33__py3-none-any.whl → 0.2.35__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.35.dist-info}/METADATA +1 -1
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.35.dist-info}/RECORD +11 -11
- pykubegrader/initialize.py +5 -3
- pykubegrader/telemetry.py +25 -17
- pykubegrader/tokens/tokens.py +5 -1
- pykubegrader/utils.py +5 -0
- pykubegrader/validate.py +6 -3
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.35.dist-info}/LICENSE.txt +0 -0
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.35.dist-info}/WHEEL +0 -0
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.35.dist-info}/entry_points.txt +0 -0
- {PyKubeGrader-0.2.33.dist-info → PyKubeGrader-0.2.35.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=
|
4
|
-
pykubegrader/utils.py,sha256=
|
5
|
-
pykubegrader/validate.py,sha256=
|
2
|
+
pykubegrader/initialize.py,sha256=Bwu1q18l18FB9lGppvt-L41D5gzr3S8t6zC0_UbrASw,3994
|
3
|
+
pykubegrader/telemetry.py,sha256=jP_mLsn5fBAkAT8sqwEBK0oGKjsOXbtZFoujje68FqI,6288
|
4
|
+
pykubegrader/utils.py,sha256=FrxuZ3gtTBTm5FQeH5c0bF9kFjA_AVtE5AYeFhzwKZ0,827
|
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=X9f3SzrGCrAJp_BXhr6VJn5f0LxtgQ7HLPBw7zEF2BY,1198
|
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.35.dist-info/LICENSE.txt,sha256=YTp-Ewc8Kems8PJEE27KnBPFnZSxoWvSg7nnknzPyYw,1546
|
31
|
+
PyKubeGrader-0.2.35.dist-info/METADATA,sha256=R4xFLArrD0fLQwL8Wekm6BwI3vh3HN2to6m0NbN_cAo,2779
|
32
|
+
PyKubeGrader-0.2.35.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
33
|
+
PyKubeGrader-0.2.35.dist-info/entry_points.txt,sha256=UPMdTT46fQwTYJWtrUwIWIbXbwyOPfNQgBFRa0frWzw,138
|
34
|
+
PyKubeGrader-0.2.35.dist-info/top_level.txt,sha256=e550Klfze6higFxER1V62fnGOcIgiKRbsrl9CC4UdtQ,13
|
35
|
+
PyKubeGrader-0.2.35.dist-info/RECORD,,
|
pykubegrader/initialize.py
CHANGED
@@ -6,9 +6,10 @@ 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
|
+
from .utils import api_base_url
|
12
13
|
|
13
14
|
|
14
15
|
# TODO: could cleanup to remove redundant imports
|
@@ -16,7 +17,6 @@ def initialize_assignment(
|
|
16
17
|
name: str,
|
17
18
|
week: str,
|
18
19
|
assignment_type: str,
|
19
|
-
url: str = "https://engr-131-api.eastus.cloudapp.azure.com/",
|
20
20
|
verbose: bool = False,
|
21
21
|
assignment_points: Optional[float] = None,
|
22
22
|
assignment_tag: Optional[str] = None,
|
@@ -72,8 +72,10 @@ def initialize_assignment(
|
|
72
72
|
pn.extension(silent=True)
|
73
73
|
|
74
74
|
# Check connection to API server
|
75
|
+
if not api_base_url:
|
76
|
+
raise Exception("Environment variable for API URL not set")
|
75
77
|
params = {"jhub_user": responses["jhub_user"]}
|
76
|
-
response = requests.get(
|
78
|
+
response = requests.get(api_base_url, params=params)
|
77
79
|
if verbose:
|
78
80
|
print(f"status code: {response.status_code}")
|
79
81
|
data = response.json()
|
pykubegrader/telemetry.py
CHANGED
@@ -13,6 +13,8 @@ from requests import Response
|
|
13
13
|
from requests.auth import HTTPBasicAuth
|
14
14
|
from requests.exceptions import RequestException
|
15
15
|
|
16
|
+
from .utils import api_base_url, student_pw, student_user
|
17
|
+
|
16
18
|
#
|
17
19
|
# Logging setup
|
18
20
|
#
|
@@ -126,11 +128,11 @@ def update_responses(key: str, value) -> dict:
|
|
126
128
|
#
|
127
129
|
|
128
130
|
|
129
|
-
def score_question(
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
url =
|
131
|
+
def score_question(term: str = "winter_2025") -> None:
|
132
|
+
if not student_user or not student_pw or not api_base_url:
|
133
|
+
raise ValueError("Necessary environment variables not set")
|
134
|
+
|
135
|
+
url = api_base_url.rstrip("/") + "/live-scorer"
|
134
136
|
|
135
137
|
responses = ensure_responses()
|
136
138
|
|
@@ -144,7 +146,9 @@ def score_question(
|
|
144
146
|
}
|
145
147
|
|
146
148
|
try:
|
147
|
-
res = requests.post(
|
149
|
+
res = requests.post(
|
150
|
+
url, json=payload, auth=HTTPBasicAuth(student_user, student_pw)
|
151
|
+
)
|
148
152
|
res.raise_for_status()
|
149
153
|
|
150
154
|
res_data: dict[str, tuple[float, float]] = res.json()
|
@@ -170,9 +174,11 @@ def submit_question(
|
|
170
174
|
question: str,
|
171
175
|
responses: dict,
|
172
176
|
score: dict,
|
173
|
-
base_url: str = "https://engr-131-api.eastus.cloudapp.azure.com/",
|
174
177
|
) -> Response:
|
175
|
-
|
178
|
+
if not student_user or not student_pw or not api_base_url:
|
179
|
+
raise ValueError("Necessary environment variables not set")
|
180
|
+
|
181
|
+
url = api_base_url.rstrip("/") + "/submit-question"
|
176
182
|
|
177
183
|
payload = {
|
178
184
|
"student_email": student_email,
|
@@ -183,33 +189,35 @@ def submit_question(
|
|
183
189
|
"score": score,
|
184
190
|
}
|
185
191
|
|
186
|
-
res = requests.post(url, json=payload, auth=HTTPBasicAuth(
|
192
|
+
res = requests.post(url, json=payload, auth=HTTPBasicAuth(student_user, student_pw))
|
187
193
|
|
188
194
|
return res
|
189
195
|
|
190
196
|
|
191
197
|
# TODO: Refine
|
192
|
-
def verify_server(
|
193
|
-
|
194
|
-
|
195
|
-
) -> str:
|
198
|
+
def verify_server(jhub_user: Optional[str] = None) -> str:
|
199
|
+
if not api_base_url:
|
200
|
+
raise ValueError("Environment variable for API URL not set")
|
196
201
|
params = {"jhub_user": jhub_user} if jhub_user else {}
|
197
|
-
res = requests.get(
|
202
|
+
res = requests.get(api_base_url, params=params)
|
198
203
|
message = f"status code: {res.status_code}"
|
199
204
|
return message
|
200
205
|
|
201
206
|
|
202
207
|
def get_my_grades() -> dict[str, float]:
|
208
|
+
if not student_user or not student_pw or not api_base_url:
|
209
|
+
raise ValueError("Necessary environment variables not set")
|
210
|
+
|
203
211
|
from_hostname = socket.gethostname().removeprefix("jupyter-")
|
204
212
|
from_env = os.getenv("JUPYTERHUB_USER")
|
205
213
|
if from_hostname != from_env:
|
206
|
-
raise ValueError("Problem with
|
214
|
+
raise ValueError("Problem with JupyterHub username")
|
207
215
|
|
208
216
|
params = {"username": from_env}
|
209
217
|
res = requests.get(
|
210
|
-
"
|
218
|
+
url=api_base_url.rstrip("/") + "/my-grades",
|
211
219
|
params=params,
|
212
|
-
auth=HTTPBasicAuth(
|
220
|
+
auth=HTTPBasicAuth(student_user, student_pw),
|
213
221
|
)
|
214
222
|
res.raise_for_status()
|
215
223
|
|
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
|
+
from ..utils import api_base_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/utils.py
CHANGED
@@ -1,8 +1,13 @@
|
|
1
|
+
import os
|
1
2
|
import random
|
2
3
|
from typing import Optional, Tuple
|
3
4
|
|
4
5
|
import panel as pn
|
5
6
|
|
7
|
+
api_base_url = os.getenv("DB_URL")
|
8
|
+
student_user = os.getenv("user_name_student")
|
9
|
+
student_pw = os.getenv("keys_student")
|
10
|
+
|
6
11
|
|
7
12
|
def list_of_lists(options: list) -> bool:
|
8
13
|
return all(isinstance(elem, list) for elem in options)
|
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
|