PyKubeGrader 0.3.2__tar.gz → 0.3.3__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.
Files changed (71) hide show
  1. {pykubegrader-0.3.2/src/PyKubeGrader.egg-info → pykubegrader-0.3.3}/PKG-INFO +1 -1
  2. {pykubegrader-0.3.2 → pykubegrader-0.3.3/src/PyKubeGrader.egg-info}/PKG-INFO +1 -1
  3. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/telemetry.py +50 -0
  4. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/.coveragerc +0 -0
  5. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/.github/workflows/main.yml +0 -0
  6. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/.gitignore +0 -0
  7. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/.readthedocs.yml +0 -0
  8. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/AUTHORS.rst +0 -0
  9. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/CHANGELOG.rst +0 -0
  10. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/CONTRIBUTING.rst +0 -0
  11. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/LICENSE.txt +0 -0
  12. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/README.rst +0 -0
  13. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/Makefile +0 -0
  14. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/_static/Drexel_blue_Logo_square_Dark.png +0 -0
  15. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/_static/Drexel_blue_Logo_square_Light.png +0 -0
  16. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/_static/custom.css +0 -0
  17. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/authors.rst +0 -0
  18. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/changelog.rst +0 -0
  19. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/conf.py +0 -0
  20. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/contributing.rst +0 -0
  21. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/index.rst +0 -0
  22. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/license.rst +0 -0
  23. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/readme.rst +0 -0
  24. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/docs/requirements.txt +0 -0
  25. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/examples/.responses.json +0 -0
  26. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/examples/true_false.ipynb +0 -0
  27. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/pyproject.toml +0 -0
  28. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/ruff.toml +0 -0
  29. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/setup.cfg +0 -0
  30. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/setup.py +0 -0
  31. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/PyKubeGrader.egg-info/SOURCES.txt +0 -0
  32. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/PyKubeGrader.egg-info/dependency_links.txt +0 -0
  33. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/PyKubeGrader.egg-info/entry_points.txt +0 -0
  34. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/PyKubeGrader.egg-info/not-zip-safe +0 -0
  35. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/PyKubeGrader.egg-info/requires.txt +0 -0
  36. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/PyKubeGrader.egg-info/top_level.txt +0 -0
  37. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/__init__.py +0 -0
  38. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/build/__init__.py +0 -0
  39. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/build/api_notebook_builder.py +0 -0
  40. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/build/build_folder.py +0 -0
  41. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/build/clean_folder.py +0 -0
  42. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/build/markdown_questions.py +0 -0
  43. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/grade_reports/grade_reports.py +0 -0
  44. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/graders/__init__.py +0 -0
  45. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/graders/late_assignments.py +0 -0
  46. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/grading_tester.ipynb +0 -0
  47. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/initialize.py +0 -0
  48. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/log_parser/__init__.py +0 -0
  49. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/log_parser/parse.ipynb +0 -0
  50. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/log_parser/parse.py +0 -0
  51. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/submit/submit_assignment.py +0 -0
  52. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/tokens/tokens.py +0 -0
  53. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/tokens/validate_token.py +0 -0
  54. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/utils.py +0 -0
  55. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/validate.py +0 -0
  56. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets/__init__.py +0 -0
  57. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets/multiple_choice.py +0 -0
  58. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets/question_processor.py +0 -0
  59. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets/reading_question.py +0 -0
  60. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets/select_many.py +0 -0
  61. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets/student_info.py +0 -0
  62. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets/style.py +0 -0
  63. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets/true_false.py +0 -0
  64. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets/types_question.py +0 -0
  65. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets_base/__init__.py +0 -0
  66. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets_base/multi_select.py +0 -0
  67. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets_base/reading.py +0 -0
  68. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/src/pykubegrader/widgets_base/select.py +0 -0
  69. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/tests/conftest.py +0 -0
  70. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/tests/import_test.py +0 -0
  71. {pykubegrader-0.3.2 → pykubegrader-0.3.3}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: PyKubeGrader
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Add a short description here!
5
5
  Home-page: https://github.com/pyscaffold/pyscaffold/
6
6
  Author: jagar2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: PyKubeGrader
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: Add a short description here!
5
5
  Home-page: https://github.com/pyscaffold/pyscaffold/
6
6
  Author: jagar2
@@ -1,5 +1,6 @@
1
1
  import base64
2
2
  import datetime
3
+ import gzip
3
4
  import json
4
5
  import logging
5
6
  import os
@@ -233,3 +234,52 @@ def get_my_grades() -> pd.DataFrame:
233
234
  sorted_vertical_df = vertical_df.sort_index()
234
235
 
235
236
  return sorted_vertical_df
237
+
238
+
239
+ #
240
+ # Code execution log testing
241
+ #
242
+
243
+
244
+ def upload_execution_log() -> None:
245
+ if not student_user or not student_pw or not api_base_url:
246
+ raise ValueError("Necessary environment variables not set")
247
+
248
+ responses = ensure_responses()
249
+ student_email: str = responses["jhub_user"]
250
+ assignment: str = responses["assignment"]
251
+ if not student_email or not assignment:
252
+ raise ValueError("Missing student email and/or assignment name")
253
+
254
+ print(f"Student: {student_email}")
255
+ print(f"Assignment: {assignment}")
256
+ print("Uploading code execution log...")
257
+
258
+ try:
259
+ with open(".output_code.log", "rb") as f:
260
+ log_bytes = f.read()
261
+ except FileNotFoundError:
262
+ raise FileNotFoundError("Code execution log not found")
263
+
264
+ print(f"Uncompressed log size: {len(log_bytes)} bytes")
265
+
266
+ compressed = gzip.compress(log_bytes)
267
+
268
+ print(f"Compressed log size: {len(compressed)} bytes")
269
+
270
+ encoded = base64.b64encode(compressed).decode("utf-8")
271
+
272
+ payload = {
273
+ "student_email": student_email,
274
+ "assignment": assignment,
275
+ "encrypted_content": encoded,
276
+ }
277
+
278
+ res = requests.post(
279
+ url=api_base_url.rstrip("/") + "/execution-logs",
280
+ json=payload,
281
+ auth=HTTPBasicAuth(student_user, student_pw),
282
+ )
283
+ res.raise_for_status()
284
+
285
+ print("Execution log uploaded successfully")
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