otter-service-stdalone 1.1.24__tar.gz → 1.1.26__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.
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/PKG-INFO +1 -1
- otter_service_stdalone-1.1.26/src/otter_service_stdalone/__init__.py +1 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/app.py +6 -4
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone.egg-info/PKG-INFO +1 -1
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone.egg-info/SOURCES.txt +2 -1
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/tests/test_upload_handle.py +4 -0
- otter_service_stdalone-1.1.26/tests/test_util.py +10 -0
- otter_service_stdalone-1.1.24/src/otter_service_stdalone/__init__.py +0 -1
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/README.md +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/pyproject.toml +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/setup.cfg +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/access_sops_keys.py +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/fs_logging.py +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/grade_notebooks.py +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/index.html +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/scripts/web_socket.js +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/secrets/gh_key.dev.yaml +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/secrets/gh_key.local.yaml +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/secrets/gh_key.prod.yaml +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/secrets/gh_key.staging.yaml +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/static_files/README_DO_NOT_DISTRIBUTE.txt +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/static_templates/403.html +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/static_templates/500.html +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/upload_handle.py +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/user_auth.py +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/util.py +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone.egg-info/dependency_links.txt +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone.egg-info/entry_points.txt +0 -0
- {otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone.egg-info/top_level.txt +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "1.1.26"
|
{otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/app.py
RENAMED
@@ -3,6 +3,7 @@ import tornado.ioloop
|
|
3
3
|
import tornado.web
|
4
4
|
import tornado.auth
|
5
5
|
import os
|
6
|
+
import re
|
6
7
|
import uuid
|
7
8
|
import tornado.websocket
|
8
9
|
from otter_service_stdalone import fs_logging as log
|
@@ -37,7 +38,7 @@ class WebSocketHandler(tornado.websocket.WebSocketHandler):
|
|
37
38
|
if user_id not in session_callbacks:
|
38
39
|
session_callbacks[user_id] = tornado.ioloop.PeriodicCallback(lambda: self.send_results(user_id), 1000)
|
39
40
|
session_callbacks[user_id].start()
|
40
|
-
|
41
|
+
|
41
42
|
def on_message(self, message):
|
42
43
|
pass # No action needed on incoming message
|
43
44
|
|
@@ -209,8 +210,8 @@ class Download(BaseHandler):
|
|
209
210
|
zipF.write(f"{file_path}", f_path, compress_type=ZIP_DEFLATED)
|
210
211
|
read_me = os.path.join(os.path.dirname(__file__), "static_files", "README_DO_NOT_DISTRIBUTE.txt")
|
211
212
|
zipF.write(read_me, "README_DO_NOT_DISTRIBUTE.txt", compress_type=ZIP_DEFLATED)
|
212
|
-
|
213
|
-
download_label = f"{download_code.split('-')[
|
213
|
+
|
214
|
+
download_label = f"{'-'.join(download_code.split('-')[:-5])}-results.zip"
|
214
215
|
self.set_header('Content-Type', 'application/octet-stream')
|
215
216
|
self.set_header("Content-Description", "File Transfer")
|
216
217
|
m = f"attachment; filename={download_label}"
|
@@ -255,7 +256,8 @@ class Upload(BaseHandler):
|
|
255
256
|
if autograder is not None and notebooks is not None:
|
256
257
|
log.write_logs(results_path, "Step 1: Upload accepted", "", "debug", log_debug)
|
257
258
|
notebooks_fname = notebooks['filename']
|
258
|
-
|
259
|
+
sanitized_filename = re.sub(r"[ ,./\\\[\]{}()]]", "", os.path.splitext(notebooks_fname)[0])
|
260
|
+
results_path = f"{sanitized_filename}-{results_path}"
|
259
261
|
notebooks_extn = os.path.splitext(notebooks_fname)[1]
|
260
262
|
if notebooks_extn == ".zip":
|
261
263
|
notebooks_name = results_path + notebooks_extn
|
@@ -23,4 +23,5 @@ src/otter_service_stdalone/secrets/gh_key.staging.yaml
|
|
23
23
|
src/otter_service_stdalone/static_files/README_DO_NOT_DISTRIBUTE.txt
|
24
24
|
src/otter_service_stdalone/static_templates/403.html
|
25
25
|
src/otter_service_stdalone/static_templates/500.html
|
26
|
-
tests/test_upload_handle.py
|
26
|
+
tests/test_upload_handle.py
|
27
|
+
tests/test_util.py
|
@@ -51,6 +51,10 @@ def test_handle_one_notebook(resources):
|
|
51
51
|
assert "tests/files" in uh.handle_one_notebook("tests/files/hw3.ipynb")
|
52
52
|
|
53
53
|
|
54
|
+
def test_period_in_notebook_name(resources):
|
55
|
+
assert "tests/files" in uh.handle_upload("tests/files/hw3.3.ipynb", "test-up-123")
|
56
|
+
|
57
|
+
|
54
58
|
def test_handle_upload(resources):
|
55
59
|
zip = "tests/files/hw3-submissions-only-notebooks.zip"
|
56
60
|
mixed_zip = "tests/files/hw3-submissions-notebooks-zips-mixed.zip"
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import otter_service_stdalone.util as util
|
2
|
+
|
3
|
+
|
4
|
+
def test_autograder_zip_version():
|
5
|
+
a1 = "tests/files/hw01-autograder_6_0_4.zip"
|
6
|
+
a2 = "tests/files/hw02-autograder_6_1_0.zip"
|
7
|
+
a3 = "tests/files/hw02-autograder_5_5_0.zip"
|
8
|
+
assert util.otter_version_correct(a1) is True
|
9
|
+
assert util.otter_version_correct(a2) is True
|
10
|
+
assert util.otter_version_correct(a3) is False
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "1.1.24"
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{otter_service_stdalone-1.1.24 → otter_service_stdalone-1.1.26}/src/otter_service_stdalone/util.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|