x4d-devkit 0.55.0rc1__tar.gz → 0.55.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.
- {x4d_devkit-0.55.0rc1/x4d_devkit.egg-info → x4d_devkit-0.55.1}/PKG-INFO +1 -1
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/pyproject.toml +1 -1
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_sdk_api.py +1 -1
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_work_session.py +37 -1
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/materialize.py +24 -3
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/validation/validator.py +9 -2
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1/x4d_devkit.egg-info}/PKG-INFO +1 -1
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/LICENSE +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/README.md +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/setup.cfg +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_accounts.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_annotation_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_annotation_document_hash.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_annotation_reference.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_assets_client.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_boundary.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_box.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_build_info.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_category_audit.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_clean_basemap.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_clean_basemap_client.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_cli_auth.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_client_json_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_client_projects.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_clip_archives.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_contract_validation.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_coordinate_frames.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_current_state.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_current_state_identity_consumers_example.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_dataset_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_dataset_identity.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_detection_eval.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_evaluate.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_export_bundle.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_clip.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_conditional_rules.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_enum_set.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_export.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_geometry.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_groups.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_preannotation.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_reference.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_review.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_schema_migration.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_schema_registry_client.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_schema_upgrade.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_source.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_work_session.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_inference_input.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_inference_schemas.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_inference_service.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_label_schemas.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_lidar_materialization.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_loader.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_matching.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_metrics.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_models.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_parse_equivalence.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_platform_pose.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_preannotation_client.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_project_discovery.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_reconstruction_client.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_release_gate.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_roadmark_preview.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_semantic_scene_authoring.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_semantic_scene_client.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_semantic_scene_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_semantic_scene_independent.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_semantic_scene_native_clip.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_source_attributes.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_source_content.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_time_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_token.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_tracking_eval.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_training_identity.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_transform.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_transform_chain.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_validation.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_vector_map.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_vector_map_geometry.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_vector_map_session.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_work_session_validation_reuse.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/__init__.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/_image_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/accounts.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/annotation_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/annotation_reference.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/audit.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/build_info.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/clean_basemap.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/cli.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/__init__.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/_origin.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/accounts.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/annotation_reference.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/assets.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/bags.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/capabilities.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/checkpoints.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/clean_basemap.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/client.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/clip_work_sessions.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/clips.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/dataset_identity.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_clips.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_exports.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_preannotations.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_review.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_schemas.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_work_sessions.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/label_schemas.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/preannotation.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/projects.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/reconstruction.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/semantic_scene.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/semantic_scene_authoring.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/services.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/test_sets.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/consumer_identity.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/coordinate_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/core/__init__.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/core/loader.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/core/models.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/core/token.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/core/transform.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/current_state.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/dataset_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/dataset_identity.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/__init__.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/api.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/box.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/detection.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/matching.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/metrics.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/tracking.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/export_bundle.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_clip.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_export.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_geometry.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_groups.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_preannotation.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_reference.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_review.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_schema.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_schema_migration.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_schema_upgrade.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_source.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_work_session.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/__init__.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/input.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/models.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/schemas.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/service.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/tasks.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/json_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/label_schema.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/lidar_materialization.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/project_discovery.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/roadmark_preview.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/semantic_scene_authoring.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/semantic_scene_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/source_content.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/time_contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/training_identity.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/validation/__init__.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/validation/contract.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/validation/platform_pose.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/validation/report.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/vector_map.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/vector_map_geometry.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/work_session.py +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit.egg-info/SOURCES.txt +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit.egg-info/dependency_links.txt +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit.egg-info/entry_points.txt +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit.egg-info/requires.txt +0 -0
- {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "x4d-devkit"
|
|
7
|
-
version = "0.55.
|
|
7
|
+
version = "0.55.1"
|
|
8
8
|
description = "Official X-4D external SDK and CLI for datasets, platform APIs, training bridges, and automation"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -11,7 +11,7 @@ from x4d_devkit.eval.matching import MetricData
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def test_package_version_is_current_release():
|
|
14
|
-
assert x4d_devkit.__version__ == "0.55.
|
|
14
|
+
assert x4d_devkit.__version__ == "0.55.1"
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
def test_loader_exposes_and_enforces_only_current_schema(tmp_path):
|
|
@@ -442,6 +442,22 @@ def test_work_session_materializes_optional_semantic_scene_as_an_independent_com
|
|
|
442
442
|
loader = ClipLoader(tmp_path)
|
|
443
443
|
assert loader.load_semantic_scene_component().manifest.semantic_scene_revision == source["semantic_scene_revision"]
|
|
444
444
|
|
|
445
|
+
# A later complete materialization of the same semantic-scene revision
|
|
446
|
+
# reuses the vouched component: no removal, transfer or re-validation.
|
|
447
|
+
semantic_urls = set(source["semantic_scene_asset_urls"].values())
|
|
448
|
+
before = len(client._http.urls)
|
|
449
|
+
again = materialize_work_session_clip(
|
|
450
|
+
source,
|
|
451
|
+
output_dir=tmp_path,
|
|
452
|
+
client=client,
|
|
453
|
+
workers=1,
|
|
454
|
+
)
|
|
455
|
+
assert again["errors"] == []
|
|
456
|
+
assert not semantic_urls & {url for _, url in client._http.urls[before:]}
|
|
457
|
+
assert ClipLoader(tmp_path).load_semantic_scene_component().manifest.semantic_scene_revision == (
|
|
458
|
+
source["semantic_scene_revision"]
|
|
459
|
+
)
|
|
460
|
+
|
|
445
461
|
|
|
446
462
|
def test_keyframes_only_materialization_writes_self_contained_projection(
|
|
447
463
|
tmp_path,
|
|
@@ -707,11 +723,12 @@ def test_invalid_native_projection_never_publishes_cache_identity(
|
|
|
707
723
|
):
|
|
708
724
|
original = materialize_module._write_component_tables
|
|
709
725
|
|
|
710
|
-
def write_invalid_projection(clip_dir, tables, *, selected_components):
|
|
726
|
+
def write_invalid_projection(clip_dir, tables, *, selected_components, complete):
|
|
711
727
|
original(
|
|
712
728
|
clip_dir,
|
|
713
729
|
tables,
|
|
714
730
|
selected_components=selected_components,
|
|
731
|
+
complete=complete,
|
|
715
732
|
)
|
|
716
733
|
(clip_dir / "ego_pose.json").write_text("[]", encoding="utf-8")
|
|
717
734
|
|
|
@@ -740,6 +757,25 @@ def test_materialize_rejects_malformed_completed_cache_identity(tmp_path):
|
|
|
740
757
|
materialize_work_session_clip(_manifest(), output_dir=tmp_path)
|
|
741
758
|
|
|
742
759
|
|
|
760
|
+
def test_complete_materialization_replaces_older_contract_meta(tmp_path):
|
|
761
|
+
# An older cache keeps retired meta fields (Dataset 0.17 vehicle_id).
|
|
762
|
+
(tmp_path / "meta.json").write_text(
|
|
763
|
+
json.dumps({"clip_id": "stale", "schema_version": "0.17", "vehicle_id": "G150"})
|
|
764
|
+
)
|
|
765
|
+
result = materialize_work_session_clip(
|
|
766
|
+
_manifest(),
|
|
767
|
+
output_dir=tmp_path,
|
|
768
|
+
api_url="http://x4d.local",
|
|
769
|
+
client=_FakeX4DClient(),
|
|
770
|
+
workers=1,
|
|
771
|
+
)
|
|
772
|
+
assert result["errors"] == []
|
|
773
|
+
meta = json.loads((tmp_path / "meta.json").read_text())
|
|
774
|
+
assert "vehicle_id" not in meta
|
|
775
|
+
assert meta["schema_version"] != "0.17"
|
|
776
|
+
assert validate_clip(tmp_path).ok
|
|
777
|
+
|
|
778
|
+
|
|
743
779
|
def test_materialize_rejects_legacy_root_occ(tmp_path):
|
|
744
780
|
(tmp_path / "occ").mkdir()
|
|
745
781
|
|
|
@@ -428,6 +428,7 @@ def materialize_work_session_clip(
|
|
|
428
428
|
clip_dir,
|
|
429
429
|
tables,
|
|
430
430
|
selected_components=selected_components,
|
|
431
|
+
complete=complete_request,
|
|
431
432
|
)
|
|
432
433
|
|
|
433
434
|
selected_sample_data = tables["sample_data.json"]
|
|
@@ -466,7 +467,17 @@ def materialize_work_session_clip(
|
|
|
466
467
|
errors=errors,
|
|
467
468
|
)
|
|
468
469
|
|
|
469
|
-
|
|
470
|
+
# The Semantic Scene is an independent content-addressed component with its
|
|
471
|
+
# own revision. When the completed cache already vouches for exactly the
|
|
472
|
+
# target revision, it is reused: no removal, transfer, or re-validation.
|
|
473
|
+
reuse_semantic_scene = (
|
|
474
|
+
"semantic_scene" in selected_components
|
|
475
|
+
and ws.semantic_scene_revision is not None
|
|
476
|
+
and previous_identity.get("semantic_scene_revision")
|
|
477
|
+
== ws.semantic_scene_revision
|
|
478
|
+
and (clip_dir / "semantic_scene" / "manifest.json").is_file()
|
|
479
|
+
)
|
|
480
|
+
if "semantic_scene" in selected_components and not reuse_semantic_scene:
|
|
470
481
|
_remove_semantic_scene_component(clip_dir)
|
|
471
482
|
if ws.semantic_scene_revision is not None:
|
|
472
483
|
with _http_context(client=client, api_url=api_url, token=token) as http:
|
|
@@ -502,6 +513,7 @@ def materialize_work_session_clip(
|
|
|
502
513
|
not errors
|
|
503
514
|
and "semantic_scene" in selected_components
|
|
504
515
|
and ws.semantic_scene_revision is not None
|
|
516
|
+
and not reuse_semantic_scene
|
|
505
517
|
):
|
|
506
518
|
try:
|
|
507
519
|
from x4d_devkit.validation.validator import load_semantic_scene_component
|
|
@@ -523,7 +535,10 @@ def materialize_work_session_clip(
|
|
|
523
535
|
if not errors:
|
|
524
536
|
from x4d_devkit.validation.validator import validate_clip
|
|
525
537
|
|
|
526
|
-
report = validate_clip(
|
|
538
|
+
report = validate_clip(
|
|
539
|
+
clip_dir,
|
|
540
|
+
validate_semantic_scene=not reuse_semantic_scene,
|
|
541
|
+
)
|
|
527
542
|
if not report.ok:
|
|
528
543
|
errors.append(
|
|
529
544
|
{
|
|
@@ -915,11 +930,17 @@ def _write_component_tables(
|
|
|
915
930
|
tables: dict[str, Any],
|
|
916
931
|
*,
|
|
917
932
|
selected_components: frozenset[str],
|
|
933
|
+
complete: bool = False,
|
|
918
934
|
) -> None:
|
|
919
935
|
target_meta = tables["meta.json"]
|
|
920
936
|
source_components = {"samples", "sweeps"}
|
|
921
937
|
meta_components = {*source_components, "label_schema", "business_metadata"}
|
|
922
|
-
if
|
|
938
|
+
if complete:
|
|
939
|
+
# A complete materialization owns every metadata field: write the
|
|
940
|
+
# target projection and never parse a previous (possibly older
|
|
941
|
+
# contract) meta.json, whose retired fields would fail validation.
|
|
942
|
+
_write_json(clip_dir / "meta.json", dict(target_meta))
|
|
943
|
+
elif selected_components & meta_components:
|
|
923
944
|
meta_path = clip_dir / "meta.json"
|
|
924
945
|
if meta_path.exists():
|
|
925
946
|
current_meta = load_i_json(meta_path)
|
|
@@ -86,8 +86,15 @@ def _is_canonical_asset_path(value: Any) -> bool:
|
|
|
86
86
|
|
|
87
87
|
def validate_clip(
|
|
88
88
|
clip_dir: str | Path,
|
|
89
|
+
*,
|
|
90
|
+
validate_semantic_scene: bool = True,
|
|
89
91
|
) -> ValidationReport:
|
|
90
|
-
"""Validate one self-contained native Dataset 0.18 Clip.
|
|
92
|
+
"""Validate one self-contained native Dataset 0.18 Clip.
|
|
93
|
+
|
|
94
|
+
``validate_semantic_scene=False`` is only for a caller that already holds
|
|
95
|
+
proof that the present Semantic Scene component is the exact unchanged
|
|
96
|
+
revision it validated before (for example a reused cache component).
|
|
97
|
+
"""
|
|
91
98
|
|
|
92
99
|
root = Path(clip_dir)
|
|
93
100
|
issues: list[ValidationIssue] = []
|
|
@@ -136,7 +143,7 @@ def validate_clip(
|
|
|
136
143
|
"native semantic_scene component path must be a directory",
|
|
137
144
|
str(semantic_scene_path),
|
|
138
145
|
)
|
|
139
|
-
elif report.ok:
|
|
146
|
+
elif report.ok and validate_semantic_scene:
|
|
140
147
|
try:
|
|
141
148
|
load_semantic_scene_component(root)
|
|
142
149
|
except Exception as exc:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_current_state_identity_consumers_example.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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
|