paces 0.0.8__tar.gz → 0.0.9__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 (37) hide show
  1. {paces-0.0.8 → paces-0.0.9}/PKG-INFO +24 -6
  2. {paces-0.0.8 → paces-0.0.9}/README.md +23 -5
  3. {paces-0.0.8 → paces-0.0.9}/paces/pose.py +11 -2
  4. {paces-0.0.8 → paces-0.0.9}/pyproject.toml +7 -2
  5. {paces-0.0.8 → paces-0.0.9}/tests/test_pose.py +30 -0
  6. {paces-0.0.8 → paces-0.0.9}/.gitignore +0 -0
  7. {paces-0.0.8 → paces-0.0.9}/LICENSE +0 -0
  8. {paces-0.0.8 → paces-0.0.9}/docs/README.md +0 -0
  9. {paces-0.0.8 → paces-0.0.9}/docs/alignment/README.md +0 -0
  10. {paces-0.0.8 → paces-0.0.9}/docs/poc-reference/README.md +0 -0
  11. {paces-0.0.8 → paces-0.0.9}/docs/poc-reference/artifacts/clips.json +0 -0
  12. {paces-0.0.8 → paces-0.0.9}/paces/__init__.py +0 -0
  13. {paces-0.0.8 → paces-0.0.9}/paces/__main__.py +0 -0
  14. {paces-0.0.8 → paces-0.0.9}/paces/derivation.py +0 -0
  15. {paces-0.0.8 → paces-0.0.9}/paces/edits.py +0 -0
  16. {paces-0.0.8 → paces-0.0.9}/paces/excerpts.py +0 -0
  17. {paces-0.0.8 → paces-0.0.9}/paces/measure.py +0 -0
  18. {paces-0.0.8 → paces-0.0.9}/paces/model.py +0 -0
  19. {paces-0.0.8 → paces-0.0.9}/paces/projection.py +0 -0
  20. {paces-0.0.8 → paces-0.0.9}/paces/render.py +0 -0
  21. {paces-0.0.8 → paces-0.0.9}/paces/segmenters.py +0 -0
  22. {paces-0.0.8 → paces-0.0.9}/paces/tools.py +0 -0
  23. {paces-0.0.8 → paces-0.0.9}/tests/audio_synth.py +0 -0
  24. {paces-0.0.8 → paces-0.0.9}/tests/data/routine.json +0 -0
  25. {paces-0.0.8 → paces-0.0.9}/tests/poc_fixture.py +0 -0
  26. {paces-0.0.8 → paces-0.0.9}/tests/test_chapters.py +0 -0
  27. {paces-0.0.8 → paces-0.0.9}/tests/test_cli_surface.py +0 -0
  28. {paces-0.0.8 → paces-0.0.9}/tests/test_derivation.py +0 -0
  29. {paces-0.0.8 → paces-0.0.9}/tests/test_edits.py +0 -0
  30. {paces-0.0.8 → paces-0.0.9}/tests/test_excerpts.py +0 -0
  31. {paces-0.0.8 → paces-0.0.9}/tests/test_measure.py +0 -0
  32. {paces-0.0.8 → paces-0.0.9}/tests/test_render_media.py +0 -0
  33. {paces-0.0.8 → paces-0.0.9}/tests/test_roundtrip_poc.py +0 -0
  34. {paces-0.0.8 → paces-0.0.9}/tests/test_segment.py +0 -0
  35. {paces-0.0.8 → paces-0.0.9}/tests/test_smoke.py +0 -0
  36. {paces-0.0.8 → paces-0.0.9}/tests/test_vertical_slice.py +0 -0
  37. {paces-0.0.8 → paces-0.0.9}/tests/video_synth.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: paces
3
- Version: 0.0.8
3
+ Version: 0.0.9
4
4
  Summary: Turn instructional media into structured, interactive learning material
5
5
  Project-URL: Homepage, https://github.com/thorwhalen/paces
6
6
  Project-URL: Repository, https://github.com/thorwhalen/paces
@@ -109,11 +109,29 @@ quarantined into one — is the **ultralytics** distribution, which is AGPL-3.0.
109
109
 
110
110
  What it pulls in is a different question, and worth stating plainly: rtmlib
111
111
  requires opencv, and opencv's *bundled FFmpeg* is **GPL-3.0-or-later on macOS
