shuttlecheck 0.2.1__tar.gz → 0.4.0__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.
- {shuttlecheck-0.2.1/shuttlecheck.egg-info → shuttlecheck-0.4.0}/PKG-INFO +25 -13
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/PYPI.md +21 -12
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/README.md +26 -26
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/pyproject.toml +74 -60
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/__init__.py +4 -4
- shuttlecheck-0.4.0/shuttlecheck/admission.py +292 -0
- shuttlecheck-0.4.0/shuttlecheck/ale.py +263 -0
- shuttlecheck-0.4.0/shuttlecheck/aliases.py +183 -0
- shuttlecheck-0.4.0/shuttlecheck/arrivals.py +659 -0
- shuttlecheck-0.4.0/shuttlecheck/attribution.py +172 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/auth.py +130 -10
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/checks.py +19 -5
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/cli.py +99 -6
- shuttlecheck-0.4.0/shuttlecheck/completeness.py +757 -0
- shuttlecheck-0.4.0/shuttlecheck/conventions.py +580 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/delivery.py +124 -16
- shuttlecheck-0.4.0/shuttlecheck/endpoints.py +481 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/extensions.py +2 -2
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/infer.py +175 -17
- shuttlecheck-0.4.0/shuttlecheck/jobs.py +794 -0
- shuttlecheck-0.4.0/shuttlecheck/journal.py +167 -0
- shuttlecheck-0.4.0/shuttlecheck/listener.py +317 -0
- shuttlecheck-0.4.0/shuttlecheck/marks.py +89 -0
- shuttlecheck-0.4.0/shuttlecheck/mhl.py +482 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/patterns.py +37 -3
- shuttlecheck-0.4.0/shuttlecheck/prefolder.py +163 -0
- shuttlecheck-0.4.0/shuttlecheck/probe.py +278 -0
- shuttlecheck-0.4.0/shuttlecheck/provenance.py +224 -0
- shuttlecheck-0.4.0/shuttlecheck/receive.py +1079 -0
- shuttlecheck-0.4.0/shuttlecheck/report.py +552 -0
- shuttlecheck-0.4.0/shuttlecheck/say.py +56 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/schedule.py +2 -2
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/schema.json +48 -2
- shuttlecheck-0.4.0/shuttlecheck/seal.py +418 -0
- shuttlecheck-0.4.0/shuttlecheck/seal_api.py +201 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/sidecar.py +240 -10
- shuttlecheck-0.4.0/shuttlecheck/sizing.py +107 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/spec.py +134 -6
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/store.py +124 -12
- shuttlecheck-0.4.0/shuttlecheck/support.py +465 -0
- shuttlecheck-0.4.0/shuttlecheck/templates.py +120 -0
- shuttlecheck-0.4.0/shuttlecheck/today.py +413 -0
- shuttlecheck-0.4.0/shuttlecheck/transport.py +540 -0
- shuttlecheck-0.4.0/shuttlecheck/ui.py +2366 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/app.css +596 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/app.html +50 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/app.js +2547 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/classic.css +3301 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/classic.html +115 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/classic.js +11165 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/fonts/display-LICENSE.txt +93 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/fonts/display.woff2 +0 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/fonts/inter-LICENSE.txt +93 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/fonts/inter.woff2 +0 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/fonts/mono-LICENSE.txt +93 -0
- shuttlecheck-0.4.0/shuttlecheck/ui_assets/fonts/mono.woff2 +0 -0
- shuttlecheck-0.4.0/shuttlecheck/updates.py +154 -0
- shuttlecheck-0.4.0/shuttlecheck/validate.py +880 -0
- shuttlecheck-0.4.0/shuttlecheck/version.py +1 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/walkthrough.py +4 -4
- shuttlecheck-0.4.0/shuttlecheck/window.py +190 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0/shuttlecheck.egg-info}/PKG-INFO +25 -13
- shuttlecheck-0.4.0/shuttlecheck.egg-info/SOURCES.txt +150 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck.egg-info/requires.txt +4 -0
- shuttlecheck-0.4.0/tests/test_admission.py +279 -0
- shuttlecheck-0.4.0/tests/test_ale.py +164 -0
- shuttlecheck-0.4.0/tests/test_aliases.py +271 -0
- shuttlecheck-0.4.0/tests/test_allocate.py +401 -0
- shuttlecheck-0.4.0/tests/test_arrivals.py +705 -0
- shuttlecheck-0.4.0/tests/test_auth_packaged.py +64 -0
- shuttlecheck-0.4.0/tests/test_check_against.py +163 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_classify.py +58 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_cli.py +33 -2
- shuttlecheck-0.4.0/tests/test_completeness.py +545 -0
- shuttlecheck-0.4.0/tests/test_consoles.py +224 -0
- shuttlecheck-0.4.0/tests/test_conventions.py +254 -0
- shuttlecheck-0.4.0/tests/test_conventions_routes.py +183 -0
- shuttlecheck-0.4.0/tests/test_counting_files.py +176 -0
- shuttlecheck-0.4.0/tests/test_dailies.py +163 -0
- shuttlecheck-0.4.0/tests/test_dailiesdrop.py +379 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_delivery.py +151 -1
- shuttlecheck-0.4.0/tests/test_device_flow.py +213 -0
- shuttlecheck-0.4.0/tests/test_due.py +381 -0
- shuttlecheck-0.4.0/tests/test_endpoints.py +245 -0
- shuttlecheck-0.4.0/tests/test_enrolment.py +270 -0
- shuttlecheck-0.4.0/tests/test_fleet_units.py +206 -0
- shuttlecheck-0.4.0/tests/test_folders.py +164 -0
- shuttlecheck-0.4.0/tests/test_fonts.py +118 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_groups.py +29 -2
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_infer.py +1 -1
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_infer_keys.py +7 -2
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_jobs.py +30 -0
- shuttlecheck-0.4.0/tests/test_keepable.py +121 -0
- shuttlecheck-0.4.0/tests/test_lamps.py +380 -0
- shuttlecheck-0.4.0/tests/test_listener.py +233 -0
- shuttlecheck-0.4.0/tests/test_marks_api.py +76 -0
- shuttlecheck-0.4.0/tests/test_message_style.py +118 -0
- shuttlecheck-0.4.0/tests/test_meters_measure.py +138 -0
- shuttlecheck-0.4.0/tests/test_mhl.py +343 -0
- shuttlecheck-0.4.0/tests/test_min_version.py +134 -0
- shuttlecheck-0.4.0/tests/test_monitor.py +343 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_no_convention.py +9 -3
- shuttlecheck-0.4.0/tests/test_one_file_is_not_a_pattern.py +174 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_originals.py +1 -1
- shuttlecheck-0.4.0/tests/test_pointed_at_the_job.py +140 -0
- shuttlecheck-0.4.0/tests/test_prefolder.py +91 -0
- shuttlecheck-0.4.0/tests/test_problems.py +164 -0
- shuttlecheck-0.4.0/tests/test_provenance.py +214 -0
- shuttlecheck-0.4.0/tests/test_rack.py +2218 -0
- shuttlecheck-0.4.0/tests/test_receive.py +413 -0
- shuttlecheck-0.4.0/tests/test_rename_token.py +161 -0
- shuttlecheck-0.4.0/tests/test_report.py +75 -0
- shuttlecheck-0.4.0/tests/test_reveal.py +155 -0
- shuttlecheck-0.4.0/tests/test_rollcall_schedule.py +336 -0
- shuttlecheck-0.4.0/tests/test_signal_path.py +653 -0
- shuttlecheck-0.4.0/tests/test_sizing.py +206 -0
- shuttlecheck-0.4.0/tests/test_sizing_history.py +175 -0
- shuttlecheck-0.4.0/tests/test_source_attach.py +216 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_store.py +40 -2
- shuttlecheck-0.4.0/tests/test_support.py +299 -0
- shuttlecheck-0.4.0/tests/test_sweeping.py +189 -0
- shuttlecheck-0.4.0/tests/test_templates.py +120 -0
- shuttlecheck-0.4.0/tests/test_the_04_window.py +172 -0
- shuttlecheck-0.4.0/tests/test_the_analyser.py +426 -0
- shuttlecheck-0.4.0/tests/test_the_pipeline.py +2006 -0
- shuttlecheck-0.4.0/tests/test_today.py +670 -0
- shuttlecheck-0.4.0/tests/test_today_screen.py +210 -0
- shuttlecheck-0.4.0/tests/test_trademark.py +212 -0
- shuttlecheck-0.4.0/tests/test_transport.py +394 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_ui.py +12 -7
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_ui_routes.py +194 -0
- shuttlecheck-0.4.0/tests/test_unread_sources.py +143 -0
- shuttlecheck-0.4.0/tests/test_updates.py +263 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_validate.py +16 -6
- shuttlecheck-0.4.0/tests/test_walk.py +313 -0
- shuttlecheck-0.4.0/tests/test_web_seal.py +241 -0
- shuttlecheck-0.4.0/tests/test_what_the_far_end_reads.py +95 -0
- shuttlecheck-0.4.0/tests/test_where_it_belongs.py +396 -0
- shuttlecheck-0.4.0/tests/test_window.py +293 -0
- shuttlecheck-0.2.1/shuttlecheck/jobs.py +0 -464
- shuttlecheck-0.2.1/shuttlecheck/report.py +0 -218
- shuttlecheck-0.2.1/shuttlecheck/ui.py +0 -688
- shuttlecheck-0.2.1/shuttlecheck/ui_assets/app.css +0 -324
- shuttlecheck-0.2.1/shuttlecheck/ui_assets/app.html +0 -26
- shuttlecheck-0.2.1/shuttlecheck/ui_assets/app.js +0 -934
- shuttlecheck-0.2.1/shuttlecheck/validate.py +0 -474
- shuttlecheck-0.2.1/shuttlecheck/version.py +0 -1
- shuttlecheck-0.2.1/shuttlecheck.egg-info/SOURCES.txt +0 -53
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/LICENSE +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/setup.cfg +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/originals.py +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/telemetry-v1.schema.json +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck/telemetry.py +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck.egg-info/dependency_links.txt +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck.egg-info/entry_points.txt +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/shuttlecheck.egg-info/top_level.txt +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_auth.py +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_path_length.py +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_pick.py +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_telemetry.py +0 -0
- {shuttlecheck-0.2.1 → shuttlecheck-0.4.0}/tests/test_verify.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: shuttlecheck
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: Check media filenames, folder structure and deliverables against a written convention. Read-only.
|
|
5
5
|
Author-email: MVRK Systems <hello@mvrk.systems>
|
|
6
6
|
License: Proprietary — free to use, no redistribution
|
|
@@ -26,12 +26,15 @@ Description-Content-Type: text/markdown
|
|
|
26
26
|
License-File: LICENSE
|
|
27
27
|
Requires-Dist: PyYAML>=6.0
|
|
28
28
|
Requires-Dist: jsonschema>=4.20
|
|
29
|
+
Requires-Dist: xxhash>=3.0
|
|
29
30
|
Requires-Dist: tzdata>=2024.1; sys_platform == "win32"
|
|
30
31
|
Provides-Extra: dev
|
|
31
32
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
33
|
+
Provides-Extra: app
|
|
34
|
+
Requires-Dist: pywebview>=5.0; extra == "app"
|
|
32
35
|
Dynamic: license-file
|
|
33
36
|
|
|
34
|
-
# ShuttleCheck
|
|
37
|
+
# ShuttleCheck™
|
|
35
38
|
|
|
36
39
|
**Check media filenames, folder structure and deliverables against a written
|
|
37
40
|
convention.** Nothing in this package renames, moves or deletes anything.
|
|
@@ -65,8 +68,8 @@ FIELDS RECOVERED
|
|
|
65
68
|
{title} slug 85% opening-remarks, keynote
|
|
66
69
|
```
|
|
67
70
|
|
|
68
|
-
It handles conventions that disagree with themselves
|
|
69
|
-
per field, optional elements, free-text titles containing the separator
|
|
71
|
+
It handles conventions that disagree with themselves: several accepted forms
|
|
72
|
+
per field, optional elements, free-text titles containing the separator, all
|
|
70
73
|
because real ones do.
|
|
71
74
|
|
|
72
75
|
## Then it tells you what breaks it
|
|
@@ -101,14 +104,14 @@ conflated, because a noisy report does not get read.
|
|
|
101
104
|
| Unicode | Names that compare equal on one platform and not another |
|
|
102
105
|
|
|
103
106
|
Media inspection uses `ffprobe` when it is on your PATH. When it is not, those
|
|
104
|
-
checks are reported as **skipped
|
|
107
|
+
checks are reported as **skipped**, never as passed. A silent skip is how a
|
|
105
108
|
conformance tool starts lying.
|
|
106
109
|
|
|
107
110
|
## For live events, the running order does the work
|
|
108
111
|
|
|
109
112
|
An event agenda is structured data that exists weeks before anyone turns a
|
|
110
|
-
camera on. Joined against time-of-day timecode, every recording names itself
|
|
111
|
-
stage, session, speaker
|
|
113
|
+
camera on. Joined against time-of-day timecode, every recording names itself,
|
|
114
|
+
with its stage, session, speaker and sponsor, and no inference of any kind.
|
|
112
115
|
|
|
113
116
|
It will also tell you when a filename is well-formed and still wrong: `S007`
|
|
114
117
|
recorded during `S011` is a valid shape carrying a false claim, and only the
|
|
@@ -129,13 +132,18 @@ No spec to be told about, no account, no connection.
|
|
|
129
132
|
|
|
130
133
|
## What this package will not do
|
|
131
134
|
|
|
132
|
-
It will not rename, move or delete anything. That boundary is the
|
|
133
|
-
the command a stranger will run on a live job, because running
|
|
134
|
-
them anything.
|
|
135
|
+
It will not rename, move or delete anything of yours. That boundary is the
|
|
136
|
+
point: it is the command a stranger will run on a live job, because running
|
|
137
|
+
it cannot cost them anything.
|
|
135
138
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
+
**Sealing is the one exception, and it is free.** `seal` writes an ASC MHL
|
|
140
|
+
hash list and the convention alongside your media, touching none of it. A
|
|
141
|
+
manifest is only worth what the far end can read for nothing, so the half
|
|
142
|
+
that writes one cannot be the paid half.
|
|
143
|
+
|
|
144
|
+
Conforming files to a convention, and undoing a conform run, are licensed
|
|
145
|
+
separately as ShuttleCheck Pro. Asking for one of those commands here prints
|
|
146
|
+
an explanation rather than an error.
|
|
139
147
|
|
|
140
148
|
## Licence
|
|
141
149
|
|
|
@@ -143,3 +151,7 @@ Free to install and use. Not open source: no right to redistribute or modify.
|
|
|
143
151
|
See <https://mvrk.systems/shuttlecheck>.
|
|
144
152
|
|
|
145
153
|
Made by [MVRK Systems](https://mvrk.systems).
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
ShuttleCheck™ and DailiesDrop™ are trademarks of MVRK Systems.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ShuttleCheck
|
|
1
|
+
# ShuttleCheck™
|
|
2
2
|
|
|
3
3
|
**Check media filenames, folder structure and deliverables against a written
|
|
4
4
|
convention.** Nothing in this package renames, moves or deletes anything.
|
|
@@ -32,8 +32,8 @@ FIELDS RECOVERED
|
|
|
32
32
|
{title} slug 85% opening-remarks, keynote
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
It handles conventions that disagree with themselves
|
|
36
|
-
per field, optional elements, free-text titles containing the separator
|
|
35
|
+
It handles conventions that disagree with themselves: several accepted forms
|
|
36
|
+
per field, optional elements, free-text titles containing the separator, all
|
|
37
37
|
because real ones do.
|
|
38
38
|
|
|
39
39
|
## Then it tells you what breaks it
|
|
@@ -68,14 +68,14 @@ conflated, because a noisy report does not get read.
|
|
|
68
68
|
| Unicode | Names that compare equal on one platform and not another |
|
|
69
69
|
|
|
70
70
|
Media inspection uses `ffprobe` when it is on your PATH. When it is not, those
|
|
71
|
-
checks are reported as **skipped
|
|
71
|
+
checks are reported as **skipped**, never as passed. A silent skip is how a
|
|
72
72
|
conformance tool starts lying.
|
|
73
73
|
|
|
74
74
|
## For live events, the running order does the work
|
|
75
75
|
|
|
76
76
|
An event agenda is structured data that exists weeks before anyone turns a
|
|
77
|
-
camera on. Joined against time-of-day timecode, every recording names itself
|
|
78
|
-
stage, session, speaker
|
|
77
|
+
camera on. Joined against time-of-day timecode, every recording names itself,
|
|
78
|
+
with its stage, session, speaker and sponsor, and no inference of any kind.
|
|
79
79
|
|
|
80
80
|
It will also tell you when a filename is well-formed and still wrong: `S007`
|
|
81
81
|
recorded during `S011` is a valid shape carrying a false claim, and only the
|
|
@@ -96,13 +96,18 @@ No spec to be told about, no account, no connection.
|
|
|
96
96
|
|
|
97
97
|
## What this package will not do
|
|
98
98
|
|
|
99
|
-
It will not rename, move or delete anything. That boundary is the
|
|
100
|
-
the command a stranger will run on a live job, because running
|
|
101
|
-
them anything.
|
|
99
|
+
It will not rename, move or delete anything of yours. That boundary is the
|
|
100
|
+
point: it is the command a stranger will run on a live job, because running
|
|
101
|
+
it cannot cost them anything.
|
|
102
102
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
103
|
+
**Sealing is the one exception, and it is free.** `seal` writes an ASC MHL
|
|
104
|
+
hash list and the convention alongside your media, touching none of it. A
|
|
105
|
+
manifest is only worth what the far end can read for nothing, so the half
|
|
106
|
+
that writes one cannot be the paid half.
|
|
107
|
+
|
|
108
|
+
Conforming files to a convention, and undoing a conform run, are licensed
|
|
109
|
+
separately as ShuttleCheck Pro. Asking for one of those commands here prints
|
|
110
|
+
an explanation rather than an error.
|
|
106
111
|
|
|
107
112
|
## Licence
|
|
108
113
|
|
|
@@ -110,3 +115,7 @@ Free to install and use. Not open source: no right to redistribute or modify.
|
|
|
110
115
|
See <https://mvrk.systems/shuttlecheck>.
|
|
111
116
|
|
|
112
117
|
Made by [MVRK Systems](https://mvrk.systems).
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
ShuttleCheck™ and DailiesDrop™ are trademarks of MVRK Systems.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# ShuttleCheck
|
|
1
|
+
# ShuttleCheck, the validator
|
|
2
2
|
|
|
3
3
|
Naming conformance for a folder tree: infer a spec from it, check it, fix it,
|
|
4
4
|
undo the fix, and send the convention with the media. Installs as `shuttlecheck`;
|
|
@@ -16,7 +16,7 @@ talked into running on a live job, because running it cannot cost them anything.
|
|
|
16
16
|
python -m pip install -e .
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
`tzdata` is a real runtime dependency on Windows
|
|
19
|
+
`tzdata` is a real runtime dependency on Windows, because the platform ships no system
|
|
20
20
|
timezone database, so `zoneinfo` cannot resolve the agenda timezone without it.
|
|
21
21
|
|
|
22
22
|
## Use
|
|
@@ -109,7 +109,7 @@ Delivery rules, for contexts that declare a `deliverable:` profile:
|
|
|
109
109
|
| `missing-sidecar` | error | Captions or checksum did not arrive with the file |
|
|
110
110
|
| `no-video-stream`, `no-audio-stream`, `unreadable-media` | error | Not the kind of file it claims to be |
|
|
111
111
|
| `color-*-mismatch` | error | Tagged with the wrong colour space |
|
|
112
|
-
| `color-*-unknown` | warning | Not tagged at all
|
|
112
|
+
| `color-*-unknown` | warning | Not tagged at all. Absence is not proof of wrongness |
|
|
113
113
|
| `incomplete-package` | error | A session or episode is short a deliverable |
|
|
114
114
|
| `spec-unknown-deliverable` | error | A context points at a profile that is not defined |
|
|
115
115
|
|
|
@@ -120,7 +120,7 @@ Severities are overridable per rule in the spec's `rules:` block.
|
|
|
120
120
|
`shuttlecheck ui` is a local web UI, not Electron and not Qt. The page ships
|
|
121
121
|
inside the wheel and is served by the standard library's HTTP server, so the
|
|
122
122
|
install stays `pip install shuttlecheck`, nothing is downloaded at runtime, and
|
|
123
|
-
it works with no connection at all
|
|
123
|
+
it works with no connection at all, which matters, because the machine this
|
|
124
124
|
runs on is often in a truck. No web fonts either; the stylesheet falls back to
|
|
125
125
|
whatever the OS has.
|
|
126
126
|
|
|
@@ -134,7 +134,7 @@ in the URL the browser is opened with, and never leaves the machine.
|
|
|
134
134
|
|
|
135
135
|
**Applying a plan requires echoing back the move count.** The page states how
|
|
136
136
|
many moves it believes it is approving. If the folder changed since the plan
|
|
137
|
-
was drawn, the numbers disagree and nothing runs
|
|
137
|
+
was drawn, the numbers disagree and nothing runs. A stale tab cannot apply a
|
|
138
138
|
plan that no longer matches reality.
|
|
139
139
|
|
|
140
140
|
## How inference works
|
|
@@ -150,14 +150,14 @@ to try.
|
|
|
150
150
|
has a different field count, anchor from the left and the right while the
|
|
151
151
|
columns still look like fixed codes and treat the remainder as one variable
|
|
152
152
|
field. Names structurally unrelated to the rest are set aside first, and
|
|
153
|
-
reported
|
|
153
|
+
reported. They are usually the existing violations.
|
|
154
154
|
3. **Profile** each column: constant, prefixed counter, enum, date, slug, or
|
|
155
155
|
free text, each with a confidence and a plain-English reason.
|
|
156
156
|
4. **Reconcile** value sets across groups, so a column that reads as the
|
|
157
157
|
constant `HALLA` in one group and the enum `{HALLA, HALLB}` in another
|
|
158
158
|
becomes one token rather than two.
|
|
159
|
-
5. **Name** the fields from prefix semantics rather than exact widths
|
|
160
|
-
and `DAY1` are both `{day}
|
|
159
|
+
5. **Name** the fields from prefix semantics rather than exact widths, so `D01`
|
|
160
|
+
and `DAY1` are both `{day}`, falling back to `{field3}` and flagging it.
|
|
161
161
|
6. **Self-validate**: run the validator over the same tree with the spec just
|
|
162
162
|
inferred, and show the result. That is the thirty-second demonstration.
|
|
163
163
|
|
|
@@ -175,14 +175,14 @@ comments of the file it writes.
|
|
|
175
175
|
It renames only what it can *derive*. For each non-conforming file:
|
|
176
176
|
|
|
177
177
|
1. Parse the folder and the filename against the context's patterns.
|
|
178
|
-
2. If both parse but disagree on a token, **skip
|
|
178
|
+
2. If both parse but disagree on a token, **skip**. There is no safe way to
|
|
179
179
|
tell which one is the mistake, so it is a question for a human.
|
|
180
180
|
3. If the name fails on a single field, recover that one field: from the folder
|
|
181
181
|
path, by matching a known alias, by re-applying the token's own transforms
|
|
182
182
|
(which fixes casing, spaces and punctuation), or from its declared source.
|
|
183
183
|
4. If a context sets `schedule_check`, cross-check the schedule-bound tokens
|
|
184
184
|
against the agenda and correct them. A name can parse perfectly and still be
|
|
185
|
-
wrong
|
|
185
|
+
wrong: `S001` recorded during `S005` is a valid shape carrying a false
|
|
186
186
|
claim. An ambiguous clock window corrects nothing rather than guessing.
|
|
187
187
|
5. If the correct name still cannot be derived, **skip and say why**. Inventing
|
|
188
188
|
a session number is worse than leaving a bad filename.
|
|
@@ -194,7 +194,7 @@ Safety, none of it optional:
|
|
|
194
194
|
| Dry run | The default. `--apply` is a separate, explicit act. |
|
|
195
195
|
| Originals | `rename: never` contexts are never planned, moved, or renamed. |
|
|
196
196
|
| Overwrite | Never. A destination that exists aborts the whole plan. |
|
|
197
|
-
| Collisions | Two files resolving to one name abort everything
|
|
197
|
+
| Collisions | Two files resolving to one name abort everything. A half-renamed job is worse than an unrenamed one. |
|
|
198
198
|
| Stale plans | Every source is re-checked for size and mtime before the first move. |
|
|
199
199
|
| Case-only renames | Routed through a temporary name, as are swaps and cycles. |
|
|
200
200
|
| Mid-run failure | Every completed move is rolled back, and the run is marked `rolled_back` in the journal. |
|
|
@@ -251,7 +251,7 @@ WHAT YOU ARE DELIVERING
|
|
|
251
251
|
with Subtitles ({stem}.srt)
|
|
252
252
|
```
|
|
253
253
|
|
|
254
|
-
The pack is **derived**, never authored separately
|
|
254
|
+
The pack is **derived**, never authored separately, so a vendor cannot drift from
|
|
255
255
|
a document they did not write. `vendors` is the other direction: point it at the
|
|
256
256
|
incoming deliveries and it reports who is clear, who has errors, and who has
|
|
257
257
|
sent nothing at all.
|
|
@@ -260,7 +260,7 @@ Two things worth knowing:
|
|
|
260
260
|
|
|
261
261
|
**Out-of-scope contexts are kept as inert stubs, not deleted.** Contexts are
|
|
262
262
|
first-match-wins, so removing an early one silently re-routes its files into a
|
|
263
|
-
later catch-all
|
|
263
|
+
later catch-all, and the ISO rushes would come back reported as malformed masters.
|
|
264
264
|
The stubs preserve ordering and say plainly: not yours.
|
|
265
265
|
|
|
266
266
|
**A vendor is never shown a rule they cannot act on.** Packages narrow to the
|
|
@@ -275,7 +275,7 @@ intended.
|
|
|
275
275
|
|
|
276
276
|
Its second job matters more than undo. Every file carries an `original_path`,
|
|
277
277
|
recorded the first time it is touched and never rewritten. When a spec is
|
|
278
|
-
edited and the tree re-conformed, names are computed from that identity
|
|
278
|
+
edited and the tree re-conformed, names are computed from that identity, never
|
|
279
279
|
from the current name. Without it, tokens compound on every pass: the second
|
|
280
280
|
run re-prefixes what the first already prefixed, and by the third edit the
|
|
281
281
|
names are unrecoverable. That failure is silent and looks like it worked.
|
|
@@ -294,7 +294,7 @@ drive out of a Peli case. `seal` writes `_SPEC/` onto the drive itself:
|
|
|
294
294
|
| `README.txt` | plain-language instructions for someone who has never heard of this tool |
|
|
295
295
|
| `journal/` | what has been renamed, and by which spec revision |
|
|
296
296
|
|
|
297
|
-
The receiving end runs `shuttlecheck verify .`
|
|
297
|
+
The receiving end runs `shuttlecheck verify .` with no spec to be told about, no
|
|
298
298
|
account, no connectivity. Sealing never touches the media; it only writes
|
|
299
299
|
inside `_SPEC/`.
|
|
300
300
|
|
|
@@ -302,19 +302,19 @@ What `verify` reports:
|
|
|
302
302
|
|
|
303
303
|
| | |
|
|
304
304
|
|---|---|
|
|
305
|
-
| `missing` | error
|
|
306
|
-
| `size-mismatch` | error
|
|
307
|
-
| `hash-mismatch` | error
|
|
308
|
-
| `added` | warning
|
|
309
|
-
| `mtime-drift` | info
|
|
310
|
-
| `clock-did-not-survive-copy` | warning
|
|
305
|
+
| `missing` | error: on the manifest, not on the drive; the copy is incomplete |
|
|
306
|
+
| `size-mismatch` | error: damaged or replaced in transit |
|
|
307
|
+
| `hash-mismatch` | error: same size, different contents (needs `--hash` at both ends) |
|
|
308
|
+
| `added` | warning: on the drive but not the manifest |
|
|
309
|
+
| `mtime-drift` | info: most copy tools do not preserve timestamps |
|
|
310
|
+
| `clock-did-not-survive-copy` | warning: see below |
|
|
311
311
|
|
|
312
312
|
Two judgement calls worth knowing about.
|
|
313
313
|
|
|
314
314
|
**Timestamp drift is not damage.** Most copy tools do not preserve mtime, so
|
|
315
315
|
treating that as corruption would make every genuine transfer look broken.
|
|
316
316
|
*But* if the spec joins the agenda on `file_mtime`, drift silently moves every
|
|
317
|
-
recording to the wrong session and the naming findings become fiction
|
|
317
|
+
recording to the wrong session and the naming findings become fiction, so that
|
|
318
318
|
specific combination is raised as a warning rather than left to be discovered.
|
|
319
319
|
A spec using embedded timecode does not have the problem.
|
|
320
320
|
|
|
@@ -328,7 +328,7 @@ timestamps are all that can be checked, and the sidecar says so in writing.
|
|
|
328
328
|
**It parses, it does not render.** The validator compiles each naming pattern
|
|
329
329
|
into a regex whose groups are constrained by each token's own type, enum values,
|
|
330
330
|
and transforms, then matches the existing name against it. That is why it needs
|
|
331
|
-
no prompting, no schedule, and no media parser to do its core job
|
|
331
|
+
no prompting, no schedule, and no media parser to do its core job, and why
|
|
332
332
|
`prompt`-sourced tokens validate fine.
|
|
333
333
|
|
|
334
334
|
**Mismatches name the field.** On a failure it recompiles the pattern with each
|
|
@@ -363,7 +363,7 @@ shuttlecheck validate ./fixture --spec ./fixture/EXC26/_SPEC/spec.yaml
|
|
|
363
363
|
```
|
|
364
364
|
|
|
365
365
|
`tests/make_infer_fixture.py` writes a tree using a convention the code has
|
|
366
|
-
never seen
|
|
366
|
+
never seen: dashes instead of underscores, `DAY1` instead of `D01`, `SES001`
|
|
367
367
|
instead of `S001`, variable-length titles containing the separator, and
|
|
368
368
|
camera-native ISO names. If inference recovers that, it is reading the tree
|
|
369
369
|
rather than recognising something baked into the source:
|
|
@@ -379,7 +379,7 @@ errors in the files it learned from.
|
|
|
379
379
|
|
|
380
380
|
Portability rules are unit-tested against the check functions rather than real
|
|
381
381
|
files, because Windows cannot create a file named `NUL.mov`, `bad<name>.mov`, or
|
|
382
|
-
`trailing..mov
|
|
382
|
+
`trailing..mov.`, which is the point of the check.
|
|
383
383
|
|
|
384
384
|
## Not built yet
|
|
385
385
|
|
|
@@ -388,5 +388,5 @@ files, because Windows cannot create a file named `NUL.mov`, `bad<name>.mov`, or
|
|
|
388
388
|
creation time via `ffprobe` and degrades honestly without it.
|
|
389
389
|
- Agenda formats other than CSV. `ics`, `sched`, `swapcard`, and `cvent` are in
|
|
390
390
|
the schema and raise `ScheduleUnavailable` rather than failing the run.
|
|
391
|
-
- The conformer, its journal, and revert. Deliberately absent
|
|
391
|
+
- The conformer, its journal, and revert. Deliberately absent: see the
|
|
392
392
|
read-only boundary above.
|
|
@@ -1,60 +1,74 @@
|
|
|
1
|
-
[project]
|
|
2
|
-
name = "shuttlecheck"
|
|
3
|
-
version = "0.
|
|
4
|
-
description = "Check media filenames, folder structure and deliverables against a written convention. Read-only."
|
|
5
|
-
readme = { file = "PYPI.md", content-type = "text/markdown" }
|
|
6
|
-
requires-python = ">=3.11"
|
|
7
|
-
license = { text = "Proprietary — free to use, no redistribution" }
|
|
8
|
-
authors = [{ name = "MVRK Systems", email = "hello@mvrk.systems" }]
|
|
9
|
-
keywords = [
|
|
10
|
-
"broadcast", "post-production", "dailies", "media", "naming-convention",
|
|
11
|
-
"file-naming", "delivery", "conformance", "validation", "vfx", "video",
|
|
12
|
-
]
|
|
13
|
-
classifiers = [
|
|
14
|
-
"Development Status :: 4 - Beta",
|
|
15
|
-
"Environment :: Console",
|
|
16
|
-
"Environment :: Web Environment",
|
|
17
|
-
"Intended Audience :: End Users/Desktop",
|
|
18
|
-
"License :: Other/Proprietary License",
|
|
19
|
-
"Natural Language :: English",
|
|
20
|
-
"Operating System :: OS Independent",
|
|
21
|
-
"Programming Language :: Python :: 3",
|
|
22
|
-
"Programming Language :: Python :: 3.11",
|
|
23
|
-
"Programming Language :: Python :: 3.12",
|
|
24
|
-
"Programming Language :: Python :: 3.13",
|
|
25
|
-
"Topic :: Multimedia :: Video",
|
|
26
|
-
"Topic :: System :: Archiving",
|
|
27
|
-
"Topic :: Utilities",
|
|
28
|
-
]
|
|
29
|
-
dependencies = [
|
|
30
|
-
"PyYAML>=6.0",
|
|
31
|
-
"jsonschema>=4.20",
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
[project.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
[
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
shuttlecheck =
|
|
60
|
-
|
|
1
|
+
[project]
|
|
2
|
+
name = "shuttlecheck"
|
|
3
|
+
version = "0.4.0"
|
|
4
|
+
description = "Check media filenames, folder structure and deliverables against a written convention. Read-only."
|
|
5
|
+
readme = { file = "PYPI.md", content-type = "text/markdown" }
|
|
6
|
+
requires-python = ">=3.11"
|
|
7
|
+
license = { text = "Proprietary — free to use, no redistribution" }
|
|
8
|
+
authors = [{ name = "MVRK Systems", email = "hello@mvrk.systems" }]
|
|
9
|
+
keywords = [
|
|
10
|
+
"broadcast", "post-production", "dailies", "media", "naming-convention",
|
|
11
|
+
"file-naming", "delivery", "conformance", "validation", "vfx", "video",
|
|
12
|
+
]
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Development Status :: 4 - Beta",
|
|
15
|
+
"Environment :: Console",
|
|
16
|
+
"Environment :: Web Environment",
|
|
17
|
+
"Intended Audience :: End Users/Desktop",
|
|
18
|
+
"License :: Other/Proprietary License",
|
|
19
|
+
"Natural Language :: English",
|
|
20
|
+
"Operating System :: OS Independent",
|
|
21
|
+
"Programming Language :: Python :: 3",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Programming Language :: Python :: 3.13",
|
|
25
|
+
"Topic :: Multimedia :: Video",
|
|
26
|
+
"Topic :: System :: Archiving",
|
|
27
|
+
"Topic :: Utilities",
|
|
28
|
+
]
|
|
29
|
+
dependencies = [
|
|
30
|
+
"PyYAML>=6.0",
|
|
31
|
+
"jsonschema>=4.20",
|
|
32
|
+
# xxh64 is the checksum the ASC MHL specification is usually written with
|
|
33
|
+
# and the one DailiesDrop records, and it is not in the standard library.
|
|
34
|
+
# A dependency in the read-only half looks like the wrong place for it
|
|
35
|
+
# until you notice that verifying a drive the appliance sealed is exactly
|
|
36
|
+
# what this half is for: without it, the common case degrades to "this
|
|
37
|
+
# installation cannot check those checksums".
|
|
38
|
+
"xxhash>=3.0",
|
|
39
|
+
# Windows ships no system tz database, so zoneinfo cannot resolve the
|
|
40
|
+
# agenda timezone without this. Required, not optional, on a target platform.
|
|
41
|
+
"tzdata>=2024.1; sys_platform == 'win32'",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
[project.optional-dependencies]
|
|
45
|
+
dev = ["pytest>=8.0"]
|
|
46
|
+
# The downloadable tool's own window, drawn by whatever webview the operating
|
|
47
|
+
# system already has: WebView2 on Windows, WKWebView on macOS, WebKitGTK on
|
|
48
|
+
# Linux. An extra rather than a dependency, because `pip install shuttlecheck`
|
|
49
|
+
# is a library and a CLI and should not pull in a GUI stack, and because the
|
|
50
|
+
# app falls back to a browser wherever this is missing. See
|
|
51
|
+
# shuttlecheck/window.py.
|
|
52
|
+
app = ["pywebview>=5.0"]
|
|
53
|
+
|
|
54
|
+
[project.urls]
|
|
55
|
+
Homepage = "https://mvrk.systems/shuttlecheck"
|
|
56
|
+
Documentation = "https://mvrk.systems/shuttlecheck#checks"
|
|
57
|
+
|
|
58
|
+
[project.scripts]
|
|
59
|
+
shuttlecheck = "shuttlecheck.cli:main"
|
|
60
|
+
|
|
61
|
+
[build-system]
|
|
62
|
+
requires = ["setuptools>=68"]
|
|
63
|
+
build-backend = "setuptools.build_meta"
|
|
64
|
+
|
|
65
|
+
[tool.setuptools]
|
|
66
|
+
packages = ["shuttlecheck"]
|
|
67
|
+
|
|
68
|
+
[tool.setuptools.package-data]
|
|
69
|
+
# Neither schema is documentation. The validator refuses to run without the
|
|
70
|
+
# spec schema, and the telemetry contract is checked against every batch before
|
|
71
|
+
# it is sent, so a build that cannot read it sends nothing at all. Both travel
|
|
72
|
+
# inside the wheel.
|
|
73
|
+
shuttlecheck = ["schema.json", "telemetry-v1.schema.json", "ui_assets/*",
|
|
74
|
+
"ui_assets/fonts/*"]
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
"""ShuttleCheck
|
|
1
|
+
"""ShuttleCheck: naming and delivery conformance.
|
|
2
2
|
|
|
3
3
|
Three entry points, in the order you would use them:
|
|
4
4
|
|
|
5
5
|
infer_spec / walkthrough read an existing tree and write the spec it follows
|
|
6
6
|
Validator / validate report what does not conform, in name and in
|
|
7
|
-
substance
|
|
7
|
+
substance: codec, resolution, audio, packages
|
|
8
8
|
verify check a drive against the sidecar it arrived with
|
|
9
9
|
|
|
10
10
|
**Nothing in this package modifies media.** That is the whole of it, and it is
|
|
11
11
|
deliberate: a checker that cannot alter anything is a checker a stranger will
|
|
12
12
|
run on a live job, because running it cannot cost them anything.
|
|
13
13
|
|
|
14
|
-
The operations that write
|
|
15
|
-
packs
|
|
14
|
+
The operations that write (conforming, the journal, sealing a drive, vendor
|
|
15
|
+
packs) are licensed separately and ship as `shuttlecheck_pro`. When it is
|
|
16
16
|
installed, `extensions.load()` finds it and the CLI and app grow the extra
|
|
17
17
|
commands; nothing here imports it, and nothing here requires it.
|
|
18
18
|
"""
|