python-interactive-courses 1.0.0__tar.gz → 1.0.1__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 (49) hide show
  1. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/PKG-INFO +1 -1
  2. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/pyproject.toml +1 -1
  3. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/pyproject.toml.orig +1 -1
  4. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/cli.py +3 -2
  5. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/dependencies.py +9 -4
  6. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/LICENSE +0 -0
  7. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/README.md +0 -0
  8. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/__init__.py +0 -0
  9. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/actions.py +0 -0
  10. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/key_listener.py +0 -0
  11. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/prompts.py +0 -0
  12. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/pyics.py +0 -0
  13. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/data/__init__.py +0 -0
  14. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/data/course.py +0 -0
  15. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/data/task.py +0 -0
  16. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/__init__.py +0 -0
  17. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/archive.py +0 -0
  18. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/fetch.py +0 -0
  19. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/pull.py +0 -0
  20. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/slugs.py +0 -0
  21. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/sources.py +0 -0
  22. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/__init__.py +0 -0
  23. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/cells.py +0 -0
  24. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/loader.py +0 -0
  25. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/sections.py +0 -0
  26. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/plugins.py +0 -0
  27. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/console.py +0 -0
  28. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/create_course.py +0 -0
  29. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/create_task.py +0 -0
  30. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/edit_course.py +0 -0
  31. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/edit_task.py +0 -0
  32. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/main.py +0 -0
  33. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/pack.py +0 -0
  34. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/pull.py +0 -0
  35. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/sources.py +0 -0
  36. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/__init__.py +0 -0
  37. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/capture.py +0 -0
  38. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/check_specs.py +0 -0
  39. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/check_structure.py +0 -0
  40. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/compare.py +0 -0
  41. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/pytest_integration.py +0 -0
  42. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/results.py +0 -0
  43. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/tests.py +0 -0
  44. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/trace.py +0 -0
  45. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/discovery.py +0 -0
  46. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/json_handling.py +0 -0
  47. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/logging.py +0 -0
  48. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/paths.py +0 -0
  49. {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/terminal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-interactive-courses
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: PyICs (Python Interactive Courses) is a modular framework for teaching programming in Python locally, allowing for co-learning of a programming environment.
5
5
  Author: johannes-langer
6
6
  Author-email: johannes-langer <johannes.langer@uni-bamberg.de>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-interactive-courses"
3
- version = "1.0.0"
3
+ version = "1.0.1"
4
4
  description = "PyICs (Python Interactive Courses) is a modular framework for teaching programming in Python locally, allowing for co-learning of a programming environment."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.14"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-interactive-courses"
3
- version = "1.0.0"
3
+ version = "1.0.1"
4
4
  description = "PyICs (Python Interactive Courses) is a modular framework for teaching programming in Python locally, allowing for co-learning of a programming environment."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.14"
@@ -1,4 +1,3 @@
1
- import importlib.metadata
2
1
  import sys
3
2
  import threading
4
3
  import time
@@ -16,6 +15,8 @@ from rich.segment import Segment
16
15
  from rich.table import Table
17
16
  from rich.text import Text, TextType
18
17
 
18
+ from pyics.distribution import dependencies
19
+
19
20
  # the escape codes not used here are re-exported, as they used to be defined here
20
21
  from pyics.util.terminal import ( # noqa: F401
21
22
  ALT_SCREEN_ENTER,
@@ -109,7 +110,7 @@ class CLI:
109
110
 
110
111
  return Panel(
111
112
  table,
112
- title=f"[blue]PyICs[white] {importlib.metadata.version('pyics')}",
113
+ title=f"[blue]PyICs[white] {dependencies.pyics_version()}",
113
114
  title_align="left",
114
115
  border_style="blue",
115
116
  box=box.ROUNDED,
@@ -34,6 +34,10 @@ from pyics.util import json_handling as json
34
34
  # always available to a course: pyics itself, and the standard library
35
35
  _ALWAYS_ALLOWED = frozenset({"pyics", *sys.stdlib_module_names})
36
36
 
37
+ # the name pyics is published under (e.g. on PyPI), which differs from its module name:
38
+ # what is installed, upgraded and looked up for its version
39
+ DISTRIBUTION = "python-interactive-courses"
40
+
37
41
 
38
42
  class MissingDependencyError(ImportError):
39
43
  """A task needs a package that isn't installed."""
@@ -47,7 +51,7 @@ class ModuleNotAllowedError(Exception):
47
51
  def pyics_version() -> str:
48
52
  """The installed version of pyics."""
49
53
  try:
50
- return importlib.metadata.version("pyics")
54
+ return importlib.metadata.version(DISTRIBUTION)
51
55
  except importlib.metadata.PackageNotFoundError:
52
56
  return "0"
53
57
 
@@ -171,12 +175,12 @@ def _tool_install_note(requirements: Sequence[str]) -> str | None:
171
175
  tool by uv or pipx, which recreate its environment when it is upgraded."""
172
176
  parts = [part.lower() for part in Path(sys.prefix).parts]
173
177
  if "pipx" in parts and "venvs" in parts:
174
- return f"pyics is installed with pipx, so you can also run: pipx inject pyics {' '.join(requirements)}"
178
+ return f"pyics is installed with pipx, so you can also run: pipx inject {DISTRIBUTION} {' '.join(requirements)}"
175
179
  if "tools" in parts and any("uv" in part for part in parts):
176
180
  withs = " ".join(f"--with {shlex.quote(r)}" for r in requirements)
177
181
  return (
178
182
  "pyics is installed as a uv tool: to keep these packages when it is "
179
- f"upgraded, reinstall it with: uv tool install pyics {withs}"
183
+ f"upgraded, reinstall it with: uv tool install {DISTRIBUTION} {withs}"
180
184
  )
181
185
  return None
182
186
 
@@ -193,7 +197,8 @@ def install_hint(problems: Iterable[Problem]) -> str:
193
197
  hints.append(note)
194
198
  if any(p.requirement.startswith("pyics") and not p.installable for p in problems):
195
199
  hints.append(
196
- "Upgrade pyics with: " + format_command(install_command(["-U", "pyics"]))
200
+ "Upgrade pyics with: "
201
+ + format_command(install_command(["-U", DISTRIBUTION]))
197
202
  )
198
203
  return " ".join(hints)
199
204