112
- wheels** (built `--enable-gpl` with libx264/libx265) though LGPL-2.1-or-later
113
- on manylinux and Windows. This is measured from the shipped binaries the
114
- wheels' own `LICENSE-3RD-PARTY.txt` never mentions x264. `paces[media]`
115
- already brings such a wheel, so `[pose]` adds a second copy rather than a
116
- higher tier. `paces.pose.check_pose_requirements()` reports what you have.
112
+ wheels of the versions measured (4.12.0.88 / 4.13.0.92)** (built `--enable-gpl`
113
+ with libx264/libx265) though LGPL-2.1-or-later on manylinux and Windowsa
114
+ per-version fact, not a per-platform one: the 5.0.0.93 macOS x86_64 wheel ships
115
+ no FFmpeg at all. This is measured from the shipped binaries the wheels' own
116
+ `LICENSE-3RD-PARTY.txt` never mentions x264. `paces[media]` already brings such
117
+ a wheel, so `[pose]` adds a second copy rather than a higher tier. Worse:
118
+ rtmlib's own metadata requires *both* `opencv-python` *and*
119
+ `opencv-contrib-python`, unpinned, so a plain `pip install paces[media,pose]`
120
+ ends up with two distributions owning one `cv2` — harmless until either is
121
+ uninstalled, at which point the survivor's `cv2` can be left with files
122
+ missing (issue #20). rtmlib only calls plain `cv2` APIs (`VideoCapture`,
123
+ `dnn.readNetFromONNX`, drawing helpers — nothing contrib-only), so `[media]`'s
124
+ `opencv-contrib-python` already covers it; to keep the closure
125
+ single-provider, install in two steps instead of one:
126
+
127
+ ```bash
128
+ pip install "paces[media]" # opencv-contrib-python, the fleet's one cv2
129
+ pip install --no-deps "rtmlib>=0.0.16,<0.1" # skip rtmlib's own opencv-* re-declaration
130
+ pip install onnxruntime tqdm # rtmlib's other real deps (numpy already arrives via opencv)
131
+ ```
132
+
133
+ `paces.pose.check_pose_requirements()` reports what you have, and names the
134
+ repair command if both providers are already present.
117
135
 
118
136
  ## How it thinks
119
137
 
@@ -71,11 +71,29 @@ quarantined into one — is the **ultralytics** distribution, which is AGPL-3.0.
71
71
 
72
72
  What it pulls in is a different question, and worth stating plainly: rtmlib
73
73
  requires opencv, and opencv's *bundled FFmpeg* is **GPL-3.0-or-later on macOS
74
- wheels** (built `--enable-gpl` with libx264/libx265) though LGPL-2.1-or-later
75
- on manylinux and Windows. This is measured from the shipped binaries the
76
- wheels' own `LICENSE-3RD-PARTY.txt` never mentions x264. `paces[media]`
77
- already brings such a wheel, so `[pose]` adds a second copy rather than a
78
- higher tier. `paces.pose.check_pose_requirements()` reports what you have.
74
+ wheels of the versions measured (4.12.0.88 / 4.13.0.92)** (built `--enable-gpl`
75
+ with libx264/libx265) though LGPL-2.1-or-later on manylinux and Windowsa
76
+ per-version fact, not a per-platform one: the 5.0.0.93 macOS x86_64 wheel ships
77
+ no FFmpeg at all. This is measured from the shipped binaries the wheels' own
78
+ `LICENSE-3RD-PARTY.txt` never mentions x264. `paces[media]` already brings such
79
+ a wheel, so `[pose]` adds a second copy rather than a higher tier. Worse:
80
+ rtmlib's own metadata requires *both* `opencv-python` *and*
81
+ `opencv-contrib-python`, unpinned, so a plain `pip install paces[media,pose]`
82
+ ends up with two distributions owning one `cv2` — harmless until either is
83
+ uninstalled, at which point the survivor's `cv2` can be left with files
84
+ missing (issue #20). rtmlib only calls plain `cv2` APIs (`VideoCapture`,
85
+ `dnn.readNetFromONNX`, drawing helpers — nothing contrib-only), so `[media]`'s
86
+ `opencv-contrib-python` already covers it; to keep the closure
87
+ single-provider, install in two steps instead of one:
88
+
89
+ ```bash
90
+ pip install "paces[media]" # opencv-contrib-python, the fleet's one cv2
91
+ pip install --no-deps "rtmlib>=0.0.16,<0.1" # skip rtmlib's own opencv-* re-declaration
92
+ pip install onnxruntime tqdm # rtmlib's other real deps (numpy already arrives via opencv)
93
+ ```
94
+
95
+ `paces.pose.check_pose_requirements()` reports what you have, and names the
96
+ repair command if both providers are already present.
79
97
 
