e2xauthoring 0.1.0__tar.gz → 0.2.0.dev1__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 (72) hide show
  1. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/.pre-commit-config.yaml +9 -3
  2. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/PKG-INFO +4 -3
  3. e2xauthoring-0.2.0.dev1/README.md +5 -0
  4. e2xauthoring-0.2.0.dev1/e2xauthoring/__version__.py +1 -0
  5. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/e2xauthoring/app/authoring.py +3 -4
  6. {e2xauthoring-0.1.0/e2xauthoring/app → e2xauthoring-0.2.0.dev1/e2xauthoring/app/handlers}/apihandlers.py +65 -18
  7. e2xauthoring-0.2.0.dev1/e2xauthoring/app/handlers/base.py +41 -0
  8. {e2xauthoring-0.1.0/e2xauthoring/app → e2xauthoring-0.2.0.dev1/e2xauthoring/app/handlers}/handlers.py +3 -3
  9. e2xauthoring-0.2.0.dev1/e2xauthoring/app/templates/authoring/asset-manifest.json +10 -0
  10. e2xauthoring-0.2.0.dev1/e2xauthoring/app/templates/authoring/index.html +1 -0
  11. e2xauthoring-0.2.0.dev1/e2xauthoring/app/templates/authoring/static/js/main.fe9bcd55.js +3 -0
  12. e2xauthoring-0.2.0.dev1/e2xauthoring/app/templates/authoring/static/js/main.fe9bcd55.js.LICENSE.txt +88 -0
  13. e2xauthoring-0.2.0.dev1/e2xauthoring/app/templates/authoring/static/js/main.fe9bcd55.js.map +1 -0
  14. e2xauthoring-0.2.0.dev1/e2xauthoring/converters/__init__.py +4 -0
  15. e2xauthoring-0.2.0.dev1/e2xauthoring/converters/converter.py +28 -0
  16. e2xauthoring-0.2.0.dev1/e2xauthoring/converters/generateexercise.py +40 -0
  17. e2xauthoring-0.2.0.dev1/e2xauthoring/models/__init__.py +15 -0
  18. e2xauthoring-0.2.0.dev1/e2xauthoring/models/assignmentmodel.py +34 -0
  19. e2xauthoring-0.2.0.dev1/e2xauthoring/models/basemodel.py +20 -0
  20. e2xauthoring-0.2.0.dev1/e2xauthoring/models/dataclasses/__init__.py +28 -0
  21. e2xauthoring-0.2.0.dev1/e2xauthoring/models/dataclasses/message.py +13 -0
  22. e2xauthoring-0.2.0.dev1/e2xauthoring/models/dataclasses/template.py +6 -0
  23. e2xauthoring-0.2.0.dev1/e2xauthoring/models/exercisemodel.py +44 -0
  24. e2xauthoring-0.2.0.dev1/e2xauthoring/models/lister/lister.py +27 -0
  25. e2xauthoring-0.2.0.dev1/e2xauthoring/models/lister/taskpoollister.py +33 -0
  26. e2xauthoring-0.2.0.dev1/e2xauthoring/models/lister/templatelister.py +17 -0
  27. e2xauthoring-0.2.0.dev1/e2xauthoring/models/managers/manager.py +40 -0
  28. e2xauthoring-0.2.0.dev1/e2xauthoring/models/managers/taskmanager.py +123 -0
  29. e2xauthoring-0.2.0.dev1/e2xauthoring/models/managers/taskpoolmanager.py +63 -0
  30. e2xauthoring-0.2.0.dev1/e2xauthoring/models/managers/templatemanager.py +50 -0
  31. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presetmodel.py +71 -0
  32. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Code (Autograded).ipynb +92 -0
  33. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Code (Manual).ipynb +68 -0
  34. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Diagram.ipynb +73 -0
  35. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Freetext.ipynb +63 -0
  36. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Multiple Choice.ipynb +54 -0
  37. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Single Choice.ipynb +52 -0
  38. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/questions/Upload Files.ipynb +64 -0
  39. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/template/Footer.ipynb +47 -0
  40. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/template/Group Info.ipynb +42 -0
  41. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/template/Header.ipynb +47 -0
  42. e2xauthoring-0.2.0.dev1/e2xauthoring/models/presets/template/Student Info.ipynb +41 -0
  43. e2xauthoring-0.2.0.dev1/e2xauthoring/models/taskmodel.py +186 -0
  44. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/e2xauthoring/models/taskpoolmodel.py +59 -2
  45. e2xauthoring-0.2.0.dev1/e2xauthoring/models/templatemodel.py +67 -0
  46. e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/__init__.py +19 -0
  47. e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/addtaskheader.py +98 -0
  48. e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/copyfiles.py +91 -0
  49. e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/copynotebooks.py +21 -0
  50. e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/filltemplate.py +37 -0
  51. e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/generatetaskids.py +60 -0
  52. e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/makeexercise.py +73 -0
  53. e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/preprocessor.py +10 -0
  54. e2xauthoring-0.2.0.dev1/e2xauthoring/preprocessors/removeexercise.py +19 -0
  55. e2xauthoring-0.2.0.dev1/e2xauthoring/utils/__init__.py +3 -0
  56. e2xauthoring-0.1.0/e2xauthoring/utils.py → e2xauthoring-0.2.0.dev1/e2xauthoring/utils/gitutils.py +14 -10
  57. e2xauthoring-0.2.0.dev1/e2xauthoring/utils/notebookvariableextractor.py +16 -0
  58. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/package-lock.json +6 -6
  59. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/package.json +1 -1
  60. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/pyproject.toml +44 -4
  61. e2xauthoring-0.1.0/README.md +0 -5
  62. e2xauthoring-0.1.0/e2xauthoring/__version__.py +0 -1
  63. e2xauthoring-0.1.0/e2xauthoring/models/__init__.py +0 -4
  64. e2xauthoring-0.1.0/e2xauthoring/models/taskmodel.py +0 -63
  65. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/.github/workflows/sonarcloud.yml +0 -0
  66. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/.gitignore +0 -0
  67. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/LICENSE +0 -0
  68. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/MANIFEST.in +0 -0
  69. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/e2xauthoring/__init__.py +0 -0
  70. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/e2xauthoring/app/__init__.py +0 -0
  71. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/e2xauthoring/assets/.gitignore +0 -0
  72. {e2xauthoring-0.1.0 → e2xauthoring-0.2.0.dev1}/lerna.json +0 -0
