mmif-python 1.4.0__tar.gz → 1.5.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 (100) hide show
  1. mmif_python-1.5.1/.github/workflows/release-check.yml +11 -0
  2. {mmif_python-1.4.0 → mmif_python-1.5.1}/CHANGELOG.md +87 -0
  3. {mmif_python-1.4.0 → mmif_python-1.5.1}/CONTRIBUTING.md +8 -1
  4. {mmif_python-1.4.0/mmif_python.egg-info → mmif_python-1.5.1}/PKG-INFO +2 -2
  5. {mmif_python-1.4.0 → mmif_python-1.5.1}/build-tools/docs.py +12 -10
  6. mmif_python-1.5.1/build-tools/prep_release.py +91 -0
  7. {mmif_python-1.4.0 → mmif_python-1.5.1}/documentation/conf.py +0 -38
  8. mmif_python-1.5.1/documentation/target-versions.csv +52 -0
  9. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/res/mmif.json +17 -0
  10. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/serialize/annotation.py +50 -28
  11. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/video_document_helper.py +467 -302
  12. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/workflow_helper.py +9 -1
  13. {mmif_python-1.4.0 → mmif_python-1.5.1/mmif_python.egg-info}/PKG-INFO +2 -2
  14. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif_python.egg-info/SOURCES.txt +3 -0
  15. {mmif_python-1.4.0 → mmif_python-1.5.1}/pyproject.toml +1 -1
  16. mmif_python-1.5.1/tests/black-2997fps.webm +0 -0
  17. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/test_serialize.py +30 -1
  18. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/test_utils.py +153 -27
  19. mmif_python-1.4.0/documentation/target-versions.csv +0 -47
  20. {mmif_python-1.4.0 → mmif_python-1.5.1}/.github/workflows/codecov.yml +0 -0
  21. {mmif_python-1.4.0 → mmif_python-1.5.1}/.github/workflows/issue-assign.yml +0 -0
  22. {mmif_python-1.4.0 → mmif_python-1.5.1}/.github/workflows/issue-close.yml +0 -0
  23. {mmif_python-1.4.0 → mmif_python-1.5.1}/.github/workflows/issue-infra-project.yml +0 -0
  24. {mmif_python-1.4.0 → mmif_python-1.5.1}/.github/workflows/publish.yml +0 -0
  25. {mmif_python-1.4.0 → mmif_python-1.5.1}/.gitignore +0 -0
  26. {mmif_python-1.4.0 → mmif_python-1.5.1}/LICENSE +0 -0
  27. {mmif_python-1.4.0 → mmif_python-1.5.1}/README.md +0 -0
  28. {mmif_python-1.4.0 → mmif_python-1.5.1}/build-tools/build.py +0 -0
  29. {mmif_python-1.4.0 → mmif_python-1.5.1}/build-tools/clean.py +0 -0
  30. {mmif_python-1.4.0 → mmif_python-1.5.1}/build-tools/publish.py +0 -0
  31. {mmif_python-1.4.0 → mmif_python-1.5.1}/build-tools/test.py +0 -0
  32. {mmif_python-1.4.0 → mmif_python-1.5.1}/documentation/_mmif_example_builder/__init__.py +0 -0
  33. {mmif_python-1.4.0 → mmif_python-1.5.1}/documentation/_templates/versions.html +0 -0
  34. {mmif_python-1.4.0 → mmif_python-1.5.1}/documentation/cli.rst +0 -0
  35. {mmif_python-1.4.0 → mmif_python-1.5.1}/documentation/consumer-tutorial.rst +0 -0
  36. {mmif_python-1.4.0 → mmif_python-1.5.1}/documentation/index.rst +0 -0
  37. {mmif_python-1.4.0 → mmif_python-1.5.1}/documentation/introduction.rst +0 -0
  38. {mmif_python-1.4.0 → mmif_python-1.5.1}/documentation/plugins.rst +0 -0
  39. {mmif_python-1.4.0 → mmif_python-1.5.1}/documentation/summarizer.rst +0 -0
  40. {mmif_python-1.4.0 → mmif_python-1.5.1}/documentation/target-versions.rst +0 -0
  41. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/__init__.py +0 -0
  42. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/res/__init__.py +0 -0
  43. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/serialize/__init__.py +0 -0
  44. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/serialize/mmif.py +0 -0
  45. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/serialize/model.py +0 -0
  46. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/serialize/view.py +0 -0
  47. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/__init__.py +0 -0
  48. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/cli/__init__.py +0 -0
  49. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/cli/describe.py +0 -0
  50. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/cli/rewind.py +0 -0
  51. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/cli/source.py +0 -0
  52. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/cli/summarize.py +0 -0
  53. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/sequence_helper.py +0 -0
  54. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/summarizer/__init__.py +0 -0
  55. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/summarizer/config.py +0 -0
  56. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/summarizer/graph.py +0 -0
  57. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/summarizer/nodes.py +0 -0
  58. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/summarizer/summary.py +0 -0
  59. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/summarizer/utils.py +0 -0
  60. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/text_document_helper.py +0 -0
  61. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/utils/timeunit_helper.py +0 -0
  62. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/ver/__init__.py +0 -0
  63. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/vocabulary/__init__.py +0 -0
  64. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/vocabulary/annotation_types.py +0 -0
  65. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/vocabulary/base_types.py +0 -0
  66. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif/vocabulary/document_types.py +0 -0
  67. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif_docloc_http/__init__.py +0 -0
  68. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif_python.egg-info/dependency_links.txt +0 -0
  69. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif_python.egg-info/entry_points.txt +0 -0
  70. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif_python.egg-info/requires.txt +0 -0
  71. {mmif_python-1.4.0 → mmif_python-1.5.1}/mmif_python.egg-info/top_level.txt +0 -0
  72. {mmif_python-1.4.0 → mmif_python-1.5.1}/setup.cfg +0 -0
  73. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/black-2997fps.mp4 +0 -0
  74. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/1.0.5-old-shortid.json +0 -0
  75. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/README.md +0 -0
  76. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/bars-tones-slates/raw.json +0 -0
  77. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/east-tesseract-typing/raw.json +0 -0
  78. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/everything/raw.json +0 -0
  79. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/examples.json +0 -0
  80. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/README.md +0 -0
  81. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/image-box-ocr-timex.json +0 -0
  82. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/image-box-ocr.json +0 -0
  83. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/image-box.json +0 -0
  84. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/image.json +0 -0
  85. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/slate-detect.json +0 -0
  86. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/slate-reco.json +0 -0
  87. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/video-demux.json +0 -0
  88. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/video-transcript-demux-fa.json +0 -0
  89. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/video-transcript-demux-fa.short.json +0 -0
  90. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/video-transcript-demux.json +0 -0
  91. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/video-transcript-sentencesplit.json +0 -0
  92. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/video-transcript.json +0 -0
  93. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/others/video.json +0 -0
  94. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/segmenter-kaldi-ner/raw.json +0 -0
  95. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif-examples/swt-1.0.mmif +0 -0
  96. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/mmif_examples.py +0 -0
  97. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/test_specver.py +0 -0
  98. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/test_utils_cli.py +0 -0
  99. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/test_vocab.py +0 -0
  100. {mmif_python-1.4.0 → mmif_python-1.5.1}/tests/testsrc-2997fps-ptsoffset.mp4 +0 -0
