opensportslib 0.3.1.dev24__tar.gz → 0.3.1.dev25__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.
- {opensportslib-0.3.1.dev24/opensportslib.egg-info → opensportslib-0.3.1.dev25}/PKG-INFO +1 -1
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25/opensportslib.egg-info}/PKG-INFO +1 -1
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/pyproject.toml +1 -1
- opensportslib-0.3.1.dev25/scripts/release_versions.py +181 -0
- opensportslib-0.3.1.dev25/tests/unit/contracts/test_release_versions.py +118 -0
- opensportslib-0.3.1.dev24/scripts/release_versions.py +0 -84
- opensportslib-0.3.1.dev24/tests/unit/contracts/test_release_versions.py +0 -56
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/LICENSE +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/LICENSE-COMMERCIAL +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/MANIFEST.in +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/README.md +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/examples/quickstart/basic_classification.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/examples/quickstart/basic_localization.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/examples/quickstart/basic_vqa.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/adaptation/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/adaptation/spotta.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/apis/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/apis/base_task_model.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/apis/classification.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/apis/config.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/apis/configuration.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/apis/localization.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/apis/vqa.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/cli.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/classification/default.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/classification/sngar_frames.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/classification/sngar_tracking.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/classification/video.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/default.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/localization/calf_resnetpca512.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/localization/default.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/localization/e2e_spotta.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/localization/h5_header_distance.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/localization/h5_header_skeleton.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/localization/netvladpp_resnetpca512.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/localization/tracking_action_spotting.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/localization/video_dali.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/localization/video_ocv.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/vqa/default.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/vqa/qwen.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/vqa/qwen3_vl_native.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/vqa/qwen_lora.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/vqa/qwen_sngar_frames.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/vqa/xvars.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/accessors.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/conflicts.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/editable.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/loader.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/migrate.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/migrations/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/migrations/legacy_to_canonical.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/rule_variants.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/runtime_adapter.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/schema.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/schemas/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/schemas/schema_canonical.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/schemas/schema_legacy.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/validate.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/loss/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/loss/builder.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/loss/calf.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/loss/ce.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/loss/combine.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/loss/nll.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/optimizer/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/optimizer/builder.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/sampler/weighted_sampler.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/scheduler/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/scheduler/builder.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/trainer/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/trainer/classification_trainer.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/trainer/localization_trainer.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/trainer/vqa_trainer.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/checkpoint.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/config.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/config_normalize.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/data.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/ddp.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/default_args.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/direct_video.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/hf_runtime.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/lightning.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/load_annotations.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/seed.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/video_processing.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/utils/wandb.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/datasets/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/datasets/builder.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/datasets/classification_dataset.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/datasets/hf_json.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/datasets/hf_tracking.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/datasets/localization_dataset.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/datasets/utils/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/datasets/utils/h5_tracking.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/datasets/utils/tracking.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/datasets/vqa_dataset.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/legacy_config/classification.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/legacy_config/localization-e2e-ocv.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/legacy_config/localization-json_calf_resnetpca512.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/legacy_config/localization-json_netvlad++_resnetpca512.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/legacy_config/localization.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/legacy_config/sngar-frames.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/legacy_config/sngar-tracking.yaml +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/metrics/classification_metric.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/metrics/localization_metric.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/metrics/vqa_metric.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/backbones/builder.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/contextaware.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/e2e.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/learnablepooling.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/qwen_vl_native.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/qwen_xvars.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/rule_based.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/tracking.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/vars.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/video.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/video_chatgpt_compat.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/video_mae.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/base/xvars_videochatgpt.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/builder.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/heads/builder.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/neck/builder.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/common.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/impl/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/impl/asformer.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/impl/calf.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/impl/gsm.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/impl/gtad.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/impl/tsm.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/litebase.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/modules.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/shift.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/utils.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/vqa_prediction_priors.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/vqa_prompting.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/models/utils/xvars_clip_index.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/remote_registry.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/setup/setup.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/tools/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/tools/_common.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/tools/hf_transfer.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/tools/osl_json_to_parquet.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/tools/parquet_to_osl_json.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib.egg-info/SOURCES.txt +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib.egg-info/dependency_links.txt +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib.egg-info/entry_points.txt +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib.egg-info/requires.txt +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib.egg-info/top_level.txt +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/scripts/redact_test_stream.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/scripts/run_h5_header_rule_inference.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/scripts/summarize_test_report.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/scripts/verify_release_manifests.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/scripts/write_release_manifest.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/setup.cfg +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/conftest.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/helpers/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/helpers/configs.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/helpers/pipeline_stubs.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/integration/classification/test_pipeline.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/integration/localization/test_pipeline.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/integration/localization/test_spotta.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/integration/vqa/test_pipeline.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/release/__init__.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/release/_release_common.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/release/test_00_environment.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/release/test_classification_release.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/release/test_localization_release.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/release/test_vqa_release.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/smoke/test_cli.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/smoke/test_config_utils.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/smoke/test_environment.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/smoke/test_package.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/smoke/test_public_apis.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/api/test_remote_registry.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/api/test_remote_sessions.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/api/test_server_jobs.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/api/test_server_registry.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/api/test_server_startup_scripts.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/api/test_task_model_contract.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/api/test_vqa.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/config/test_architecture.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/config/test_editable.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/config/test_optional_hf.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/config/test_pretrained_merge.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/config/test_split_overrides.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/contracts/test_architecture.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/contracts/test_dependencies.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/contracts/test_package.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/contracts/test_runner_contract.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/core/test_classification_trainer.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/core/test_localization_hf_backend.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/core/test_training_components.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/core/test_video_processing.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/data/test_classification_paths.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/data/test_h5_tracking.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/data/test_hf_json_spotting.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/data/test_hf_json_tracking_spotting.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/data/test_hf_tracking_dataset.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/data/test_localization_dali.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/data/test_localization_intervals.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/data/test_osl_formats.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/models/test_classification_metrics.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/models/test_header_rule_spotter.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/models/test_header_skeleton_spotter.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/models/test_localization_metrics.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/models/test_temporal_shift.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/models/test_vqa_metrics.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/models/test_vqa_qwen_xvars.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/models/test_vqa_training_lora.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/models/test_vqa_xvars_videochatgpt.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/tools/test_conversion.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/tools/test_extract_xvars_features.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/tools/test_hf_transfer.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/tools/test_release_manifest.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/tools/test_report_summary.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tests/unit/tools/test_setup.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/build_sn_vqa_2026_vqa.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/build_sngar_spotting.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/build_soccernet_gar.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/build_soccernet_gar_action_spotting.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/build_soccernet_gar_vqa.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/build_xvars_indexes.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/extract_xvars_clip_features.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/osl_json_to_parquet_webdataset.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/parquet_webdataset_to_osl_json.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/sngar_dataset_card.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/sngar_events.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/convert/verify_sngar_spotting.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/download/download_hf_repo.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/download/download_osl_hf.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/download/push_sngar_spotting.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/download/upload_osl_hf.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/train/train_config.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/training/classification.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/training/localization.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/training/vqa.py +0 -0
- {opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/tools/upload/upload_model_hf.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opensportslib
|
|
3
|
-
Version: 0.3.1.
|
|
3
|
+
Version: 0.3.1.dev25
|
|
4
4
|
Summary: OpenSportsLib is the professional library, designed for advanced video understanding in sports. It provides state-of-the-art tools for action recognition, spotting, retrieval, and captioning, making it ideal for researchers, analysts, and developers working with sports video data.
|
|
5
5
|
Author: Jeet Vora
|
|
6
6
|
Requires-Python: >=3.12
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opensportslib
|
|
3
|
-
Version: 0.3.1.
|
|
3
|
+
Version: 0.3.1.dev25
|
|
4
4
|
Summary: OpenSportsLib is the professional library, designed for advanced video understanding in sports. It provides state-of-the-art tools for action recognition, spotting, retrieval, and captioning, making it ideal for researchers, analysts, and developers working with sports video data.
|
|
5
5
|
Author: Jeet Vora
|
|
6
6
|
Requires-Python: >=3.12
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "opensportslib"
|
|
7
|
-
version = "0.3.1.
|
|
7
|
+
version = "0.3.1.dev25"
|
|
8
8
|
description = "OpenSportsLib is the professional library, designed for advanced video understanding in sports. It provides state-of-the-art tools for action recognition, spotting, retrieval, and captioning, making it ideal for researchers, analysts, and developers working with sports video data."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"""Keep the library version and the server's library pin in sync."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import re
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
STABLE_VERSION = re.compile(r"^(?P<version>\d+\.\d+\.\d+)$")
|
|
11
|
+
DEV_VERSION = re.compile(r"^(?P<base>\d+\.\d+\.\d+)\.dev(?P<number>\d+)$")
|
|
12
|
+
PROJECT_VERSION = re.compile(
|
|
13
|
+
r'(?ms)(^\[project\]\s*.*?^version\s*=\s*")[^"]+("\s*$)'
|
|
14
|
+
)
|
|
15
|
+
SERVER_PIN = re.compile(r'("opensportslib==)([^"]+)(")')
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def next_dev_version(current: str) -> str:
|
|
19
|
+
"""Return the next development release for an existing dev version."""
|
|
20
|
+
match = DEV_VERSION.fullmatch(current)
|
|
21
|
+
if not match:
|
|
22
|
+
raise ValueError(f"expected X.Y.Z.devN, got {current!r}")
|
|
23
|
+
return f"{match.group('base')}.dev{int(match.group('number')) + 1}"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def stable_version(tag: str) -> str:
|
|
27
|
+
"""Return a stable version from a vX.Y.Z release tag."""
|
|
28
|
+
if not tag.startswith("v"):
|
|
29
|
+
raise ValueError(f"release tag must start with 'v', got {tag!r}")
|
|
30
|
+
version = tag[1:]
|
|
31
|
+
if not STABLE_VERSION.fullmatch(version):
|
|
32
|
+
raise ValueError(f"release tag must have the form vX.Y.Z, got {tag!r}")
|
|
33
|
+
return version
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def development_version(tag: str) -> str:
|
|
37
|
+
"""Return the initial development version for a stable release tag."""
|
|
38
|
+
return f"{stable_version(tag)}.dev0"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def next_patch_development_version(tag: str) -> str:
|
|
42
|
+
"""Return the next patch's initial development version for a release tag."""
|
|
43
|
+
major, minor, patch = (int(part) for part in stable_version(tag).split("."))
|
|
44
|
+
return f"{major}.{minor}.{patch + 1}.dev0"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def version_base(version: str) -> str:
|
|
48
|
+
"""Return X.Y.Z from either a stable or development package version."""
|
|
49
|
+
dev_match = DEV_VERSION.fullmatch(version)
|
|
50
|
+
if dev_match:
|
|
51
|
+
return dev_match.group("base")
|
|
52
|
+
if STABLE_VERSION.fullmatch(version):
|
|
53
|
+
return version
|
|
54
|
+
raise ValueError(f"unsupported release version {version!r}")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def read_project_version(pyproject: Path) -> str:
|
|
58
|
+
text = pyproject.read_text()
|
|
59
|
+
match = PROJECT_VERSION.search(text)
|
|
60
|
+
if not match:
|
|
61
|
+
raise ValueError(f"project.version not found in {pyproject}")
|
|
62
|
+
return text[match.start(0) + len(match.group(1)) : match.end(0) - len(match.group(2))]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def read_server_pin(pyproject: Path) -> str:
|
|
66
|
+
"""Return the OpenSportsLib dependency pin from the server metadata."""
|
|
67
|
+
text = pyproject.read_text()
|
|
68
|
+
matches = SERVER_PIN.findall(text)
|
|
69
|
+
if len(matches) != 1:
|
|
70
|
+
raise ValueError(f"expected one opensportslib dependency pin in {pyproject}")
|
|
71
|
+
return matches[0][1]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def assert_synchronized(root_pyproject: Path, server_pyproject: Path) -> str:
|
|
75
|
+
"""Ensure the package version and server dependency pin are identical."""
|
|
76
|
+
version = read_project_version(root_pyproject)
|
|
77
|
+
pin = read_server_pin(server_pyproject)
|
|
78
|
+
if version != pin:
|
|
79
|
+
raise ValueError(
|
|
80
|
+
f"version metadata is not synchronized: {root_pyproject} has {version!r}, "
|
|
81
|
+
f"but {server_pyproject} pins {pin!r}"
|
|
82
|
+
)
|
|
83
|
+
return version
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def validate_release(tag: str, root_pyproject: Path, server_pyproject: Path) -> str:
|
|
87
|
+
"""Validate that metadata is the prepared prerelease for *tag*."""
|
|
88
|
+
expected = development_version(tag)
|
|
89
|
+
current = assert_synchronized(root_pyproject, server_pyproject)
|
|
90
|
+
if not DEV_VERSION.fullmatch(current) or version_base(current) != stable_version(tag):
|
|
91
|
+
raise ValueError(
|
|
92
|
+
f"release tag {tag!r} requires prepared version {expected[:-1]}N, got {current!r}"
|
|
93
|
+
)
|
|
94
|
+
return current
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def prepare_development(tag: str, root_pyproject: Path, server_pyproject: Path) -> str:
|
|
98
|
+
"""Start the requested release line at X.Y.Z.dev0."""
|
|
99
|
+
target = development_version(tag)
|
|
100
|
+
current = assert_synchronized(root_pyproject, server_pyproject)
|
|
101
|
+
if tuple(map(int, stable_version(tag).split("."))) <= tuple(map(int, version_base(current).split("."))):
|
|
102
|
+
raise ValueError(f"target release {tag!r} must be newer than current version {current!r}")
|
|
103
|
+
synchronize(target, root_pyproject, server_pyproject)
|
|
104
|
+
return target
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def advance_development(tag: str, root_pyproject: Path, server_pyproject: Path) -> str:
|
|
108
|
+
"""Advance a released development line to its next patch development base."""
|
|
109
|
+
validate_release(tag, root_pyproject, server_pyproject)
|
|
110
|
+
target = next_patch_development_version(tag)
|
|
111
|
+
synchronize(target, root_pyproject, server_pyproject)
|
|
112
|
+
return target
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def synchronize(version: str, root_pyproject: Path, server_pyproject: Path) -> None:
|
|
116
|
+
"""Write one OpenSportsLib version to both release metadata files."""
|
|
117
|
+
if not (STABLE_VERSION.fullmatch(version) or DEV_VERSION.fullmatch(version)):
|
|
118
|
+
raise ValueError(f"unsupported release version {version!r}")
|
|
119
|
+
|
|
120
|
+
root_text = root_pyproject.read_text()
|
|
121
|
+
server_text = server_pyproject.read_text()
|
|
122
|
+
if len(PROJECT_VERSION.findall(root_text)) != 1:
|
|
123
|
+
raise ValueError(f"expected one project.version in {root_pyproject}")
|
|
124
|
+
if len(SERVER_PIN.findall(server_text)) != 1:
|
|
125
|
+
raise ValueError(f"expected one opensportslib dependency pin in {server_pyproject}")
|
|
126
|
+
|
|
127
|
+
root_updated = PROJECT_VERSION.sub(rf"\g<1>{version}\g<2>", root_text)
|
|
128
|
+
server_updated = SERVER_PIN.sub(rf"\g<1>{version}\g<3>", server_text)
|
|
129
|
+
root_pyproject.write_text(root_updated)
|
|
130
|
+
server_pyproject.write_text(server_updated)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def main() -> None:
|
|
134
|
+
parser = argparse.ArgumentParser()
|
|
135
|
+
parser.add_argument(
|
|
136
|
+
"command",
|
|
137
|
+
choices=(
|
|
138
|
+
"bump-dev",
|
|
139
|
+
"set-stable",
|
|
140
|
+
"prepare-dev",
|
|
141
|
+
"validate-release",
|
|
142
|
+
"advance-dev",
|
|
143
|
+
"assert-synchronized",
|
|
144
|
+
),
|
|
145
|
+
)
|
|
146
|
+
parser.add_argument("value", nargs="?", help="vX.Y.Z tag for set-stable")
|
|
147
|
+
parser.add_argument("--root", type=Path, default=Path("pyproject.toml"))
|
|
148
|
+
parser.add_argument("--server", type=Path, default=Path("server/pyproject.toml"))
|
|
149
|
+
args = parser.parse_args()
|
|
150
|
+
|
|
151
|
+
if args.command == "bump-dev":
|
|
152
|
+
if args.value is not None:
|
|
153
|
+
parser.error("bump-dev does not accept a value")
|
|
154
|
+
version = next_dev_version(assert_synchronized(args.root, args.server))
|
|
155
|
+
synchronize(version, args.root, args.server)
|
|
156
|
+
elif args.command == "set-stable":
|
|
157
|
+
if args.value is None:
|
|
158
|
+
parser.error("set-stable requires a vX.Y.Z tag")
|
|
159
|
+
version = stable_version(args.value)
|
|
160
|
+
synchronize(version, args.root, args.server)
|
|
161
|
+
elif args.command == "prepare-dev":
|
|
162
|
+
if args.value is None:
|
|
163
|
+
parser.error("prepare-dev requires a vX.Y.Z tag")
|
|
164
|
+
version = prepare_development(args.value, args.root, args.server)
|
|
165
|
+
elif args.command == "validate-release":
|
|
166
|
+
if args.value is None:
|
|
167
|
+
parser.error("validate-release requires a vX.Y.Z tag")
|
|
168
|
+
version = validate_release(args.value, args.root, args.server)
|
|
169
|
+
elif args.command == "advance-dev":
|
|
170
|
+
if args.value is None:
|
|
171
|
+
parser.error("advance-dev requires a vX.Y.Z tag")
|
|
172
|
+
version = advance_development(args.value, args.root, args.server)
|
|
173
|
+
else:
|
|
174
|
+
if args.value is not None:
|
|
175
|
+
parser.error("assert-synchronized does not accept a value")
|
|
176
|
+
version = assert_synchronized(args.root, args.server)
|
|
177
|
+
print(version)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
if __name__ == "__main__":
|
|
181
|
+
main()
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import importlib.util
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
SCRIPT = Path(__file__).parents[3] / "scripts" / "release_versions.py"
|
|
8
|
+
SPEC = importlib.util.spec_from_file_location("release_versions", SCRIPT)
|
|
9
|
+
release_versions = importlib.util.module_from_spec(SPEC)
|
|
10
|
+
assert SPEC.loader is not None
|
|
11
|
+
SPEC.loader.exec_module(release_versions)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def test_next_dev_version_increments_counter():
|
|
15
|
+
assert release_versions.next_dev_version("0.3.1.dev5") == "0.3.1.dev6"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@pytest.mark.parametrize("version", ["0.3.1", "0.3.1rc1", "invalid"])
|
|
19
|
+
def test_next_dev_version_rejects_non_dev_versions(version):
|
|
20
|
+
with pytest.raises(ValueError, match="expected X.Y.Z.devN"):
|
|
21
|
+
release_versions.next_dev_version(version)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_stable_version_requires_stable_v_tag():
|
|
25
|
+
assert release_versions.stable_version("v0.3.1") == "0.3.1"
|
|
26
|
+
with pytest.raises(ValueError, match="vX.Y.Z"):
|
|
27
|
+
release_versions.stable_version("v0.3.1.dev1")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_development_version_helpers():
|
|
31
|
+
assert release_versions.development_version("v0.4.0") == "0.4.0.dev0"
|
|
32
|
+
assert release_versions.next_patch_development_version("v0.3.1") == "0.3.2.dev0"
|
|
33
|
+
assert release_versions.version_base("0.3.1.dev5") == "0.3.1"
|
|
34
|
+
assert release_versions.version_base("0.3.1") == "0.3.1"
|
|
35
|
+
with pytest.raises(ValueError, match="unsupported release version"):
|
|
36
|
+
release_versions.version_base("invalid")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_synchronize_updates_root_and_server_pin_only(tmp_path):
|
|
40
|
+
root = tmp_path / "pyproject.toml"
|
|
41
|
+
server = tmp_path / "server.toml"
|
|
42
|
+
root.write_text('[project]\nname = "opensportslib"\nversion = "0.3.1.dev5"\n')
|
|
43
|
+
server.write_text(
|
|
44
|
+
'[project]\nname = "opensportslib-server"\nversion = "0.1.0"\n'
|
|
45
|
+
'dependencies = [\n "opensportslib==0.3.1.dev5",\n "fastapi",\n]\n'
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
release_versions.synchronize("0.3.1.dev6", root, server)
|
|
49
|
+
|
|
50
|
+
assert 'version = "0.3.1.dev6"' in root.read_text()
|
|
51
|
+
assert 'version = "0.1.0"' in server.read_text()
|
|
52
|
+
assert '"opensportslib==0.3.1.dev6"' in server.read_text()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_synchronize_fails_before_writing_when_server_pin_is_missing(tmp_path):
|
|
56
|
+
root = tmp_path / "pyproject.toml"
|
|
57
|
+
server = tmp_path / "server.toml"
|
|
58
|
+
original = '[project]\nversion = "0.3.1.dev5"\n'
|
|
59
|
+
root.write_text(original)
|
|
60
|
+
server.write_text('[project]\nversion = "0.1.0"\n')
|
|
61
|
+
|
|
62
|
+
with pytest.raises(ValueError, match="dependency pin"):
|
|
63
|
+
release_versions.synchronize("0.3.1.dev6", root, server)
|
|
64
|
+
|
|
65
|
+
assert root.read_text() == original
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_assert_synchronized_rejects_mismatched_metadata(tmp_path):
|
|
69
|
+
root = tmp_path / "pyproject.toml"
|
|
70
|
+
server = tmp_path / "server.toml"
|
|
71
|
+
root.write_text('[project]\nversion = "0.3.1.dev5"\n')
|
|
72
|
+
server.write_text('dependencies = ["opensportslib==0.3.1.dev4"]\n')
|
|
73
|
+
|
|
74
|
+
with pytest.raises(ValueError, match="not synchronized"):
|
|
75
|
+
release_versions.assert_synchronized(root, server)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def test_validate_release_requires_matching_prepared_dev_line(tmp_path):
|
|
79
|
+
root = tmp_path / "pyproject.toml"
|
|
80
|
+
server = tmp_path / "server.toml"
|
|
81
|
+
root.write_text('[project]\nversion = "0.3.1.dev5"\n')
|
|
82
|
+
server.write_text('dependencies = ["opensportslib==0.3.1.dev5"]\n')
|
|
83
|
+
|
|
84
|
+
assert release_versions.validate_release("v0.3.1", root, server) == "0.3.1.dev5"
|
|
85
|
+
with pytest.raises(ValueError, match="requires prepared version"):
|
|
86
|
+
release_versions.validate_release("v0.3.2", root, server)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_prepare_development_starts_newer_feature_line(tmp_path):
|
|
90
|
+
root = tmp_path / "pyproject.toml"
|
|
91
|
+
server = tmp_path / "server.toml"
|
|
92
|
+
root.write_text('[project]\nversion = "0.3.2.dev8"\n')
|
|
93
|
+
server.write_text('dependencies = ["opensportslib==0.3.2.dev8"]\n')
|
|
94
|
+
|
|
95
|
+
assert release_versions.prepare_development("v0.4.0", root, server) == "0.4.0.dev0"
|
|
96
|
+
assert release_versions.assert_synchronized(root, server) == "0.4.0.dev0"
|
|
97
|
+
with pytest.raises(ValueError, match="must be newer"):
|
|
98
|
+
release_versions.prepare_development("v0.4.0", root, server)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def test_advance_development_moves_to_next_patch_only_from_matching_line(tmp_path):
|
|
102
|
+
root = tmp_path / "pyproject.toml"
|
|
103
|
+
server = tmp_path / "server.toml"
|
|
104
|
+
root.write_text('[project]\nversion = "0.3.1.dev6"\n')
|
|
105
|
+
server.write_text('dependencies = ["opensportslib==0.3.1.dev6"]\n')
|
|
106
|
+
|
|
107
|
+
assert release_versions.advance_development("v0.3.1", root, server) == "0.3.2.dev0"
|
|
108
|
+
assert release_versions.assert_synchronized(root, server) == "0.3.2.dev0"
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def test_advance_development_refuses_a_different_release_line(tmp_path):
|
|
112
|
+
root = tmp_path / "pyproject.toml"
|
|
113
|
+
server = tmp_path / "server.toml"
|
|
114
|
+
root.write_text('[project]\nversion = "0.4.0.dev0"\n')
|
|
115
|
+
server.write_text('dependencies = ["opensportslib==0.4.0.dev0"]\n')
|
|
116
|
+
|
|
117
|
+
with pytest.raises(ValueError, match="requires prepared version"):
|
|
118
|
+
release_versions.advance_development("v0.3.1", root, server)
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"""Keep the library version and the server's library pin in sync."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import argparse
|
|
6
|
-
import re
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
STABLE_VERSION = re.compile(r"^(?P<version>\d+\.\d+\.\d+)$")
|
|
11
|
-
DEV_VERSION = re.compile(r"^(?P<base>\d+\.\d+\.\d+)\.dev(?P<number>\d+)$")
|
|
12
|
-
PROJECT_VERSION = re.compile(
|
|
13
|
-
r'(?ms)(^\[project\]\s*.*?^version\s*=\s*")[^"]+("\s*$)'
|
|
14
|
-
)
|
|
15
|
-
SERVER_PIN = re.compile(r'("opensportslib==)[^"]+("[,\s]*$)', re.MULTILINE)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def next_dev_version(current: str) -> str:
|
|
19
|
-
"""Return the next development release for an existing dev version."""
|
|
20
|
-
match = DEV_VERSION.fullmatch(current)
|
|
21
|
-
if not match:
|
|
22
|
-
raise ValueError(f"expected X.Y.Z.devN, got {current!r}")
|
|
23
|
-
return f"{match.group('base')}.dev{int(match.group('number')) + 1}"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def stable_version(tag: str) -> str:
|
|
27
|
-
"""Return a stable version from a vX.Y.Z release tag."""
|
|
28
|
-
if not tag.startswith("v"):
|
|
29
|
-
raise ValueError(f"release tag must start with 'v', got {tag!r}")
|
|
30
|
-
version = tag[1:]
|
|
31
|
-
if not STABLE_VERSION.fullmatch(version):
|
|
32
|
-
raise ValueError(f"release tag must have the form vX.Y.Z, got {tag!r}")
|
|
33
|
-
return version
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def read_project_version(pyproject: Path) -> str:
|
|
37
|
-
text = pyproject.read_text()
|
|
38
|
-
match = PROJECT_VERSION.search(text)
|
|
39
|
-
if not match:
|
|
40
|
-
raise ValueError(f"project.version not found in {pyproject}")
|
|
41
|
-
return text[match.start(0) + len(match.group(1)) : match.end(0) - len(match.group(2))]
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def synchronize(version: str, root_pyproject: Path, server_pyproject: Path) -> None:
|
|
45
|
-
"""Write one OpenSportsLib version to both release metadata files."""
|
|
46
|
-
if not (STABLE_VERSION.fullmatch(version) or DEV_VERSION.fullmatch(version)):
|
|
47
|
-
raise ValueError(f"unsupported release version {version!r}")
|
|
48
|
-
|
|
49
|
-
root_text = root_pyproject.read_text()
|
|
50
|
-
server_text = server_pyproject.read_text()
|
|
51
|
-
if len(PROJECT_VERSION.findall(root_text)) != 1:
|
|
52
|
-
raise ValueError(f"expected one project.version in {root_pyproject}")
|
|
53
|
-
if len(SERVER_PIN.findall(server_text)) != 1:
|
|
54
|
-
raise ValueError(f"expected one opensportslib dependency pin in {server_pyproject}")
|
|
55
|
-
|
|
56
|
-
root_updated = PROJECT_VERSION.sub(rf"\g<1>{version}\g<2>", root_text)
|
|
57
|
-
server_updated = SERVER_PIN.sub(rf"\g<1>{version}\g<2>", server_text)
|
|
58
|
-
root_pyproject.write_text(root_updated)
|
|
59
|
-
server_pyproject.write_text(server_updated)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def main() -> None:
|
|
63
|
-
parser = argparse.ArgumentParser()
|
|
64
|
-
parser.add_argument("command", choices=("bump-dev", "set-stable"))
|
|
65
|
-
parser.add_argument("value", nargs="?", help="vX.Y.Z tag for set-stable")
|
|
66
|
-
parser.add_argument("--root", type=Path, default=Path("pyproject.toml"))
|
|
67
|
-
parser.add_argument("--server", type=Path, default=Path("server/pyproject.toml"))
|
|
68
|
-
args = parser.parse_args()
|
|
69
|
-
|
|
70
|
-
if args.command == "bump-dev":
|
|
71
|
-
if args.value is not None:
|
|
72
|
-
parser.error("bump-dev does not accept a value")
|
|
73
|
-
version = next_dev_version(read_project_version(args.root))
|
|
74
|
-
else:
|
|
75
|
-
if args.value is None:
|
|
76
|
-
parser.error("set-stable requires a vX.Y.Z tag")
|
|
77
|
-
version = stable_version(args.value)
|
|
78
|
-
|
|
79
|
-
synchronize(version, args.root, args.server)
|
|
80
|
-
print(version)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if __name__ == "__main__":
|
|
84
|
-
main()
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import importlib.util
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
|
|
4
|
-
import pytest
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
SCRIPT = Path(__file__).parents[3] / "scripts" / "release_versions.py"
|
|
8
|
-
SPEC = importlib.util.spec_from_file_location("release_versions", SCRIPT)
|
|
9
|
-
release_versions = importlib.util.module_from_spec(SPEC)
|
|
10
|
-
assert SPEC.loader is not None
|
|
11
|
-
SPEC.loader.exec_module(release_versions)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def test_next_dev_version_increments_counter():
|
|
15
|
-
assert release_versions.next_dev_version("0.3.1.dev5") == "0.3.1.dev6"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@pytest.mark.parametrize("version", ["0.3.1", "0.3.1rc1", "invalid"])
|
|
19
|
-
def test_next_dev_version_rejects_non_dev_versions(version):
|
|
20
|
-
with pytest.raises(ValueError, match="expected X.Y.Z.devN"):
|
|
21
|
-
release_versions.next_dev_version(version)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def test_stable_version_requires_stable_v_tag():
|
|
25
|
-
assert release_versions.stable_version("v0.3.1") == "0.3.1"
|
|
26
|
-
with pytest.raises(ValueError, match="vX.Y.Z"):
|
|
27
|
-
release_versions.stable_version("v0.3.1.dev1")
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def test_synchronize_updates_root_and_server_pin_only(tmp_path):
|
|
31
|
-
root = tmp_path / "pyproject.toml"
|
|
32
|
-
server = tmp_path / "server.toml"
|
|
33
|
-
root.write_text('[project]\nname = "opensportslib"\nversion = "0.3.1.dev5"\n')
|
|
34
|
-
server.write_text(
|
|
35
|
-
'[project]\nname = "opensportslib-server"\nversion = "0.1.0"\n'
|
|
36
|
-
'dependencies = [\n "opensportslib==0.3.1.dev5",\n "fastapi",\n]\n'
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
release_versions.synchronize("0.3.1.dev6", root, server)
|
|
40
|
-
|
|
41
|
-
assert 'version = "0.3.1.dev6"' in root.read_text()
|
|
42
|
-
assert 'version = "0.1.0"' in server.read_text()
|
|
43
|
-
assert '"opensportslib==0.3.1.dev6"' in server.read_text()
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def test_synchronize_fails_before_writing_when_server_pin_is_missing(tmp_path):
|
|
47
|
-
root = tmp_path / "pyproject.toml"
|
|
48
|
-
server = tmp_path / "server.toml"
|
|
49
|
-
original = '[project]\nversion = "0.3.1.dev5"\n'
|
|
50
|
-
root.write_text(original)
|
|
51
|
-
server.write_text('[project]\nversion = "0.1.0"\n')
|
|
52
|
-
|
|
53
|
-
with pytest.raises(ValueError, match="dependency pin"):
|
|
54
|
-
release_versions.synchronize("0.3.1.dev6", root, server)
|
|
55
|
-
|
|
56
|
-
assert root.read_text() == original
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/examples/quickstart/basic_classification.py
RENAMED
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/examples/quickstart/basic_localization.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/adaptation/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/apis/base_task_model.py
RENAMED
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/apis/classification.py
RENAMED
|
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
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/vqa/default.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/vqa/qwen_lora.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/configs/vqa/xvars.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/accessors.py
RENAMED
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/conflicts.py
RENAMED
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/editable.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/migrate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/rule_variants.py
RENAMED
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/runtime_adapter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/config/validate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/optimizer/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/optimizer/builder.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/scheduler/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/scheduler/builder.py
RENAMED
|
File without changes
|
{opensportslib-0.3.1.dev24 → opensportslib-0.3.1.dev25}/opensportslib/core/trainer/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|