@@ -1,20 +1,26 @@
1
1
  repos:
2
2
  - repo: https://github.com/psf/black
3
- rev: 22.6.0
3
+ rev: 23.1.0
4
4
  hooks:
5
5
  - id: black
6
6
 
7
7
  - repo: https://github.com/PyCQA/isort
8
- rev: 5.10.1
8
+ rev: 5.11.5
9
9
  hooks:
10
10
  - id: isort
11
11
  files: \.py$
12
12
  args: [--profile=black]
13
13
 
14
+ - repo: https://github.com/charliermarsh/ruff-pre-commit
15
+ rev: "v0.0.267"
16
+ hooks:
17
+ - id: ruff
18
+
14
19
  - repo: local
15
20
  hooks:
16
21
  - id: prettier
17
22
  name: prettier
18
23
  entry: 'npm run prettier:files'
19
24
  language: node
20
- types_or: [json, markdown, ts, tsx, javascript, jsx, css]
25
+ types_or: [json, markdown, ts, tsx, javascript, jsx, css]
26
+ exclude_types: [jupyter]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: e2xauthoring
3
- Version: 0.1.0
3
+ Version: 0.2.0.dev1
4
4
  Summary: Authoring app for e2xgrader
5
5
  Project-URL: Source, https://github.com/Digiklausur/e2xauthoring
6
6
  Author-email: Tim Metzler <tim.metzler@h-brs.de>
@@ -12,15 +12,16 @@ Classifier: Programming Language :: Python :: 3.7
12
12
  Classifier: Programming Language :: Python :: 3.8
13
13
  Classifier: Programming Language :: Python :: 3.9
14
14
  Requires-Python: >=3.7
15
- Requires-Dist: e2xgrader==0.1.*
15
+ Requires-Dist: e2xcore==0.0.2
16
16
  Requires-Dist: gitpython
17
17
  Provides-Extra: dev
18
18
  Requires-Dist: hatchling; extra == 'dev'
19
19
  Requires-Dist: pre-commit; extra == 'dev'
