mostlyright-data 0.15.1__tar.gz → 0.15.3__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 (537) hide show
  1. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/PKG-INFO +1 -1
  2. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/pyproject.toml +4 -1
  3. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/skills/mr-data-build/SKILL.md +20 -3
  4. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/acquisition/http.py +360 -0
  5. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/acquisition/parsing.py +602 -1
  6. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/acquisition/sandbox.py +908 -65
  7. mostlyright_data-0.15.3/src/mostlyright/data_harness/bounded_scratch_sink.py +223 -0
  8. mostlyright_data-0.15.3/src/mostlyright/data_harness/compact_worker.py +371 -0
  9. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/declared_checks.py +166 -54
  10. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/formats.py +2 -0
  11. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_bootstrap.py +4 -0
  12. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_crawler.py +27 -2
  13. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_crawler_fetch.py +42 -0
  14. mostlyright_data-0.15.3/src/mostlyright/data_harness/hosted_ingestion_worker.py +238 -0
  15. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_run_worker.py +3314 -136
  16. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +24 -0
  17. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_worker.py +13 -2
  18. mostlyright_data-0.15.3/src/mostlyright/data_harness/incremental_slice_executor.py +815 -0
  19. mostlyright_data-0.15.3/src/mostlyright/data_harness/incremental_worker.py +524 -0
  20. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/inprocess_acquisition.py +347 -1
  21. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/linux_process_boundary.py +168 -3
  22. mostlyright_data-0.15.3/src/mostlyright/data_harness/part_check_evidence.py +348 -0
  23. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/pipeline.py +40 -14
  24. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/plan_graph.py +53 -12
  25. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/run_execution_v4.py +825 -18
  26. mostlyright_data-0.15.3/src/mostlyright/data_harness/source_bootstrap.py +238 -0
  27. mostlyright_data-0.15.3/src/mostlyright/data_harness/source_bundle_writer.py +602 -0
  28. mostlyright_data-0.15.3/src/mostlyright/data_harness/source_history_candidate_child.py +188 -0
  29. mostlyright_data-0.15.3/src/mostlyright/data_harness/source_history_transform_child.py +151 -0
  30. mostlyright_data-0.15.3/src/mostlyright/data_harness/source_inventory.py +162 -0
  31. mostlyright_data-0.15.3/src/mostlyright/data_harness/source_raw_inventory.py +243 -0
  32. mostlyright_data-0.15.3/src/mostlyright/data_harness/source_state_index.py +543 -0
  33. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/_adapter_steps.py +19 -3
  34. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/contracts.py +3 -1
  35. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/registry.py +183 -11
  36. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream.py +13 -1
  37. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_capture_session.py +67 -8
  38. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connector.py +119 -23
  39. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_transport.py +14 -1
  40. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sql_transform_engine.py +523 -15
  41. mostlyright_data-0.15.3/src/mostlyright/data_harness/stream_order_vector.py +136 -0
  42. mostlyright_data-0.15.3/src/mostlyright/data_harness/stream_recovery_objects.py +256 -0
  43. mostlyright_data-0.15.3/src/mostlyright/data_harness/stream_segment_spill.py +275 -0
  44. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/stream_subscription_feed.py +82 -6
  45. mostlyright_data-0.15.3/src/mostlyright/data_harness/stream_subscription_sealer.py +1440 -0
  46. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/stream_subscription_worker.py +975 -94
  47. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/stream_venue_staging.py +310 -59
  48. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/studio_boundary.py +2 -2
  49. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/studio_subscription_control.py +331 -9
  50. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/table_manifest.py +203 -10
  51. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/table_parts.py +236 -26
  52. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/recipe.py +81 -0
  53. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4.py +39 -16
  54. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_datasets.py +174 -1
  55. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_runs.py +8 -3
  56. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_tables.py +1 -1
  57. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/vocabulary.py +5 -0
  58. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/workers.py +6 -0
  59. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/remediation.py +16 -1
  60. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/render.py +1 -0
  61. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_acquisition.py +88 -4
  62. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_recipe.py +307 -2
  63. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_window.py +126 -0
  64. mostlyright_data-0.15.1/src/mostlyright/data_harness/stream_subscription_sealer.py +0 -689
  65. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/.gitignore +0 -0
  66. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/README.md +0 -0
  67. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/scripts/hatch_build.py +0 -0
  68. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/skills/mr-data-build/agents/openai.yaml +0 -0
  69. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  70. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
  71. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/__init__.py +0 -0
  72. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
  73. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
  74. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
  75. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
  76. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
  77. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
  78. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
  79. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
  80. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
  81. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
  82. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
  83. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
  84. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
  85. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
  86. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
  87. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
  88. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
  89. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
  90. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
  91. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
  92. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
  93. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
  94. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
  95. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
  96. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
  97. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
  98. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
  99. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
  100. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
  101. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
  102. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
  103. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
  104. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
  105. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
  106. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
  107. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
  108. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
  109. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/__init__.py +0 -0
  110. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  111. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
  112. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  113. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  114. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  115. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  116. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  117. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  118. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  119. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  120. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  121. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  122. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/backends/reference.py +0 -0
  123. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/backends/registry.py +0 -0
  124. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  125. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/bounded_query.py +0 -0
  126. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/canonical.py +0 -0
  127. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/catalog_job.py +0 -0
  128. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/cli.py +0 -0
  129. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/contracts.py +0 -0
  130. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/coordinator.py +0 -0
  131. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/crosswalks.py +0 -0
  132. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/deploy.py +0 -0
  133. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/deploy_target.py +0 -0
  134. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  135. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/__init__.py +0 -0
  136. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
  137. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/capture.py +0 -0
  138. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/contracts.py +0 -0
  139. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/lane.py +0 -0
  140. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/ocr.py +0 -0
  141. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/pdf.py +0 -0
  142. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/registry.py +0 -0
  143. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
  144. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/selections.py +0 -0
  145. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/tables.py +0 -0
  146. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
  147. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/events.py +0 -0
  148. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  149. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/governors.py +0 -0
  150. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  151. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  152. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  153. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  154. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  155. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  156. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  157. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
  158. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  159. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
  160. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  161. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
  162. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
  163. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
  164. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  165. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  166. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  167. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  168. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  169. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  170. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/key_seam.py +0 -0
  171. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/local_contracts.py +0 -0
  172. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  173. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  174. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  175. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  176. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  177. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  178. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  179. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  180. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  181. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  182. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  183. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  184. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  185. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  186. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  187. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  188. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  189. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/notebook.py +0 -0
  190. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/offline.py +0 -0
  191. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/operation_registry.py +0 -0
  192. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/operator_setup.py +0 -0
  193. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  194. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  195. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  196. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  197. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  198. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  199. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  200. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/preparation/table.py +0 -0
  201. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  202. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/progress_events.py +0 -0
  203. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  204. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
  205. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/budgets.py +0 -0
  206. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/containers.py +0 -0
  207. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  208. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  209. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
  210. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
  211. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
  212. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  213. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  214. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
  215. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
  216. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  217. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  218. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  219. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
  220. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
  221. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
  222. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  223. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  224. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
  225. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
  226. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
  227. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
  228. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
  229. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
  230. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
  231. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
  232. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
  233. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
  234. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
  235. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
  236. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/registry.py +0 -0
  237. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  238. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  239. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  240. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  241. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  242. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  243. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  244. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  245. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  246. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  247. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  248. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  249. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  250. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  251. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  252. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  253. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  254. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  255. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  256. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  257. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  258. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
  259. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
  260. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
  261. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
  262. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
  263. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
  264. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
  265. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
  266. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
  267. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
  268. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
  269. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
  270. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  271. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  272. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  273. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  274. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
  275. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
  276. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
  277. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
  278. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
  279. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
  280. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
  281. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
  282. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
  283. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
  284. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
  285. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
  286. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
  287. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
  288. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  289. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  290. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
  291. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
  292. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
  293. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
  294. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
  295. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
  296. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
  297. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
  298. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
  299. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
  300. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/himawari-hsd-b13-complete.zip +0 -0
  301. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
  302. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
  303. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
  304. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
  305. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
  306. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
  307. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
  308. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
  309. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
  310. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
  311. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
  312. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
  313. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
  314. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
  315. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
  316. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
  317. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
  318. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
  319. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
  320. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
  321. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  322. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  323. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  324. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  325. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  326. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  327. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  328. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  329. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  330. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  331. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  332. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  333. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  334. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  335. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  336. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
  337. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
  338. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
  339. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
  340. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
  341. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
  342. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
  343. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
  344. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
  345. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
  346. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
  347. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
  348. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/samples.py +0 -0
  349. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific.py +0 -0
  350. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
  351. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
  352. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
  353. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
  354. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
  355. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
  356. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
  357. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
  358. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
  359. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
  360. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
  361. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
  362. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
  363. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
  364. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
  365. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
  366. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
  367. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
  368. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
  369. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
  370. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
  371. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  372. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
  373. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  374. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/vector.py +0 -0
  375. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
  376. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
  377. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
  378. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/recipe.py +0 -0
  379. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/review.py +0 -0
  380. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/rowset.py +0 -0
  381. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/session_probes.py +0 -0
  382. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/signing.py +0 -0
  383. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/skill_assets.py +0 -0
  384. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/source_discovery.py +0 -0
  385. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  386. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  387. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  388. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  389. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
  390. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  391. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  392. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  393. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  394. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  395. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  396. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  397. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  398. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  399. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  400. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  401. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  402. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  403. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  404. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  405. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  406. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  407. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  408. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  409. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  410. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  411. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  412. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  413. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  414. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  415. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  416. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  417. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  418. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  419. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  420. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  421. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  422. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  423. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  424. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  425. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  426. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  427. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  428. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  429. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  430. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/collections.py +0 -0
  431. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/dataset.py +0 -0
  432. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  433. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
  434. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  435. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/governance.py +0 -0
  436. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  437. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/integration.py +0 -0
  438. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  439. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  440. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  441. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/sports.py +0 -0
  442. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
  443. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
  444. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
  445. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
  446. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
  447. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
  448. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
  449. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
  450. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
  451. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
  452. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
  453. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
  454. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
  455. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
  456. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
  457. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  458. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
  459. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
  460. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  461. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  462. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
  463. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
  464. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  465. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
  466. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/stream_venue.py +0 -0
  467. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/table_profile.py +0 -0
  468. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  469. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  470. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  471. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/activity.py +0 -0
  472. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  473. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/commands.py +0 -0
  474. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/download.py +0 -0
  475. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  476. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/parity.py +0 -0
  477. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/probe.py +0 -0
  478. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/propose.py +0 -0
  479. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/research.py +0 -0
  480. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/router.py +0 -0
  481. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/runs.py +0 -0
  482. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/session.py +0 -0
  483. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/stream.py +0 -0
  484. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
  485. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/transport.py +0 -0
  486. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
  487. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_connections.py +0 -0
  488. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  489. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  490. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  491. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
  492. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  493. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  494. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  495. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  496. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/unit_flow.py +0 -0
  497. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/units.py +0 -0
  498. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  499. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  500. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  501. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  502. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  503. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  504. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  505. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  506. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  507. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
  508. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  509. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  510. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  511. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  512. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  513. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  514. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/headline.py +0 -0
  515. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  516. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  517. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/login.py +0 -0
  518. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  519. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  520. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/ux/readers.py +0 -0
  521. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
  522. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_closed_source.py +0 -0
  523. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
  524. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
  525. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_required_controls.py +0 -0
  526. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
  527. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
  528. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/v4_transform.py +0 -0
  529. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  530. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  531. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  532. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  533. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  534. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  535. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  536. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  537. {mostlyright_data-0.15.1 → mostlyright_data-0.15.3}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyright-data
