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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: PyKubeGrader
3
- Version: 0.2.32
3
+ Version: 0.2.34
4
4
  Summary: Add a short description here!
5
5
  Home-page: https://github.com/pyscaffold/pyscaffold/
6
6
  Author: jagar2
@@ -1,8 +1,8 @@
1
1
  pykubegrader/__init__.py,sha256=AoAkdfIjDDZGWLlsIRENNq06L9h46kDGBIE8vRmsCfg,311
2
- pykubegrader/initialize.py,sha256=W-O1d9hy6BIYS28x3kcLG50WnNC4196eZwqwzVZdsgU,3902
3
- pykubegrader/telemetry.py,sha256=GwKcC8Y8p35L07zwTC7ijR5ux5ceb6LyC_MZp5yBbH8,5360
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=2KLSB3wfFZbBh1NGgmrOV073paKAgrQz4AgA6LmCIj4,11076
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=TOj0jRun1lWTztKA7KX9SjzIfNQqkwdnbczrFSPWB7Y,1089
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.32.dist-info/LICENSE.txt,sha256=YTp-Ewc8Kems8PJEE27KnBPFnZSxoWvSg7nnknzPyYw,1546
31
- PyKubeGrader-0.2.32.dist-info/METADATA,sha256=T_k_tpz6f2e3E0XlcY-48BMGSlgSEjTs6y9xZ785ybA,2779
32
- PyKubeGrader-0.2.32.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
33
- PyKubeGrader-0.2.32.dist-info/entry_points.txt,sha256=UPMdTT46fQwTYJWtrUwIWIbXbwyOPfNQgBFRa0frWzw,138
34
- PyKubeGrader-0.2.32.dist-info/top_level.txt,sha256=e550Klfze6higFxER1V62fnGOcIgiKRbsrl9CC4UdtQ,13
35
- PyKubeGrader-0.2.32.dist-info/RECORD,,
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,,
@@ -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(url, params=params)
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
- term: str = "winter_2025",
130
- base_url: str = "https://engr-131-api.eastus.cloudapp.azure.com",
131
- ) -> None:
132
- url = base_url + "/live-scorer"
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(url, json=payload, auth=HTTPBasicAuth("student", "capture"))
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
- url = base_url + "/submit-question"
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("student", "capture"))
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
- jhub_user: Optional[str] = None,
193
- url: str = "https://engr-131-api.eastus.cloudapp.azure.com/",
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(url, params=params)
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
@@ -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
- url = "https://engr-131-api.eastus.cloudapp.azure.com/tokens"
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,