20
+ Requires-Dist: tbump; extra == 'dev'
20
21
  Description-Content-Type: text/markdown
21
22
 
22
23
  # e2xauthoring
23
24
 
24
25
  ---
25
26
 
26
- This is an authoring component for e2xgrader
27
+ This is an authoring component for e2xgrader
@@ -0,0 +1,5 @@
1
+ # e2xauthoring
2
+
3
+ ---
4
+
5
+ This is an authoring component for e2xgrader
@@ -0,0 +1 @@
1
+ __version__ = "0.2.0-dev1"
@@ -1,15 +1,14 @@
1
1
  import os
2
2
 
3
- from e2xgrader.server_extensions.grader.apps.base import BaseApp
3
+ from e2xcore import BaseApp
4
4
  from nbgrader.apps.baseapp import NbGrader
5
5
  from tornado import web
6
6
 
7
- from .apihandlers import default_handlers
8
- from .handlers import default_handlers as handlers
7
+ from .handlers.apihandlers import default_handlers
8
+ from .handlers.handlers import default_handlers as handlers
9
9
 
10
10
 
11
11
  class AuthoringApp(NbGrader, BaseApp):
12
-
13
12
  template_path = os.path.join(os.path.dirname(__file__), "templates")
14
13
  static_path = os.path.join(template_path, "authoring", "static")
15
14
 
@@ -1,27 +1,71 @@
1
1
  import json
2
+ import os
2
3
 
3
- from e2xgrader.converters import GenerateExercise
4
- from e2xgrader.models import AssignmentModel, TemplateModel
5
- from e2xgrader.server_extensions.grader.apps.authoring.apihandlers import (
6
- BaseApiListHandler,
7
- BaseApiManageHandler,
8
- E2xApiHandler,
9
- ExerciseModel,
10
- KernelSpecHandler,
11
- PresetHandler,
12
- TemplateVariableHandler,
13
- api_url,
14
- assignment_regex,
15
- name_regex,
16
- pool_regex,
17
- )
18
- from e2xgrader.utils import urljoin
4
+ from e2xcore.handlers import E2xApiHandler
5
+ from e2xcore.utils import urljoin
6
+ from jupyter_client.kernelspec import KernelSpecManager
19
7
  from nbgrader.server_extensions.formgrader.base import check_xsrf
20
8
  from tornado import web
21
9
 
22
- from e2xauthoring.utils import get_author, set_author
10
+ from ...converters import GenerateExercise
11
+ from ...models import (
12
+ AssignmentModel,
13
+ ExerciseModel,
14
+ PresetModel,
15
+ TaskModel,
16
+ TaskPoolModel,
17
+ TemplateModel,
18
+ )
19
+ from ...utils import NotebookVariableExtractor
20
+ from ...utils.gitutils import get_author, set_author
21
+ from .base import BaseApiListHandler, BaseApiManageHandler
22
+
23
+
24
+ class PresetHandler(E2xApiHandler):
25
+ def initialize(self):
26
+ self.__model = PresetModel(self.coursedir)
27
+
28
+ def _list_template(self):
29
+ self.write(json.dumps(self.__model.list_template_presets()))
30
+
31
+ def _get_template(self):
32
+ name = self.get_argument("name")
33
+ self.write(json.dumps(self.__model.get_template_preset(name)))
34
+
35
+ def _list_question(self):
36
+ self.write(json.dumps(self.__model.list_question_presets()))
37
+
38
+ def _get_question(self):
39
+ name = self.get_argument("name")
40
+ self.write(json.dumps(self.__model.get_question_preset(name)))
41
+
42
+ @web.authenticated
43
+ @check_xsrf
44
+ def get(self):
45
+ action = self.get_argument("action")
46
+ preset_type = self.get_argument("type")
47
+ handler = getattr(self, "_{}_{}".format(action, preset_type))
48
+ handler()
49
+
50
+
51
+ class TemplateVariableHandler(E2xApiHandler):
52
+ @web.authenticated
53
+ @check_xsrf
54
+ def get(self):
55
+ template = self.get_argument("template")
56
+ variables = NotebookVariableExtractor().extract(
57
+ os.path.join(
58
+ self.url_prefix, "templates", template, "{}.ipynb".format(template)
59
+ )
60
+ )
61
+ self.write(json.dumps(variables))
62
+
23
63
 