3
- Version: 0.15.1
3
+ Version: 0.15.3
4
4
  Summary: Mostly Right CLI for reproducible, reviewed Parquet datasets
5
5
  Project-URL: Homepage, https://mostlyright.md/
6
6
  Project-URL: Documentation, https://mostlyright.md/docs/guides/cli/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyright-data"
3
- version = "0.15.1"
3
+ version = "0.15.3"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.14"
@@ -84,6 +84,9 @@ mr-data-generic-api = "mostlyright.data_harness.thin.workers:generic_api_probe_m
84
84
  mr-data-session-worker = "mostlyright.data_harness.thin.workers:session_worker_main"
85
85
  mr-data-session-worker-job = "mostlyright.data_harness.thin.workers:session_worker_job_main"
86
86
  mr-data-ingestion-job = "mostlyright.data_harness.thin.workers:ingestion_job_main"
87
+ # The shared, persistent executor for bounded incremental refreshes. Unlike the
88
+ # segment-delivery Job above, it claims a run directly and has no task-specific argv.
89
+ mr-data-ingestion-worker = "mostlyright.data_harness.thin.workers:ingestion_worker_main"
87
90
  # The hosted stream venue's recorder. It runs from the same worker runtime the producer and
88
91
  # the ingestion Job run from -- the install stage puts every console script in the image and