@@ -0,0 +1,11 @@
1
+ name: "🔖 Release PR check"
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ types: [opened, synchronize, reopened, edited]
7
+
8
+ jobs:
9
+ release-check:
10
+ name: "🤙 Call SDK release-check workflow"
11
+ uses: clamsproject/.github/.github/workflows/sdk-release-check.yml@main
@@ -1,4 +1,47 @@
1
1
 
2
+ ## releasing 1.5.0 (2026-05-27)
3
+ ### Overview
4
+
5
+ Improves image-extraction API in `video_document_helper` for TP source tracking, restores the source-composition prefix in workflow identifiers, and fixes the versioned-docs publishing pipeline.
6
+
7
+ ### Additions
8
+
9
+ * `extract_images_by_count_with_sources` and `extract_images_by_mode_with_sources`: new public functions in `mmif.utils.video_document_helper` that return per-image source IDs (or sampled timepoints in ms when a fallback path is used), so downstream apps can anchor each extracted image to a specific point in the source media (https://github.com/clamsproject/mmif-python/pull/385, https://github.com/clamsproject/mmif-python/issues/384).
10
+
11
+ ### Changes
12
+
13
+ * `mmif.utils.video_document_helper`: renamed
14
+ * `extract_timepoints_as_images` --> `extract_images_from_timepoints`,
15
+ * `extract_target_frames` --> `extract_images_by_count_with_sources` (alongside new bare `extract_images_by_count`), and
16
+ * `extract_frames_by_mode` --> `extract_images_by_mode`.
17
+ * The three pre-rename names remain importable as soft-deprecated aliases through 2.0.0 (https://github.com/clamsproject/mmif-python/pull/385).
18
+ * `mmif.utils.workflow_helper.generate_workflow_identifier`: now prefixes a `source_composition` segment (`TextDocument-1-VideoDocument-1/...`) describing the top-level document mix in the input MMIF (https://github.com/clamsproject/mmif-python/pull/386).
19
+ * `build-tools/docs.py`: versioned-docs build now works against pyproject-only tags, restoring docs publishing in the release workflow (https://github.com/clamsproject/mmif-python/pull/388, https://github.com/clamsproject/mmif-python/issues/387).
20
+
21
+ > [!NOTE]
22
+ > - `mmif describe` (and the underlying `mmif.utils.workflow_helper`) is still experimental and subject to change in future releases without notice. Backward compatibility is not guaranteed.
23
+ > - The new `source_composition` prefix in `generate_workflow_identifier()` changes the format of returned identifiers. Downstream tools parsing the identifier path (e.g. for storage-directory routing) may need to account for the extra leading segment.
24
+
25
+
26
+
27
+ ## releasing 1.4.0 (2026-04-22)
28
+ ### Overview
29
+ * This is minor level release that 1) replacing simple string enums in `mmif.vocabulary` with fully-fledged pydantic classes in `clams-vocabulary` package 2) deprecating framenum-based image extraction functions in VDH (frame numbers are no longer considered as proper timestamps)
30
+
31
+ ### Additions
32
+ * presentation timestamp-based image extraction functions added to VDH (https://github.com/clamsproject/mmif-python/pull/382 )
33
+ * `pyav` and `clams-vocabulary` as new dependencies
34
+
35
+ ### Changes
36
+ * opencv-based video operations are now based on pyav (ffmpeg backend)
37
+ * all framenum-based functions in VDH are now marked as deprecated, scheduled for removal at 2.0.0
38
+ * `mmif.vocabulary` package is now a thin wrapper around `clams-vocabulary` package (https://github.com/clamsproject/mmif-python/pull/381 )
39
+ * `AnnotationTypes` and `DocumentTypes` classes are no longer simple string enums, but pydantic-based validation-supported python classes
40
+
41
+ ### Removal
42
+ * `durationTimeUnit` is no longer written to video documents' `Annotation` property. This is non-API change hence not triggering major version bump. (based on https://github.com/clamsproject/mmif/pull/240/changes/a74dc46245c21dc7a279b3f271cf3e3a2a126f3a, all time notations without explicit unit specification are considered as milliseconds)
43
+
44
+
2
45
  ## releasing 1.3.1 (2026-03-11)
3
46
  ### Overview
4
47
 
@@ -8,6 +51,7 @@ Bug-fix release to address broken `as_PIL=True` option in `extract_frames_as_ima
8
51
 
9
52
  * Fix `PIL.Image` import failure in `_check_cv_dep` by switching from `importlib.__import__` to `importlib.import_module` (https://github.com/clamsproject/mmif-python/pull/377)
10
53
 
54
+
11
55
  ## releasing 1.3.0 (2026-03-10)
12
56
  ### Overview
13
57
  Minor release adding a new `summarize` CLI, pydantic-based workflow descriptors, and various fixes for video document helpers and timestamp handling.
@@ -26,6 +70,7 @@ Minor release adding a new `summarize` CLI, pydantic-based workflow descriptors,
26
70
  * Documentation build migrated to "build-once, stay-forever" model via documentation hub (https://github.com/clamsproject/mmif-python/pull/344)
27
71
 
28
72
 
73
+
29
74
  ## releasing 1.2.1 (2025-11-28)
30
75
  ### Overview
31
76
  Updated output formats of the experimental `mmif describe` command
@@ -38,6 +83,7 @@ Updated output formats of the experimental `mmif describe` command
38
83
  > [!NOTE]
39
84
  > `mmif describe` (and the underlying `mmif.utils.workflow_helper`) is still experimental and subject to change in future releases without notice. Backward compatibility is not guaranteed.
40
85
 
86
+
41
87
  ## releasing 1.2.0 (2025-11-20)
42
88
  ### Overview
43
89
  This version is minor release with addition of a new cli (`describe`), lots of in-line documentation updates, and deprecation of some "getter" methods
@@ -57,6 +103,7 @@ mmif.get(some_view_id)
57
103
  * many outdated documentation updates
58
104
 
59
105
 
106
+
60
107
  ## releasing 1.1.2 (2025-07-28)
61
108
  ### Overview
62
109
  Patch release with a hotfix of a bug.
@@ -64,6 +111,7 @@ Patch release with a hotfix of a bug.
64
111
  ### Changes
65
112
  * Fixed bug with handling "list of ID" props in 1.0.x MMIF.
66
113
 
114
+
67
115
  ## releasing 1.1.1 (2025-07-26)
68
116
  ### Overview
69
117
  Patch release to support installation on python 3.12 and newer (fixes https://github.com/clamsproject/mmif-python/issues/314).
@@ -72,6 +120,7 @@ Patch release to support installation on python 3.12 and newer (fixes https://gi
72
120
  - `setup.py` is now compatible with the latest setuptools (80) .
73
121
  - [Since python 3.12 no longer ship `setuptools` as a part of standard installation](https://docs.python.org/3/whatsnew/3.12.html#ensurepip), added setuptools as a `dev` dependency.
74
122
 
123
+
75
124
  ## releasing 1.1.0 (2025-07-23)
76
125
  ### Overview
77
126
  This is a minor version release, but it includes several significant changes and improvements across the codebase.
@@ -88,6 +137,7 @@ This is a minor version release, but it includes several significant changes and
88
137
  * Miscellaneous cleanup and improvements on documentation and unused code.
89
138
 
90
139
 
140
+
91
141
  ## releasing 1.0.19 (2024-07-29)
92
142
  ### Overview
93
143
  Patch to fix a critical bug.
@@ -95,6 +145,7 @@ Patch to fix a critical bug.
95
145
  ### Changes
96
146
  - bugfix when `Annotation` instance and "warnings" view both are involved, MMIF is not properly returned (#299)
97
147
 
148
+
98
149
  ## releasing 1.0.18 (2024-07-15)
99
150
  ### Overview
100
151
  Patch release with a bugfix.
@@ -104,6 +155,7 @@ Patch release with a bugfix.
104
155
  ### Changes
105
156
  - fixed bug when adding custom properties to a newly generated `TextDocument` object (https://github.com/clamsproject/mmif-python/issues/290)
106
157
 
158
+
107
159
  ## releasing 1.0.17 (2024-06-26)
108
160
  ### Overview
109
161
  This release adds caching mechanism for annotation alignments (via `Alignment` annotation, the alignment via `targets` property is not yet supported).
@@ -117,6 +169,7 @@ This release adds caching mechanism for annotation alignments (via `Alignment` a
117
169
  - `mmif.utils.text_document_helper.slice_text` received a major speed boost from the alignment caching.
118
170
 
119
171
 
172
+
120
173
  ## releasing 1.0.16 (2024-06-14)
121
174
  ### Overview
122
175
  This release includes an _experimental_ implementation for helpers to slice `text_value` from text documents.
@@ -125,6 +178,7 @@ This release includes an _experimental_ implementation for helpers to slice `tex
125
178
  * `mmif.utils.text_document_helper` module to address https://github.com/clamsproject/mmif-python/issues/280
126
179
 
127
180
 
181
+
128
182
  ## releasing 1.0.15 (2024-06-07)
129
183
  ### Overview
130
184
  Minor release to add/improve helper methods.
@@ -136,6 +190,7 @@ Minor release to add/improve helper methods.
136
190
  - `Mmif.__getitem__()` now works with short annotation IDs (https://github.com/clamsproject/mmif-python/issues/279)
137
191
 
138
192
 
193
+
139
194
  ## releasing 1.0.14 (2024-04-10)
140
195
  ### Overview
141
196
  This release contains small fixes and improvements.
@@ -151,6 +206,7 @@ This release contains small fixes and improvements.
151
206
  ### Changes
152
207
  - "empty" annotation property values are correctly retrievable
153
208
 
209
+
154
210
  ## releasing 1.0.13 (2024-04-02)
155
211
  ### Overview
156
212
  This version includes small, but helpful improvements.
@@ -161,6 +217,7 @@ This version includes small, but helpful improvements.
161
217
  * video frame sampling can now use fractional sampling rate (in terms of frame numbers)
162
218
 
163
219
 
220
+
164
221
  ## releasing 1.0.12 (2024-04-01)
165
222
  ### Overview
166
223
  Hot-fixing a wrong field name.
@@ -169,6 +226,7 @@ Hot-fixing a wrong field name.
169
226
  - `views[].metadata.app_configuration` is renamed to `appConfiguration`, correctly following the MMIF json schema.
170
227
 
171
228
 
229
+
172
230
  ## releasing 1.0.11 (2024-03-31)
173
231
  ### Overview
174
232
  This release includes changes from MMIF spec 1.0.3 and 1.0.4, and a new helper module to handle sequence annotations
@@ -186,6 +244,7 @@ This release includes changes from MMIF spec 1.0.3 and 1.0.4, and a new helper m
186
244
  - getting start or end anchor points on annotations objects only with `targets` are no longer require the targets list is already sorted
187
245
  - sphinx-based public API documentation for old versions is back
188
246
 
247
+
189
248
  ## releasing 1.0.10 (2024-03-01)
190
249
  ### Overview
191
250
  This version includes minor bug fixes and support for MMIF spec 1.0.2.
@@ -198,6 +257,7 @@ This version includes minor bug fixes and support for MMIF spec 1.0.2.
198
257
  * ISO-like time unit conversion now consistently returns only to third decimal place.
199
258
 
200
259
 
260
+
201
261
  ## releasing 1.0.9 (2024-02-10)
202
262
  ### Overview
203
263
  This is a feature-packed release.
@@ -213,6 +273,7 @@ This is a feature-packed release.
213
273
  * `Annotation` objects' `properties` attribute is no longer limited to primitives and list of primitives (https://github.com/clamsproject/mmif/issues/215)
214
274
  * Fixed annotation URI equivalence checker wasn't working in set-like collections (https://github.com/clamsproject/mmif-python/issues/257)
215
275
 
276
+
216
277
  ## releasing 1.0.8 (2023-07-24)
217
278
  ### Overview
218
279
  This release includes polishing and bug fixes around the `mmif.utils.video_document_helper` module.
@@ -224,6 +285,7 @@ This release includes polishing and bug fixes around the `mmif.utils.video_docum
224
285
  * `Annotation.get_property` now provide more intuitive access to "view-level" annotation properties found in `view.metadata.contains.some_at_type` dict
225
286
 
226
287
 
288
+
227
289
  ## releasing 1.0.7 (2023-07-20)
228
290
  ### Overview
229
291
  Minor updates in VideoDucment helper module
@@ -233,6 +295,7 @@ Minor updates in VideoDucment helper module
233
295
 
234
296
 
235
297
 
298
+
236
299
  ## releasing 1.0.6 (2023-07-19)
237
300
  ### Overview
238
301
  This release relaxes checks for optional CV dependencies in video utils module, so that users don't have install all of `[cv]` dependencies when they don't use them all.
@@ -241,6 +304,7 @@ This release relaxes checks for optional CV dependencies in video utils module,
241
304
  * when any of `[cv]` dependencies is not found during `mmif.utils.video_document_helper` module is being loaded, instead of raising and an error, a warning is issued.
242
305
 
243
306
 
307
+
244
308
  ## releasing 1.0.5 (2023-07-19)
245
309
  ### Overview
246
310
  This release contains a minor fix in video_document_helper module
@@ -249,11 +313,13 @@ This release contains a minor fix in video_document_helper module
249
313
  * fixed time unit normalization was missing some important string
250
314
 
251
315
 
316
+
252
317
  ## releasing 1.0.4 (2023-07-19)
253
318
  ### Overview
254
319
  This release fixes installation error in the previous version.
255
320
 
256
321
 
322
+
257
323
  ## releasing 1.0.3 (2023-07-19)
258
324
  ### Overview
259
325
  This release is primarily about adding `mmif.utils` package and `mmif.utils.video_document_helper` module. The module provides many helper functions to handle frame-based and time-based documents and annotations.
@@ -266,6 +332,7 @@ This release is primarily about adding `mmif.utils` package and `mmif.utils.vide
266
332
  * fixed bug in `Annotation.get_property` (#232)
267
333
 
268
334
 
335
+
269
336
  ## releasing 1.0.2 (2023-07-11)
270
337
  ### Overview
271
338
  This release includes support for plugins, and a "magic" helper for using `Annotation` annotations for documents in MMIF.
@@ -277,6 +344,7 @@ This release includes support for plugins, and a "magic" helper for using `Annot
277
344
 
278
345
 
279
346
 
347
+
280
348
  ## releasing 1.0.1 (2023-05-26)
281
349
  ### Overview
282
350
  `mmif-python` 1.0.0 included MMIF 0.5.0 instead of MMIF 1.0.0. This release fixes it
@@ -284,11 +352,13 @@ This release includes support for plugins, and a "magic" helper for using `Annot
284
352
  ### Changes
285
353
  * now based on MMIF specification 1.0.0
286
354
 
355
+
287
356
  ## releasing 1.0.0 (2023-05-25)
288
357
  ### Overview
289
358
  This release will be numbered as 1.0.0, but actually is re-numbering of 0.5.2, hence no technical changes are included in 1.0.0.
290
359
 
291
360
 
361
+
292
362
  ## releasing 0.5.2 (2023-05-19)
293
363
  ### Overview
294
364
  This release fixes an oversight bug in `__eq__` in `MmifObject`s. Also includes updates of the sphinx documentation.
@@ -298,6 +368,7 @@ This release fixes an oversight bug in `__eq__` in `MmifObject`s. Also includes
298
368
  * Updated sphinx documentation (#215 )
299
369
 
300
370
 
371
+
301
372
  ## releasing 0.5.1 (2023-05-02)
302
373
  ### Overview
303
374
  This release includes "fuzzy" matching of at_types and sanitized `serialize` of `Mmif` objects.
@@ -313,6 +384,7 @@ This release includes "fuzzy" matching of at_types and sanitized `serialize` of
313
384
  * fixed a small bug in `Mmif.get_alignments`
314
385
  * fixed `view.metadata` serialized into an invalid MMIF due to a *oneOf* condition in jsonschema
315
386
 
387
+
316
388
  ## releasing 0.5.0 (2023-04-30)
317
389
  ### Overview
318
390
  This release is a synchronization of `mmif-python` with the latest [MMIF 0.5.0 release](https://github.com/clamsproject/mmif/pull/199).
@@ -321,9 +393,11 @@ This release is a synchronization of `mmif-python` with the latest [MMIF 0.5.0 r
321
393
  * Enum-like subclasses for annotation `@type`s in the `mmif.vocabulary` package are updated to accommodate the new way of checking I/O compatibility (as `__eq__()` in the SDK).
322
394
 
323
395
 
396
+
324
397
  ## releasing 0.4.8 (2023-02-10)
325
398
  This is a small PR that doesn't include any code in the SDK, but the target MMIF version is bumped up to [0.4.2](https://github.com/clamsproject/mmif/blob/master/CHANGELOG.md#version-042---2023-02-09).
326
399
 
400
+
327
401
  ## releasing 0.4.7 (2023-02-09)
328
402
  This release includes
329
403
 
@@ -331,12 +405,14 @@ This release includes
331
405
  * made `properties` map to behave like a map (#194)
332
406
  * updated python dependencies (#196, #198)
333
407
 
408
+
334
409
  ## releasing 0.4.6 (2022-03-25)
335
410
  This release includes
336
411
 
337
412
  * fixes in the development & release pipelines. (#189 #187)
338
413
  * upgrade in the text retrieval from TextDocument (#185)
339
414
 
415
+
340
416
  ## releasing 0.4.5 (2021-07-11)
341
417
  This release contains minor bug fixes
342
418
 
@@ -344,23 +420,29 @@ This release contains minor bug fixes
344
420
  * fixed how `develop` version of vocab URIs were handled
345
421
  * colon (`:`) is now a class constant for gluing view_id and annotation_id
346
422
 
423
+
347
424
  ## releasing 0.4.4 (2021-06-19)
348
425
  This release contains small but breaking changes. See d5198cb2304ad488975644a87fba51906abc5299 for details.
349
426
 
350
427
 
428
+
351
429
  ## releasing 0.4.3 (2021-06-18)
352
430
  This release fixes minor bugs from the previous version.
353
431
 
354
432
 
433
+
355
434
  ## releasing 0.4.2 (2021-06-17)
356
435
  This release adds `new_textdocument` helper method to `View` class.
357
436
 
437
+
358
438
  ## releasing 0.4.1 (2021-06-14)
359
439
  The release contains a small bug fix in deserialization of `Mmif` object.
360
440
 
441
+
361
442
  ## releasing 0.4.0 (2021-06-10)
362
443
  New release to correspond to the MMIF specification 0.4.0.
363
444
 
445
+
364
446
  ## releasing 0.3.5 (2021-06-05)
365
447
  The release includes ...
366
448
 
@@ -370,19 +452,24 @@ The release includes ...
370
452
  * various bug fixes and clean-up
371
453
 
372
454
 
455
+
373
456
  ## releasing 0.3.4 (2021-05-24)
374
457
  This release includes major bug fixes (#131, #164) and a new documentation generation pipeline (#167).
375
458
 
459
+
376
460
  ## releasing 0.3.3 (2021-05-12)
377
461
  This release contains various bug fixes.
378
462
 
463
+
379
464
  ## releasing 0.3.2 (2021-05-12)
380
465
  A version to match changes in the specification 0.3.1.
381
466
 
467
+
382
468
  ## releasing 0.3.1 (2021-03-30)
383
469
  0.3.1 contains mostly small bugfixes.
384
470
 
385
471
 
472
+
386
473
  ## release candidate for 0.3.0 (2021-03-14)
387
474
  release note for mmif-python 0.3.0
388
475
 
@@ -13,10 +13,17 @@ We follow a Gitflow-inspired branching model to maintain a stable `main` branch
13
13
  - Once work is complete, open a PR targeting the `develop` branch.
14
14
  - **Communication**: High-level discussion and planning should occur in the issue thread. The PR conversation is strictly for code review and implementation-specific feedback.
15
15
  5. **Releases**:
16
- - When `develop` is ready for a new release, open a PR from `develop` to `main` using the "release" PR template.
16
+ - When `develop` is ready for a new release, open a PR from `develop` to `main` using the "release" PR template. See the **Releases** section below for the required title format and preparation steps.
17
17
  - After merging the release candidate into `main`, manually tag the commit with the version number. This tag triggers the automated CI/CD pipeline for publishing.
18
18
  6. **Branch Protection**: Both `main` and `develop` are protected branches. Direct pushes are disabled; all changes must be introduced via Pull Requests.
19
19
 
20
+ ## Releases
21
+
22
+ Release PRs (from `develop` to `main`) are gated by the `release-check` CI workflow. Before opening one:
23
+
24
+ 1. Title the PR exactly `releasing X.Y.Z` (strict semver); `release-check` reads the version from the title.
25
+ 2. Run `python build-tools/prep_release.py X.Y.Z` and commit its changes. See inside the prep script to see what's actually prepared.
26
+
20
27
  ## CLI Scripts
21
28
 
22
29
  The `mmif` command-line interface supports subcommands (e.g., `mmif source`, `mmif describe`). These are implemented as Python modules in `mmif/utils/cli/`.
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mmif-python
3
- Version: 1.4.0
3
+ Version: 1.5.1
4
4
  Summary: Python implementation of MultiMedia Interchange Format specification. (https://mmif.clams.ai)
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: homepage, https://mmif.clams.ai
7
7
  Project-URL: source, https://github.com/clamsproject/mmif-python
8
- Project-URL: mmif-spec, https://mmif.clams.ai/1.1.1
8
+ Project-URL: mmif-spec, https://mmif.clams.ai/1.2.0
9
9
  Classifier: Development Status :: 5 - Production/Stable
10
10
  Classifier: Intended Audience :: Developers
11
11
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -109,10 +109,6 @@ def build_versioned_docs(env: Venv, source_path: Path, version: str):
109
109
  print("\n--- Installing sphinx and furo theme ---")
110
110
  env.run_pip("install", "sphinx>=7.0,<8.0", "furo", "m2r2", cwd=source_path)
111
111
 
112
- # Write VERSION file (needed for setup.py and sphinx)
113
- version_file = source_path / "VERSION"
114
- version_file.write_text(version)
115
-
116
112
  # Inject linkcode_resolve function into conf.py for GitHub source links
117
113
  # because some old version of conf.py may not have it
118
114
  print("\n--- Injecting linkcode_resolve into conf.py ---")
@@ -148,10 +144,16 @@ def linkcode_resolve(domain, info):
148
144
  with open(conf_py, "a") as f:
149
145
  f.write(linkcode_snippet)
150
146
 
151
- # Install package in develop mode to generate code (ver, res, vocabulary)
152
- # Uses setup.py develop for compatibility with all versions
153
- print("\n--- Installing package in develop mode ---")
154
- env.run_python("setup.py", "develop", cwd=source_path)
147
+ # Install package in editable mode so sphinx-autodoc can import it.
148
+ # Pre-1.4.0 releases ship setup.py with build-time code generation that
149
+ # needs a VERSION file; 1.4.0+ releases are pyproject-only and version
150
+ # themselves from git tags via setuptools-scm.
151
+ print("\n--- Installing package in editable mode ---")
152
+ if (source_path / "setup.py").exists():
153
+ (source_path / "VERSION").write_text(version)
154
+ env.run_python("setup.py", "develop", cwd=source_path)
155
+ else:
156
+ env.run_pip("install", "-e", ".", cwd=source_path)
155
157
 
156
158
  # Build documentation with sphinx-build
157
159
  print("\n--- Building Sphinx documentation ---")
@@ -216,8 +218,8 @@ def build_docs_for_version(version: str, output_base_dir: Path, repo_path: Path
216
218
  print(f"\n--- Step 2: Creating and setting up virtual environment ---")
217
219
  env = Venv(venv_path)
218
220
  env.create()
219
- # Use setuptools<80 for compatibility with older setup.py files
220
- # that use the old import structure
221
+ # setuptools<80 pin keeps the legacy `python setup.py develop` path
222
+ # working for pre-1.4.0 tags; harmless for pyproject-only tags.
221
223
  env.run_pip("install", "--upgrade", "pip", "setuptools<80", "wheel")
222
224
 
223
225
  print(f"\n--- Step 3: Building documentation ---")
@@ -0,0 +1,91 @@
1
+ """
2
+ Prepare release artifacts for the mmif-python package.
3
+
4
+ Run while preparing a release PR, passing the version being released::
5
+
6
+ python build-tools/prep_release.py X.Y.Z
7
+
8
+ Currently this adds a row to ``documentation/target-versions.csv`` for
9
+ the release version, resolving the target MMIF spec version from the
10
+ installed package metadata (``mmif.__specver__``). This script is the
11
+ single place that writes the target-versions table; the docs build only
12
+ renders it, and CI verifies (on the release PR) that a row for the PR's
13
+ version exists.
14
+
15
+ Requires an editable install (``pip install -e .``) so that
16
+ ``mmif.__specver__`` is importable.
17
+ """
18
+ import argparse
19
+ import re
20
+ import sys
21
+ from pathlib import Path
22
+
23
+ PROJECT_ROOT = Path(__file__).parent.parent
24
+ CSV_PATH = PROJECT_ROOT / 'documentation' / 'target-versions.csv'
25
+
26
+ VERSION_RE = re.compile(r'^\d+\.\d+\.\d+$')
27
+ TOP_ROW_RE = re.compile(r'`(\d+\.\d+\.\d+) <')
28
+
29
+
30
+ def _row(version, specver):
31
+ return (
32
+ f'`{version} <https://pypi.org/project/mmif-python/{version}/>`__,'
33
+ f'`{specver} <https://mmif.clams.ai/{specver}/>`__'
34
+ )
35
+
36
+
37
+ def _version_tuple(v):
38
+ return tuple(int(x) for x in v.split('.'))
39
+
40
+
41
+ def _top_version(data_lines):
42
+ if not data_lines:
43
+ return None
44
+ m = TOP_ROW_RE.match(data_lines[0])
45
+ return m.group(1) if m else None
46
+
47
+
48
+ def main():
49
+ parser = argparse.ArgumentParser(
50
+ description="Prepare release artifacts for mmif-python."
51
+ )
52
+ parser.add_argument(
53
+ "version", metavar="X.Y.Z",
54
+ help="the release version being prepared",
55
+ )
56
+ args = parser.parse_args()
57
+ version = args.version
58
+
59
+ if not VERSION_RE.match(version):
60
+ sys.exit(f"Error: '{version}' is not a valid X.Y.Z version.")
61
+
62
+ try:
63
+ import mmif
64
+ specver = mmif.__specver__
65
+ except (ImportError, AttributeError):
66
+ sys.exit("Error: cannot read mmif.__specver__. "
67
+ "Run `pip install -e .` first.")
68
+
69
+ lines = CSV_PATH.read_text().splitlines()
70
+ header, data = lines[0], lines[1:]
71
+ top = _top_version(data)
72
+
73
+ if top is not None and _version_tuple(version) < _version_tuple(top):
74
+ sys.exit(f"Error: {version} is older than the current top row "
75
+ f"{top}; refusing to insert an out-of-order version.")
76
+
77
+ new_row = _row(version, specver)
78
+ if top == version:
79
+ data[0] = new_row # update in place (e.g. spec changed)
80
+ action = "updated"
81
+ else:
82
+ data.insert(0, new_row) # prepend as the new latest
83
+ action = "added"
84
+
85
+ CSV_PATH.write_text('\n'.join([header] + data) + '\n')
86
+ print(f"target-versions.csv: {action} row "
87
+ f"{version} -> MMIF spec {specver}")
88
+
89
+
90
+ if __name__ == "__main__":
91
+ main()
@@ -6,7 +6,6 @@ import datetime
6
6
  import inspect
7
7
  import json
8
8
  import os
9
- import re
10
9
  import subprocess
11
10
  import sys
12
11
  import textwrap
@@ -148,42 +147,6 @@ def linkcode_resolve(domain, info):
148
147
  return None
149
148
 
150
149
 
151
- def update_target_versions(app):
152
- """
153
- Update documentation/target-versions.csv with the current version and spec version.
154
- This replaces the old logic in setup.py.
155
- """
156
- # Check if we have __specver__ (it might not be there if not installed via setup.py develop)
157
- if not hasattr(mmif, '__specver__'):
158
- return
159
-
160
- current_ver = mmif.__version__
161
- # Skip dev/dummy versions to avoid dirtying the git-tracked CSV
162
- if 'dev' in current_ver or not re.match(r'^\d+\.\d+\.\d+$', current_ver):
163
- return
164
- spec_ver = mmif.__specver__
165
-
166
- csv_path = proj_root_dir / 'documentation' / 'target-versions.csv'
167
- if not csv_path.exists():
168
- return
169
-
170
- # Read existing content
171
- with open(csv_path, 'r') as f:
172
- lines = f.readlines()
173
-
174
- # Check if current version is already in the file (first data line)
175
- # lines[0] is header, lines[1] is latest version
176
- if len(lines) > 1 and lines[1].startswith(f'{current_ver},'):
177
- return
178
-
179
- # Insert new version
180
- logger.info(f"Updating target-versions.csv: {current_ver} -> {spec_ver}")
181
- lines.insert(1, f'{current_ver},"{spec_ver}"\n')
182
-
183
- with open(csv_path, 'w') as f:
184
- f.writelines(lines)
185
-
186
-
187
150
  def generate_cli_rst(app):
188
151
  from mmif import prep_argparser_and_subcmds
189
152
 
@@ -292,7 +255,6 @@ def run_apidoc(app):
292
255
  def setup(app):
293
256
  try:
294
257
  app.connect('builder-inited', run_apidoc)
295
- app.connect('builder-inited', update_target_versions)
296
258
  app.connect('builder-inited', generate_cli_rst)
297
259
  app.connect('builder-inited', generate_whatsnew_rst)
298
260
  except ImportError:
@@ -0,0 +1,52 @@
1
+ "``mmif-python`` version","Target MMIF Specification"
2
+ `1.5.1 <https://pypi.org/project/mmif-python/1.5.1/>`__,`1.2.0 <https://mmif.clams.ai/1.2.0/>`__
3
+ `1.5.0 <https://pypi.org/project/mmif-python/1.5.0/>`__,`1.2.0 <https://mmif.clams.ai/1.2.0/>`__
4
+ `1.4.0 <https://pypi.org/project/mmif-python/1.4.0/>`__,`1.1.1 <https://mmif.clams.ai/1.1.1/>`__
5
+ `1.3.1 <https://pypi.org/project/mmif-python/1.3.1/>`__,`1.1.0 <https://mmif.clams.ai/1.1.0/>`__
6
+ `1.3.0 <https://pypi.org/project/mmif-python/1.3.0/>`__,`1.1.0 <https://mmif.clams.ai/1.1.0/>`__
7
+ `1.2.1 <https://pypi.org/project/mmif-python/1.2.1/>`__,`1.1.0 <https://mmif.clams.ai/1.1.0/>`__
8
+ `1.2.0 <https://pypi.org/project/mmif-python/1.2.0/>`__,`1.1.0 <https://mmif.clams.ai/1.1.0/>`__
9
+ `1.1.2 <https://pypi.org/project/mmif-python/1.1.2/>`__,`1.1.0 <https://mmif.clams.ai/1.1.0/>`__
10
+ `1.1.1 <https://pypi.org/project/mmif-python/1.1.1/>`__,`1.1.0 <https://mmif.clams.ai/1.1.0/>`__
11
+ `1.1.0 <https://pypi.org/project/mmif-python/1.1.0/>`__,`1.1.0 <https://mmif.clams.ai/1.1.0/>`__
12
+ `1.0.19 <https://pypi.org/project/mmif-python/1.0.19/>`__,`1.0.5 <https://mmif.clams.ai/1.0.5/>`__
13
+ `1.0.18 <https://pypi.org/project/mmif-python/1.0.18/>`__,`1.0.5 <https://mmif.clams.ai/1.0.5/>`__
14
+ `1.0.17 <https://pypi.org/project/mmif-python/1.0.17/>`__,`1.0.5 <https://mmif.clams.ai/1.0.5/>`__
15
+ `1.0.16 <https://pypi.org/project/mmif-python/1.0.16/>`__,`1.0.4 <https://mmif.clams.ai/1.0.4/>`__
16
+ `1.0.15 <https://pypi.org/project/mmif-python/1.0.15/>`__,`1.0.4 <https://mmif.clams.ai/1.0.4/>`__
17
+ `1.0.14 <https://pypi.org/project/mmif-python/1.0.14/>`__,`1.0.4 <https://mmif.clams.ai/1.0.4/>`__
18
+ `1.0.13 <https://pypi.org/project/mmif-python/1.0.13/>`__,`1.0.4 <https://mmif.clams.ai/1.0.4/>`__
19
+ `1.0.12 <https://pypi.org/project/mmif-python/1.0.12/>`__,`1.0.4 <https://mmif.clams.ai/1.0.4/>`__
20
+ `1.0.11 <https://pypi.org/project/mmif-python/1.0.11/>`__,`1.0.4 <https://mmif.clams.ai/1.0.4/>`__
21
+ `1.0.10 <https://pypi.org/project/mmif-python/1.0.10/>`__,`1.0.2 <https://mmif.clams.ai/1.0.2/>`__
22
+ `1.0.9 <https://pypi.org/project/mmif-python/1.0.9/>`__,`1.1.0 <https://mmif.clams.ai/1.1.0/>`__
23
+ `1.0.8 <https://pypi.org/project/mmif-python/1.0.8/>`__,`1.0.0 <https://mmif.clams.ai/1.0.0/>`__
24
+ `1.0.7 <https://pypi.org/project/mmif-python/1.0.7/>`__,`1.0.0 <https://mmif.clams.ai/1.0.0/>`__
25
+ `1.0.6 <https://pypi.org/project/mmif-python/1.0.6/>`__,`1.0.0 <https://mmif.clams.ai/1.0.0/>`__
26
+ `1.0.5 <https://pypi.org/project/mmif-python/1.0.5/>`__,`1.0.0 <https://mmif.clams.ai/1.0.0/>`__
27
+ `1.0.4 <https://pypi.org/project/mmif-python/1.0.4/>`__,`1.0.0 <https://mmif.clams.ai/1.0.0/>`__
28
+ `1.0.3 <https://pypi.org/project/mmif-python/1.0.3/>`__,`1.0.0 <https://mmif.clams.ai/1.0.0/>`__
29
+ `1.0.2 <https://pypi.org/project/mmif-python/1.0.2/>`__,`1.0.0 <https://mmif.clams.ai/1.0.0/>`__
30
+ `1.0.1 <https://pypi.org/project/mmif-python/1.0.1/>`__,`1.0.0 <https://mmif.clams.ai/1.0.0/>`__
31
+ `1.0.0 <https://pypi.org/project/mmif-python/1.0.0/>`__,`0.5.0 <https://mmif.clams.ai/0.5.0/>`__
32
+ `0.5.2 <https://pypi.org/project/mmif-python/0.5.2/>`__,`0.5.0 <https://mmif.clams.ai/0.5.0/>`__
33
+ `0.5.1 <https://pypi.org/project/mmif-python/0.5.1/>`__,`0.5.0 <https://mmif.clams.ai/0.5.0/>`__
34
+ `0.5.0 <https://pypi.org/project/mmif-python/0.5.0/>`__,`0.5.0 <https://mmif.clams.ai/0.5.0/>`__
35
+ `0.4.8 <https://pypi.org/project/mmif-python/0.4.8/>`__,`0.4.2 <https://mmif.clams.ai/0.4.2/>`__
36
+ `0.4.7 <https://pypi.org/project/mmif-python/0.4.7/>`__,`0.4.1 <https://mmif.clams.ai/0.4.1/>`__
37
+ `0.4.6 <https://pypi.org/project/mmif-python/0.4.6/>`__,`0.4.0 <https://mmif.clams.ai/0.4.0/>`__
38
+ `0.4.5 <https://pypi.org/project/mmif-python/0.4.5/>`__,`0.4.0 <https://mmif.clams.ai/0.4.0/>`__
39
+ `0.4.4 <https://pypi.org/project/mmif-python/0.4.4/>`__,`0.4.0 <https://mmif.clams.ai/0.4.0/>`__
40
+ `0.4.3 <https://pypi.org/project/mmif-python/0.4.3/>`__,`0.4.0 <https://mmif.clams.ai/0.4.0/>`__
41
+ `0.4.2 <https://pypi.org/project/mmif-python/0.4.2/>`__,`0.4.0 <https://mmif.clams.ai/0.4.0/>`__
42
+ `0.4.1 <https://pypi.org/project/mmif-python/0.4.1/>`__,`0.4.0 <https://mmif.clams.ai/0.4.0/>`__
43
+ `0.4.0 <https://pypi.org/project/mmif-python/0.4.0/>`__,`0.4.0 <https://mmif.clams.ai/0.4.0/>`__
44
+ `0.3.5 <https://pypi.org/project/mmif-python/0.3.5/>`__,`0.3.1 <https://mmif.clams.ai/0.3.1/>`__
45
+ `0.3.4 <https://pypi.org/project/mmif-python/0.3.4/>`__,`0.3.1 <https://mmif.clams.ai/0.3.1/>`__
46
+ `0.3.3 <https://pypi.org/project/mmif-python/0.3.3/>`__,`0.3.1 <https://mmif.clams.ai/0.3.1/>`__
47
+ `0.3.2 <https://pypi.org/project/mmif-python/0.3.2/>`__,`0.3.1 <https://mmif.clams.ai/0.3.1/>`__
48
+ `0.3.1 <https://pypi.org/project/mmif-python/0.3.1/>`__,`0.3.0 <https://mmif.clams.ai/0.3.0/>`__
49
+ `0.3.0 <https://pypi.org/project/mmif-python/0.3.0/>`__,`0.3.0 <https://mmif.clams.ai/0.3.0/>`__
50
+ `0.2.2 <https://pypi.org/project/mmif-python/0.2.2/>`__,`0.2.1 <https://mmif.clams.ai/0.2.1/>`__
51
+ `0.2.1 <https://pypi.org/project/mmif-python/0.2.1/>`__,`0.2.1 <https://mmif.clams.ai/0.2.1/>`__
52
+ `0.2.0 <https://pypi.org/project/mmif-python/0.2.0/>`__,`0.2.1 <https://mmif.clams.ai/0.2.1/>`__