24
- from ..models import TaskModel, TaskPoolModel
64
+ class KernelSpecHandler(E2xApiHandler):
65
+ @web.authenticated
66
+ @check_xsrf
67
+ def get(self):
68
+ self.write(json.dumps(KernelSpecManager().get_all_specs()))
25
69
 
26
70
 
27
71
  class ManagePoolsHandler(E2xApiHandler):
@@ -185,6 +229,9 @@ class GitAuthorHandler(E2xApiHandler):
185
229
  self.write(json.dumps(set_author(name=name, email=email)))
186
230
 
187
231
 
232
+ api_url = urljoin("e2x", "authoring", "api")
233
+ name_regex = r"(?P<name>[^/]+)"
234
+ assignment_regex = r"(?P<assignment>[^/]+)"
188
235
  pool_action_regex = r"(?P<action>new|list|remove|get|init_repo)"
189
236
  task_action_regex = r"(?P<action>new|list|list_all|remove|commit|get|diff)"
190
237
  template_action_regex = r"(?P<action>new|list|remove)"
@@ -0,0 +1,41 @@
1
+ import json
2
+
3
+ from e2xcore.handlers import E2xApiHandler
4
+ from nbgrader.server_extensions.formgrader.base import check_xsrf
5
+ from tornado import web
6
+
7
+
8
+ class BaseApiManageHandler(E2xApiHandler):
9
+ def initialize(self, model_cls):
10
+ self.__model = model_cls(self.coursedir)
11
+
12
+ @web.authenticated
13
+ @check_xsrf
14
+ def post(self, **kwargs):
15
+ self.write(self.__model.new(**kwargs))
16
+
17
+ @web.authenticated
18
+ @check_xsrf
19
+ def delete(self, **kwargs):
20
+ self.__model.remove(**kwargs)
21
+ self.write({"status": True})
22
+
23
+ @web.authenticated
24
+ @check_xsrf
25
+ def get(self, **kwargs):
26
+ self.write(json.dumps(self.__model.get(**kwargs)))
27
+
28
+ @web.authenticated
29
+ @check_xsrf
30
+ def put(self, **kwargs):
31
+ self.write(self.__model.new(**kwargs))
32
+
33
+
34
+ class BaseApiListHandler(E2xApiHandler):
35
+ def initialize(self, model_cls):
36
+ self.__model = model_cls(self.coursedir)
37
+
38
+ @web.authenticated
39
+ @check_xsrf
40
+ def get(self, **kwargs):
41
+ self.write(json.dumps(self.__model.list(**kwargs)))
@@ -1,9 +1,7 @@
1
1
  import os
2
2
  import sys
3
- from email.policy import default
4
3
 
5
- from e2xgrader.server_extensions.grader.apps.authoring.handlers import app_url
6
- from e2xgrader.utils import urljoin
4
+ from e2xcore.utils import urljoin
7
5
  from nbgrader.server_extensions.formgrader.base import (
8
6
  BaseHandler,
9
7
  check_notebook_dir,
@@ -11,6 +9,8 @@ from nbgrader.server_extensions.formgrader.base import (
11
9
  )
12
10
  from tornado import web
13
11
 
12
+ app_url = urljoin("e2x", "authoring", "app")
13
+
14
14
 
15
15
  class AuthoringHandler(BaseHandler):
16
16
  @web.authenticated
@@ -0,0 +1,10 @@
1
+ {
2
+ "files": {
3
+ "main.js": "/e2x/authoring/static/js/main.fe9bcd55.js",
4
+ "index.html": "/e2x/authoring/index.html",
5
+ "main.fe9bcd55.js.map": "/e2x/authoring/static/js/main.fe9bcd55.js.map"
6
+ },
7
+ "entrypoints": [
8
+ "static/js/main.fe9bcd55.js"
9
+ ]
10
+ }
@@ -0,0 +1 @@
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>e²xgrader - Authoring</title><script type="text/javascript">window.base_url="{{ base_url }}",window.url_prefix="{{ url_prefix }}",window.webpackstuff="/e2x/authoring/static/js/main.fe9bcd55.js"</script><script defer="defer" src="{{base_url}}/e2x/authoring/static/js/main.fe9bcd55.js"></script>{%- block head -%} {%- endblock -%}</head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>