mirror of
https://github.com/ChristianLight/tutor.git
synced 2025-01-10 09:02:14 +00:00
Merge remote-tracking branch 'origin/master' into nightly
This commit is contained in:
commit
8d1294c67f
16
CHANGELOG.md
16
CHANGELOG.md
@ -20,6 +20,22 @@ instructions, because git commits are used to generate release notes:
|
|||||||
|
|
||||||
<!-- scriv-insert-here -->
|
<!-- scriv-insert-here -->
|
||||||
|
|
||||||
|
<a id='changelog-17.0.2'></a>
|
||||||
|
## v17.0.2 (2024-02-09)
|
||||||
|
|
||||||
|
- [Feature] Several enhancements to the Demo Course (by @kdmccormick):
|
||||||
|
- The [Open edX Demo Course](https://github.com/openedx/openedx-demo-course) has been re-built from scratch with up-to-date instruction-focused content. Its directory structure has changed.
|
||||||
|
- In order to support both the old and new structures of the Demo Course's repository, the command `tutor local do importdemocourse` will now auto-determine the course root based on the location of `course.xml`. Use the `--repo-dir` argument to override this behavior.
|
||||||
|
- The new command `tutor local do importdemolibraries` will import any content libraries defined within the Demo Course repository. At the moment, that is just the "Respiratory System Question Bank", which is an optional but helpful extension to the new Demo Course.
|
||||||
|
- To try out the new Demo Course now, run: `tutor local do importdemocourse --version master`.
|
||||||
|
- To try out the demo Respiratory System Question Bank now, run: `tutor local do importdemolibraries --version master`.
|
||||||
|
- To revert back to an older Demo Course version at any point, run: `tutor local do importdemocourse --version open-release/quince.2`, replacing `quince.2` with your preferred course version.
|
||||||
|
- [Bugfix] Remove duplicate volume declarations that cause `docker compose` v2.24.1 to fail.
|
||||||
|
- [Bugfix] Actually update the environment on `tutor plugins enable ...`. (by @regisb)
|
||||||
|
- [Feature] Introduce a `tutor.hooks.lru_cache` decorator that is automatically cleared whenever a plugin is loaded or unloaded. This is useful, in particular when a plugin implements a costly function that depends on tutor hooks. (by @regisb)
|
||||||
|
- [Bugfix] Fix compatibility with Python 3.12 by replacing pkg_resources with importlib_metadata and importlib_resources. (by @Danyal-Faheem)
|
||||||
|
- [Improvement] Upgrade base release to open-release/quince.2. (by @regisb)
|
||||||
|
|
||||||
<a id='changelog-17.0.1'></a>
|
<a id='changelog-17.0.1'></a>
|
||||||
## v17.0.1 (2024-01-25)
|
## v17.0.1 (2024-01-25)
|
||||||
|
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
- [Feature] Several enhancements to the Demo Course (by @kdmccormick):
|
|
||||||
- The [Open edX Demo Course](https://github.com/openedx/openedx-demo-course) has been re-built from scratch with up-to-date instruction-focused content. Its directory structure has changed.
|
|
||||||
- In order to support both the old and new structures of the Demo Course's repository, the command `tutor local do importdemocourse` will now auto-determine the course root based on the location of `course.xml`. Use the `--repo-dir` argument to override this behavior.
|
|
||||||
- The new command `tutor local do importdemolibraries` will import any content libraries defined within the Demo Course repository. At the moment, that is just the "Respiratory System Question Bank", which is an optional but helpful extension to the new Demo Course.
|
|
||||||
- To try out the new Demo Course now, run: `tutor local do importdemocourse --version master`.
|
|
||||||
- To try out the demo Respiratory System Question Bank now, run: `tutor local do importdemolibraries --version master`.
|
|
||||||
- To revert back to an older Demo Course version at any point, run: `tutor local do importdemocourse --version open-release/quince.2`, replacing `quince.2` with your preferred course version.
|
|
@ -1,2 +0,0 @@
|
|||||||
- [Bugfix] Fixes duplicate volume declarations causing Tutor commands that
|
|
||||||
invoke Docker to fail.
|
|
@ -1,2 +0,0 @@
|
|||||||
- [Bugfix] Actually update the environment on `tutor plugins enable ...`. (by @regisb)
|
|
||||||
- [Feature] Introduce a `tutor.hooks.lru_cache` decorator that is automatically cleared whenever a plugin is loaded or unloaded. This is useful, in particular when a plugin implements a costly function that depends on tutor hooks. (by @regisb)
|
|
@ -6,3 +6,5 @@ mypy
|
|||||||
pycryptodome>=3.17.0
|
pycryptodome>=3.17.0
|
||||||
pyyaml>=6.0
|
pyyaml>=6.0
|
||||||
typing-extensions>=4.4.0
|
typing-extensions>=4.4.0
|
||||||
|
importlib-metadata>=7.0.1
|
||||||
|
importlib-resources>=6.1.1
|
||||||
|
@ -20,6 +20,10 @@ google-auth==2.23.3
|
|||||||
# via kubernetes
|
# via kubernetes
|
||||||
idna==3.4
|
idna==3.4
|
||||||
# via requests
|
# via requests
|
||||||
|
importlib-metadata==7.0.1
|
||||||
|
# via -r requirements/base.in
|
||||||
|
importlib-resources==6.1.1
|
||||||
|
# via -r requirements/base.in
|
||||||
jinja2==3.1.3
|
jinja2==3.1.3
|
||||||
# via -r requirements/base.in
|
# via -r requirements/base.in
|
||||||
kubernetes==28.1.0
|
kubernetes==28.1.0
|
||||||
@ -72,3 +76,7 @@ urllib3==1.26.18
|
|||||||
# requests
|
# requests
|
||||||
websocket-client==1.6.4
|
websocket-client==1.6.4
|
||||||
# via kubernetes
|
# via kubernetes
|
||||||
|
zipp==3.17.0
|
||||||
|
# via
|
||||||
|
# importlib-metadata
|
||||||
|
# importlib-resources
|
||||||
|
@ -58,14 +58,17 @@ idna==3.4
|
|||||||
# via
|
# via
|
||||||
# -r requirements/base.txt
|
# -r requirements/base.txt
|
||||||
# requests
|
# requests
|
||||||
importlib-metadata==6.8.0
|
importlib-metadata==7.0.1
|
||||||
# via
|
# via
|
||||||
|
# -r requirements/base.txt
|
||||||
# build
|
# build
|
||||||
# keyring
|
# keyring
|
||||||
# pyinstaller
|
# pyinstaller
|
||||||
# twine
|
# twine
|
||||||
importlib-resources==6.1.1
|
importlib-resources==6.1.1
|
||||||
# via keyring
|
# via
|
||||||
|
# -r requirements/base.txt
|
||||||
|
# keyring
|
||||||
isort==5.12.0
|
isort==5.12.0
|
||||||
# via pylint
|
# via pylint
|
||||||
jaraco-classes==3.3.0
|
jaraco-classes==3.3.0
|
||||||
@ -232,6 +235,7 @@ wheel==0.41.2
|
|||||||
# via pip-tools
|
# via pip-tools
|
||||||
zipp==3.17.0
|
zipp==3.17.0
|
||||||
# via
|
# via
|
||||||
|
# -r requirements/base.txt
|
||||||
# importlib-metadata
|
# importlib-metadata
|
||||||
# importlib-resources
|
# importlib-resources
|
||||||
|
|
||||||
|
@ -42,8 +42,12 @@ idna==3.4
|
|||||||
# requests
|
# requests
|
||||||
imagesize==1.4.1
|
imagesize==1.4.1
|
||||||
# via sphinx
|
# via sphinx
|
||||||
importlib-metadata==6.8.0
|
importlib-metadata==7.0.1
|
||||||
# via sphinx
|
# via
|
||||||
|
# -r requirements/base.txt
|
||||||
|
# sphinx
|
||||||
|
importlib-resources==6.1.1
|
||||||
|
# via -r requirements/base.txt
|
||||||
jinja2==3.1.3
|
jinja2==3.1.3
|
||||||
# via
|
# via
|
||||||
# -r requirements/base.txt
|
# -r requirements/base.txt
|
||||||
@ -153,4 +157,7 @@ websocket-client==1.6.4
|
|||||||
# -r requirements/base.txt
|
# -r requirements/base.txt
|
||||||
# kubernetes
|
# kubernetes
|
||||||
zipp==3.17.0
|
zipp==3.17.0
|
||||||
# via importlib-metadata
|
# via
|
||||||
|
# -r requirements/base.txt
|
||||||
|
# importlib-metadata
|
||||||
|
# importlib-resources
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# -*- mode: python -*-
|
# -*- mode: python -*-
|
||||||
import importlib
|
import importlib
|
||||||
import os
|
import os
|
||||||
import pkg_resources
|
from importlib_metadata
|
||||||
|
|
||||||
block_cipher = None
|
block_cipher = None
|
||||||
|
|
||||||
@ -10,10 +10,10 @@ hidden_imports = []
|
|||||||
|
|
||||||
# Auto-discover plugins and include patches & templates folders
|
# Auto-discover plugins and include patches & templates folders
|
||||||
for entrypoint_version in ["tutor.plugin.v0", "tutor.plugin.v1"]:
|
for entrypoint_version in ["tutor.plugin.v0", "tutor.plugin.v1"]:
|
||||||
for entrypoint in pkg_resources.iter_entry_points(entrypoint_version):
|
for entrypoint in importlib_metadata.entry_points(group=entrypoint_version):
|
||||||
plugin_name = entrypoint.name
|
plugin_name = entrypoint.name
|
||||||
try:
|
try:
|
||||||
plugin = entrypoint.load()
|
plugin = importlib.import_module(entrypoint.value)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"ERROR Failed to load plugin {plugin_name}: {e}")
|
print(f"ERROR Failed to load plugin {plugin_name}: {e}")
|
||||||
continue
|
continue
|
||||||
|
@ -2,7 +2,7 @@ import os
|
|||||||
|
|
||||||
# Increment this version number to trigger a new release. See
|
# Increment this version number to trigger a new release. See
|
||||||
# docs/tutor.html#versioning for information on the versioning scheme.
|
# docs/tutor.html#versioning for information on the versioning scheme.
|
||||||
__version__ = "17.0.1"
|
__version__ = "17.0.2"
|
||||||
|
|
||||||
# The version suffix will be appended to the actual version, separated by a
|
# The version suffix will be appended to the actual version, separated by a
|
||||||
# dash. Use this suffix to differentiate between the actual released version and
|
# dash. Use this suffix to differentiate between the actual released version and
|
||||||
|
@ -7,13 +7,13 @@ import typing as t
|
|||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
|
||||||
import jinja2
|
import jinja2
|
||||||
import pkg_resources
|
import importlib_resources
|
||||||
|
|
||||||
from tutor import exceptions, fmt, hooks, plugins, utils
|
from tutor import exceptions, fmt, hooks, plugins, utils
|
||||||
from tutor.__about__ import __app__, __version__
|
from tutor.__about__ import __app__, __version__
|
||||||
from tutor.types import Config, ConfigValue
|
from tutor.types import Config, ConfigValue
|
||||||
|
|
||||||
TEMPLATES_ROOT = pkg_resources.resource_filename("tutor", "templates")
|
TEMPLATES_ROOT = str(importlib_resources.files("tutor") / "templates")
|
||||||
VERSION_FILENAME = "version"
|
VERSION_FILENAME = "version"
|
||||||
BIN_FILE_EXTENSIONS = [
|
BIN_FILE_EXTENSIONS = [
|
||||||
".ico",
|
".ico",
|
||||||
|
@ -5,7 +5,7 @@ import typing as t
|
|||||||
from glob import glob
|
from glob import glob
|
||||||
|
|
||||||
import click
|
import click
|
||||||
import pkg_resources
|
import importlib_metadata
|
||||||
|
|
||||||
from tutor import env, exceptions, fmt, hooks, serialize
|
from tutor import env, exceptions, fmt, hooks, serialize
|
||||||
from tutor.__about__ import __app__
|
from tutor.__about__ import __app__
|
||||||
@ -246,12 +246,12 @@ class EntrypointPlugin(BasePlugin):
|
|||||||
|
|
||||||
ENTRYPOINT = "tutor.plugin.v0"
|
ENTRYPOINT = "tutor.plugin.v0"
|
||||||
|
|
||||||
def __init__(self, entrypoint: pkg_resources.EntryPoint) -> None:
|
def __init__(self, entrypoint: importlib_metadata.EntryPoint) -> None:
|
||||||
self.loader: pkg_resources.EntryPoint
|
self.loader: importlib_metadata.EntryPoint = entrypoint
|
||||||
super().__init__(entrypoint.name, entrypoint)
|
super().__init__(entrypoint.name, entrypoint)
|
||||||
|
|
||||||
def _load_obj(self) -> None:
|
def _load_obj(self) -> None:
|
||||||
self.obj = self.loader.load()
|
self.obj = importlib.import_module(self.loader.value)
|
||||||
|
|
||||||
def _version(self) -> t.Optional[str]:
|
def _version(self) -> t.Optional[str]:
|
||||||
if not self.loader.dist:
|
if not self.loader.dist:
|
||||||
@ -260,12 +260,11 @@ class EntrypointPlugin(BasePlugin):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def discover_all(cls) -> None:
|
def discover_all(cls) -> None:
|
||||||
for entrypoint in pkg_resources.iter_entry_points(cls.ENTRYPOINT):
|
entrypoints = importlib_metadata.entry_points(group=cls.ENTRYPOINT)
|
||||||
|
for entrypoint in entrypoints:
|
||||||
try:
|
try:
|
||||||
error: t.Optional[str] = None
|
error: t.Optional[str] = None
|
||||||
cls(entrypoint)
|
cls(entrypoint)
|
||||||
except pkg_resources.VersionConflict as e:
|
|
||||||
error = e.report()
|
|
||||||
except Exception as e: # pylint: disable=broad-except
|
except Exception as e: # pylint: disable=broad-except
|
||||||
error = str(e)
|
error = str(e)
|
||||||
if error:
|
if error:
|
||||||
|
@ -2,7 +2,7 @@ import importlib.util
|
|||||||
import os
|
import os
|
||||||
from glob import glob
|
from glob import glob
|
||||||
|
|
||||||
import pkg_resources
|
import importlib_metadata
|
||||||
|
|
||||||
from tutor import hooks
|
from tutor import hooks
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ def _discover_entrypoint_plugins() -> None:
|
|||||||
"""
|
"""
|
||||||
with hooks.Contexts.PLUGINS.enter():
|
with hooks.Contexts.PLUGINS.enter():
|
||||||
if "TUTOR_IGNORE_ENTRYPOINT_PLUGINS" not in os.environ:
|
if "TUTOR_IGNORE_ENTRYPOINT_PLUGINS" not in os.environ:
|
||||||
for entrypoint in pkg_resources.iter_entry_points("tutor.plugin.v1"):
|
for entrypoint in importlib_metadata.entry_points(group="tutor.plugin.v1"):
|
||||||
discover_package(entrypoint)
|
discover_package(entrypoint)
|
||||||
|
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ def discover_module(path: str) -> None:
|
|||||||
spec.loader.exec_module(module)
|
spec.loader.exec_module(module)
|
||||||
|
|
||||||
|
|
||||||
def discover_package(entrypoint: pkg_resources.EntryPoint) -> None:
|
def discover_package(entrypoint: importlib_metadata.EntryPoint) -> None:
|
||||||
"""
|
"""
|
||||||
Install a plugin from a python package.
|
Install a plugin from a python package.
|
||||||
"""
|
"""
|
||||||
@ -68,10 +68,11 @@ def discover_package(entrypoint: pkg_resources.EntryPoint) -> None:
|
|||||||
# Add plugin information
|
# Add plugin information
|
||||||
if entrypoint.dist is None:
|
if entrypoint.dist is None:
|
||||||
raise ValueError(f"Could not read plugin version: {name}")
|
raise ValueError(f"Could not read plugin version: {name}")
|
||||||
hooks.Filters.PLUGINS_INFO.add_item((name, entrypoint.dist.version))
|
dist_version = entrypoint.dist.version if entrypoint.dist else "Unknown"
|
||||||
|
hooks.Filters.PLUGINS_INFO.add_item((name, dist_version))
|
||||||
|
|
||||||
# Import module on enable
|
# Import module on enable
|
||||||
@hooks.Actions.PLUGIN_LOADED.add()
|
@hooks.Actions.PLUGIN_LOADED.add()
|
||||||
def load(plugin_name: str) -> None:
|
def load(plugin_name: str) -> None:
|
||||||
if name == plugin_name:
|
if name == plugin_name:
|
||||||
entrypoint.load()
|
importlib.import_module(entrypoint.value)
|
||||||
|
@ -62,7 +62,7 @@ OPENEDX_LMS_UWSGI_WORKERS: 2
|
|||||||
OPENEDX_MYSQL_DATABASE: "openedx"
|
OPENEDX_MYSQL_DATABASE: "openedx"
|
||||||
OPENEDX_MYSQL_USERNAME: "openedx"
|
OPENEDX_MYSQL_USERNAME: "openedx"
|
||||||
# the common version will be automatically set to "master" in the nightly branch
|
# the common version will be automatically set to "master" in the nightly branch
|
||||||
OPENEDX_COMMON_VERSION: "open-release/quince.1"
|
OPENEDX_COMMON_VERSION: "open-release/quince.2"
|
||||||
OPENEDX_EXTRA_PIP_REQUIREMENTS: []
|
OPENEDX_EXTRA_PIP_REQUIREMENTS: []
|
||||||
MYSQL_HOST: "mysql"
|
MYSQL_HOST: "mysql"
|
||||||
MYSQL_PORT: 3306
|
MYSQL_PORT: 3306
|
||||||
|
Loading…
Reference in New Issue
Block a user