mostlyright-data 0.9.0__py3-none-any.whl

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 (314) hide show
  1. mostlyright/data_harness/__init__.py +158 -0
  2. mostlyright/data_harness/acquisition/__init__.py +55 -0
  3. mostlyright/data_harness/acquisition/http.py +2773 -0
  4. mostlyright/data_harness/acquisition/parsing.py +809 -0
  5. mostlyright/data_harness/acquisition/ranges.py +495 -0
  6. mostlyright/data_harness/acquisition/result_download.py +360 -0
  7. mostlyright/data_harness/acquisition/retention_admission.py +248 -0
  8. mostlyright/data_harness/acquisition/sandbox.py +4888 -0
  9. mostlyright/data_harness/acquisition/url_policy.py +530 -0
  10. mostlyright/data_harness/agent_runtime.py +2743 -0
  11. mostlyright/data_harness/assets/logo-ink.svg +31 -0
  12. mostlyright/data_harness/backends/__init__.py +28 -0
  13. mostlyright/data_harness/backends/pandas_backend.py +350 -0
  14. mostlyright/data_harness/backends/polars_backend.py +366 -0
  15. mostlyright/data_harness/backends/protocol.py +124 -0
  16. mostlyright/data_harness/backends/reference.py +83 -0
  17. mostlyright/data_harness/backends/registry.py +55 -0
  18. mostlyright/data_harness/backends/restrictions.py +126 -0
  19. mostlyright/data_harness/canonical.py +333 -0
  20. mostlyright/data_harness/catalog_job.py +625 -0
  21. mostlyright/data_harness/cli.py +5398 -0
  22. mostlyright/data_harness/contracts.py +53 -0
  23. mostlyright/data_harness/coordinator.py +1307 -0
  24. mostlyright/data_harness/deploy.py +924 -0
  25. mostlyright/data_harness/deploy_target.py +312 -0
  26. mostlyright/data_harness/deployment_evidence.py +1067 -0
  27. mostlyright/data_harness/event_presentation.py +576 -0
  28. mostlyright/data_harness/events.py +2152 -0
  29. mostlyright/data_harness/fast_delimited.py +239 -0
  30. mostlyright/data_harness/fleet.py +237 -0
  31. mostlyright/data_harness/formats.py +236 -0
  32. mostlyright/data_harness/governors.py +1163 -0
  33. mostlyright/data_harness/hosted_bootstrap.py +972 -0
  34. mostlyright/data_harness/hosted_crawler.py +1115 -0
  35. mostlyright/data_harness/hosted_crawler_container_smoke.py +351 -0
  36. mostlyright/data_harness/hosted_crawler_fetch.py +423 -0
  37. mostlyright/data_harness/hosted_crawler_job.py +1277 -0
  38. mostlyright/data_harness/hosted_crawler_protocol.py +676 -0
  39. mostlyright/data_harness/hosted_dataset.py +1500 -0
  40. mostlyright/data_harness/hosted_deploy.py +3037 -0
  41. mostlyright/data_harness/hosted_handoff.py +62 -0
  42. mostlyright/data_harness/hosted_ingestion_contract.py +504 -0
  43. mostlyright/data_harness/hosted_ingestion_job.py +356 -0
  44. mostlyright/data_harness/hosted_ingestion_job_smoke.py +40 -0
  45. mostlyright/data_harness/hosted_session_container_smoke.py +194 -0
  46. mostlyright/data_harness/hosted_session_worker.py +3554 -0
  47. mostlyright/data_harness/hosted_session_worker_job_smoke.py +46 -0
  48. mostlyright/data_harness/hosted_worker.py +6784 -0
  49. mostlyright/data_harness/ingestion/__init__.py +56 -0
  50. mostlyright/data_harness/ingestion/contracts.py +461 -0
  51. mostlyright/data_harness/ingestion/faults.py +42 -0
  52. mostlyright/data_harness/ingestion/gcs_store.py +1162 -0
  53. mostlyright/data_harness/ingestion/spool.py +130 -0
  54. mostlyright/data_harness/ingestion/store.py +885 -0
  55. mostlyright/data_harness/key_seam.py +434 -0
  56. mostlyright/data_harness/linux_process_boundary.py +262 -0
  57. mostlyright/data_harness/local_contracts.py +2880 -0
  58. mostlyright/data_harness/local_search/__init__.py +5 -0
  59. mostlyright/data_harness/local_search/build_index.py +1087 -0
  60. mostlyright/data_harness/local_search/contracts.py +920 -0
  61. mostlyright/data_harness/local_search/query_trace.py +266 -0
  62. mostlyright/data_harness/local_search/retrieval.py +700 -0
  63. mostlyright/data_harness/local_search/sealed.py +474 -0
  64. mostlyright/data_harness/local_search/service.py +784 -0
  65. mostlyright/data_harness/nbrender/CONTRACT.md +212 -0
  66. mostlyright/data_harness/nbrender/__init__.py +12 -0
  67. mostlyright/data_harness/nbrender/chrome.py +359 -0
  68. mostlyright/data_harness/nbrender/code_body.py +266 -0
  69. mostlyright/data_harness/nbrender/document.py +407 -0
  70. mostlyright/data_harness/nbrender/frame.py +275 -0
  71. mostlyright/data_harness/nbrender/interactive.py +337 -0
  72. mostlyright/data_harness/nbrender/markdown_body.py +477 -0
  73. mostlyright/data_harness/nbrender/mr_components.py +134 -0
  74. mostlyright/data_harness/nbrender/outputs_data.py +595 -0
  75. mostlyright/data_harness/nbrender/outputs_rich.py +906 -0
  76. mostlyright/data_harness/nbrender/outputs_source.py +260 -0
  77. mostlyright/data_harness/nbrender/outputs_stage.py +176 -0
  78. mostlyright/data_harness/nbrender/outputs_text.py +400 -0
  79. mostlyright/data_harness/nbrender/parse.py +394 -0
  80. mostlyright/data_harness/nbrender/status.py +40 -0
  81. mostlyright/data_harness/nbrender/tokens.py +1295 -0
  82. mostlyright/data_harness/notebook.py +1710 -0
  83. mostlyright/data_harness/offline.py +2049 -0
  84. mostlyright/data_harness/operation_registry.py +1007 -0
  85. mostlyright/data_harness/operator_setup.py +239 -0
  86. mostlyright/data_harness/pipeline.py +6428 -0
  87. mostlyright/data_harness/plan_graph.py +2026 -0
  88. mostlyright/data_harness/preparation/__init__.py +104 -0
  89. mostlyright/data_harness/preparation/contracts.py +1017 -0
  90. mostlyright/data_harness/preparation/engine.py +221 -0
  91. mostlyright/data_harness/preparation/errors.py +14 -0
  92. mostlyright/data_harness/preparation/gates.py +751 -0
  93. mostlyright/data_harness/preparation/joins.py +574 -0
  94. mostlyright/data_harness/preparation/profile.py +384 -0
  95. mostlyright/data_harness/preparation/table.py +217 -0
  96. mostlyright/data_harness/preparation/transforms.py +568 -0
  97. mostlyright/data_harness/progress_events.py +534 -0
  98. mostlyright/data_harness/readers/__init__.py +46 -0
  99. mostlyright/data_harness/readers/containers.py +963 -0
  100. mostlyright/data_harness/readers/contracts.py +542 -0
  101. mostlyright/data_harness/readers/delimited.py +257 -0
  102. mostlyright/data_harness/readers/grib2/__init__.py +33 -0
  103. mostlyright/data_harness/readers/grib2/admission.py +722 -0
  104. mostlyright/data_harness/readers/grib2/decode.py +1009 -0
  105. mostlyright/data_harness/readers/grib2/geometry.py +1133 -0
  106. mostlyright/data_harness/readers/grib2/portable_math.py +501 -0
  107. mostlyright/data_harness/readers/json_tabular.py +485 -0
  108. mostlyright/data_harness/readers/registry.py +514 -0
  109. mostlyright/data_harness/readers/samples/README.md +110 -0
  110. mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  111. mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +24 -0
  112. mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  113. mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +24 -0
  114. mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  115. mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +24 -0
  116. mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  117. mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +24 -0
  118. mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  119. mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +25 -0
  120. mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  121. mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +25 -0
  122. mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  123. mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +25 -0
  124. mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +3 -0
  125. mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +23 -0
  126. mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +5 -0
  127. mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +25 -0
  128. mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +30 -0
  129. mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +5 -0
  130. mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +44 -0
  131. mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +1 -0
  132. mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +48 -0
  133. mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +4 -0
  134. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  135. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +24 -0
  136. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +27 -0
  137. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  138. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +27 -0
  139. mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  140. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +20 -0
  141. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +55 -0
  142. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  143. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +54 -0
  144. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  145. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +54 -0
  146. mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  147. mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +54 -0
  148. mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  149. mostlyright/data_harness/readers/samples.py +582 -0
  150. mostlyright/data_harness/readers/spreadsheet.py +803 -0
  151. mostlyright/data_harness/readers/tabular.py +510 -0
  152. mostlyright/data_harness/recipe.py +5321 -0
  153. mostlyright/data_harness/repair/__init__.py +78 -0
  154. mostlyright/data_harness/repair/adapters.py +274 -0
  155. mostlyright/data_harness/repair/contracts.py +872 -0
  156. mostlyright/data_harness/repair/coordinator.py +1099 -0
  157. mostlyright/data_harness/repair/errors.py +16 -0
  158. mostlyright/data_harness/review.py +2533 -0
  159. mostlyright/data_harness/rowset.py +283 -0
  160. mostlyright/data_harness/serving.py +1975 -0
  161. mostlyright/data_harness/serving_edge.py +590 -0
  162. mostlyright/data_harness/serving_http.py +1031 -0
  163. mostlyright/data_harness/session_probes.py +759 -0
  164. mostlyright/data_harness/signing.py +101 -0
  165. mostlyright/data_harness/source_discovery.py +898 -0
  166. mostlyright/data_harness/sources/__init__.py +209 -0
  167. mostlyright/data_harness/sources/_adapter_steps.py +213 -0
  168. mostlyright/data_harness/sources/adapters.py +1214 -0
  169. mostlyright/data_harness/sources/cadence.py +1428 -0
  170. mostlyright/data_harness/sources/cadence_emission.py +453 -0
  171. mostlyright/data_harness/sources/cadence_history.py +546 -0
  172. mostlyright/data_harness/sources/catalog/__init__.py +17 -0
  173. mostlyright/data_harness/sources/catalog/admission.py +477 -0
  174. mostlyright/data_harness/sources/catalog/authoring.py +1701 -0
  175. mostlyright/data_harness/sources/catalog/authoring_policy.py +701 -0
  176. mostlyright/data_harness/sources/catalog/authoring_shards.py +1217 -0
  177. mostlyright/data_harness/sources/catalog/bounded_io.py +231 -0
  178. mostlyright/data_harness/sources/catalog/channel.py +523 -0
  179. mostlyright/data_harness/sources/catalog/channel_client.py +296 -0
  180. mostlyright/data_harness/sources/catalog/contracts.py +825 -0
  181. mostlyright/data_harness/sources/catalog/coverage.py +137 -0
  182. mostlyright/data_harness/sources/catalog/delta.py +1340 -0
  183. mostlyright/data_harness/sources/catalog/embedding.py +532 -0
  184. mostlyright/data_harness/sources/catalog/entry_v2.py +1182 -0
  185. mostlyright/data_harness/sources/catalog/fill.py +3889 -0
  186. mostlyright/data_harness/sources/catalog/fill_partitions.py +459 -0
  187. mostlyright/data_harness/sources/catalog/fill_staging.py +1105 -0
  188. mostlyright/data_harness/sources/catalog/gating.py +374 -0
  189. mostlyright/data_harness/sources/catalog/generation_receipt.py +1607 -0
  190. mostlyright/data_harness/sources/catalog/harvest/__init__.py +7 -0
  191. mostlyright/data_harness/sources/catalog/harvest/ckan.py +384 -0
  192. mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +798 -0
  193. mostlyright/data_harness/sources/catalog/harvest/protocol.py +964 -0
  194. mostlyright/data_harness/sources/catalog/harvest/sdmx.py +445 -0
  195. mostlyright/data_harness/sources/catalog/harvest/stac.py +384 -0
  196. mostlyright/data_harness/sources/catalog/health.py +447 -0
  197. mostlyright/data_harness/sources/catalog/hosted_catalog.py +105 -0
  198. mostlyright/data_harness/sources/catalog/identity_history.py +1549 -0
  199. mostlyright/data_harness/sources/catalog/neural.py +1618 -0
  200. mostlyright/data_harness/sources/catalog/packed_catalog.py +2345 -0
  201. mostlyright/data_harness/sources/catalog/packed_retrieval.py +1517 -0
  202. mostlyright/data_harness/sources/catalog/packed_writer.py +2802 -0
  203. mostlyright/data_harness/sources/catalog/query_trace.py +1037 -0
  204. mostlyright/data_harness/sources/catalog/recommend.py +171 -0
  205. mostlyright/data_harness/sources/catalog/retrieval.py +230 -0
  206. mostlyright/data_harness/sources/catalog/retrieval_manifest.py +995 -0
  207. mostlyright/data_harness/sources/catalog/rights_decisions.py +254 -0
  208. mostlyright/data_harness/sources/catalog/sealed.py +560 -0
  209. mostlyright/data_harness/sources/catalog/search.py +230 -0
  210. mostlyright/data_harness/sources/catalog/streaming_delta.py +1097 -0
  211. mostlyright/data_harness/sources/catalog/update.py +891 -0
  212. mostlyright/data_harness/sources/collections.py +815 -0
  213. mostlyright/data_harness/sources/contracts.py +2223 -0
  214. mostlyright/data_harness/sources/deletion.py +761 -0
  215. mostlyright/data_harness/sources/fitness.py +162 -0
  216. mostlyright/data_harness/sources/governance.py +163 -0
  217. mostlyright/data_harness/sources/hosted.py +173 -0
  218. mostlyright/data_harness/sources/integration.py +218 -0
  219. mostlyright/data_harness/sources/range_reader.py +418 -0
  220. mostlyright/data_harness/sources/registry.py +514 -0
  221. mostlyright/data_harness/sources/rights_rule.py +59 -0
  222. mostlyright/data_harness/sources/source_cadence_vectors.v1.json +1 -0
  223. mostlyright/data_harness/sources/sports.py +521 -0
  224. mostlyright/data_harness/sources/stream.py +524 -0
  225. mostlyright/data_harness/sources/stream_connector.py +418 -0
  226. mostlyright/data_harness/sources/stream_recorder.py +1404 -0
  227. mostlyright/data_harness/studio_boundary.py +2019 -0
  228. mostlyright/data_harness/thin/__init__.py +37 -0
  229. mostlyright/data_harness/thin/acquire.py +1137 -0
  230. mostlyright/data_harness/thin/acquire_cancel.py +579 -0
  231. mostlyright/data_harness/thin/approvals.py +617 -0
  232. mostlyright/data_harness/thin/commands.py +406 -0
  233. mostlyright/data_harness/thin/download.py +194 -0
  234. mostlyright/data_harness/thin/narrative.py +589 -0
  235. mostlyright/data_harness/thin/parity.py +1070 -0
  236. mostlyright/data_harness/thin/propose.py +2759 -0
  237. mostlyright/data_harness/thin/research.py +1663 -0
  238. mostlyright/data_harness/thin/router.py +924 -0
  239. mostlyright/data_harness/thin/runs.py +519 -0
  240. mostlyright/data_harness/thin/session.py +281 -0
  241. mostlyright/data_harness/thin/stream.py +501 -0
  242. mostlyright/data_harness/thin/transport.py +187 -0
  243. mostlyright/data_harness/thin/vocabulary.py +368 -0
  244. mostlyright/data_harness/thin/workers.py +164 -0
  245. mostlyright/data_harness/ucum/TABLE-PIN.json +40 -0
  246. mostlyright/data_harness/ucum/ucum-subset.v1.json +632 -0
  247. mostlyright/data_harness/unit_flow.py +927 -0
  248. mostlyright/data_harness/units.py +572 -0
  249. mostlyright/data_harness/ux/__init__.py +9 -0
  250. mostlyright/data_harness/ux/approve.py +485 -0
  251. mostlyright/data_harness/ux/author_yaml.py +597 -0
  252. mostlyright/data_harness/ux/cloud_auth.py +447 -0
  253. mostlyright/data_harness/ux/commands/__init__.py +260 -0
  254. mostlyright/data_harness/ux/commands/approve.py +136 -0
  255. mostlyright/data_harness/ux/commands/auth.py +744 -0
  256. mostlyright/data_harness/ux/commands/author.py +79 -0
  257. mostlyright/data_harness/ux/commands/catalog_author.py +403 -0
  258. mostlyright/data_harness/ux/commands/catalog_fill.py +523 -0
  259. mostlyright/data_harness/ux/commands/catalog_harvest.py +545 -0
  260. mostlyright/data_harness/ux/commands/catalog_publish.py +1838 -0
  261. mostlyright/data_harness/ux/commands/catalog_search.py +71 -0
  262. mostlyright/data_harness/ux/commands/catalog_update.py +437 -0
  263. mostlyright/data_harness/ux/commands/deploy.py +134 -0
  264. mostlyright/data_harness/ux/commands/deploy_dataset.py +98 -0
  265. mostlyright/data_harness/ux/commands/deploy_plan.py +105 -0
  266. mostlyright/data_harness/ux/commands/deploy_status.py +104 -0
  267. mostlyright/data_harness/ux/commands/diff.py +74 -0
  268. mostlyright/data_harness/ux/commands/index.py +84 -0
  269. mostlyright/data_harness/ux/commands/inventory.py +47 -0
  270. mostlyright/data_harness/ux/commands/list_builds.py +143 -0
  271. mostlyright/data_harness/ux/commands/login.py +63 -0
  272. mostlyright/data_harness/ux/commands/peek.py +236 -0
  273. mostlyright/data_harness/ux/commands/plan_check.py +90 -0
  274. mostlyright/data_harness/ux/commands/preflight.py +97 -0
  275. mostlyright/data_harness/ux/commands/record.py +107 -0
  276. mostlyright/data_harness/ux/commands/review_setup.py +47 -0
  277. mostlyright/data_harness/ux/commands/search.py +440 -0
  278. mostlyright/data_harness/ux/commands/show.py +61 -0
  279. mostlyright/data_harness/ux/commands/whoami.py +37 -0
  280. mostlyright/data_harness/ux/credential_native.py +551 -0
  281. mostlyright/data_harness/ux/credential_store.py +1055 -0
  282. mostlyright/data_harness/ux/credentials.py +631 -0
  283. mostlyright/data_harness/ux/diffing.py +444 -0
  284. mostlyright/data_harness/ux/headline.py +671 -0
  285. mostlyright/data_harness/ux/hosted_acquisition.py +974 -0
  286. mostlyright/data_harness/ux/hosted_run_status.py +619 -0
  287. mostlyright/data_harness/ux/inventory.py +427 -0
  288. mostlyright/data_harness/ux/local_review.py +375 -0
  289. mostlyright/data_harness/ux/login.py +691 -0
  290. mostlyright/data_harness/ux/path_kind.py +147 -0
  291. mostlyright/data_harness/ux/peek.py +1000 -0
  292. mostlyright/data_harness/ux/plain_file.py +178 -0
  293. mostlyright/data_harness/ux/plan_check.py +311 -0
  294. mostlyright/data_harness/ux/preflight.py +918 -0
  295. mostlyright/data_harness/ux/readers.py +1124 -0
  296. mostlyright/data_harness/ux/remediation.py +2195 -0
  297. mostlyright/data_harness/ux/render.py +657 -0
  298. mostlyright/data_harness/ux/workload.py +1077 -0
  299. mostlyright/data_harness/viewer.py +3713 -0
  300. mostlyright/data_harness/visual_run/__init__.py +83 -0
  301. mostlyright/data_harness/visual_run/authoring.py +235 -0
  302. mostlyright/data_harness/visual_run/contracts.py +673 -0
  303. mostlyright/data_harness/visual_run/materialize.py +486 -0
  304. mostlyright/data_harness/visual_run/observations.py +874 -0
  305. mostlyright/data_harness/visual_run/query.py +259 -0
  306. mostlyright/data_harness/visual_run/reducer.py +280 -0
  307. mostlyright/data_harness/visual_run/sdk.py +892 -0
  308. mostlyright/data_harness/visual_run/store.py +584 -0
  309. mostlyright/data_harness/visual_run/transport.py +239 -0
  310. mostlyright/data_harness/watch.py +2999 -0
  311. mostlyright_data-0.9.0.dist-info/METADATA +607 -0
  312. mostlyright_data-0.9.0.dist-info/RECORD +314 -0
  313. mostlyright_data-0.9.0.dist-info/WHEEL +4 -0
  314. mostlyright_data-0.9.0.dist-info/entry_points.txt +12 -0
@@ -0,0 +1,209 @@
1
+ """Versioned source adapter and evidence contracts.
2
+
3
+ Acquisition runs in three steps. A caller builds an ``AcquisitionRequest`` and passes it with an
4
+ ``AcquisitionContext`` to ``AdapterRegistry.acquire``. The registry resolves the allowlisted
5
+ adapter for the requested adapter id and version and calls its ``acquire`` method. The adapter
6
+ returns an ``AcquisitionOutput`` holding the digest-bound receipt and the source observation, plus
7
+ the optional parsed schema digest, content-addressed snapshot path, and next stream watermark.
8
+
9
+ ``docs/SOURCES-AND-ACQUISITION.md`` describes that boundary in full, including catalog-provider
10
+ ownership, the sports comparison, stream batches, and deletion.
11
+ """
12
+
13
+ from mostlyright.data_harness.sources.adapters import (
14
+ AdapterGovernance,
15
+ LocalFileAdapter,
16
+ ObservationPolicy,
17
+ PublicHttpsAdapter,
18
+ RangeReaderHttpsAdapter,
19
+ )
20
+ from mostlyright.data_harness.sources.cadence import (
21
+ SOURCE_CADENCE_ALGORITHM_DIGEST,
22
+ SOURCE_CADENCE_ALGORITHM_VERSION,
23
+ SOURCE_CADENCE_INFERENCE_SCHEMA,
24
+ SOURCE_CADENCE_OBSERVATION_SCHEMA,
25
+ CadenceContractError,
26
+ CadenceInference,
27
+ EmpiricalSourceObservation,
28
+ PartitionDigest,
29
+ SourceFrontier,
30
+ infer_source_cadence,
31
+ parse_cadence_inference,
32
+ parse_empirical_source_observation,
33
+ source_cadence_algorithm_spec,
34
+ validate_observation_history,
35
+ )
36
+ from mostlyright.data_harness.sources.collections import (
37
+ CollectionMember,
38
+ PublicHttpsCollectionAdapter,
39
+ collection_members,
40
+ )
41
+ from mostlyright.data_harness.sources.contracts import (
42
+ AcquisitionReceipt,
43
+ AcquisitionReceiptV2,
44
+ AcquisitionReceiptV3,
45
+ AcquisitionRequest,
46
+ AdapterDescriptor,
47
+ CollectionMemberEvidence,
48
+ DeletionTombstone,
49
+ EvidenceReference,
50
+ FetchedMember,
51
+ FitnessEvidence,
52
+ FitnessReport,
53
+ LicenseObligation,
54
+ RetentionPolicy,
55
+ RightsEvidence,
56
+ SnapshotReference,
57
+ SourceContractError,
58
+ SourceObservation,
59
+ evaluate_obligations,
60
+ parse_adapter_descriptor,
61
+ )
62
+ from mostlyright.data_harness.sources.deletion import (
63
+ DeletionCoordinator,
64
+ DeletionOutcome,
65
+ RetentionDecision,
66
+ load_sealed_tombstone,
67
+ project_availability,
68
+ require_source_available,
69
+ retention_decision,
70
+ )
71
+ from mostlyright.data_harness.sources.fitness import (
72
+ FitnessSignals,
73
+ build_fitness_report,
74
+ select_one_source,
75
+ )
76
+ from mostlyright.data_harness.sources.governance import (
77
+ ClassificationFinding,
78
+ ClassificationResult,
79
+ classify_and_require_admissible,
80
+ classify_before_persistence,
81
+ require_admissible,
82
+ )
83
+ from mostlyright.data_harness.sources.integration import (
84
+ AcquiredOneToOneJoinEvidence,
85
+ OneToOneJoinEvidence,
86
+ join_acquired_sources_one_to_one,
87
+ join_source_tables_one_to_one,
88
+ )
89
+ from mostlyright.data_harness.sources.registry import (
90
+ AcquisitionContext,
91
+ AcquisitionOutput,
92
+ AdapterRegistry,
93
+ SourceAdapter,
94
+ )
95
+ from mostlyright.data_harness.sources.sports import (
96
+ GovernedSportsPackage,
97
+ SportsComparison,
98
+ compare_recorded_sports_sources,
99
+ create_governed_sports_package,
100
+ openligadb_adapter,
101
+ openligadb_descriptor,
102
+ openligadb_rights,
103
+ )
104
+ from mostlyright.data_harness.sources.stream import (
105
+ StreamBatch,
106
+ StreamBatchAdapter,
107
+ StreamGateway,
108
+ StreamState,
109
+ StreamWatermarkStore,
110
+ )
111
+ from mostlyright.data_harness.sources.stream_connector import (
112
+ KNOWN_STREAM_CONNECTORS,
113
+ STREAM_CONNECTOR_IDS,
114
+ StreamConnectorConfig,
115
+ stream_connector,
116
+ )
117
+ from mostlyright.data_harness.sources.stream_recorder import (
118
+ CaptureManifest,
119
+ RecordedStreamGateway,
120
+ read_capture_manifest,
121
+ seal_recorded_capture,
122
+ )
123
+
124
+ __all__ = [
125
+ "KNOWN_STREAM_CONNECTORS",
126
+ "SOURCE_CADENCE_ALGORITHM_DIGEST",
127
+ "SOURCE_CADENCE_ALGORITHM_VERSION",
128
+ "SOURCE_CADENCE_INFERENCE_SCHEMA",
129
+ "SOURCE_CADENCE_OBSERVATION_SCHEMA",
130
+ "STREAM_CONNECTOR_IDS",
131
+ "AcquiredOneToOneJoinEvidence",
132
+ "AcquisitionContext",
133
+ "AcquisitionOutput",
134
+ "AcquisitionReceipt",
135
+ "AcquisitionReceiptV2",
136
+ "AcquisitionReceiptV3",
137
+ "AcquisitionRequest",
138
+ "AdapterDescriptor",
139
+ "AdapterGovernance",
140
+ "AdapterRegistry",
141
+ "CadenceContractError",
142
+ "CadenceInference",
143
+ "CaptureManifest",
144
+ "ClassificationFinding",
145
+ "ClassificationResult",
146
+ "CollectionMember",
147
+ "CollectionMemberEvidence",
148
+ "DeletionCoordinator",
149
+ "DeletionOutcome",
150
+ "DeletionTombstone",
151
+ "EmpiricalSourceObservation",
152
+ "EvidenceReference",
153
+ "FetchedMember",
154
+ "FitnessEvidence",
155
+ "FitnessReport",
156
+ "FitnessSignals",
157
+ "GovernedSportsPackage",
158
+ "LicenseObligation",
159
+ "LocalFileAdapter",
160
+ "ObservationPolicy",
161
+ "OneToOneJoinEvidence",
162
+ "PartitionDigest",
163
+ "PublicHttpsAdapter",
164
+ "PublicHttpsCollectionAdapter",
165
+ "RangeReaderHttpsAdapter",
166
+ "RecordedStreamGateway",
167
+ "RetentionDecision",
168
+ "RetentionPolicy",
169
+ "RightsEvidence",
170
+ "SnapshotReference",
171
+ "SourceAdapter",
172
+ "SourceContractError",
173
+ "SourceFrontier",
174
+ "SourceObservation",
175
+ "SportsComparison",
176
+ "StreamBatch",
177
+ "StreamBatchAdapter",
178
+ "StreamConnectorConfig",
179
+ "StreamGateway",
180
+ "StreamState",
181
+ "StreamWatermarkStore",
182
+ "build_fitness_report",
183
+ "classify_and_require_admissible",
184
+ "classify_before_persistence",
185
+ "collection_members",
186
+ "compare_recorded_sports_sources",
187
+ "create_governed_sports_package",
188
+ "evaluate_obligations",
189
+ "infer_source_cadence",
190
+ "join_acquired_sources_one_to_one",
191
+ "join_source_tables_one_to_one",
192
+ "load_sealed_tombstone",
193
+ "openligadb_adapter",
194
+ "openligadb_descriptor",
195
+ "openligadb_rights",
196
+ "parse_adapter_descriptor",
197
+ "parse_cadence_inference",
198
+ "parse_empirical_source_observation",
199
+ "project_availability",
200
+ "read_capture_manifest",
201
+ "require_admissible",
202
+ "require_source_available",
203
+ "retention_decision",
204
+ "seal_recorded_capture",
205
+ "select_one_source",
206
+ "source_cadence_algorithm_spec",
207
+ "stream_connector",
208
+ "validate_observation_history",
209
+ ]
@@ -0,0 +1,213 @@
1
+ """Adapter steps shared by every source adapter in this package.
2
+
3
+ The file, HTTPS, external-provider, and stream adapters all authorize the candidate use, derive
4
+ sandbox parse limits, require the coordinator-pinned sandbox policy, and build the receipt and
5
+ observation the same way. Those four steps live here so no adapter can drift from them.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from dataclasses import dataclass
11
+ from pathlib import Path
12
+ from typing import TYPE_CHECKING
13
+
14
+ from mostlyright.data_harness.acquisition.http import ProbeTransport
15
+ from mostlyright.data_harness.acquisition.parsing import ParseLimits
16
+ from mostlyright.data_harness.canonical import sha256_bytes
17
+ from mostlyright.data_harness.sources.contracts import (
18
+ AcquisitionReceipt,
19
+ AcquisitionRequest,
20
+ AdapterDescriptor,
21
+ SnapshotReference,
22
+ SourceContractError,
23
+ SourceObservation,
24
+ decode_options_digest,
25
+ evaluate_obligations,
26
+ )
27
+ from mostlyright.data_harness.sources.registry import (
28
+ AcquisitionContext,
29
+ AcquisitionOutput,
30
+ )
31
+
32
+ if TYPE_CHECKING:
33
+ from mostlyright.data_harness.sources.adapters import AdapterGovernance
34
+
35
+
36
+ @dataclass(frozen=True)
37
+ class DecodeRecord:
38
+ """What a Reader reports back to the adapter that ran it.
39
+
40
+ Local to ``sources/`` rather than imported from ``readers``, so the evidence layer
41
+ stays independent of the Toolbox implementation and the seam can be exercised with a
42
+ stub. It carries the digest of the fetched bytes rather than the bytes themselves:
43
+ the sealed bytes are already in the adapter's hand and a second copy of the input
44
+ would only be a second thing that could go stale.
45
+ """
46
+
47
+ fetched_content_sha256: str
48
+ family_id: str
49
+ family_version: str
50
+ decode_options_digest: str
51
+ flags: tuple[str, ...] = ()
52
+
53
+
54
+ def _require_decode_matches_pin(
55
+ request: AcquisitionRequest,
56
+ decode: DecodeRecord | None,
57
+ ) -> None:
58
+ """Refuse an acquisition whose decode contradicts what the request entitled.
59
+
60
+ The adapter-side twin of ``recipe._validate_reader_pin_binding``, and deliberately not
61
+ a replacement for it. This one fires earlier and nearer the decode, which is where
62
+ the diagnosis is cheapest; the coordinator's own check stays as an independent second
63
+ gate reading the sealed receipt. A bug then has to defeat both.
64
+
65
+ It fires in the same three directions the coordinator check covers: the request
66
+ entitles a decoder and none ran, a decoder ran that the request entitled none, and
67
+ both are stated but disagree.
68
+ """
69
+
70
+ pin = request.reader_pin
71
+ if pin is None and decode is None:
72
+ return
73
+ if pin is None:
74
+ raise SourceContractError(
75
+ "DECODE_PIN_MISMATCH",
76
+ "receipt.family_id",
77
+ "a decode was recorded for a request that entitles no Reader family",
78
+ )
79
+ if decode is None:
80
+ raise SourceContractError(
81
+ "DECODE_PIN_MISMATCH",
82
+ "request.reader_pin",
83
+ "the request entitles a Reader family that this acquisition did not run",
84
+ )
85
+ if (decode.family_id, decode.family_version) != (pin["family_id"], pin["family_version"]):
86
+ raise SourceContractError(
87
+ "DECODE_PIN_MISMATCH",
88
+ "receipt.family_id",
89
+ "the decode names a Reader family the request did not entitle",
90
+ )
91
+ if decode.decode_options_digest != decode_options_digest(pin["decode_options"]):
92
+ raise SourceContractError(
93
+ "DECODE_PIN_MISMATCH",
94
+ "receipt.decode_options_digest",
95
+ "the decode ran with settings other than the ones the request entitled",
96
+ )
97
+
98
+
99
+ def _output(
100
+ *,
101
+ request: AcquisitionRequest,
102
+ descriptor: AdapterDescriptor,
103
+ governance: AdapterGovernance,
104
+ snapshot_path: Path,
105
+ content: bytes,
106
+ data_format: str,
107
+ media_type: str,
108
+ source_uri: str,
109
+ final_uri: str,
110
+ classification: str,
111
+ transport_evidence_digest: str,
112
+ parsed_schema_digest: str,
113
+ next_watermark: str | None = None,
114
+ decode: DecodeRecord | None = None,
115
+ probe_transport: ProbeTransport | None = None,
116
+ parsed_row_count: int | None = None,
117
+ parsed_row_digest: str | None = None,
118
+ ) -> AcquisitionOutput:
119
+ _require_decode_matches_pin(request, decode)
120
+ observation = SourceObservation(
121
+ source_id=request.source_id,
122
+ observed_at=governance.observation.observed_at,
123
+ event_time_field=governance.observation.event_time_field,
124
+ available_at_field=governance.observation.available_at_field,
125
+ historical_start=governance.observation.historical_start,
126
+ historical_end=governance.observation.historical_end,
127
+ live_status=governance.observation.live_status,
128
+ publication_delay_seconds=governance.observation.publication_delay_seconds,
129
+ update_frequency_seconds=governance.observation.update_frequency_seconds,
130
+ response_status=governance.observation.response_status,
131
+ evidence=governance.observation.evidence,
132
+ )
133
+ digest = sha256_bytes(content)
134
+ receipt = AcquisitionReceipt(
135
+ receipt_id=f"receipt.{request.digest[:24]}",
136
+ request_digest=request.digest,
137
+ source_id=request.source_id,
138
+ adapter=descriptor,
139
+ query_digest=request.query_digest,
140
+ snapshot=SnapshotReference(
141
+ content_sha256=digest,
142
+ size_bytes=len(content),
143
+ media_type=media_type,
144
+ data_format=data_format,
145
+ storage_name=snapshot_path.name,
146
+ ),
147
+ # The two hashes coincide for a direct fetch and diverge for a Reader-decoded
148
+ # acquisition: the fetched bytes are what arrived, the sealed bytes are what the
149
+ # Reader normalized them into. That is the middle link of the three-link identity
150
+ # chain ``AcquisitionReceipt`` describes, and keeping both is what gives a
151
+ # normalized artifact a way back to the bytes that produced it. On the direct
152
+ # path the snapshot digest is reused rather than the content hashed twice.
153
+ fetched_content_sha256=digest if decode is None else decode.fetched_content_sha256,
154
+ family_id=None if decode is None else decode.family_id,
155
+ family_version=None if decode is None else decode.family_version,
156
+ decode_options_digest=None if decode is None else decode.decode_options_digest,
157
+ decode_flags=() if decode is None else decode.flags,
158
+ source_uri=source_uri,
159
+ final_uri=final_uri,
160
+ event_time_field=governance.observation.event_time_field,
161
+ observed_at=governance.observation.observed_at,
162
+ available_at=governance.observation.available_at,
163
+ ingested_at=request.requested_at,
164
+ classification=classification,
165
+ rights_digest=governance.rights.digest,
166
+ retention_digest=governance.retention.digest,
167
+ observation_digest=observation.digest,
168
+ transport_evidence_digest=transport_evidence_digest,
169
+ )
170
+ return AcquisitionOutput(
171
+ receipt=receipt,
172
+ observation=observation,
173
+ parsed_schema_digest=parsed_schema_digest,
174
+ snapshot_path=snapshot_path,
175
+ next_watermark=next_watermark,
176
+ probe_transport=probe_transport,
177
+ parsed_row_count=parsed_row_count,
178
+ parsed_row_digest=parsed_row_digest,
179
+ )
180
+
181
+
182
+ def _authorize_candidate(request: AcquisitionRequest, governance: AdapterGovernance) -> None:
183
+ evaluate_obligations(
184
+ rights=governance.rights,
185
+ lifecycle="candidate",
186
+ intended_use=request.intended_use,
187
+ attached_artifact_digests=governance.attached_license_artifact_digests,
188
+ )
189
+
190
+
191
+ def _parse_limits(context: AcquisitionContext) -> ParseLimits:
192
+ return ParseLimits(
193
+ max_input_bytes=context.max_source_bytes,
194
+ max_uncompressed_bytes=min(max(context.max_source_bytes, 1) * 100, 1 << 36),
195
+ max_rows=context.max_rows,
196
+ max_columns=context.max_columns,
197
+ max_total_cells=min(context.max_rows * context.max_columns, 100_000_000),
198
+ )
199
+
200
+
201
+ def _require_sandbox_binding(policy_digest: str, context: AcquisitionContext) -> None:
202
+ if context.crawler_sandbox_attestation_digest is None:
203
+ raise SourceContractError(
204
+ "SANDBOX_ATTESTATION_REQUIRED",
205
+ "context.crawler_sandbox_attestation_digest",
206
+ "acquisition requires the coordinator-pinned crawler policy digest",
207
+ )
208
+ if policy_digest != context.crawler_sandbox_attestation_digest:
209
+ raise SourceContractError(
210
+ "SANDBOX_ATTESTATION_MISMATCH",
211
+ "sandbox.policy_digest",
212
+ "sandbox result does not match the coordinator-pinned policy",
213
+ )