spatialdds 0.3.0__tar.gz → 0.3.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 (147) hide show
  1. {spatialdds-0.3.0 → spatialdds-0.3.1}/PKG-INFO +56 -24
  2. {spatialdds-0.3.0 → spatialdds-0.3.1}/README.md +55 -23
  3. {spatialdds-0.3.0 → spatialdds-0.3.1}/pyproject.toml +1 -1
  4. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/__init__.py +1 -1
  5. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds.egg-info/PKG-INFO +56 -24
  6. {spatialdds-0.3.0 → spatialdds-0.3.1}/setup.cfg +0 -0
  7. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/idl/core.idl +0 -0
  8. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/idl/discovery.idl +0 -0
  9. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/idl/types.idl +0 -0
  10. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/builtin_Time.json +0 -0
  11. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorDelta.json +0 -0
  12. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorEntry.json +0 -0
  13. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSet.json +0 -0
  14. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSetRequest.json +0 -0
  15. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_anchors_AnchorSetResponse.json +0 -0
  16. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_argeo_NodeGeo.json +0 -0
  17. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_argeo_QualityRequirements.json +0 -0
  18. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_argeo_VpsRequest.json +0 -0
  19. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_argeo_VpsResponse.json +0 -0
  20. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_common_AssetRef.json +0 -0
  21. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_common_FrameRef.json +0 -0
  22. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_common_KV.json +0 -0
  23. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_common_MetaKV.json +0 -0
  24. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_common_Vec2.json +0 -0
  25. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_Aabb3.json +0 -0
  26. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_BlobChunk.json +0 -0
  27. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_BlobRef.json +0 -0
  28. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_ComponentRef.json +0 -0
  29. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_Edge.json +0 -0
  30. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_EntityBinding.json +0 -0
  31. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_FrameTransform.json +0 -0
  32. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_FramedPose.json +0 -0
  33. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_GeoAnchor.json +0 -0
  34. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_GeoPose.json +0 -0
  35. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_NavSatStatus.json +0 -0
  36. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_Node.json +0 -0
  37. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_PlannedTrajectory.json +0 -0
  38. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_PlannedWaypoint.json +0 -0
  39. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_PoseSE3.json +0 -0
  40. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_SnapshotRequest.json +0 -0
  41. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_SnapshotResponse.json +0 -0
  42. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_TileKey.json +0 -0
  43. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_TileMeta.json +0 -0
  44. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_core_TilePatch.json +0 -0
  45. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_Announce.json +0 -0
  46. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_Capabilities.json +0 -0
  47. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_ContentAnnounce.json +0 -0
  48. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageElement.json +0 -0
  49. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageFilter.json +0 -0
  50. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageHint.json +0 -0
  51. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageQuery.json +0 -0
  52. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_CoverageResponse.json +0 -0
  53. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_Depart.json +0 -0
  54. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_KV.json +0 -0
  55. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_ProfileSupport.json +0 -0
  56. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_ServiceSummary.json +0 -0
  57. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_TopicMeta.json +0 -0
  58. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_Transform.json +0 -0
  59. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_disco_ValidityWindow.json +0 -0
  60. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_events_CrossingLine.json +0 -0
  61. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_events_SpatialEvent.json +0 -0
  62. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_events_SpatialZone.json +0 -0
  63. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_events_ZoneState.json +0 -0
  64. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_mapping_Edge.json +0 -0
  65. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_mapping_MapAlignment.json +0 -0
  66. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_mapping_MapEvent.json +0 -0
  67. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_mapping_MapMeta.json +0 -0
  68. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_mapping_MapQuality.json +0 -0
  69. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_owm_Entity.json +0 -0
  70. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_owm_ModelCommand.json +0 -0
  71. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_owm_ModelPose.json +0 -0
  72. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection2D.json +0 -0
  73. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection2DSet.json +0 -0
  74. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection3D.json +0 -0
  75. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_semantics_Detection3DSet.json +0 -0
  76. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_semantics_FusedTrack.json +0 -0
  77. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_semantics_FusedTrackSet.json +0 -0
  78. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_semantics_Keypoint3D.json +0 -0
  79. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_semantics_KeypointLink.json +0 -0
  80. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_common_Axis.json +0 -0
  81. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_common_FrameHeader.json +0 -0
  82. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_common_FrameQuality.json +0 -0
  83. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_common_Linspace.json +0 -0
  84. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_common_ROI.json +0 -0
  85. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_common_ROIReply.json +0 -0
  86. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_common_ROIRequest.json +0 -0
  87. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_common_StreamMeta.json +0 -0
  88. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarDetection.json +0 -0
  89. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarDetectionSet.json +0 -0
  90. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarFrame.json +0 -0
  91. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_lidar_LidarMeta.json +0 -0
  92. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadDetection.json +0 -0
  93. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadDetectionSet.json +0 -0
  94. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadSensorMeta.json +0 -0
  95. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadTensorFrame.json +0 -0
  96. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_rad_RadTensorMeta.json +0 -0
  97. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioObservation.json +0 -0
  98. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioScan.json +0 -0
  99. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_radio_RadioSensorMeta.json +0 -0
  100. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamArraySet.json +0 -0
  101. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamFrame.json +0 -0
  102. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_rf_beam_RfBeamMeta.json +0 -0
  103. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_CamIntrinsics.json +0 -0
  104. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_Keypoint2D.json +0 -0
  105. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_Track2D.json +0 -0
  106. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionDetections.json +0 -0
  107. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionFrame.json +0 -0
  108. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_sensing_vision_VisionMeta.json +0 -0
  109. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_CameraInfo.json +0 -0
  110. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_Feature2D.json +0 -0
  111. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_FeatureMatch.json +0 -0
  112. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_KeyframeFeatures.json +0 -0
  113. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_Landmark.json +0 -0
  114. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_MatchSet.json +0 -0
  115. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_TrackObs.json +0 -0
  116. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_slam_frontend_Tracklet.json +0 -0
  117. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_vio_FusedState.json +0 -0
  118. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_vio_ImuInfo.json +0 -0
  119. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_vio_ImuSample.json +0 -0
  120. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_vio_MagnetometerSample.json +0 -0
  121. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/schemas/spatial_vio_SensorFusionSample.json +0 -0
  122. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/artifacts/serializer_tables.json +0 -0
  123. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/canonical.py +0 -0
  124. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/canonjson.py +0 -0
  125. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/client.py +0 -0
  126. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/demo/assets/duck.gltf +0 -0
  127. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/demo/assets/fountain-label.txt +0 -0
  128. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/demo/assets/fountain-marker.gltf +0 -0
  129. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/demo/fountain-anchors.mcap +0 -0
  130. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/demo/manifests/content-fountain-label.json +0 -0
  131. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/demo/manifests/content-fountain-marker.json +0 -0
  132. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/errors.py +0 -0
  133. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/records.py +0 -0
  134. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/serve.py +0 -0
  135. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/server/__init__.py +0 -0
  136. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/server/gateway.py +0 -0
  137. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/server/gw_http.py +0 -0
  138. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/server/idlmodel.py +0 -0
  139. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/server/pin.py +0 -0
  140. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/server/publish.py +0 -0
  141. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/server/webjson.py +0 -0
  142. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds/server/xcdr2.py +0 -0
  143. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds.egg-info/SOURCES.txt +0 -0
  144. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds.egg-info/dependency_links.txt +0 -0
  145. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds.egg-info/entry_points.txt +0 -0
  146. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds.egg-info/requires.txt +0 -0
  147. {spatialdds-0.3.0 → spatialdds-0.3.1}/spatialdds.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spatialdds
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: SpatialDDS over plain HTTPS and a WebSocket: a client for the web binding (Appendix N), and the reference registry behind one command.
5
5
  Author: Open AR Cloud