89
92
  # that stage deletes none of them -- so this entry is the whole of what a new job shape needs.
@@ -516,8 +516,7 @@ the ones above. Spell out the names a reader would search for -- the place, the
516
516
  every common form, the programme and the publisher -- once each, in the opening sentences and
517
517
  never as a keyword list. The opening sentences double as the summary cards and search engines
518
518
  show, so they must stand alone. A one-line description is a defect to fix in the revision, not a
519
- style choice. Give `table.description` the grain and the window, and give every column a
520
- description a reader can act on.
519
+ style choice. Give `table.description` the grain and the window.
521
520
 
522
521
  **Every dataset gets a cover before its first run is presented.** Once the description is
523
522
  written, generate one with
@@ -545,7 +544,17 @@ years are already in their names.
545
544
  Leaving it out is a defect in the same way a one-line dataset description is: the source is then
546
545
  drawn with its endpoint alone, and a reader is left to guess from a query string.
547
546
 
548
- ### Say what each column shows
547
+ ### Say what each column is, and what it shows
548
+
549
+ **Every column carries a `description`, and every column that measures a physical quantity carries
550
+ a `units` entry.** The description is one sentence saying what the column means, written for
551
+ somebody who has never seen the source — `The highest air temperature recorded that day.` — and it
552
+ is what the dataset page, the schema and everybody reading the table downstream go on. The
553
+ units entry names the code that column's numbers are in, and a temperature, a distance, a duration
554
+ or a rate that arrives without one is a number nobody can convert or compare. Neither member is
555
+ work to leave for later: a recipe that leaves a column undescribed or a measurement unitless is not
556
+ one to start a run on, and a run already built from one is not finished, however well its checks
557
+ reported.
549
558
 
550
559
  Decide, per column, what a reader should see, and write it on the column as `presentation`. This is
551
560
  your judgement about the data and nobody else can make it: the Builder can see the values but not
@@ -808,6 +817,14 @@ required check that fails ends the run with `failure_code: CHECK_FAILED`.
808
817
  `mr-data diff RUN_A RUN_B` compares two runs — columns added, removed and retyped, row counts, the
809
818
  coverage window and the data fingerprint. `--columns-only` narrows what is compared to the schema.
810
819
 
820
+ **Then read the columns against the document, because an undescribed column is a revision rather
821
+ than a caveat.** `peek` names the columns the run sealed; the recipe is where their descriptions
822
+ and units are, so this is a reading of the document rather than a judgement about the data: every
823
+ column has a `description`, and every column that measures a physical quantity has a `units`
824
+ entry. A run whose recipe leaves either out is not finished — the table arrives with nothing
825
+ beside it to say what its numbers mean or what they are measured in — so it is a revision, which
826
+ is stage 7, and it is registered again before anything is presented.
827
+
811
828
  ### 7. Fix — revise the document and register it again
812
829
 
813
830
  Change the document and send it again. Same dataset, same table, new digest:
@@ -1088,6 +1088,34 @@ class TransportResponse:
1088
1088
  return values[0] if values else None
1089
1089
 
1090
1090
 
1091
+ @dataclass(frozen=True)
1092
+ class StreamedTransportResponse:
1093
+ """A transport response whose body was copied to a coordinator-owned sink.
1094
+
1095
+ The body deliberately has no representation here. Callers get the facts needed for the
1096
+ same pinned-peer receipt as ``TransportResponse`` without an opportunity to re-materialise
1097
+ a large source in coordinator memory.
1098
+ """
1099
+
1100
+ status: int
1101
+ headers: tuple[tuple[str, str], ...]
1102
+ body_size_bytes: int
1103
+ body_sha256: str
1104
+ connected_peer: str
1105
+ tls_verified: bool
1106
+ hostname_verified: bool
1107
+
1108
+ def header(self, name: str) -> str | None:
1109
+ return TransportResponse(
1110
+ self.status,
1111
+ self.headers,
1112
+ b"",
1113
+ self.connected_peer,
1114
+ self.tls_verified,
1115
+ self.hostname_verified,
1116
+ ).header(name)
1117
+
1118
+
1091
1119
  class PinnedTransport(Protocol):
1092
1120
  def request(
1093
1121
  self,
@@ -1109,6 +1137,17 @@ class PinnedTransport(Protocol):
1109
1137
  can influence character by character.
1110
1138
  """
1111
1139
 
1140
+ def request_to_sink(
1141
+ self,
1142
+ target: ValidatedTarget,
1143
+ *,
1144
+ approved_ip: str,
1145
+ headers: Mapping[str, str],
1146
+ limits: RetrievalLimits,
1147
+ sink: Callable[[bytes], None],
1148
+ ) -> StreamedTransportResponse:
1149
+ """Stream one response into ``sink`` while retaining only bounded receipt facts."""
1150
+
1112
1151
 
1113
1152
  class TransportFailureError(AcquisitionSecurityError):
1114
1153
  """Retryable transport failure with exact response-body bytes already consumed."""
@@ -1391,6 +1430,33 @@ class RetrievedBytes:
1391
1430
  )
1392
1431
 
1393
1432
 
1433
+ @dataclass(frozen=True)
1434
+ class RetrievedSink:
1435
+ """Receipt facts for a retrieval copied directly into a caller-owned file descriptor."""
1436
+
1437
+ source_url: str
1438
+ final_url: str
1439
+ media_type: str
1440
+ content_sha256: str
1441
+ content_size_bytes: int
1442
+ hops: tuple[RetrievalHop, ...]
1443
+ transport_evidence_digest: str
1444
+
1445
+ @property
1446
+ def total_response_body_size_bytes(self) -> int:
1447
+ """Every response byte consumed, including failed peer attempts."""
1448
+
1449
+ return sum(
1450
+ hop.response_body_size_bytes
1451
+ + sum(
1452
+ attempt.response_body_size_bytes
1453
+ for attempt in hop.peer_attempts[:-1]
1454
+ if attempt.outcome == "transport_failure"
1455
+ )
1456
+ for hop in self.hops
1457
+ )
1458
+
1459
+
1394
1460
  def probe_transport_for(retrieved: RetrievedBytes) -> ProbeTransport:
1395
1461
  """Seal what the terminal response of one retrieval stated.
1396
1462
 
@@ -1653,6 +1719,209 @@ class PinnedHttpsRetriever:
1653
1719
  validators=validators,
1654
1720
  )
1655
1721
 