80
98
  ## How it thinks
81
99
 
@@ -412,7 +412,12 @@ def check_pose_requirements() -> dict:
412
412
  ``opencv-contrib-python``, while the fleet standardises on the contrib
413
413
  superset (mixing's single cv2 provider). An install can therefore end up
414
414
  with two distributions owning one ``cv2`` package. Reported, not fatal:
415
- it works until one of them is uninstalled, and a reader deserves to know.
415
+ it works until one of them is uninstalled, and a reader deserves to know
416
+ — and, since neither package's uninstall is safe once both are present
417
+ (each claims files the other also claims), the note names the repair
418
+ command rather than only the collision. See README's "Auto-crop" section
419
+ for the install recipe that avoids the pair in the first place
420
+ (issue #20).
416
421
 
417
422
  Downloads nothing: weights arrive on first inference, not on this check.
418
423
  """
@@ -449,7 +454,11 @@ def check_pose_requirements() -> dict:
449
454
  notes.append(
450
455
  "two distributions provide cv2 "
451
456
  f"({', '.join(cv2_providers)}) — rtmlib declares both; uninstalling "
452
- "either can leave the other's cv2 broken"
457
+ "either can leave the other's cv2 broken. Repair: "
458
+ "pip uninstall -y opencv-python opencv-contrib-python && "
459
+ "pip install --force-reinstall opencv-contrib-python — not sticky: "
460
+ "the next plain `pip install paces[pose]` re-adds opencv-python, "
461
+ "so use README's Auto-crop install recipe to avoid it recurring"
453
462
  )
454
463
  return {
455
464
  "ok": rtmlib_version is not None and onnxruntime_version is not None,
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "paces"
9
- version = "0.0.8"
9
+ version = "0.0.9"
10
10
  description = "Turn instructional media into structured, interactive learning material"
11
11
  readme = "README.md"
12
12
  license = "MIT"
@@ -89,7 +89,12 @@ media = [
89
89
  # unaudited wheel in silently.
90
90
  # Not mirrored into [dev] on purpose: the tests are offline and stay on fake
91
91
  # locators (no weights, no network), and CI has no reason to take on the second
92
- # cv2 provider. `check_pose_requirements()` reports that pair when it happens.
92
+ # cv2 provider. `check_pose_requirements()` reports that pair when it happens
93
+ # and names the repair command; README's "Auto-crop" section has the two-step
94
+ # install recipe that avoids the pair in the first place (issue #20). Not
95
+ # fixable from here: rtmlib declares both wheels unconditionally, with no
96
+ # marker paces can override, so a single-provider closure needs either that
97
+ # recipe or an upstream rtmlib change — not a pin in this file.
93
98
  pose = [
94
99
  "rtmlib>=0.0.16,<0.1",
95
100
  "onnxruntime",
@@ -439,6 +439,36 @@ def test_check_pose_requirements_reports_channels_without_downloading():
439
439
  assert any("paces[pose]" in note for note in report["notes"])
440
440
 
441
441
 
442
+ def test_check_pose_requirements_names_the_repair_when_both_cv2_providers_present(
443
+ monkeypatch,
444
+ ):
445
+ # issue #20: rtmlib declares both opencv-python and opencv-contrib-python.
446
+ # Naming the collision isn't enough — a reader who hits it needs the
447
+ # repair command, not just the two package names, since neither package's
448
+ # uninstall is safe once both are present (each claims the other's files).
449
+ import importlib.metadata
450
+
451
+ installed = {
452
+ "rtmlib": "0.0.16",
453
+ "onnxruntime": "1.2.3",
454
+ "opencv-python": "4.12.0.88",
455
+ "opencv-contrib-python": "4.13.0.92",
456
+ }
457
+
458
+ def fake_version(distribution, *args, **kwargs):
459
+ try:
460
+ return installed[distribution]
461
+ except KeyError:
462
+ raise importlib.metadata.PackageNotFoundError(distribution)
463
+
464
+ monkeypatch.setattr(importlib.metadata, "version", fake_version)
465
+ report = check_pose_requirements()
466
+ assert report["cv2_providers"] == ["opencv-python", "opencv-contrib-python"]
467
+ assert any(
468
+ "pip install --force-reinstall" in note for note in report["notes"]
469
+ )
470
+
471
+
442
472
  # ── the licence perimeter (packaging facts, guarded because nothing else is) ─
443
473
 
444
474
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes