atdata 0.2.2b1__tar.gz → 0.3.0b1__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 (345) hide show
  1. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/issues.db +0 -0
  2. atdata-0.3.0b1/.github/workflows/uv-publish-pypi.yml +65 -0
  3. atdata-0.3.0b1/.github/workflows/uv-test.yml +134 -0
  4. {atdata-0.2.2b1 → atdata-0.3.0b1}/.gitignore +6 -1
  5. {atdata-0.2.2b1 → atdata-0.3.0b1}/.vscode/settings.json +6 -0
  6. {atdata-0.2.2b1 → atdata-0.3.0b1}/CHANGELOG.md +110 -0
  7. {atdata-0.2.2b1 → atdata-0.3.0b1}/CLAUDE.md +32 -40
  8. {atdata-0.2.2b1 → atdata-0.3.0b1}/PKG-INFO +5 -1
  9. atdata-0.3.0b1/benchmarks/bench_atmosphere.py +220 -0
  10. atdata-0.3.0b1/benchmarks/bench_dataset_io.py +293 -0
  11. atdata-0.3.0b1/benchmarks/bench_index_providers.py +215 -0
  12. atdata-0.3.0b1/benchmarks/bench_query.py +278 -0
  13. atdata-0.3.0b1/benchmarks/conftest.py +345 -0
  14. atdata-0.3.0b1/benchmarks/render_report.py +462 -0
  15. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/AbstractDataStore.html +35 -200
  16. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/AbstractIndex.html +50 -216
  17. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/AtUri.html +38 -203
  18. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/AtmosphereClient.html +35 -200
  19. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/AtmosphereIndex.html +41 -206
  20. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/AtmosphereIndexEntry.html +28 -192
  21. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/BlobSource.html +39 -204
  22. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/DataSource.html +40 -205
  23. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/Dataset.html +92 -240
  24. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/DatasetDict.html +38 -203
  25. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/DatasetLoader.html +47 -213
  26. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/DatasetPublisher.html +43 -208
  27. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/DictSample.html +39 -204
  28. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/IndexEntry.html +28 -192
  29. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/Lens.html +75 -243
  30. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/LensLoader.html +38 -203
  31. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/LensPublisher.html +48 -213
  32. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/PDSBlobStore.html +35 -200
  33. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/Packable-protocol.html +40 -205
  34. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/PackableSample.html +39 -204
  35. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/S3Source.html +54 -221
  36. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/SampleBatch.html +34 -199
  37. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/SchemaLoader.html +38 -203
  38. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/SchemaPublisher.html +43 -208
  39. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/URLSource.html +34 -199
  40. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/index.html +28 -192
  41. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/load_dataset.html +47 -212
  42. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/local.Index.html +54 -221
  43. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/local.LocalDatasetEntry.html +28 -192
  44. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/local.S3DataStore.html +28 -192
  45. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/packable.html +47 -207
  46. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/api/promote_to_atmosphere.html +35 -200
  47. atdata-0.3.0b1/docs/benchmarks/index.html +1331 -0
  48. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/index.html +44 -208
  49. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/architecture.html +47 -211
  50. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/atmosphere.html +55 -219
  51. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/datasets.html +46 -210
  52. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/deployment.html +33 -197
  53. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/lenses.html +44 -208
  54. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/load-dataset.html +45 -209
  55. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/local-storage.html +44 -208
  56. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/packable-samples.html +46 -210
  57. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/promotion.html +41 -205
  58. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/protocols.html +45 -209
  59. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/troubleshooting.html +33 -197
  60. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/reference/uri-spec.html +35 -199
  61. atdata-0.3.0b1/docs/robots.txt +1 -0
  62. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/search.json +119 -290
  63. atdata-0.3.0b1/docs/site_libs/bootstrap/bootstrap-62ce3d63edf8507b4d15f75c6b92352a.min.css +12 -0
  64. atdata-0.2.2b1/docs/site_libs/quarto-html/quarto-syntax-highlighting-9582434199d49cc9e91654cdeeb4866b.css → atdata-0.3.0b1/docs/site_libs/quarto-html/quarto-syntax-highlighting-b854dd4081d6110d4acfde180236d7b2.css +2 -2
  65. atdata-0.3.0b1/docs/sitemap.xml +199 -0
  66. atdata-0.3.0b1/docs/styles.css +50 -0
  67. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/tutorials/atmosphere.html +47 -211
  68. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/tutorials/local-workflow.html +41 -205
  69. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/tutorials/promotion.html +45 -209
  70. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/tutorials/quickstart.html +39 -203
  71. atdata-0.3.0b1/docs_src/.nojekyll +0 -0
  72. atdata-0.3.0b1/docs_src/_brand.yml +73 -0
  73. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/_quarto.yml +57 -13
  74. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/AbstractDataStore.qmd +7 -7
  75. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/AbstractIndex.qmd +24 -24
  76. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/AtUri.qmd +10 -10
  77. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/AtmosphereClient.qmd +7 -7
  78. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/AtmosphereIndex.qmd +14 -14
  79. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/BlobSource.qmd +12 -12
  80. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/DataSource.qmd +13 -13
  81. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/Dataset.qmd +54 -34
  82. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/DatasetDict.qmd +10 -10
  83. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/DatasetLoader.qmd +20 -20
  84. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/DatasetPublisher.qmd +16 -16
  85. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/DictSample.qmd +12 -12
  86. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/Lens.qmd +51 -51
  87. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/LensLoader.qmd +10 -10
  88. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/LensPublisher.qmd +21 -21
  89. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/PDSBlobStore.qmd +7 -7
  90. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/Packable-protocol.qmd +13 -13
  91. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/PackableSample.qmd +12 -12
  92. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/S3Source.qmd +28 -28
  93. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/SampleBatch.qmd +6 -6
  94. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/SchemaLoader.qmd +10 -10
  95. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/SchemaPublisher.qmd +16 -16
  96. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/URLSource.qmd +6 -6
  97. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/load_dataset.qmd +19 -19
  98. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/local.Index.qmd +29 -29
  99. atdata-0.3.0b1/docs_src/api/packable.qmd +53 -0
  100. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/promote_to_atmosphere.qmd +7 -7
  101. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/index.qmd +2 -2
  102. atdata-0.3.0b1/docs_src/styles.css +50 -0
  103. atdata-0.3.0b1/docs_src/theme-dark.scss +1 -0
  104. atdata-0.3.0b1/docs_src/theme-light.scss +15 -0
  105. atdata-0.3.0b1/justfile +49 -0
  106. atdata-0.3.0b1/prototyping/human-review-atmosphere.ipynb +66 -0
  107. atdata-0.3.0b1/prototyping/human-review-local.ipynb +674 -0
  108. {atdata-0.2.2b1 → atdata-0.3.0b1}/pyproject.toml +13 -1
  109. atdata-0.3.0b1/src/atdata/.gitignore +1 -0
  110. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/__init__.py +31 -1
  111. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/_cid.py +29 -35
  112. atdata-0.3.0b1/src/atdata/_exceptions.py +168 -0
  113. atdata-0.3.0b1/src/atdata/_helpers.py +74 -0
  114. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/_hf_api.py +109 -59
  115. atdata-0.3.0b1/src/atdata/_logging.py +70 -0
  116. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/_protocols.py +74 -132
  117. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/_schema_codec.py +38 -41
  118. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/_sources.py +57 -64
  119. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/_stub_manager.py +31 -26
  120. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/_type_utils.py +47 -7
  121. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/atmosphere/__init__.py +31 -24
  122. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/atmosphere/_types.py +11 -11
  123. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/atmosphere/client.py +11 -8
  124. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/atmosphere/lens.py +27 -30
  125. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/atmosphere/records.py +34 -39
  126. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/atmosphere/schema.py +35 -31
  127. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/atmosphere/store.py +16 -20
  128. atdata-0.3.0b1/src/atdata/cli/__init__.py +208 -0
  129. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/cli/diagnose.py +12 -8
  130. atdata-0.3.0b1/src/atdata/cli/inspect.py +69 -0
  131. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/cli/local.py +5 -2
  132. atdata-0.3.0b1/src/atdata/cli/preview.py +63 -0
  133. atdata-0.3.0b1/src/atdata/cli/schema.py +109 -0
  134. atdata-0.3.0b1/src/atdata/dataset.py +1190 -0
  135. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/lens.py +85 -83
  136. atdata-0.3.0b1/src/atdata/local/__init__.py +71 -0
  137. atdata-0.3.0b1/src/atdata/local/_entry.py +157 -0
  138. atdata-0.3.0b1/src/atdata/local/_index.py +940 -0
  139. atdata-0.3.0b1/src/atdata/local/_repo_legacy.py +218 -0
  140. atdata-0.3.0b1/src/atdata/local/_s3.py +349 -0
  141. atdata-0.3.0b1/src/atdata/local/_schema.py +380 -0
  142. atdata-0.3.0b1/src/atdata/manifest/__init__.py +28 -0
  143. atdata-0.3.0b1/src/atdata/manifest/_aggregates.py +156 -0
  144. atdata-0.3.0b1/src/atdata/manifest/_builder.py +163 -0
  145. atdata-0.3.0b1/src/atdata/manifest/_fields.py +154 -0
  146. atdata-0.3.0b1/src/atdata/manifest/_manifest.py +146 -0
  147. atdata-0.3.0b1/src/atdata/manifest/_query.py +150 -0
  148. atdata-0.3.0b1/src/atdata/manifest/_writer.py +74 -0
  149. {atdata-0.2.2b1 → atdata-0.3.0b1}/src/atdata/promote.py +20 -24
  150. atdata-0.3.0b1/src/atdata/providers/__init__.py +25 -0
  151. atdata-0.3.0b1/src/atdata/providers/_base.py +140 -0
  152. atdata-0.3.0b1/src/atdata/providers/_factory.py +69 -0
  153. atdata-0.3.0b1/src/atdata/providers/_postgres.py +214 -0
  154. atdata-0.3.0b1/src/atdata/providers/_redis.py +171 -0
  155. atdata-0.3.0b1/src/atdata/providers/_sqlite.py +191 -0
  156. atdata-0.3.0b1/src/atdata/repository.py +323 -0
  157. atdata-0.3.0b1/src/atdata/testing.py +337 -0
  158. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/EXPECTED_WARNINGS.md +2 -2
  159. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/conftest.py +15 -10
  160. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_atmosphere.py +154 -46
  161. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_cid.py +9 -6
  162. atdata-0.3.0b1/tests/test_cli.py +794 -0
  163. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_dataset.py +232 -194
  164. atdata-0.3.0b1/tests/test_dev_experience.py +423 -0
  165. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_helpers.py +22 -16
  166. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_hf_api.py +11 -4
  167. atdata-0.3.0b1/tests/test_index_providers.py +477 -0
  168. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration.py +21 -6
  169. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration_atmosphere.py +69 -25
  170. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration_atmosphere_live.py +25 -7
  171. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration_cross_backend.py +39 -26
  172. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration_dynamic_types.py +333 -98
  173. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration_e2e.py +20 -7
  174. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration_edge_cases.py +10 -7
  175. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration_error_handling.py +40 -36
  176. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration_lens.py +12 -2
  177. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration_local.py +59 -49
  178. atdata-0.3.0b1/tests/test_integration_manifest.py +263 -0
  179. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_integration_promotion.py +69 -29
  180. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_lens.py +74 -77
  181. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_local.py +288 -189
  182. atdata-0.3.0b1/tests/test_logging.py +60 -0
  183. atdata-0.3.0b1/tests/test_manifest.py +528 -0
  184. atdata-0.3.0b1/tests/test_partial_failure.py +152 -0
  185. atdata-0.3.0b1/tests/test_postgres_provider.py +411 -0
  186. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_promote.py +36 -19
  187. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_protocols.py +13 -7
  188. atdata-0.3.0b1/tests/test_query_coverage.py +215 -0
  189. atdata-0.3.0b1/tests/test_repository.py +377 -0
  190. atdata-0.3.0b1/tests/test_repository_coverage.py +265 -0
  191. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/test_sources.py +35 -22
  192. atdata-0.3.0b1/tests/test_stub_manager.py +556 -0
  193. atdata-0.3.0b1/tests/test_testing.py +205 -0
  194. atdata-0.3.0b1/tests/test_type_utils.py +181 -0
  195. atdata-0.3.0b1/uv.lock +3616 -0
  196. atdata-0.2.2b1/.github/workflows/uv-publish-pypi.yml +0 -46
  197. atdata-0.2.2b1/.github/workflows/uv-test.yml +0 -58
  198. atdata-0.2.2b1/docs/robots.txt +0 -1
  199. atdata-0.2.2b1/docs/site_libs/bootstrap/bootstrap-62bce24ca844314e7bb1a34dbdfe05cc.min.css +0 -12
  200. atdata-0.2.2b1/docs/site_libs/bootstrap/bootstrap-dark-7964ffd8887b0991fe8d71c6c8bc75d6.min.css +0 -12
  201. atdata-0.2.2b1/docs/site_libs/quarto-html/quarto-syntax-highlighting-dark-8dcd8563ea6803ab7cbb3d71ca5772e1.css +0 -210
  202. atdata-0.2.2b1/docs/sitemap.xml +0 -199
  203. atdata-0.2.2b1/docs_src/api/packable.qmd +0 -45
  204. atdata-0.2.2b1/justfile +0 -2
  205. atdata-0.2.2b1/prototyping/human-review-atmosphere.ipynb +0 -25
  206. atdata-0.2.2b1/prototyping/human-review-local.ipynb +0 -634
  207. atdata-0.2.2b1/src/atdata/_helpers.py +0 -58
  208. atdata-0.2.2b1/src/atdata/cli/__init__.py +0 -213
  209. atdata-0.2.2b1/src/atdata/dataset.py +0 -1045
  210. atdata-0.2.2b1/src/atdata/local.py +0 -1707
  211. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/c.md +0 -0
  212. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/cpp.md +0 -0
  213. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/csharp.md +0 -0
  214. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/global.md +0 -0
  215. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/go.md +0 -0
  216. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/java.md +0 -0
  217. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/javascript-react.md +0 -0
  218. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/javascript.md +0 -0
  219. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/kotlin.md +0 -0
  220. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/odin.md +0 -0
  221. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/php.md +0 -0
  222. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/project.md +0 -0
  223. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/python.md +0 -0
  224. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/ruby.md +0 -0
  225. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/rust.md +0 -0
  226. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/scala.md +0 -0
  227. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/swift.md +0 -0
  228. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/typescript-react.md +0 -0
  229. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/typescript.md +0 -0
  230. {atdata-0.2.2b1 → atdata-0.3.0b1}/.chainlink/rules/zig.md +0 -0
  231. {atdata-0.2.2b1 → atdata-0.3.0b1}/.claude/hooks/post-edit-check.py +0 -0
  232. {atdata-0.2.2b1 → atdata-0.3.0b1}/.claude/hooks/prompt-guard.py +0 -0
  233. {atdata-0.2.2b1 → atdata-0.3.0b1}/.claude/hooks/session-start.py +0 -0
  234. {atdata-0.2.2b1 → atdata-0.3.0b1}/.claude/settings.json +0 -0
  235. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/roadmap/v0.2/03_human-review-assessment.md +0 -0
  236. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/roadmap/v0.3/01_codebase-review.md +0 -0
  237. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/roadmap/v0.3/02_synthesis-roadmap.md +0 -0
  238. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/roadmap/v0.3/architecture-doc.md +0 -0
  239. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/01_overview.md +0 -0
  240. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/02_lexicon_design.md +0 -0
  241. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/03_python_client.md +0 -0
  242. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/04_appview.md +0 -0
  243. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/05_codegen.md +0 -0
  244. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/README.md +0 -0
  245. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/atproto_integration.md +0 -0
  246. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/decisions/01_schema_representation_format.md +0 -0
  247. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/decisions/02_lens_code_storage.md +0 -0
  248. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/decisions/03_webdataset_storage.md +0 -0
  249. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/decisions/04_schema_evolution.md +0 -0
  250. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/decisions/05_lexicon_namespace.md +0 -0
  251. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/decisions/06_lexicon_validation.md +0 -0
  252. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/decisions/README.md +0 -0
  253. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/decisions/assessment.md +0 -0
  254. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/decisions/record_lexicon_assessment.md +0 -0
  255. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/decisions/sampleSchema_design_questions.md +0 -0
  256. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/examples/code/ndarray_roundtrip.py +0 -0
  257. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/examples/code/validate_ndarray_shim.py +0 -0
  258. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/examples/dataset_blob_storage.json +0 -0
  259. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/examples/dataset_external_storage.json +0 -0
  260. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/examples/lens_example.json +0 -0
  261. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/examples/sampleSchema_example.json +0 -0
  262. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/README.md +0 -0
  263. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/README_ARRAY_FORMATS.md +0 -0
  264. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/README_SCHEMA_TYPES.md +0 -0
  265. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/ac.foundation.dataset.arrayFormat.json +0 -0
  266. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/ac.foundation.dataset.getLatestSchema.json +0 -0
  267. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/ac.foundation.dataset.lens.json +0 -0
  268. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/ac.foundation.dataset.record.json +0 -0
  269. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/ac.foundation.dataset.sampleSchema.json +0 -0
  270. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/ac.foundation.dataset.schemaType.json +0 -0
  271. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/ac.foundation.dataset.storageBlobs.json +0 -0
  272. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/ac.foundation.dataset.storageExternal.json +0 -0
  273. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/lexicons/ndarray_shim.json +0 -0
  274. {atdata-0.2.2b1 → atdata-0.3.0b1}/.planning/setup/ndarray_shim_spec.md +0 -0
  275. {atdata-0.2.2b1 → atdata-0.3.0b1}/.python-version +0 -0
  276. {atdata-0.2.2b1 → atdata-0.3.0b1}/.reference/atproto_lexicon_guide.md +0 -0
  277. {atdata-0.2.2b1 → atdata-0.3.0b1}/.reference/atproto_lexicon_spec.md +0 -0
  278. {atdata-0.2.2b1 → atdata-0.3.0b1}/.reference/huggingface-datasets/architecture.md +0 -0
  279. {atdata-0.2.2b1 → atdata-0.3.0b1}/.reference/huggingface-datasets/loading-guide.md +0 -0
  280. {atdata-0.2.2b1 → atdata-0.3.0b1}/.reference/huggingface-datasets/loading-methods.md +0 -0
  281. {atdata-0.2.2b1 → atdata-0.3.0b1}/.reference/huggingface-datasets/main-classes.md +0 -0
  282. {atdata-0.2.2b1 → atdata-0.3.0b1}/.reference/python_atproto_sdk.md +0 -0
  283. {atdata-0.2.2b1 → atdata-0.3.0b1}/.review/comprehensive-review.md +0 -0
  284. {atdata-0.2.2b1 → atdata-0.3.0b1}/.review/human-review.md +0 -0
  285. {atdata-0.2.2b1 → atdata-0.3.0b1}/LICENSE +0 -0
  286. {atdata-0.2.2b1 → atdata-0.3.0b1}/README.md +0 -0
  287. /atdata-0.2.2b1/docs/.nojekyll → /atdata-0.3.0b1/benchmarks/__init__.py +0 -0
  288. {atdata-0.2.2b1/docs_src → atdata-0.3.0b1/docs}/.nojekyll +0 -0
  289. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/assets/styles.css +0 -0
  290. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/bootstrap/bootstrap-icons.css +0 -0
  291. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/bootstrap/bootstrap-icons.woff +0 -0
  292. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/bootstrap/bootstrap.min.js +0 -0
  293. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/clipboard/clipboard.min.js +0 -0
  294. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-html/anchor.min.js +0 -0
  295. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-html/popper.min.js +0 -0
  296. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-html/quarto.js +0 -0
  297. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-html/tabsets/tabsets.js +0 -0
  298. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-html/tippy.css +0 -0
  299. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-html/tippy.umd.min.js +0 -0
  300. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-nav/headroom.min.js +0 -0
  301. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-nav/quarto-nav.js +0 -0
  302. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-search/autocomplete.umd.js +0 -0
  303. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-search/fuse.min.js +0 -0
  304. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs/site_libs/quarto-search/quarto-search.js +0 -0
  305. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.backup/api-index-handwritten.qmd +0 -0
  306. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.backup/atmosphere.md +0 -0
  307. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.backup/datasets.md +0 -0
  308. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.backup/index.md +0 -0
  309. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.backup/lenses.md +0 -0
  310. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.backup/load-dataset.md +0 -0
  311. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.backup/local-storage.md +0 -0
  312. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.backup/packable-samples.md +0 -0
  313. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.backup/promotion.md +0 -0
  314. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.backup/protocols.md +0 -0
  315. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/.gitignore +0 -0
  316. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/AtmosphereIndexEntry.qmd +0 -0
  317. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/IndexEntry.qmd +0 -0
  318. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/index.qmd +0 -0
  319. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/local.LocalDatasetEntry.qmd +0 -0
  320. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/api/local.S3DataStore.qmd +0 -0
  321. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/assets/styles.css +0 -0
  322. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/objects.json +0 -0
  323. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/architecture.qmd +0 -0
  324. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/atmosphere.qmd +0 -0
  325. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/datasets.qmd +0 -0
  326. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/deployment.qmd +0 -0
  327. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/lenses.qmd +0 -0
  328. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/load-dataset.qmd +0 -0
  329. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/local-storage.qmd +0 -0
  330. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/packable-samples.qmd +0 -0
  331. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/promotion.qmd +0 -0
  332. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/protocols.qmd +0 -0
  333. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/troubleshooting.qmd +0 -0
  334. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/reference/uri-spec.qmd +0 -0
  335. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/tutorials/atmosphere.qmd +0 -0
  336. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/tutorials/local-workflow.qmd +0 -0
  337. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/tutorials/promotion.qmd +0 -0
  338. {atdata-0.2.2b1 → atdata-0.3.0b1}/docs_src/tutorials/quickstart.qmd +0 -0
  339. {atdata-0.2.2b1 → atdata-0.3.0b1}/examples/atmosphere_demo.py +0 -0
  340. {atdata-0.2.2b1 → atdata-0.3.0b1}/examples/local_workflow.py +0 -0
  341. {atdata-0.2.2b1 → atdata-0.3.0b1}/examples/promote_workflow.py +0 -0
  342. {atdata-0.2.2b1 → atdata-0.3.0b1}/issues.db +0 -0
  343. {atdata-0.2.2b1 → atdata-0.3.0b1}/prototyping/.credentials/.gitignore +0 -0
  344. {atdata-0.2.2b1 → atdata-0.3.0b1}/prototyping/data/.gitignore +0 -0
  345. {atdata-0.2.2b1 → atdata-0.3.0b1}/tests/fixtures/test_samples.tar +0 -0
@@ -0,0 +1,65 @@
1
+ name: Build and upload package to PyPI
2
+
3
+ on:
4
+ release:
5
+ types:
6
+ - published
7
+
8
+ permissions:
9
+ contents: read
10
+ id-token: write
11
+
12
+ concurrency:
13
+ group: ${{ github.workflow }}-${{ github.ref }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ build:
18
+ name: Build release distribution
19
+ runs-on: ubuntu-latest
20
+
21
+ steps:
22
+ - uses: actions/checkout@v5
23
+
24
+ - name: Set up Python
25
+ uses: actions/setup-python@v5
26
+ with:
27
+ python-version-file: "pyproject.toml"
28
+
29
+ - name: Install uv
30
+ uses: astral-sh/setup-uv@v6
31
+ with:
32
+ enable-cache: true
33
+
34
+ - name: Install project
35
+ run: uv sync --locked --all-extras --dev
36
+
37
+ - name: Build release distributions
38
+ run: uv build
39
+
40
+ - name: Upload dist artifacts
41
+ uses: actions/upload-artifact@v4
42
+ with:
43
+ name: dist
44
+ path: dist/
45
+
46
+ publish:
47
+ name: Publish to PyPI
48
+ runs-on: ubuntu-latest
49
+ needs: build
50
+ environment:
51
+ name: pypi
52
+ url: https://pypi.org/project/atdata/
53
+
54
+ steps:
55
+ - name: Download dist artifacts
56
+ uses: actions/download-artifact@v4
57
+ with:
58
+ name: dist
59
+ path: dist/
60
+
61
+ - name: Install uv
62
+ uses: astral-sh/setup-uv@v6
63
+
64
+ - name: Publish to PyPI
65
+ run: uv publish --trusted-publishing always dist/*
@@ -0,0 +1,134 @@
1
+ name: Run tests with `uv`
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+
9
+ permissions:
10
+ contents: read
11
+ actions: read
12
+
13
+ concurrency:
14
+ group: ${{ github.workflow }}-${{ github.ref }}
15
+ cancel-in-progress: true
16
+
17
+ jobs:
18
+ lint:
19
+ name: Lint
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - uses: actions/checkout@v5
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v6
26
+ with:
27
+ enable-cache: true
28
+
29
+ - name: Install the project
30
+ run: uv sync --locked --dev
31
+
32
+ - name: Run ruff check
33
+ run: uv run ruff check src/ tests/
34
+
35
+ - name: Run ruff format check
36
+ run: uv run ruff format --check src/ tests/
37
+
38
+ test:
39
+ name: Test (py${{ matrix.python-version }}, redis${{ matrix.redis-version }})
40
+ runs-on: ubuntu-latest
41
+ environment:
42
+ name: test
43
+ strategy:
44
+ fail-fast: false
45
+ matrix:
46
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
47
+ redis-version: [6, 7]
48
+
49
+ steps:
50
+ - uses: actions/checkout@v5
51
+
52
+ - name: Set up Python
53
+ uses: actions/setup-python@v5
54
+ with:
55
+ python-version: ${{ matrix.python-version }}
56
+
57
+ - name: Install uv
58
+ uses: astral-sh/setup-uv@v6
59
+ with:
60
+ enable-cache: true
61
+
62
+ - name: Install the project
63
+ run: uv sync --locked --all-extras --dev
64
+
65
+ - name: Start Redis
66
+ uses: supercharge/redis-github-action@1.8.1
67
+ with:
68
+ redis-version: ${{ matrix.redis-version }}
69
+
70
+ - name: Run tests with coverage
71
+ run: uv run pytest --cov=atdata --cov-report=xml --cov-report=term
72
+
73
+ - name: Upload coverage to Codecov
74
+ uses: codecov/codecov-action@v5
75
+ with:
76
+ fail_ci_if_error: false
77
+ token: ${{ secrets.CODECOV_TOKEN }}
78
+
79
+ benchmark:
80
+ name: Benchmarks
81
+ runs-on: ubuntu-latest
82
+ needs: [lint]
83
+ permissions:
84
+ contents: write
85
+ actions: write
86
+ steps:
87
+ - uses: actions/checkout@v5
88
+
89
+ - name: Set up Python
90
+ uses: actions/setup-python@v5
91
+ with:
92
+ python-version: "3.14"
93
+
94
+ - name: Install uv
95
+ uses: astral-sh/setup-uv@v6
96
+ with:
97
+ enable-cache: true
98
+
99
+ - name: Install just
100
+ uses: extractions/setup-just@v2
101
+
102
+ - name: Install the project
103
+ run: uv sync --locked --all-extras --dev
104
+
105
+ - name: Start Redis
106
+ uses: supercharge/redis-github-action@1.8.1
107
+ with:
108
+ redis-version: 7
109
+
110
+ - name: Run benchmarks
111
+ run: just bench
112
+
113
+ - name: Copy report to docs
114
+ run: |
115
+ mkdir -p docs/benchmarks
116
+ cp .bench/report.html docs/benchmarks/index.html
117
+
118
+ - name: Commit updated benchmark docs
119
+ if: github.event_name == 'push'
120
+ run: |
121
+ git config user.name "github-actions[bot]"
122
+ git config user.email "github-actions[bot]@users.noreply.github.com"
123
+ git add docs/benchmarks/index.html
124
+ git diff --cached --quiet || git commit -m "docs: update benchmark report [skip ci]"
125
+ git push
126
+
127
+ - name: Upload benchmark report
128
+ uses: actions/upload-artifact@v4
129
+ if: always()
130
+ with:
131
+ name: benchmark-report
132
+ path: |
133
+ .bench/report.html
134
+ .bench/*.json
@@ -5,8 +5,10 @@
5
5
  # Don't commit any .env files
6
6
  **/*.env
7
7
  # Don't commit `uv` lockfiles
8
- **/uv.lock
8
+ # (SIKE it turns out we actually do want to commit)
9
+ # **/uv.lock
9
10
  # Development tooling (keep local, not in upstream)
11
+ # (SIKE it turns out we actually do want to commit)
10
12
  # .chainlink/
11
13
  # .claude/
12
14
 
@@ -50,6 +52,9 @@ MANIFEST
50
52
  pip-log.txt
51
53
  pip-delete-this-directory.txt
52
54
 
55
+ # Benchmark results
56
+ .bench/
57
+
53
58
  # Unit test / coverage reports
54
59
  htmlcov/
55
60
  .tox/
@@ -5,15 +5,19 @@
5
5
  "atproto",
6
6
  "creds",
7
7
  "dtype",
8
+ "fastparquet",
8
9
  "getattr",
9
10
  "hgetall",
10
11
  "hset",
12
+ "libipld",
11
13
  "maxcount",
12
14
  "minioadmin",
13
15
  "msgpack",
14
16
  "ndarray",
15
17
  "NSID",
16
18
  "ormsgpack",
19
+ "psycopg",
20
+ "pydantic",
17
21
  "pypi",
18
22
  "pyproject",
19
23
  "pytest",
@@ -24,6 +28,8 @@
24
28
  "schemamodels",
25
29
  "shardlists",
26
30
  "tariterators",
31
+ "tqdm",
32
+ "typer",
27
33
  "unpackb",
28
34
  "webdataset"
29
35
  ],
