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.
Files changed (176) hide show
  1. {x4d_devkit-0.55.0rc1/x4d_devkit.egg-info → x4d_devkit-0.55.1}/PKG-INFO +1 -1
  2. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/pyproject.toml +1 -1
  3. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_sdk_api.py +1 -1
  4. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_work_session.py +37 -1
  5. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/materialize.py +24 -3
  6. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/validation/validator.py +9 -2
  7. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1/x4d_devkit.egg-info}/PKG-INFO +1 -1
  8. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/LICENSE +0 -0
  9. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/README.md +0 -0
  10. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/setup.cfg +0 -0
  11. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_accounts.py +0 -0
  12. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_annotation_contract.py +0 -0
  13. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_annotation_document_hash.py +0 -0
  14. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_annotation_reference.py +0 -0
  15. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_assets_client.py +0 -0
  16. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_boundary.py +0 -0
  17. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_box.py +0 -0
  18. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_build_info.py +0 -0
  19. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_category_audit.py +0 -0
  20. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_clean_basemap.py +0 -0
  21. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_clean_basemap_client.py +0 -0
  22. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_cli_auth.py +0 -0
  23. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_client_json_contract.py +0 -0
  24. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_client_projects.py +0 -0
  25. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_clip_archives.py +0 -0
  26. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_contract_validation.py +0 -0
  27. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_coordinate_frames.py +0 -0
  28. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_current_state.py +0 -0
  29. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_current_state_identity_consumers_example.py +0 -0
  30. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_dataset_contract.py +0 -0
  31. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_dataset_identity.py +0 -0
  32. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_detection_eval.py +0 -0
  33. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_evaluate.py +0 -0
  34. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_export_bundle.py +0 -0
  35. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_clip.py +0 -0
  36. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_conditional_rules.py +0 -0
  37. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_enum_set.py +0 -0
  38. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_export.py +0 -0
  39. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_geometry.py +0 -0
  40. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_groups.py +0 -0
  41. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_preannotation.py +0 -0
  42. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_reference.py +0 -0
  43. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_review.py +0 -0
  44. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_schema_migration.py +0 -0
  45. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_schema_registry_client.py +0 -0
  46. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_schema_upgrade.py +0 -0
  47. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_source.py +0 -0
  48. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_image_work_session.py +0 -0
  49. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_inference_input.py +0 -0
  50. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_inference_schemas.py +0 -0
  51. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_inference_service.py +0 -0
  52. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_label_schemas.py +0 -0
  53. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_lidar_materialization.py +0 -0
  54. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_loader.py +0 -0
  55. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_matching.py +0 -0
  56. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_metrics.py +0 -0
  57. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_models.py +0 -0
  58. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_parse_equivalence.py +0 -0
  59. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_platform_pose.py +0 -0
  60. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_preannotation_client.py +0 -0
  61. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_project_discovery.py +0 -0
  62. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_reconstruction_client.py +0 -0
  63. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_release_gate.py +0 -0
  64. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_roadmark_preview.py +0 -0
  65. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_semantic_scene_authoring.py +0 -0
  66. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_semantic_scene_client.py +0 -0
  67. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_semantic_scene_contract.py +0 -0
  68. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_semantic_scene_independent.py +0 -0
  69. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_semantic_scene_native_clip.py +0 -0
  70. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_source_attributes.py +0 -0
  71. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_source_content.py +0 -0
  72. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_time_contract.py +0 -0
  73. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_token.py +0 -0
  74. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_tracking_eval.py +0 -0
  75. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_training_identity.py +0 -0
  76. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_transform.py +0 -0
  77. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_transform_chain.py +0 -0
  78. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_validation.py +0 -0
  79. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_vector_map.py +0 -0
  80. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_vector_map_geometry.py +0 -0
  81. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_vector_map_session.py +0 -0
  82. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/tests/test_work_session_validation_reuse.py +0 -0
  83. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/__init__.py +0 -0
  84. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/_image_contract.py +0 -0
  85. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/accounts.py +0 -0
  86. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/annotation_contract.py +0 -0
  87. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/annotation_reference.py +0 -0
  88. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/audit.py +0 -0
  89. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/build_info.py +0 -0
  90. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/clean_basemap.py +0 -0
  91. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/cli.py +0 -0
  92. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/__init__.py +0 -0
  93. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/_origin.py +0 -0
  94. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/accounts.py +0 -0
  95. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/annotation_reference.py +0 -0
  96. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/assets.py +0 -0
  97. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/bags.py +0 -0
  98. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/capabilities.py +0 -0
  99. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/checkpoints.py +0 -0
  100. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/clean_basemap.py +0 -0
  101. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/client.py +0 -0
  102. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/clip_work_sessions.py +0 -0
  103. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/clips.py +0 -0
  104. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/dataset_identity.py +0 -0
  105. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_clips.py +0 -0
  106. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_exports.py +0 -0
  107. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_preannotations.py +0 -0
  108. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_review.py +0 -0
  109. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_schemas.py +0 -0
  110. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/image_work_sessions.py +0 -0
  111. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/label_schemas.py +0 -0
  112. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/preannotation.py +0 -0
  113. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/projects.py +0 -0
  114. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/reconstruction.py +0 -0
  115. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/semantic_scene.py +0 -0
  116. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/semantic_scene_authoring.py +0 -0
  117. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/services.py +0 -0
  118. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/client/test_sets.py +0 -0
  119. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/consumer_identity.py +0 -0
  120. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/coordinate_contract.py +0 -0
  121. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/core/__init__.py +0 -0
  122. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/core/loader.py +0 -0
  123. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/core/models.py +0 -0
  124. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/core/token.py +0 -0
  125. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/core/transform.py +0 -0
  126. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/current_state.py +0 -0
  127. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/dataset_contract.py +0 -0
  128. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/dataset_identity.py +0 -0
  129. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/__init__.py +0 -0
  130. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/api.py +0 -0
  131. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/box.py +0 -0
  132. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/detection.py +0 -0
  133. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/matching.py +0 -0
  134. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/metrics.py +0 -0
  135. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/eval/tracking.py +0 -0
  136. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/export_bundle.py +0 -0
  137. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_clip.py +0 -0
  138. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_export.py +0 -0
  139. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_geometry.py +0 -0
  140. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_groups.py +0 -0
  141. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_preannotation.py +0 -0
  142. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_reference.py +0 -0
  143. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_review.py +0 -0
  144. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_schema.py +0 -0
  145. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_schema_migration.py +0 -0
  146. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_schema_upgrade.py +0 -0
  147. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_source.py +0 -0
  148. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/image_work_session.py +0 -0
  149. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/__init__.py +0 -0
  150. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/input.py +0 -0
  151. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/models.py +0 -0
  152. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/schemas.py +0 -0
  153. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/service.py +0 -0
  154. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/inference/tasks.py +0 -0
  155. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/json_contract.py +0 -0
  156. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/label_schema.py +0 -0
  157. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/lidar_materialization.py +0 -0
  158. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/project_discovery.py +0 -0
  159. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/roadmark_preview.py +0 -0
  160. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/semantic_scene_authoring.py +0 -0
  161. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/semantic_scene_contract.py +0 -0
  162. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/source_content.py +0 -0
  163. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/time_contract.py +0 -0
  164. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/training_identity.py +0 -0
  165. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/validation/__init__.py +0 -0
  166. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/validation/contract.py +0 -0
  167. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/validation/platform_pose.py +0 -0
  168. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/validation/report.py +0 -0
  169. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/vector_map.py +0 -0
  170. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/vector_map_geometry.py +0 -0
  171. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit/work_session.py +0 -0
  172. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit.egg-info/SOURCES.txt +0 -0
  173. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit.egg-info/dependency_links.txt +0 -0
  174. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit.egg-info/entry_points.txt +0 -0
  175. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit.egg-info/requires.txt +0 -0
  176. {x4d_devkit-0.55.0rc1 → x4d_devkit-0.55.1}/x4d_devkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: x4d-devkit
3
- Version: 0.55.0rc1
3
+ Version: 0.55.1
4
4
  Summary: Official X-4D external SDK and CLI for datasets, platform APIs, training bridges, and automation
5
5
  Author: windzu
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "x4d-devkit"
7
- version = "0.55.0rc1"
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.0rc1"
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
- if "semantic_scene" in selected_components:
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(clip_dir)
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 selected_components & meta_components:
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: x4d-devkit
3
- Version: 0.55.0rc1
3
+ Version: 0.55.1
4
4
  Summary: Official X-4D external SDK and CLI for datasets, platform APIs, training bridges, and automation
5
5
  Author: windzu
6
6
  License-Expression: Apache-2.0
File without changes
File without changes
File without changes