tutor 23.0.0.dev3193__tar.gz → 23.0.0.dev3196__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 (110) hide show
  1. tutor-23.0.0.dev3196/.hatch_build.py +79 -0
  2. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/PKG-INFO +3 -3
  3. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/requirements/base.in +1 -2
  4. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/requirements/dev.txt +1 -1
  5. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/config.py +5 -5
  6. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/images.py +1 -1
  7. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/mounts.py +1 -1
  8. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/params.py +5 -1
  9. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/plugins.py +2 -2
  10. tutor-23.0.0.dev3193/.hatch_build.py +0 -28
  11. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/.gitignore +0 -0
  12. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/LICENSE.txt +0 -0
  13. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/README.rst +0 -0
  14. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/pyproject.toml +0 -0
  15. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/requirements/plugins.txt +0 -0
  16. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/__about__.py +0 -0
  17. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/__init__.py +0 -0
  18. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/bindmount.py +0 -0
  19. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/__init__.py +0 -0
  20. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/cli.py +0 -0
  21. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/compose.py +0 -0
  22. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/context.py +0 -0
  23. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/dev.py +0 -0
  24. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/jobs.py +0 -0
  25. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/jobs_utils.py +0 -0
  26. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/k8s.py +0 -0
  27. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/local.py +0 -0
  28. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/upgrade/__init__.py +0 -0
  29. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/upgrade/common.py +0 -0
  30. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/upgrade/compose.py +0 -0
  31. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/commands/upgrade/k8s.py +0 -0
  32. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/config.py +0 -0
  33. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/core/__init__.py +0 -0
  34. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/core/hooks/__init__.py +0 -0
  35. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/core/hooks/actions.py +0 -0
  36. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/core/hooks/contexts.py +0 -0
  37. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/core/hooks/filters.py +0 -0
  38. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/core/hooks/priorities.py +0 -0
  39. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/env.py +0 -0
  40. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/exceptions.py +0 -0
  41. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/fmt.py +0 -0
  42. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/hooks/__init__.py +0 -0
  43. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/hooks/catalog.py +0 -0
  44. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/images.py +0 -0
  45. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/interactive.py +0 -0
  46. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/plugins/__init__.py +0 -0
  47. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/plugins/base.py +0 -0
  48. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/plugins/indexes.py +0 -0
  49. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/plugins/openedx.py +0 -0
  50. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/plugins/v0.py +0 -0
  51. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/plugins/v1.py +0 -0
  52. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/py.typed +0 -0
  53. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/serialize.py +0 -0
  54. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/tasks.py +0 -0
  55. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/caddy/Caddyfile +0 -0
  56. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/config/cms.env.yml +0 -0
  57. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/config/lms.env.yml +0 -0
  58. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/config/partials/auth.yml +0 -0
  59. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/cms/__init__.py +0 -0
  60. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/cms/development.py +0 -0
  61. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/cms/production.py +0 -0
  62. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/cms/test.py +0 -0
  63. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/lms/__init__.py +0 -0
  64. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/lms/development.py +0 -0
  65. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/lms/production.py +0 -0
  66. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/lms/test.py +0 -0
  67. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/partials/common_all.py +0 -0
  68. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/partials/common_cms.py +0 -0
  69. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/partials/common_lms.py +0 -0
  70. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/settings/partials/common_test.py +0 -0
  71. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/openedx/uwsgi.ini +0 -0
  72. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/permissions/setowners.sh +0 -0
  73. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/apps/redis/redis.conf +0 -0
  74. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/Dockerfile +0 -0
  75. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/bin/reload-uwsgi +0 -0
  76. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/revisions.yml +0 -0
  77. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/settings/cms/__init__.py +0 -0
  78. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/settings/cms/assets.py +0 -0
  79. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/settings/cms/i18n.py +0 -0
  80. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/settings/lms/__init__.py +0 -0
  81. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/settings/lms/assets.py +0 -0
  82. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/settings/lms/i18n.py +0 -0
  83. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/settings/partials/assets.py +0 -0
  84. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/settings/partials/i18n.py +0 -0
  85. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/settings/uwsgi.ini +0 -0
  86. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/openedx/themes/README +0 -0
  87. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/permissions/Dockerfile +0 -0
  88. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/build/permissions/setowner.sh +0 -0
  89. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/config/base.yml +0 -0
  90. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/config/defaults.yml +0 -0
  91. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/dev/docker-compose.jobs.yml +0 -0
  92. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/dev/docker-compose.yml +0 -0
  93. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/jobs/init/cms.sh +0 -0
  94. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/jobs/init/lms.sh +0 -0
  95. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/jobs/init/meilisearch.sh +0 -0
  96. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/jobs/init/mounted-directories.sh +0 -0
  97. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/jobs/init/mysql.sh +0 -0
  98. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/k8s/deployments.yml +0 -0
  99. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/k8s/jobs.yml +0 -0
  100. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/k8s/namespace.yml +0 -0
  101. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/k8s/override.yml +0 -0
  102. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/k8s/services.yml +0 -0
  103. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/k8s/volumes.yml +0 -0
  104. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/kustomization.yml +0 -0
  105. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/local/docker-compose.jobs.yml +0 -0
  106. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/local/docker-compose.prod.yml +0 -0
  107. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/local/docker-compose.yml +0 -0
  108. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/templates/version +0 -0
  109. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/types.py +0 -0
  110. {tutor-23.0.0.dev3193 → tutor-23.0.0.dev3196}/tutor/utils.py +0 -0