@@ -25,6 +25,116 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
25
25
  - **Comprehensive integration test suite**: 593 tests covering E2E flows, error handling, edge cases
26
26
 
27
27
  ### Changed
28
+ - Investigate upload-artifact not finding benchmark output (#512)
29
+ - Fix duplicate CI runs for push+PR overlap (#511)
30
+ - Scope contents:write permission to benchmark job only (#510)
31
+ - Add benchmark docs auto-commit to CI workflow (#509)
32
+ - Submit PR for v0.3.0b1 release to upstream/main (#508)
33
+ - Implement GH#39: Production hardening (observability, error handling, testing infra) (#504)
34
+ - Add pluggable structured logging via atdata.configure_logging (#507)
35
+ - Add PartialFailureError and shard-level error handling to Dataset.map (#506)
36
+ - Add atdata.testing module with mock clients, fixtures, and helpers (#505)
37
+ - Fix CI linting failures (20 ruff errors) (#503)
38
+ - Adversarial review: Post-benchmark suite assessment (#494)
39
+ - Remove redundant protocol docstrings that restate signatures (#500)
40
+ - Add missing unit tests for _type_utils.py (#499)
41
+ - Strengthen weak assertions (assert X is not None → value checks) (#498)
42
+ - Trim verbose exception constructor docstrings (#501)
43
+ - Analyze benchmark results for performance improvement opportunities (#502)
44
+ - Consolidate remaining duplicate sample types in test files (#497)
45
+ - Remove dead code: _repo_legacy.py legacy UUID field, unused imports (#496)
46
+ - Trim verbose docstrings in dataset.py and _index.py (#495)
47
+ - Benchmark report: replace mean/stddev with median/IQR, add per-sample columns (#492)
48
+ - Add parameter descriptions to benchmark suite with automatic report introspection (#491)
49
+ - HTML benchmark reports with CI integration (#487)
50
+ - Add bench + render step to CI on highest Python version only (#490)
51
+ - Update justfile bench commands to export JSON and render (#489)
52
+ - Create render_report.py script to convert JSON to HTML (#488)
53
+ - Increase test coverage for low-coverage modules (#480)
54
+ - Add providers/_postgres.py tests (mock-based) (#485)
55
+ - Add _stub_manager.py tests (#484)
56
+ - Add manifest/_query.py tests (#483)
57
+ - Add repository.py tests (#482)
58
+ - Add CLI tests (cli/__init__, diagnose, local, preview, schema) (#481)
59
+ - Check test coverage for CLI utils (#479)
60
+ - Add performance benchmark suite for atdata (#471)
61
+ - Verify benchmarks run (#478)
62
+ - Update pyproject.toml and justfile (#477)
63
+ - Create bench_atmosphere.py (#476)
64
+ - Create bench_query.py (#475)
65
+ - Create bench_dataset_io.py (#474)
66
+ - Create bench_index_providers.py (#473)
67
+ - Create benchmarks/conftest.py with shared fixtures (#472)
68
+ - Add per-shard manifest and query system (GH #35) (#462)
69
+ - Write unit and integration tests (#470)
70
+ - Integrate manifest into write path and Dataset.query() (#469)
71
+ - Implement QueryExecutor and SampleLocation (#468)
72
+ - Implement ManifestWriter (JSON + parquet) (#467)
73
+ - Implement ManifestBuilder (#465)
74
+ - Implement ShardManifest data model (#466)
75
+ - Implement aggregate collectors (categorical, numeric, set) (#464)
76
+ - Implement ManifestField annotation and resolve_manifest_fields() (#463)
77
+ - Migrate type annotations from PackableSample to Packable protocol (#461)
78
+ - Remove LocalIndex factory — consolidate to Index (#460)
79
+ - Split local.py monolith into local/ package (#452)
80
+ - Verify tests and lint pass (#459)
81
+ - Create __init__.py re-export facade and delete local.py (#458)
82
+ - Create _repo_legacy.py with deprecated Repo class (#457)
83
+ - Create _index.py with Index class and LocalIndex factory (#456)
84
+ - Create _s3.py with S3DataStore and S3 helpers (#455)
85
+ - Create _schema.py with schema models and helpers (#454)
86
+ - Create _entry.py with LocalDatasetEntry and constants (#453)
87
+ - Migrate CLI from argparse to typer (#449)
88
+ - Investigate test failures (#450)
89
+ - Fix ensure_stub receiving LocalSchemaRecord instead of dict (#451)
90
+ - GH#38: Developer experience improvements (#437)
91
+ - CLI: atdata preview command (#440)
92
+ - CLI: atdata schema show/diff commands (#439)
93
+ - CLI: atdata inspect command (#438)
94
+ - Dataset.__len__ and Dataset.select() for sample count and indexed access (#447)
95
+ - Dataset.to_pandas() and Dataset.to_dict() export methods (#446)
96
+ - Dataset.filter() and Dataset.map() streaming transforms (#445)
97
+ - Dataset.get(key) for keyed sample access (#442)
98
+ - Dataset.describe() summary statistics (#444)
99
+ - Dataset.schema property and column_names (#443)
100
+ - Dataset.head(n) and Dataset.__iter__ convenience methods (#441)
101
+ - Custom exception hierarchy with actionable error messages (#448)
102
+ - Adversarial review: Post-Repository consolidation assessment (#430)
103
+ - Remove backwards-compat dict-access methods from SchemaField and LocalSchemaRecord (#436)
104
+ - Add missing test coverage for Repository prefix routing edge cases and error paths (#435)
105
+ - Trim over-verbose docstrings in local.py module/class level (#434)
106
+ - Fix formally incorrect test assertions (batch_size, CID, brace notation) (#433)
107
+ - Consolidate duplicate test sample types across test files into conftest.py (#432)
108
+ - Consolidate duplicate entry-creation logic in Index (add_entry vs _insert_dataset_to_provider) (#431)
109
+ - Switch default Index provider from Redis to SQLite (#429)
110
+ - Consolidated Index with Repository system (#424)
111
+ - Phase 4: Deprecate AtmosphereIndex, update exports (#428)
112
+ - Phase 3: Default Index singleton and load_dataset integration (#427)
113
+ - Phase 2: Extend Index with repos/atmosphere params and prefix routing (#426)
114
+ - Phase 1: Create Repository dataclass and _AtmosphereBackend in repository.py (#425)
115
+ - Adversarial review: Post-IndexProvider pluggable storage assessment (#417)
116
+ - Convert TODO comments to tracked issues or remove (#422)
117
+ - Remove deprecated shard_list property references from docstrings (#421)
118
+ - Replace bare except in _stub_manager.py and cli/local.py with specific exceptions (#423)
119
+ - Tighten generic pytest.raises(Exception) to specific exception types in tests (#420)
120
+ - Replace assert statements with ValueError in production code (#419)
121
+ - Consolidate duplicated _parse_semver into _type_utils.py (#418)
122
+ - feat: Add SQLite/PostgreSQL index providers (GH #42) (#409)
123
+ - Update documentation and public API exports (#416)
124
+ - Add tests for all providers (#415)
125
+ - Refactor Index class to accept provider parameter (#414)
126
+ - Implement PostgresIndexProvider (#413)
127
+ - Implement SqliteIndexProvider (#412)
128
+ - Implement RedisIndexProvider (extract from Index class) (#411)
129
+ - Define IndexProvider protocol in _protocols.py (#410)
130
+ - Add just lint command to justfile (#408)
131
+ - Add SQLite/PostgreSQL providers for LocalIndex (in addition to Redis) (#407)
132
+ - Fix type hints for @atdata.packable decorator to show PackableSample methods (#406)
133
+ - Review GitHub workflows and recommend CI improvements (#405)
134
+ - Fix type signatures for Dataset.ordered and Dataset.shuffled (GH#28) (#404)
135
+ - Investigate quartodoc Example section rendering - missing CSS classes on pre/code tags (#401)
136
+ - Update all docstrings from Example: to Examples: format (#403)
137
+ - Create GitHub issues for v0.3 roadmap feature domains (#402)
28
138
  - Expand Quarto documentation with architectural narrative (#395)
29
139
  - Expand atmosphere tutorial with federation context (#400)
30
140
  - Expand local-workflow tutorial with system narrative (#399)
@@ -46,8 +46,10 @@ uv build
46
46
  Development tasks are managed with [just](https://github.com/casey/just), a command runner. Available commands:
47
47
 
48
48
  ```bash
49
- # Build documentation (runs quartodoc + quarto)
50
- just docs
49
+ just test # Run all tests with coverage
50
+ just test tests/test_dataset.py # Run specific test file
51
+ just lint # Run ruff check + format check
52
+ just docs # Build documentation (runs quartodoc + quarto)
51
53
  ```
52
54
 
53
55
  The `justfile` is in the project root. Add new dev tasks there rather than creating shell scripts.
@@ -209,11 +211,11 @@ def test_repo_insert_with_s3(mock_s3, clean_redis):
209
211
 
210
212
  ## Docstring Formatting
211
213
 
212
- This project uses **Google-style docstrings** with quartodoc for API documentation generation. The most important formatting requirement is for **Example sections**.
214
+ This project uses **Google-style docstrings** with quartodoc for API documentation generation. The most important formatting requirement is for **Examples sections**.
213
215
 
214
- ### Example Section Format
216
+ ### Examples Section Format
215
217
 
216
- Example sections must use reStructuredText literal block syntax (`::`) to render correctly in quartodoc-generated documentation:
218
+ Use `Examples:` (plural) for code examples. This is recognized by griffe's Google docstring parser and rendered with proper syntax highlighting by quartodoc:
217
219
 
218
220
  ```python
219
221
  def my_function():
@@ -227,50 +229,44 @@ def my_function():
227
229
  Returns:
228
230
  Description of return value.
229
231
 
230
- Example:
231
- ::
232
-
233
- >>> result = my_function()
234
- >>> print(result)
235
- 'output'
232
+ Examples:
233
+ >>> result = my_function()
234
+ >>> print(result)
235
+ 'output'
236
236
  """
237
237
  ```
238
238
 
239
239
  **Key formatting rules:**
240
240
 
241
- 1. `Example:` with a colon, 4-space indented from the docstring margin
242
- 2. `::` on its own line, 8-space indented (4 more than `Example:`)
243
- 3. Blank line after `::`
244
- 4. Code examples indented 12 spaces (4 more than `::`)
245
- 5. Use `>>>` for Python prompts and `...` for continuation lines
241
+ 1. Use `Examples:` (plural, not `Example:` singular)
242
+ 2. Code examples are indented 8 spaces (4 more than `Examples:`)
243
+ 3. Use `>>>` for Python prompts and `...` for continuation lines
244
+ 4. No `::` marker needed - griffe handles the parsing automatically
246
245
 
247
- **Incorrect format (will not render properly):**
246
+ **Incorrect format (will not render with syntax highlighting):**
248
247
  ```python
249
- Example:
250
- >>> code_here() # Wrong - missing :: and extra indentation
248
+ Example: # Wrong - singular form is treated as an admonition
249
+ :: # Wrong - reST literal block marker not needed
250
+ >>> code_here()
251
251
  ```
252
252
 
253
253
  **Correct format:**
254
254
  ```python
255
- Example:
256
- ::
257
-
258
- >>> code_here() # Correct - has :: and proper indentation
255
+ Examples:
256
+ >>> code_here() # Correct - plural form, proper indentation
259
257
  ```
260
258
 
261
259
  ### Multiple Examples
262
260
 
263
- For multiple examples, use the same pattern:
261
+ For multiple examples, continue in the same section:
264
262
 
265
263
  ```python
266
- Example:
267
- ::
268
-
269
- >>> # First example
270
- >>> x = create_thing()
264
+ Examples:
265
+ >>> # First example
266
+ >>> x = create_thing()
271
267
 
272
- >>> # Second example
273
- >>> y = other_thing()
268
+ >>> # Second example
269
+ >>> y = other_thing()
274
270
  ```
275
271
 
276
272
  ### Class and Method Docstrings
@@ -281,20 +277,16 @@ Apply the same format to class docstrings and method docstrings:
281
277
  class MyClass:
282
278
  """Class description.
283
279
 
284
- Example:
285
- ::
286
-
287
- >>> obj = MyClass()
288
- >>> obj.do_something()
280
+ Examples:
281
+ >>> obj = MyClass()
282
+ >>> obj.do_something()
289
283
  """
290
284
 
291
285
  def method(self):
292
286
  """Method description.
293
287
 
294
- Example:
295
- ::
296
-
297
- >>> self.method()
288
+ Examples:
289
+ >>> self.method()
298
290
  """
299
291
  ```
300
292
 
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atdata
3
- Version: 0.2.2b1
3
+ Version: 0.3.0b1
4
4
  Summary: A loose federation of distributed, typed datasets
5
5
  Author-email: Maxine Levesque <hello@maxine.science>, "Maxine @ Forecast Bio" <maxine@forecast.bio>
6
6
  License-File: LICENSE
7
7
  Requires-Python: >=3.12
8
8
  Requires-Dist: atproto>=0.0.65
9
+ Requires-Dist: boto3>=1.41.5
9
10
  Requires-Dist: fastparquet>=2024.11.0
10
11
  Requires-Dist: libipld>=3.3.2
11
12
  Requires-Dist: msgpack>=1.1.2
@@ -19,9 +20,12 @@ Requires-Dist: requests>=2.32.5
19
20
  Requires-Dist: s3fs>=2025.12.0
20
21
  Requires-Dist: schemamodels>=0.9.1
21
22
  Requires-Dist: tqdm>=4.67.1
23
+ Requires-Dist: typer>=0.21.1
22
24
  Requires-Dist: webdataset>=1.0.2
23
25
  Provides-Extra: atmosphere
24
26
  Requires-Dist: atproto>=0.0.55; extra == 'atmosphere'
27
+ Provides-Extra: postgres
28
+ Requires-Dist: psycopg[binary]>=3.1; extra == 'postgres'
25
29
  Description-Content-Type: text/markdown
26
30
 
27
31
  # atdata