6
6
  License: Apache-2.0
@@ -43,6 +43,10 @@ not have to assemble member by member.
43
43
  specification versions move independently; `spatialdds.SPEC_COMMIT` is the one
44
44
  that says what the wire looks like.
45
45
 
46
+ The source, the reference gateway, the recordings and every gate behind the
47
+ claims on this page are at [https://github.com/OpenArCloud/spatialdds-web](https://github.com/OpenArCloud/spatialdds-web). Every code block below is executed
48
+ by one of those gates on every run, against an endpoint started for it.
49
+
46
50
  ## Your own registry, in one command
47
51
 
48
52
  ```sh
@@ -72,17 +76,26 @@ Appendix N's schemas make every member of a record required, so an `Announce`
72
76
  is eighteen members, a `ContentAnnounce` sixteen, a `GeoAnchor` nine. The
73
77
  builders take the arguments you actually have:
74
78
 
79
+ <!-- bar: verbs -->
75
80
  ```python
76
81
  import spatialdds as sd
82
+ ep = sd.connect("http://127.0.0.1:8787", token="not-a-secret", scene="mytown")
83
+ a = ep.publish_service(service_id="mytown-vps", kind="VPS",
84
+ coverage=sd.circle(30.2849, -97.7393, 500))
85
+ b = ep.publish_content(
86
+ content_id="duck", title="A duck", position=(30.2849, -97.7393),
87
+ asset=sd.asset_ref("https://cdn.example/duck.gltf",
88
+ media_type="model/gltf+json"))
89
+ c = ep.publish_anchor("anchor/duck-perch", lat=30.2849, lon=-97.7393,
90
+ method="VisualFix", sigma_enu_m=(0.25, 0.25, 0.5),
91
+ content="duck")
92
+ print("service", a.created, "| content", b.created, "| anchor", c.created)
93
+ print("manifest", b.manifest.doc["id"])
94
+ ```
77
95
 
78
- ep = sd.connect("http://127.0.0.1:8787", token="tok", scene="mytown")
79
- ep.publish_service(service_id="mytown-vps", kind="VPS",
80
- coverage=sd.circle(30.2849, -97.7393, 500))
81
- ep.publish_content(content_id="duck", title="Duck", position=(30.2849, -97.7393),
82
- asset="https://cdn.example/duck.gltf", sha256=digest)
83
- ep.publish_anchor("anchor/duck-perch", lat=30.2849, lon=-97.7393,
84
- method="VisualFix", sigma_enu_m=(0.25, 0.25, 0.5),
85
- content="duck")
96
+ ```console
97
+ service True | content True | anchor True
98
+ manifest spatialdds://demo.spatialdds.org/mytown/content/duck
86
99
  ```
87
100
 
88
101
  `publish_service` and `publish_content` are two PUTs each -- the manifest
@@ -91,9 +104,12 @@ with the manifest's own result on `.manifest`.
91
104
 
92
105
  A full service contract is the same one call, with the claims stated:
93
106
 
107
+ <!-- bar: contract -->
94
108
  ```python
109
+ import spatialdds as sd
110
+ ep = sd.connect("http://127.0.0.1:8787", token="not-a-secret", scene="mytown")
95
111
  area = sd.circle(30.2849, -97.7393, 500)
96
- ep.publish_service(
112
+ w = ep.publish_service(
97
113
  service_id="mytown-vps", kind="VPS", coverage=area,
98
114
  caps=sd.capabilities(
99
115
  supported=[sd.profile("spatial.core", minor=8)],
@@ -101,19 +117,28 @@ ep.publish_service(
101
117
  manifest=sd.service_manifest(
102
118
  "mytown-vps", "VPS", authority=ep.authority, scene="mytown",
103
119
  profiles=["Core", "AR+Geo"],
104
- request={{"features_topic": "feat.keyframe"}},
105
- response={{"minimal": "geo.fix"}},
106
- limits={{"max_fps": 10}},
107
- auth={{"scheme": "bearer", "issuer": "https://registry.mytown.example"}},
120
+ request={"features_topic": "feat.keyframe"},
121
+ response={"minimal": "geo.fix"},
122
+ limits={"max_fps": 10},
123
+ auth={"scheme": "bearer",
124
+ "issuer": "https://registry.mytown.example"},
108
125
  coverage=area, cells=sd.cells(area)))
126
+ print("profiles", w.manifest.doc["profiles"])
127
+ print("limits ", w.manifest.doc["limits"])
128
+ ```
129
+
130
+ ```console
131
+ profiles ['Core', 'AR+Geo']
132
+ limits {'max_fps': 10}
109
133
  ```
110
134
 
111
135
  Every one of those is something a service operator knows and a library cannot
112
- guess. [docs/MYTOWN.md](../../docs/MYTOWN.md) publishes that and prints the
113
- whole served document; `gates/builders.py` rebuilds this repository's
114
- hand-authored `austin-vps` and duck records through these calls and compares
115
- them member by member, which is what makes "every member is reachable from an
116
- argument" a check rather than a claim.
136
+ guess. [The mytown walkthrough](https://github.com/OpenArCloud/spatialdds-web/blob/main/docs/MYTOWN.md) publishes that
137
+ and prints the whole served document;
138
+ [`gates/builders.py`](https://github.com/OpenArCloud/spatialdds-web/blob/main/gates/builders.py) rebuilds that
139
+ repository's hand-authored `austin-vps` and duck records through these calls
140
+ and compares them member by member, which is what makes "every member is
141
+ reachable from an argument" a check rather than a claim.
117
142
 
118
143
  **Two forms for an asset, because there are two situations.**
119
144
  `sd.asset(path_or_bytes, media_type=...)` reads the data and computes the hash
@@ -122,7 +147,8 @@ and the byte count itself: a hash nobody typed is a hash a reader can trust.
122
147
  else hosts, and the hash comes from whoever has the bytes. Pass no hash and
123
148
  the reference carries no integrity claim, which costs a reader one thing:
124
149
  `fetch_asset()` raises rather than reporting a check it could not perform
125
- (finding 31). `publish_content` takes either, or a path, or bytes, or a URL.
150
+ ([finding 31](https://github.com/OpenArCloud/spatialdds-web/blob/main/WEB-BINDING-FINDINGS.md)).
151
+ `publish_content` takes either, or a path, or bytes, or a URL.
126
152
 
127
153
  The builders are also usable on their own: `sd.service_announce`,
128
154
  `sd.service_manifest`, `sd.content_announce`, `sd.content_manifest`,
@@ -258,7 +284,7 @@ call goes away and the bar is one line.
258
284
 
259
285
  ## The surface
260
286
 
261
- | | |
287
+ | call | what it does |
262
288
  | --- | --- |
263
289
  | `sd.connect(base, token=None, verify_integrity=True, timeout=15.0, lifted=True, scene="default", authority=None)` | an `Endpoint`; nothing is fetched until you ask |
264
290
  | `ep.search(geohash=None, kinds=None)` | §3.3.0 search → a list of `Hit` |
@@ -309,7 +335,7 @@ One family, built from the endpoint's own N.8 problem documents — `status`,
309
335
  `type`, `detail` carried, not re-invented. Everything below derives from
310
336
  `SpatialDDSError`, so one `except` catches the lot.
311
337
 
312
- | | |
338
+ | exception | raised when |
313
339
  | --- | --- |
314
340
  | `Unreachable` | the endpoint did not answer; names the URL and the serve line |
315
341
  | `Unauthorized` | 401; says to pass `token=` and where the token is printed |
@@ -330,13 +356,19 @@ Latched reads revalidate with the ETag the endpoint gave; `fetch_asset` checks
330
356
  the bytes. Opting out exists and is loud: `verify_integrity=False`, at the call
331
357
  site, nowhere else.
332
358
 
333
- ## Not in 0.3.0
359
+ ## Not in 0.3.1
334
360
 
335
361
  Stated so nobody waits for them: no async API, no caching beyond ETag
336
362
  revalidation, no retry policy, no MCAP tooling beyond the journal the server
337
363
  writes, and no DDS dependency of any kind. The wire is HTTP and a WebSocket.
338
364
 
339
- `sd.asset` changed meaning in 0.3.0, which is why the version moved: it now
365
+ 0.3.1 is this page: two code blocks on it had no gate behind them and both
366
+ were broken, and a long description is baked into the artifact, so the page on
367
+ PyPI only heals with a release. Every block here is executed by a gate now,
368
+ and the gate also refuses a relative link, an empty table header and a serve
369
+ line naming a flag that does not exist.
370
+
371
+ `sd.asset` changed meaning in 0.3.0, which is why that version moved: it now
340
372
  reads bytes and computes a hash, where in 0.2.0 it took a URL and a hash you
341
373
  supplied. That second form is `sd.asset_ref`. A published release has to stay
342
374
  reproducible from a public commit, so the API could not change under the same
@@ -19,6 +19,10 @@ not have to assemble member by member.
19
19
  specification versions move independently; `spatialdds.SPEC_COMMIT` is the one
20
20
  that says what the wire looks like.
21
21
 
22
+ The source, the reference gateway, the recordings and every gate behind the
23
+ claims on this page are at [https://github.com/OpenArCloud/spatialdds-web](https://github.com/OpenArCloud/spatialdds-web). Every code block below is executed
24
+ by one of those gates on every run, against an endpoint started for it.
25
+
22
26
  ## Your own registry, in one command
23
27
 
24
28
  ```sh
@@ -48,17 +52,26 @@ Appendix N's schemas make every member of a record required, so an `Announce`
48
52
  is eighteen members, a `ContentAnnounce` sixteen, a `GeoAnchor` nine. The
49
53
  builders take the arguments you actually have:
50
54
 
55
+ <!-- bar: verbs -->
51
56
  ```python
52
57
  import spatialdds as sd
58
+ ep = sd.connect("http://127.0.0.1:8787", token="not-a-secret", scene="mytown")
59
+ a = ep.publish_service(service_id="mytown-vps", kind="VPS",
60
+ coverage=sd.circle(30.2849, -97.7393, 500))
61
+ b = ep.publish_content(
62
+ content_id="duck", title="A duck", position=(30.2849, -97.7393),
63
+ asset=sd.asset_ref("https://cdn.example/duck.gltf",
64
+ media_type="model/gltf+json"))
65
+ c = ep.publish_anchor("anchor/duck-perch", lat=30.2849, lon=-97.7393,
66
+ method="VisualFix", sigma_enu_m=(0.25, 0.25, 0.5),
67
+ content="duck")
68
+ print("service", a.created, "| content", b.created, "| anchor", c.created)
69
+ print("manifest", b.manifest.doc["id"])
70
+ ```
53
71
 
54
- ep = sd.connect("http://127.0.0.1:8787", token="tok", scene="mytown")
55
- ep.publish_service(service_id="mytown-vps", kind="VPS",
56
- coverage=sd.circle(30.2849, -97.7393, 500))
57
- ep.publish_content(content_id="duck", title="Duck", position=(30.2849, -97.7393),
58
- asset="https://cdn.example/duck.gltf", sha256=digest)
59
- ep.publish_anchor("anchor/duck-perch", lat=30.2849, lon=-97.7393,
60
- method="VisualFix", sigma_enu_m=(0.25, 0.25, 0.5),
61
- content="duck")
72
+ ```console
73
+ service True | content True | anchor True
74
+ manifest spatialdds://demo.spatialdds.org/mytown/content/duck
62
75
  ```
63
76
 
64
77
  `publish_service` and `publish_content` are two PUTs each -- the manifest
@@ -67,9 +80,12 @@ with the manifest's own result on `.manifest`.
67
80
 
68
81
  A full service contract is the same one call, with the claims stated:
69
82
 
83
+ <!-- bar: contract -->
70
84
  ```python
85
+ import spatialdds as sd
86
+ ep = sd.connect("http://127.0.0.1:8787", token="not-a-secret", scene="mytown")
71
87
  area = sd.circle(30.2849, -97.7393, 500)
72
- ep.publish_service(
88
+ w = ep.publish_service(
73
89
  service_id="mytown-vps", kind="VPS", coverage=area,
74
90
  caps=sd.capabilities(
75
91
  supported=[sd.profile("spatial.core", minor=8)],
@@ -77,19 +93,28 @@ ep.publish_service(
77
93
  manifest=sd.service_manifest(
78
94
  "mytown-vps", "VPS", authority=ep.authority, scene="mytown",
79
95
  profiles=["Core", "AR+Geo"],
80
- request={{"features_topic": "feat.keyframe"}},
81
- response={{"minimal": "geo.fix"}},
82
- limits={{"max_fps": 10}},
83
- auth={{"scheme": "bearer", "issuer": "https://registry.mytown.example"}},
96
+ request={"features_topic": "feat.keyframe"},
97
+ response={"minimal": "geo.fix"},
98
+ limits={"max_fps": 10},
99
+ auth={"scheme": "bearer",
100
+ "issuer": "https://registry.mytown.example"},
84
101
  coverage=area, cells=sd.cells(area)))
102
+ print("profiles", w.manifest.doc["profiles"])
103
+ print("limits ", w.manifest.doc["limits"])
104
+ ```
105
+
106
+ ```console
107
+ profiles ['Core', 'AR+Geo']
108
+ limits {'max_fps': 10}
85
109
  ```
86
110
 
87
111
  Every one of those is something a service operator knows and a library cannot
88
- guess. [docs/MYTOWN.md](../../docs/MYTOWN.md) publishes that and prints the
89
- whole served document; `gates/builders.py` rebuilds this repository's
90
- hand-authored `austin-vps` and duck records through these calls and compares
91
- them member by member, which is what makes "every member is reachable from an
92
- argument" a check rather than a claim.
112
+ guess. [The mytown walkthrough](https://github.com/OpenArCloud/spatialdds-web/blob/main/docs/MYTOWN.md) publishes that
113
+ and prints the whole served document;
114
+ [`gates/builders.py`](https://github.com/OpenArCloud/spatialdds-web/blob/main/gates/builders.py) rebuilds that
115
+ repository's hand-authored `austin-vps` and duck records through these calls
116
+ and compares them member by member, which is what makes "every member is
117
+ reachable from an argument" a check rather than a claim.
93
118
 
94
119
  **Two forms for an asset, because there are two situations.**
95
120
  `sd.asset(path_or_bytes, media_type=...)` reads the data and computes the hash
@@ -98,7 +123,8 @@ and the byte count itself: a hash nobody typed is a hash a reader can trust.
98
123
  else hosts, and the hash comes from whoever has the bytes. Pass no hash and
99
124
  the reference carries no integrity claim, which costs a reader one thing:
100
125
  `fetch_asset()` raises rather than reporting a check it could not perform
101
- (finding 31). `publish_content` takes either, or a path, or bytes, or a URL.
126
+ ([finding 31](https://github.com/OpenArCloud/spatialdds-web/blob/main/WEB-BINDING-FINDINGS.md)).
127
+ `publish_content` takes either, or a path, or bytes, or a URL.
102
128
 
103
129
  The builders are also usable on their own: `sd.service_announce`,
104
130
  `sd.service_manifest`, `sd.content_announce`, `sd.content_manifest`,
@@ -234,7 +260,7 @@ call goes away and the bar is one line.
234
260
 
235
261
  ## The surface
236
262
 
237
- | | |
263
+ | call | what it does |
238
264
  | --- | --- |
239
265
  | `sd.connect(base, token=None, verify_integrity=True, timeout=15.0, lifted=True, scene="default", authority=None)` | an `Endpoint`; nothing is fetched until you ask |
240
266
  | `ep.search(geohash=None, kinds=None)` | §3.3.0 search → a list of `Hit` |
@@ -285,7 +311,7 @@ One family, built from the endpoint's own N.8 problem documents — `status`,
285
311
  `type`, `detail` carried, not re-invented. Everything below derives from
286
312
  `SpatialDDSError`, so one `except` catches the lot.
287
313
 
288
- | | |
314
+ | exception | raised when |
289
315
  | --- | --- |
290
316
  | `Unreachable` | the endpoint did not answer; names the URL and the serve line |
291
317
  | `Unauthorized` | 401; says to pass `token=` and where the token is printed |
@@ -306,13 +332,19 @@ Latched reads revalidate with the ETag the endpoint gave; `fetch_asset` checks
306
332
  the bytes. Opting out exists and is loud: `verify_integrity=False`, at the call
307
333
  site, nowhere else.
308
334
 
309
- ## Not in 0.3.0
335
+ ## Not in 0.3.1
310
336
 
311
337
  Stated so nobody waits for them: no async API, no caching beyond ETag
312
338
  revalidation, no retry policy, no MCAP tooling beyond the journal the server
313
339
  writes, and no DDS dependency of any kind. The wire is HTTP and a WebSocket.
314
340
 
315
- `sd.asset` changed meaning in 0.3.0, which is why the version moved: it now
341
+ 0.3.1 is this page: two code blocks on it had no gate behind them and both
342
+ were broken, and a long description is baked into the artifact, so the page on
343
+ PyPI only heals with a release. Every block here is executed by a gate now,
344
+ and the gate also refuses a relative link, an empty table header and a serve
345
+ line naming a flag that does not exist.
346
+
347
+ `sd.asset` changed meaning in 0.3.0, which is why that version moved: it now
316
348
  reads bytes and computes a hash, where in 0.2.0 it took a URL and a hash you
317
349
  supplied. That second form is `sd.asset_ref`. A published release has to stay
318
350
  reproducible from a public commit, so the API could not change under the same
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "spatialdds"
7
- version = "0.3.0"
7
+ version = "0.3.1"
8
8
  description = "SpatialDDS over plain HTTPS and a WebSocket: a client for the web binding (Appendix N), and the reference registry behind one command."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -37,7 +37,7 @@ __all__ = [
37
37
  "content_manifest", "geo_anchor", "service_uri", "content_uri",
38
38
  ]
39
39
 
40
- __version__ = "0.3.0"
40
+ __version__ = "0.3.1"
41
41
  #: The SpatialDDS-spec commit whose Appendix N and generated artifacts this
42
42
  #: package implements. Package versions and specification versions move
43
43
  #: independently; this is the one that says what the wire looks like.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spatialdds
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: SpatialDDS over plain HTTPS and a WebSocket: a client for the web binding (Appendix N), and the reference registry behind one command.
5
5
  Author: Open AR Cloud
6
6
  License: Apache-2.0
@@ -43,6 +43,10 @@ not have to assemble member by member.
43
43
  specification versions move independently; `spatialdds.SPEC_COMMIT` is the one
44
44
  that says what the wire looks like.
45
45
 
46
+ The source, the reference gateway, the recordings and every gate behind the
47
+ claims on this page are at [https://github.com/OpenArCloud/spatialdds-web](https://github.com/OpenArCloud/spatialdds-web). Every code block below is executed
48
+ by one of those gates on every run, against an endpoint started for it.
49
+
46
50
  ## Your own registry, in one command
47
51
 
48
52
  ```sh
@@ -72,17 +76,26 @@ Appendix N's schemas make every member of a record required, so an `Announce`
72
76
  is eighteen members, a `ContentAnnounce` sixteen, a `GeoAnchor` nine. The
73
77
  builders take the arguments you actually have:
74
78
 
79
+ <!-- bar: verbs -->
75
80
  ```python
76
81
  import spatialdds as sd
82
+ ep = sd.connect("http://127.0.0.1:8787", token="not-a-secret", scene="mytown")
83
+ a = ep.publish_service(service_id="mytown-vps", kind="VPS",
84
+ coverage=sd.circle(30.2849, -97.7393, 500))
85
+ b = ep.publish_content(
86
+ content_id="duck", title="A duck", position=(30.2849, -97.7393),
87
+ asset=sd.asset_ref("https://cdn.example/duck.gltf",
88
+ media_type="model/gltf+json"))
89
+ c = ep.publish_anchor("anchor/duck-perch", lat=30.2849, lon=-97.7393,
90
+ method="VisualFix", sigma_enu_m=(0.25, 0.25, 0.5),
91
+ content="duck")
92
+ print("service", a.created, "| content", b.created, "| anchor", c.created)
93
+ print("manifest", b.manifest.doc["id"])
94
+ ```
77
95
 
78
- ep = sd.connect("http://127.0.0.1:8787", token="tok", scene="mytown")
79
- ep.publish_service(service_id="mytown-vps", kind="VPS",
80
- coverage=sd.circle(30.2849, -97.7393, 500))
81
- ep.publish_content(content_id="duck", title="Duck", position=(30.2849, -97.7393),
82
- asset="https://cdn.example/duck.gltf", sha256=digest)
83
- ep.publish_anchor("anchor/duck-perch", lat=30.2849, lon=-97.7393,
84
- method="VisualFix", sigma_enu_m=(0.25, 0.25, 0.5),
85
- content="duck")
96
+ ```console
97
+ service True | content True | anchor True
98
+ manifest spatialdds://demo.spatialdds.org/mytown/content/duck
86
99
  ```
87
100
 
88
101
  `publish_service` and `publish_content` are two PUTs each -- the manifest
@@ -91,9 +104,12 @@ with the manifest's own result on `.manifest`.
91
104
 
92
105
  A full service contract is the same one call, with the claims stated:
93
106
 
107
+ <!-- bar: contract -->
94
108
  ```python
109
+ import spatialdds as sd
110
+ ep = sd.connect("http://127.0.0.1:8787", token="not-a-secret", scene="mytown")
95
111
  area = sd.circle(30.2849, -97.7393, 500)
96
- ep.publish_service(
112
+ w = ep.publish_service(
97
113
  service_id="mytown-vps", kind="VPS", coverage=area,
98
114
  caps=sd.capabilities(
99
115
  supported=[sd.profile("spatial.core", minor=8)],
@@ -101,19 +117,28 @@ ep.publish_service(
101
117
  manifest=sd.service_manifest(
102
118
  "mytown-vps", "VPS", authority=ep.authority, scene="mytown",
103
119
  profiles=["Core", "AR+Geo"],
104
- request={{"features_topic": "feat.keyframe"}},
105
- response={{"minimal": "geo.fix"}},
106
- limits={{"max_fps": 10}},
107
- auth={{"scheme": "bearer", "issuer": "https://registry.mytown.example"}},
120
+ request={"features_topic": "feat.keyframe"},
121
+ response={"minimal": "geo.fix"},
122
+ limits={"max_fps": 10},
123
+ auth={"scheme": "bearer",
124
+ "issuer": "https://registry.mytown.example"},
108
125
  coverage=area, cells=sd.cells(area)))
126
+ print("profiles", w.manifest.doc["profiles"])
127
+ print("limits ", w.manifest.doc["limits"])
128
+ ```
129
+
130
+ ```console
131
+ profiles ['Core', 'AR+Geo']
132
+ limits {'max_fps': 10}
109
133
  ```
110
134
 
111
135
  Every one of those is something a service operator knows and a library cannot
112
- guess. [docs/MYTOWN.md](../../docs/MYTOWN.md) publishes that and prints the
113
- whole served document; `gates/builders.py` rebuilds this repository's
114
- hand-authored `austin-vps` and duck records through these calls and compares
115
- them member by member, which is what makes "every member is reachable from an
116
- argument" a check rather than a claim.
136
+ guess. [The mytown walkthrough](https://github.com/OpenArCloud/spatialdds-web/blob/main/docs/MYTOWN.md) publishes that
137
+ and prints the whole served document;
138
+ [`gates/builders.py`](https://github.com/OpenArCloud/spatialdds-web/blob/main/gates/builders.py) rebuilds that
139
+ repository's hand-authored `austin-vps` and duck records through these calls
140
+ and compares them member by member, which is what makes "every member is
141
+ reachable from an argument" a check rather than a claim.
117
142
 
118
143
  **Two forms for an asset, because there are two situations.**
119
144
  `sd.asset(path_or_bytes, media_type=...)` reads the data and computes the hash
@@ -122,7 +147,8 @@ and the byte count itself: a hash nobody typed is a hash a reader can trust.
122
147
  else hosts, and the hash comes from whoever has the bytes. Pass no hash and
123
148
  the reference carries no integrity claim, which costs a reader one thing:
124
149
  `fetch_asset()` raises rather than reporting a check it could not perform
125
- (finding 31). `publish_content` takes either, or a path, or bytes, or a URL.
150
+ ([finding 31](https://github.com/OpenArCloud/spatialdds-web/blob/main/WEB-BINDING-FINDINGS.md)).
151
+ `publish_content` takes either, or a path, or bytes, or a URL.
126
152
 
127
153
  The builders are also usable on their own: `sd.service_announce`,
128
154
  `sd.service_manifest`, `sd.content_announce`, `sd.content_manifest`,
@@ -258,7 +284,7 @@ call goes away and the bar is one line.
258
284
 
259
285
  ## The surface
260
286
 
261
- | | |
287
+ | call | what it does |
262
288
  | --- | --- |
263
289
  | `sd.connect(base, token=None, verify_integrity=True, timeout=15.0, lifted=True, scene="default", authority=None)` | an `Endpoint`; nothing is fetched until you ask |
264
290
  | `ep.search(geohash=None, kinds=None)` | §3.3.0 search → a list of `Hit` |
@@ -309,7 +335,7 @@ One family, built from the endpoint's own N.8 problem documents — `status`,
309
335
  `type`, `detail` carried, not re-invented. Everything below derives from
310
336
  `SpatialDDSError`, so one `except` catches the lot.
311
337
 
312
- | | |
338
+ | exception | raised when |
313
339
  | --- | --- |
314
340
  | `Unreachable` | the endpoint did not answer; names the URL and the serve line |
315
341
  | `Unauthorized` | 401; says to pass `token=` and where the token is printed |
@@ -330,13 +356,19 @@ Latched reads revalidate with the ETag the endpoint gave; `fetch_asset` checks
330
356
  the bytes. Opting out exists and is loud: `verify_integrity=False`, at the call
331
357
  site, nowhere else.
332
358
 
333
- ## Not in 0.3.0
359
+ ## Not in 0.3.1
334
360
 
335
361
  Stated so nobody waits for them: no async API, no caching beyond ETag
336
362
  revalidation, no retry policy, no MCAP tooling beyond the journal the server
337
363
  writes, and no DDS dependency of any kind. The wire is HTTP and a WebSocket.
338
364
 
339
- `sd.asset` changed meaning in 0.3.0, which is why the version moved: it now
365
+ 0.3.1 is this page: two code blocks on it had no gate behind them and both
366
+ were broken, and a long description is baked into the artifact, so the page on
367
+ PyPI only heals with a release. Every block here is executed by a gate now,
368
+ and the gate also refuses a relative link, an empty table header and a serve
369
+ line naming a flag that does not exist.
370
+
371
+ `sd.asset` changed meaning in 0.3.0, which is why that version moved: it now
340
372
  reads bytes and computes a hash, where in 0.2.0 it took a URL and a hash you
341
373
  supplied. That second form is `sd.asset_ref`. A published release has to stay
342
374
  reproducible from a public commit, so the API could not change under the same
File without changes