1722
+ def retrieve_to_sink(
1723
+ self,
1724
+ url: str,
1725
+ *,
1726
+ sink: Callable[[bytes], None],
1727
+ reset_sink: Callable[[], None] | None = None,
1728
+ ) -> RetrievedSink:
1729
+ """Fetch a public whole CSV while streaming its terminal body to ``sink``.
1730
+
1731
+ Redirect bodies are discarded after their digest is measured. A peer retry starts a
1732
+ fresh request only after the failed attempt records its consumed bytes; the caller must
1733
+ therefore use a fresh staging file per acquisition and discard it on any exception.
1734
+ """
1735
+ if not callable(sink):
1736
+ raise AcquisitionSecurityError("STREAM_SINK", "stream sink must be callable")
1737
+ started = float(self._clock())
1738
+ current_url = url
1739
+ hops: list[RetrievalHop] = []
1740
+ aggregate = 0
1741
+ requests = 0
1742
+ for redirect_count in range(self._limits.max_redirects + 1):
1743
+ self._check_total_timeout(started)
1744
+ target = validate_public_https_url(
1745
+ current_url, resolver=self._resolver, egress_policy=self._egress_policy
1746
+ )
1747
+ headers = {
1748
+ "Accept": _accept_header(self._limits),
1749
+ "Accept-Encoding": "identity",
1750
+ "Connection": "close",
1751
+ "Host": urlsplit(target.normalized_url).netloc,
1752
+ "User-Agent": self._limits.user_agent,
1753
+ }
1754
+ response: StreamedTransportResponse | None = None
1755
+ attempts: list[PeerAttempt] = []
1756
+ for ip in target.approved_ips:
1757
+ if requests >= self._limits.max_requests:
1758
+ raise PeerAttemptError(
1759
+ "REQUEST_LIMIT",
1760
+ "retrieval exceeded its request budget",
1761
+ tuple(attempts),
1762
+ hops=tuple(hops),
1763
+ )
1764
+ requests += 1
1765
+ remaining = self._limits.max_aggregate_response_bytes - aggregate
1766
+ try:
1767
+ limits = self._remaining_attempt_limits(
1768
+ started + self._limits.total_timeout_seconds,
1769
+ remaining_aggregate_bytes=remaining,
1770
+ )
1771
+ # Only the terminal body reaches the supplied fd. Redirect bytes are still
1772
+ # fully consumed and evidenced, but are never retained.
1773
+ with self._limiter.acquire(
1774
+ target.hostname, deadline=started + self._limits.total_timeout_seconds
1775
+ ):
1776
+ response = self._transport.request_to_sink(
1777
+ target, approved_ip=ip, headers=headers, limits=limits, sink=sink
1778
+ )
1779
+ except AcquisitionSecurityError as exc:
1780
+ consumed = (
1781
+ exc.response_body_size_bytes
1782
+ if isinstance(exc, TransportFailureError)
1783
+ else 0
1784
+ )
1785
+ aggregate += consumed
1786
+ attempts.append(
1787
+ PeerAttempt(
1788
+ approved_ip=ip,
1789
+ outcome="transport_failure",
1790
+ failure_code=exc.code,
1791
+ response_body_size_bytes=consumed,
1792
+ )
1793
+ )
1794
+ if (
1795
+ exc.code == "TRANSPORT_FAILURE"
1796
+ and ip != target.approved_ips[-1]
1797
+ and aggregate < self._limits.max_aggregate_response_bytes
1798
+ ):
1799
+ # A failed peer may already have copied an unauthenticated prefix to
1800
+ # the caller-owned staging file. A second peer answers a fresh whole
1801
+ # representation, so it can proceed only after that prefix is removed.
1802
+ if reset_sink is None:
1803
+ raise PeerAttemptError(
1804
+ "STREAM_SINK",
1805
+ "retrying a streamed retrieval requires a resettable sink",
1806
+ tuple(attempts),
1807
+ hops=tuple(hops),
1808
+ ) from None
1809
+ reset_sink()
1810
+ continue
1811
+ raise PeerAttemptError(
1812
+ exc.code, exc.detail, tuple(attempts), hops=tuple(hops)
1813
+ ) from None
1814
+ attempts.append(
1815
+ PeerAttempt(
1816
+ approved_ip=ip,
1817
+ outcome="response",
1818
+ failure_code=None,
1819
+ response_body_size_bytes=response.body_size_bytes,
1820
+ )
1821
+ )
1822
+ break
1823
+ if response is None:
1824
+ raise PeerAttemptError(
1825
+ "TRANSPORT_FAILURE",
1826
+ "all resolver-approved peers failed",
1827
+ tuple(attempts),
1828
+ hops=tuple(hops),
1829
+ )
1830
+ aggregate += response.body_size_bytes
1831
+ if aggregate > self._limits.max_aggregate_response_bytes:
1832
+ raise PeerAttemptError(
1833
+ "AGGREGATE_RESPONSE_LIMIT",
1834
+ "response bodies exceeded aggregate budget",
1835
+ tuple(attempts),
1836
+ hops=tuple(hops),
1837
+ )
1838
+ if not response.tls_verified or not response.hostname_verified:
1839
+ raise PeerAttemptError(
1840
+ "TLS_VERIFICATION",
1841
+ "transport did not prove TLS verification",
1842
+ tuple(attempts),
1843
+ hops=tuple(hops),
1844
+ )
1845
+ peer = require_approved_peer(target, response.connected_peer)
1846
+ normalized = _validate_response_headers(response.headers)
1847
+ content_length = response.header("content-length")
1848
+ if content_length is not None and (
1849
+ not _DECIMAL_ONLY.fullmatch(content_length)
1850
+ or int(content_length) != response.body_size_bytes
1851
+ ):
1852
+ raise PeerAttemptError(
1853
+ "CONTENT_LENGTH",
1854
+ "response bytes do not match declared content length",
1855
+ tuple(attempts),
1856
+ hops=tuple(hops),
1857
+ )
1858
+ encoding = (response.header("content-encoding") or "").lower().strip()
1859
+ if encoding not in _ALLOWED_RESPONSE_ENCODINGS:
1860
+ raise PeerAttemptError(
1861
+ "CONTENT_ENCODING",
1862
+ "compressed network responses are disabled",
1863
+ tuple(attempts),
1864
+ hops=tuple(hops),
1865
+ )
1866
+ hop = RetrievalHop(
1867
+ url=target.normalized_url,
1868
+ resolution_digest=target.resolution_digest,
1869
+ connected_peer=peer,
1870
+ status=response.status,
1871
+ response_headers_digest=canonical_sha256(normalized),
1872
+ response_body_size_bytes=response.body_size_bytes,
1873
+ response_body_sha256=response.body_sha256,
1874
+ etag=response.header("etag"),
1875
+ last_modified=response.header("last-modified"),
1876
+ peer_attempts=tuple(attempts),
1877
+ approved_ips=target.approved_ips,
1878
+ )
1879
+ hops.append(hop)
1880
+ if response.status in REDIRECT_STATUSES:
1881
+ location = response.header(_REDIRECT_HEADER)
1882
+ if not location or redirect_count >= self._limits.max_redirects:
1883
+ raise PeerAttemptError(
1884
+ "REDIRECT_LIMIT",
1885
+ "response redirect is outside the admitted limit",
1886
+ tuple(attempts),
1887
+ hops=tuple(hops),
1888
+ )
1889
+ current_url = urljoin(target.normalized_url, location)
1890
+ # The redirect entity is evidence, never source content. A file-backed caller
1891
+ # truncates its coordinator staging descriptor here before the next hop.
1892
+ if reset_sink is None:
1893
+ raise AcquisitionSecurityError(
1894
+ "STREAM_SINK", "redirecting streamed retrieval requires a resettable sink"
1895
+ )
1896
+ reset_sink()
1897
+ continue
1898
+ if response.status == NOT_FOUND_STATUS or not 200 <= response.status <= 299:
1899
+ raise PeerAttemptError(
1900
+ "HTTP_STATUS",
1901
+ f"source returned HTTP status {response.status}",
1902
+ tuple(attempts),
1903
+ hops=tuple(hops),
1904
+ http_status=response.status,
1905
+ )
1906
+ media_type = _media_type(response.header("content-type"))
1907
+ if media_type not in self._limits.allowed_media_types:
1908
+ raise PeerAttemptError(
1909
+ "MEDIA_TYPE",
1910
+ "response media type is not allowlisted",
1911
+ tuple(attempts),
1912
+ hops=tuple(hops),
1913
+ )
1914
+ return RetrievedSink(
1915
+ source_url=url,
1916
+ final_url=target.normalized_url,
1917
+ media_type=media_type,
1918
+ content_sha256=response.body_sha256,
1919
+ content_size_bytes=response.body_size_bytes,
1920
+ hops=tuple(hops),
1921
+ transport_evidence_digest=canonical_sha256([hop.to_dict() for hop in hops]),
1922
+ )
1923
+ raise AcquisitionSecurityError("REDIRECT_LIMIT", "redirect loop did not terminate")
1924
+
1656
1925
  def retrieve_datagov_v4(
1657
1926
  self,
1658
1927
  url: str,
@@ -2613,6 +2882,97 @@ class StdlibPinnedTransport:
2613
2882
  finally:
2614
2883
  connection.close()
2615
2884
 
2885
+ def request_to_sink(
2886
+ self,
2887
+ target: ValidatedTarget,
2888
+ *,
2889
+ approved_ip: str,
2890
+ headers: Mapping[str, str],
2891
+ limits: RetrievalLimits,
2892
+ sink: Callable[[bytes], None],
2893
+ ) -> StreamedTransportResponse:
2894
+ """The production no-buffer variant of :meth:`request`.
2895
+
2896
+ The size check happens before every write. A rejected response can therefore leave a
2897
+ partial staging file, but never an admitted result; its exact consumed byte count is
2898
+ carried by ``TransportFailureError`` for retry accounting.
2899
+ """
2900
+ deadline = time.monotonic() + limits.total_timeout_seconds
2901
+ connection = _PinnedHTTPSConnection(
2902
+ hostname=target.hostname,
2903
+ approved_ip=approved_ip,
2904
+ port=target.port,
2905
+ timeout=min(limits.connect_timeout_seconds, limits.total_timeout_seconds),
2906
+ context=self._context,
2907
+ )
2908
+ total = 0
2909
+ digest = hashlib.sha256()
2910
+ try:
2911
+ connection.request("GET", target.request_target, headers=dict(headers))
2912
+ if connection.sock is not None:
2913
+ connection.sock.settimeout(
2914
+ _remaining_socket_timeout(deadline, configured=limits.read_timeout_seconds)
2915
+ )
2916
+ response = connection.getresponse()
2917
+ raw_headers = tuple(
2918
+ (key.lower(), value.strip()) for key, value in response.getheaders()
2919
+ )
2920
+ _validate_response_headers(raw_headers)
2921
+ content_length = next(
2922
+ (value for key, value in raw_headers if key == "content-length"), None
2923
+ )
2924
+ if content_length is not None:
2925
+ try:
2926
+ if int(content_length) > limits.max_response_bytes:
2927
+ raise AcquisitionSecurityError(
2928
+ "RESPONSE_LIMIT",
2929
+ "declared response length exceeds the configured limit",
2930
+ )
2931
+ except ValueError:
2932
+ raise AcquisitionSecurityError(
2933
+ "CONTENT_LENGTH", "response content length is invalid"
2934
+ ) from None
2935
+ while True:
2936
+ if connection.sock is not None:
2937
+ connection.sock.settimeout(
2938
+ _remaining_socket_timeout(deadline, configured=limits.read_timeout_seconds)
2939
+ )
2940
+ chunk = response.read(min(65_536, limits.max_response_bytes + 1 - total))
2941
+ if not chunk:
2942
+ break
2943
+ total += len(chunk)
2944
+ if total > limits.max_response_bytes:
2945
+ raise AcquisitionSecurityError(
2946
+ "RESPONSE_LIMIT", "response exceeded the configured byte limit"
2947
+ )
2948
+ digest.update(chunk)
2949
+ sink(chunk)
2950
+ peer = connection.connected_peer
2951
+ if peer is None:
2952
+ raise AcquisitionSecurityError(
2953
+ "PEER_ADDRESS", "transport did not record its connected peer"
2954
+ )
2955
+ return StreamedTransportResponse(
2956
+ response.status, raw_headers, total, digest.hexdigest(), peer, True, True
2957
+ )
2958
+ except http.client.IncompleteRead as exc:
2959
+ partial = exc.partial if isinstance(exc.partial, bytes) else bytes(exc.partial)
2960
+ raise TransportFailureError(
2961
+ f"HTTPS peer disconnected during a response: {type(exc).__name__}",
2962
+ response_body_size_bytes=total + len(partial),
2963
+ ) from None
2964
+ except http.client.RemoteDisconnected as exc:
2965
+ raise TransportFailureError(
2966
+ f"HTTPS peer disconnected before a response: {type(exc).__name__}",
2967
+ response_body_size_bytes=total,
2968
+ ) from None
2969
+ except OSError as exc:
2970
+ raise TransportFailureError(
2971
+ f"HTTPS transport failed: {type(exc).__name__}", response_body_size_bytes=total
2972
+ ) from None
2973
+ finally:
2974
+ connection.close()
2975
+
2616
2976
 
2617
2977
  def _remaining_socket_timeout(deadline: float, *, configured: float) -> float:
2618
2978
  remaining = deadline - time.monotonic()