@@ -0,0 +1,79 @@
1
+ # https://hatch.pypa.io/latest/how-to/config/dynamic-metadata/
2
+ import os
3
+ import re
4
+ import typing as t
5
+
6
+ from hatchling.metadata.plugin.interface import MetadataHookInterface
7
+
8
+ HERE = os.path.dirname(__file__)
9
+
10
+ # Official plugins listed in requirements/plugins.txt are all hosted under this
11
+ # GitHub organization, in a repository that has the same name as the package.
12
+ PLUGINS_GITHUB_ORG = "https://github.com/overhangio"
13
+
14
+ # Plugin requirements must be of the form "<name><version specifier>", such as
15
+ # "tutor-mfe>=22.0.0,<23.0.0". Extras, environment markers and URLs are rejected
16
+ # rather than silently dropped when the requirement is rewritten for Tutor Main.
17
+ PLUGIN_REQUIREMENT_REGEX = re.compile(
18
+ r"^(?P<name>[A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?)\s*(?P<specifier>([<>=!~]=?[^;\[\]@]*)?)$"
19
+ )
20
+
21
+
22
+ class MetaDataHook(MetadataHookInterface):
23
+ def update(self, metadata: dict[str, t.Any]) -> None:
24
+ metadata["dependencies"] = load_requirements("base.in")
25
+ metadata["optional-dependencies"] = {
26
+ "dev": load_requirements("dev.txt"),
27
+ "full": load_plugin_requirements(),
28
+ }
29
+
30
+
31
+ def load_requirements(filename: str) -> list[str]:
32
+ requirements = []
33
+ with open(
34
+ os.path.join(HERE, "requirements", filename), "rt", encoding="utf-8"
35
+ ) as f:
36
+ for line in f:
37
+ line = line.strip()
38
+ if line != "" and not line.startswith("#"):
39
+ requirements.append(line)
40
+ return requirements
41
+
42
+
43
+ def load_plugin_requirements() -> list[str]:
44
+ """
45
+ Load the official plugin requirements from requirements/plugins.txt.
46
+
47
+ That file always pins plugins to PyPI version ranges, on every branch. In
48
+ Tutor Main (i.e: when the version suffix is "main"), plugins are installed
49
+ from the main branch of their GitHub repository instead. This is the same
50
+ mechanism that sets OPENEDX_COMMON_VERSION to "master" in Tutor Main, and it
51
+ means that plugins.txt does not differ between the main and release
52
+ branches, so it never conflicts when one is merged into the other.
53
+ """
54
+ requirements = load_requirements("plugins.txt")
55
+ if load_version_suffix() != "main":
56
+ return requirements
57
+ main_requirements = []
58
+ for requirement in requirements:
59
+ match = PLUGIN_REQUIREMENT_REGEX.match(requirement)
60
+ if not match:
61
+ raise ValueError(
62
+ f"Unsupported plugin requirement: '{requirement}'. Expected "
63
+ "'<name><version specifier>' with no extras, markers or URL."
64
+ )
65
+ name = match.group("name")
66
+ main_requirements.append(f"{name}@git+{PLUGINS_GITHUB_ORG}/{name}@main")
67
+ return main_requirements
68
+
69
+
70
+ def load_version_suffix() -> str:
71
+ """
72
+ Read __version_suffix__ from tutor/__about__.py without importing tutor,
73
+ which is not installed yet at build time.
74
+ """
75
+ with open(os.path.join(HERE, "tutor", "__about__.py"), encoding="utf-8") as f:
76
+ match = re.search(r'^__version_suffix__ = "([^"]*)"', f.read(), re.MULTILINE)
77
+ if not match:
78
+ raise ValueError("Could not find __version_suffix__ in tutor/__about__.py")
79
+ return match.group(1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tutor
3
- Version: 23.0.0.dev3193
3
+ Version: 23.0.0.dev3196
4
4
  Summary: The Docker-based Open edX distribution designed for peace of mind
5
5
  Project-URL: Homepage, https://docs.tutor.edly.io/
6
6
  Project-URL: Documentation, https://docs.tutor.edly.io/
@@ -24,7 +24,7 @@ Classifier: Programming Language :: Python :: 3.13
24
24
  Classifier: Programming Language :: Python :: 3.14
25
25
  Requires-Python: >=3.10
26
26
  Requires-Dist: appdirs
27
- Requires-Dist: click<8.3.0,>=8.0
27
+ Requires-Dist: click>=8.4
28
28
  Requires-Dist: importlib-metadata>=7.0.1
29
29
  Requires-Dist: importlib-resources>=6.1.1
30
30
  Requires-Dist: jinja2>=2.10
@@ -44,7 +44,7 @@ Requires-Dist: cachetools==5.5.2; extra == 'dev'
44
44
  Requires-Dist: certifi==2025.8.3; extra == 'dev'
45
45
  Requires-Dist: charset-normalizer==3.4.7; extra == 'dev'
46
46
  Requires-Dist: click-log==0.4.0; extra == 'dev'
47
- Requires-Dist: click==8.1.8; extra == 'dev'
47
+ Requires-Dist: click==8.5.0; extra == 'dev'
48
48
  Requires-Dist: coverage==7.10.7; extra == 'dev'
49
49
  Requires-Dist: docutils==0.22.4; extra == 'dev'
50
50
  Requires-Dist: durationpy==0.10; extra == 'dev'
@@ -1,6 +1,5 @@
1
1
  appdirs
2
- # TODO: remove 8.3.0 when https://github.com/overhangio/tutor/issues/1276 is resolved completely
3
- click>=8.0,<8.3.0
2
+ click>=8.4
4
3
  jinja2>=2.10
5
4
  kubernetes
6
5
  mypy
@@ -29,7 +29,7 @@ charset-normalizer==3.4.7
29
29
  # via
30
30
  # -r requirements/base.txt
31
31
  # requests
32
- click==8.1.8
32
+ click==8.5.0
33
33
  # via
34
34
  # -r requirements/base.txt
35
35
  # click-log
@@ -12,7 +12,7 @@ from tutor import config as tutor_config
12
12
  from tutor import env, exceptions, fmt, hooks, serialize, utils
13
13
  from tutor import interactive as interactive_config
14
14
  from tutor.commands.context import Context
15
- from tutor.commands.params import ConfigLoaderParam
15
+ from tutor.commands.params import ConfigLoaderParam, ParamValue
16
16
  from tutor.types import Config, ConfigValue
17
17
 
18
18
 
@@ -25,7 +25,7 @@ def config_command() -> None:
25
25
  pass
26
26
 
27
27
 
28
- class ConfigKeyParamType(ConfigLoaderParam):
28
+ class ConfigKeyParamType(ConfigLoaderParam[ParamValue]):
29
29
  name = "configkey"
30
30
 
31
31
  def shell_complete(
@@ -49,7 +49,7 @@ class ConfigKeyParamType(ConfigLoaderParam):
49
49
  yield from self.config.items()
50
50
 
51
51
 
52
- class ConfigKeyValParamType(ConfigKeyParamType):
52
+ class ConfigKeyValParamType(ConfigKeyParamType[tuple[str, t.Any]]):
53
53
  """
54
54
  Parser for <KEY>=<YAML VALUE> command line arguments.
55
55
  """
@@ -131,7 +131,7 @@ class ConfigListKeyValParamType(ConfigKeyValParamType):
131
131
  "--unset",
132
132
  "unset_vars",
133
133
  multiple=True,
134
- type=ConfigKeyParamType(),
134
+ type=ConfigKeyParamType[str](),
135
135
  help="Remove a configuration value (can be used multiple times)",
136
136
  )
137
137
  @click.option(
@@ -221,7 +221,7 @@ def printroot(context: Context) -> None:
221
221
 
222
222
 
223
223
  @click.command(help="Print a configuration value")
224
- @click.argument("key", type=ConfigKeyParamType())
224
+ @click.argument("key", type=ConfigKeyParamType[str]())
225
225
  @click.pass_obj
226
226
  def printvalue(context: Context, key: str) -> None:
227
227
  config = tutor_config.load(context.root)
@@ -88,7 +88,7 @@ def _add_core_images_to_push(
88
88
  return remote_images
89
89
 
90
90
 
91
- class ImageNameParam(ConfigLoaderParam):
91
+ class ImageNameParam(ConfigLoaderParam[str]):
92
92
  """
93
93
  Convenient auto-completion of image names.
94
94
  """
@@ -12,7 +12,7 @@ from tutor.commands.context import Context
12
12
  from tutor.commands.params import ConfigLoaderParam
13
13
 
14
14
 
15
- class MountParamType(ConfigLoaderParam):
15
+ class MountParamType(ConfigLoaderParam[str]):
16
16
  name = "mount"
17
17
 
18
18
  def shell_complete(
@@ -6,8 +6,12 @@ from tutor import config as tutor_config
6
6
  from tutor import hooks
7
7
  from tutor.types import Config
8
8
 
9
+ # Type of the value produced by the param type `convert` method. Since click 8.4,
10
+ # `click.ParamType` is generic and must be parameterized with that type.
11
+ ParamValue = t.TypeVar("ParamValue")
9
12
 
10
- class ConfigLoaderParam(click.ParamType):
13
+
14
+ class ConfigLoaderParam(click.ParamType[ParamValue]):
11
15
  """
12
16
  Convenient param child class that automatically loads the user configuration on auto-complete.
13
17
  """
@@ -19,7 +19,7 @@ from tutor.types import Config
19
19
  from .context import Context
20
20
 
21
21
 
22
- class PluginName(click.ParamType):
22
+ class PluginName(click.ParamType[str]):
23
23
  """
24
24
  Convenient param type that supports autocompletion of installed plugin names.
25
25
  """
@@ -44,7 +44,7 @@ class PluginName(click.ParamType):
44
44
  return [name for name in candidates if name.startswith(incomplete)]
45
45
 
46
46
 
47
- class IndexPluginName(click.ParamType):
47
+ class IndexPluginName(click.ParamType[str]):
48
48
  """
49
49
  Param type for auto-completion of plugin names found in index cache.
50
50
  """
@@ -1,28 +0,0 @@
1
- # https://hatch.pypa.io/latest/how-to/config/dynamic-metadata/
2
- import os
3
- import typing as t
4
-
5
- from hatchling.metadata.plugin.interface import MetadataHookInterface
6
-
7
- HERE = os.path.dirname(__file__)
8
-
9
-
10
- class MetaDataHook(MetadataHookInterface):
11
- def update(self, metadata: dict[str, t.Any]) -> None:
12
- metadata["dependencies"] = load_requirements("base.in")
13
- metadata["optional-dependencies"] = {
14
- "dev": load_requirements("dev.txt"),
15
- "full": load_requirements("plugins.txt"),
16
- }
17
-
18
-
19
- def load_requirements(filename: str) -> list[str]:
20
- requirements = []
21
- with open(
22
- os.path.join(HERE, "requirements", filename), "rt", encoding="utf-8"
23
- ) as f:
24
- for line in f:
25
- line = line.strip()
26
- if line != "" and not line.startswith("#"):
27
- requirements.append(line)
28
- return requirements