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.
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/PKG-INFO +1 -1
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/pyproject.toml +1 -1
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/pyproject.toml.orig +1 -1
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/cli.py +3 -2
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/dependencies.py +9 -4
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/LICENSE +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/README.md +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/__init__.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/actions.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/key_listener.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/prompts.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/pyics.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/data/__init__.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/data/course.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/data/task.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/__init__.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/archive.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/fetch.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/pull.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/slugs.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/sources.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/__init__.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/cells.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/loader.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/sections.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/plugins.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/console.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/create_course.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/create_task.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/edit_course.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/edit_task.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/main.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/pack.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/pull.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/sources.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/__init__.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/capture.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/check_specs.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/check_structure.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/compare.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/pytest_integration.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/results.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/tests.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/trace.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/discovery.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/json_handling.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/logging.py +0 -0
- {python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/paths.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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] {
|
|
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(
|
|
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
|
|
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
|
|
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: "
|
|
200
|
+
"Upgrade pyics with: "
|
|
201
|
+
+ format_command(install_command(["-U", DISTRIBUTION]))
|
|
197
202
|
)
|
|
198
203
|
return " ".join(hints)
|
|
199
204
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/actions.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/key_listener.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/prompts.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/app/pyics.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/data/__init__.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/data/course.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/data/task.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/distribution/pull.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/__init__.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/cells.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/loader.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/notebook/sections.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/console.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/edit_task.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/main.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/pack.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/pull.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/scripts/sources.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/__init__.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/capture.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/check_specs.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/compare.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/results.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/tests.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/tests/trace.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/discovery.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/logging.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/paths.py
RENAMED
|
File without changes
|
{python_interactive_courses-1.0.0 → python_interactive_courses-1.0.1}/src/pyics/util/terminal.py
RENAMED
|
File without changes
|