mostlyright-data 0.13.0__tar.gz → 0.14.0__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 (562) hide show
  1. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/PKG-INFO +1 -1
  2. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/pyproject.toml +1 -1
  3. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/skills/mr-data-build/SKILL.md +47 -0
  4. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_run_worker.py +3 -0
  5. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_worker.py +411 -19
  6. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/run_execution_v4.py +1 -0
  7. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/v4_recipe.py +153 -6
  8. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/.gitignore +0 -0
  9. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/README.md +0 -0
  10. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/scripts/hatch_build.py +0 -0
  11. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/skills/mr-data-build/agents/openai.yaml +0 -0
  12. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  13. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
  14. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/__init__.py +0 -0
  15. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
  16. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
  17. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
  18. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
  19. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
  20. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
  21. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
  22. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
  23. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
  24. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
  25. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
  26. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
  27. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
  28. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
  29. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
  30. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
  31. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
  32. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
  33. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
  34. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
  35. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
  36. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
  37. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
  38. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
  39. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
  40. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
  41. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
  42. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
  43. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
  44. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
  45. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
  46. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
  47. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
  48. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
  49. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
  50. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
  51. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
  52. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/__init__.py +0 -0
  53. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  54. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
  55. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/acquisition/http.py +0 -0
  56. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  57. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  58. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  59. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  60. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
  61. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  62. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  63. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  64. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  65. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  66. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  67. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  68. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/backends/reference.py +0 -0
  69. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/backends/registry.py +0 -0
  70. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  71. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/bounded_query.py +0 -0
  72. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/canonical.py +0 -0
  73. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/catalog_job.py +0 -0
  74. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/cli.py +0 -0
  75. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/contracts.py +0 -0
  76. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/coordinator.py +0 -0
  77. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/crosswalks.py +0 -0
  78. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/declared_checks.py +0 -0
  79. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/deploy.py +0 -0
  80. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/deploy_target.py +0 -0
  81. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  82. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/__init__.py +0 -0
  83. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
  84. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
  85. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/capture.py +0 -0
  86. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/contracts.py +0 -0
  87. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/lane.py +0 -0
  88. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/ocr.py +0 -0
  89. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/pdf.py +0 -0
  90. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/registry.py +0 -0
  91. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
  92. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/selections.py +0 -0
  93. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/tables.py +0 -0
  94. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
  95. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/events.py +0 -0
  96. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  97. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/formats.py +0 -0
  98. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/governors.py +0 -0
  99. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
  100. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  101. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  102. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  103. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  104. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  105. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
  106. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  107. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
  108. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  109. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  110. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  111. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
  112. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  113. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
  114. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  115. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
  116. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
  117. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
  118. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +0 -0
  119. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  120. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  121. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  122. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  123. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  124. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  125. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/inprocess_acquisition.py +0 -0
  126. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/key_seam.py +0 -0
  127. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  128. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/local_contracts.py +0 -0
  129. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
  130. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
  131. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
  132. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
  133. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
  134. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
  135. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/local_search/service.py +0 -0
  136. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  137. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  138. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  139. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  140. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  141. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  142. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  143. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  144. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  145. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  146. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  147. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  148. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  149. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  150. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  151. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  152. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  153. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/notebook.py +0 -0
  154. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/offline.py +0 -0
  155. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/operation_registry.py +0 -0
  156. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/operator_setup.py +0 -0
  157. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/pipeline.py +0 -0
  158. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/plan_graph.py +0 -0
  159. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  160. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  161. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  162. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  163. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  164. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  165. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  166. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/preparation/table.py +0 -0
  167. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  168. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/progress_events.py +0 -0
  169. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  170. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
  171. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/budgets.py +0 -0
  172. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/containers.py +0 -0
  173. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  174. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  175. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
  176. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
  177. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
  178. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  179. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  180. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
  181. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
  182. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  183. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  184. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  185. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
  186. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
  187. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
  188. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  189. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  190. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
  191. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
  192. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
  193. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
  194. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
  195. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
  196. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
  197. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
  198. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
  199. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
  200. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
  201. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
  202. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/registry.py +0 -0
  203. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  204. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  205. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  206. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  207. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  208. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  209. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  210. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  211. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  212. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  213. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  214. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  215. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  216. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  217. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  218. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  219. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  220. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  221. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  222. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  223. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  224. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
  225. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
  226. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
  227. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
  228. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
  229. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
  230. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
  231. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
  232. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
  233. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
  234. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
  235. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
  236. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  237. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  238. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  239. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  240. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
  241. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
  242. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
  243. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
  244. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
  245. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
  246. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
  247. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
  248. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
  249. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
  250. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
  251. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
  252. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
  253. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
  254. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  255. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  256. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
  257. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
  258. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
  259. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
  260. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
  261. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
  262. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
  263. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
  264. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
  265. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
  266. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/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
  267. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
  268. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
  269. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
  270. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
  271. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
  272. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
  273. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
  274. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
  275. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
  276. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
  277. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
  278. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
  279. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
  280. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
  281. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
  282. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
  283. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
  284. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
  285. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
  286. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
  287. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  288. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  289. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  290. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  291. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  292. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  293. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  294. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  295. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  296. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  297. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  298. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  299. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  300. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  301. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  302. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
  303. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
  304. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
  305. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
  306. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
  307. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
  308. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
  309. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
  310. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
  311. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
  312. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
  313. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
  314. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/samples.py +0 -0
  315. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific.py +0 -0
  316. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
  317. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
  318. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
  319. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
  320. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
  321. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
  322. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
  323. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
  324. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
  325. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
  326. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
  327. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
  328. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
  329. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
  330. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
  331. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
  332. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
  333. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
  334. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
  335. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
  336. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
  337. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  338. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
  339. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  340. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/vector.py +0 -0
  341. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
  342. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
  343. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
  344. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/recipe.py +0 -0
  345. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/repair/__init__.py +0 -0
  346. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/repair/adapters.py +0 -0
  347. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/repair/contracts.py +0 -0
  348. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
  349. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/repair/errors.py +0 -0
  350. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/review.py +0 -0
  351. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/rowset.py +0 -0
  352. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/session_probes.py +0 -0
  353. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/signing.py +0 -0
  354. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/skill_assets.py +0 -0
  355. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/source_discovery.py +0 -0
  356. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  357. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  358. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  359. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  360. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  361. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
  362. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  363. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  364. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  365. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  366. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  367. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  368. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  369. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  370. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  371. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  372. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  373. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  374. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  375. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
  376. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  377. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  378. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  379. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  380. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  381. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  382. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  383. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  384. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  385. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  386. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  387. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  388. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  389. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
  390. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  391. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  392. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  393. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  394. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  395. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  396. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  397. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  398. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  399. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  400. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
  401. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  402. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  403. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  404. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  405. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/collections.py +0 -0
  406. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  407. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/dataset.py +0 -0
  408. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  409. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
  410. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  411. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/governance.py +0 -0
  412. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  413. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/integration.py +0 -0
  414. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  415. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/registry.py +0 -0
  416. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  417. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  418. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/sports.py +0 -0
  419. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream.py +0 -0
  420. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
  421. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
  422. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
  423. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
  424. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
  425. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
  426. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
  427. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
  428. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
  429. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
  430. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
  431. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
  432. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
  433. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
  434. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
  435. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
  436. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
  437. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  438. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
  439. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
  440. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  441. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  442. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
  443. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
  444. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  445. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
  446. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  447. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
  448. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
  449. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/stream_subscription_sealer.py +0 -0
  450. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/stream_subscription_worker.py +0 -0
  451. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/stream_venue.py +0 -0
  452. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
  453. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/studio_boundary.py +0 -0
  454. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/studio_subscription_control.py +0 -0
  455. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  456. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  457. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  458. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/activity.py +0 -0
  459. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  460. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/commands.py +0 -0
  461. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/download.py +0 -0
  462. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  463. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/parity.py +0 -0
  464. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/probe.py +0 -0
  465. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/propose.py +0 -0
  466. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/recipe.py +0 -0
  467. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/research.py +0 -0
  468. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/router.py +0 -0
  469. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/runs.py +0 -0
  470. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/session.py +0 -0
  471. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/stream.py +0 -0
  472. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
  473. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/transport.py +0 -0
  474. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4.py +0 -0
  475. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
  476. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  477. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4_datasets.py +0 -0
  478. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  479. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  480. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
  481. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
  482. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  483. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  484. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/v4_tables.py +0 -0
  485. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
  486. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/thin/workers.py +0 -0
  487. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  488. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  489. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/unit_flow.py +0 -0
  490. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/units.py +0 -0
  491. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  492. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/approve.py +0 -0
  493. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  494. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
  495. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  496. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  497. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  498. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
  499. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  500. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
  501. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  502. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
  503. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  504. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  505. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
  506. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
  507. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
  508. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
  509. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
  510. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
  511. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
  512. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
  513. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
  514. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
  515. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
  516. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
  517. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  518. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
  519. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
  520. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
  521. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  522. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
  523. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
  524. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
  525. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  526. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  527. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  528. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  529. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/diffing.py +0 -0
  530. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/headline.py +0 -0
  531. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  532. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
  533. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/inventory.py +0 -0
  534. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  535. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/login.py +0 -0
  536. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  537. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/peek.py +0 -0
  538. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  539. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
  540. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/preflight.py +0 -0
  541. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/readers.py +0 -0
  542. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/remediation.py +0 -0
  543. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/render.py +0 -0
  544. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/ux/workload.py +0 -0
  545. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
  546. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
  547. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
  548. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
  549. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/v4_required_controls.py +0 -0
  550. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
  551. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
  552. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/v4_transform.py +0 -0
  553. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  554. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  555. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  556. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  557. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  558. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/visual_run/query.py +0 -0
  559. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  560. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  561. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  562. {mostlyright_data-0.13.0 → mostlyright_data-0.14.0}/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.13.0
3
+ Version: 0.14.0
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.13.0"
3
+ version = "0.14.0"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.14"
@@ -525,6 +525,53 @@ which Studio fixes. Do it once per dataset, silently, and do not repeat it for a
525
525
  subject changed. A dataset presented without a cover is a defect, the same as a one-line
526
526
  description.
527
527
 
528
+ ### Say what each column shows
529
+
530
+ Decide, per column, what a reader should see, and write it on the column as `presentation`. This is
531
+ your judgement about the data and nobody else can make it: the Builder can see the values but not
532
+ the question they were gathered to answer.
533
+
534
+ {
535
+ "name": "observed_on",
536
+ "type": "date",
537
+ "description": "The day the readings were taken.",
538
+ "presentation": {
539
+ "chart": "timeline",
540
+ "story": "The archive runs unbroken across three summer months.",
541
+ "bucket": "month"
542
+ }
543
+ }
544
+
545
+ `chart` says what to draw and is one of `histogram`, `timeline`, `top_values`, `share` and `none`.
546
+ Rules of thumb, and they hold most of the time:
547
+
548
+ - Identifiers, free text, notes, anything one row carries its own copy of — `none`. Counting the
549
+ twelve commonest case numbers says only that the sample is a sample.
550
+ - Measurements — `histogram`. Temperatures, prices, durations, counts of things.
551
+ - Event times — `timeline`, with `bucket` matched to the grain the rows arrive at: hourly readings
552
+ get `hour` or `day`, a decade of annual filings gets `year`.
553
+ - Categories — `top_values`. Cities, statuses, publishers, anything a reader would group by.
554
+ - Flags — `share`. One split bar, the true part against the false part.
555
+
556
+ `story` is the sentence a reader should be able to say after looking. Write it about the DATA —
557
+ "rain is concentrated in a handful of days and most days record almost none" — and never about the
558
+ chart, because the reader can see that it is a chart. Leave it out rather than write a caption.
559
+
560
+ Every member is optional, including `presentation` itself. A column that says nothing still gets a
561
+ chart: the Builder picks one from the type you declared and the dataset page says the choice was
562
+ its own rather than yours. Say something anyway wherever you have an opinion — a column you
563
+ thought about reads differently from one nobody did.
564
+
565
+ Three things can make the Builder replace the chart you asked for, and each of them drops your
566
+ `story` with it: a column that turns out to be entirely missing, an event time spanning more than
567
+ twelve years (no grain draws that in twelve buckets), and a build whose sealed output type
568
+ contradicts what the column declared. A `bucket` the span outgrew is not one of them — the grain
569
+ is widened and the chart stays yours. So `none` is the right answer to write for a column you
570
+ already know has no shape, and a wide date range is worth a thought before you promise a timeline.
571
+
572
+ [The recipe document](../../docs/RECIPE-DOCUMENT.md) carries which types each chart admits, what
573
+ the defaults are, and the two members only some charts take.
574
+
528
575
  ### What the statement must actually return
529
576
 
530
577
  Every acquired source is bound as all-text CSV — `read_csv(header = true, auto_detect = false,
@@ -1162,6 +1162,9 @@ def v4_artifact_payloads(
1162
1162
  workspace_id=job.workspace_id,
1163
1163
  run_id=job.run_id,
1164
1164
  candidate_digest=candidate_digest,
1165
+ # The parsed document, not a second read of the bytes: the recipe is already in hand
1166
+ # here, and a profile that re-read it could disagree with the run that produced it.
1167
+ declared_columns={column.name: column for column in job.recipe.table.columns},
1165
1168
  ),
1166
1169
  "preview": _table_preview(snapshot["data/table.parquet"], candidate_digest),
1167
1170
  "receipt": _receipt_document(job, verified, coverage, raw_members, snapshot),
@@ -32,11 +32,11 @@ from collections.abc import Callable, Iterator, Mapping, Sequence
32
32
  from concurrent.futures import Future, ThreadPoolExecutor
33
33
  from contextlib import contextmanager
34
34
  from dataclasses import asdict, dataclass, replace
35
- from datetime import UTC, date, datetime
35
+ from datetime import UTC, date, datetime, timedelta
36
36
  from decimal import Decimal
37
37
  from pathlib import Path, PurePosixPath
38
38
  from types import MappingProxyType
39
- from typing import Any, BinaryIO, ClassVar, NoReturn, Protocol
39
+ from typing import TYPE_CHECKING, Any, BinaryIO, ClassVar, NoReturn, Protocol
40
40
  from urllib.parse import parse_qsl, urlsplit
41
41
  from uuid import UUID, uuid5
42
42
 
@@ -173,6 +173,11 @@ from mostlyright.data_harness.studio_boundary import (
173
173
  studio_wire_dict,
174
174
  )
175
175
 
176
+ if TYPE_CHECKING:
177
+ # Type-only, and it has to be: ``v4_recipe`` reaches ``run_execution_v4``, which reaches this
178
+ # module, so a runtime import would close a cycle. The v4 caller passes the parsed objects in.
179
+ from mostlyright.data_harness.v4_recipe import V4Column
180
+
176
181
  JOB_SCHEMA = "mostlyright-hosted-worker-job.v3"
177
182
  AUTHENTICATED_JOB_SCHEMA = "mostlyright-hosted-worker-job.v4"
178
183
  GENERIC_AUTHENTICATED_JOB_SCHEMA = "mostlyright-hosted-worker-job.v5"
@@ -481,6 +486,87 @@ RELEASED_COLUMN_PROFILE_SCHEMA = "mostlyright.released-column-profile.v1"
481
486
  RELEASED_COLUMN_PROFILE_MEDIA_TYPE = "application/vnd.mostlyright.released-column-profile+json"
482
487
  MAX_RELEASED_COLUMN_PROFILE_BYTES = 4 * 1024 * 1024
483
488
  MAX_RELEASED_DISTRIBUTION_ITEMS = 12
489
+
490
+ #: The grain one timeline bin covers, FINEST FIRST rather than sorted, because a default reads the
491
+ #: sequence in this direction and picks the first grain the observed span fits inside.
492
+ #:
493
+ #: RESTATED HERE RATHER THAN IMPORTED, and held equal to the recipe's by test -- the same
494
+ #: arrangement ``local_contracts`` already has for the source bindings, and for the same reason: a
495
+ #: module-scope import of ``v4_recipe`` would close a cycle, since it reaches ``run_execution_v4``
496
+ #: which reaches this module.
497
+ TIMELINE_BUCKETS = ("hour", "day", "week", "month", "quarter", "year")
498
+
499
+ #: How many bins a chart gets when the document asked for no particular number. The ceiling is
500
+ #: the item ceiling above, so a chart can never carry more marks than a distribution may hold.
501
+ DEFAULT_DISTRIBUTION_BINS = 8
502
+
503
+ #: Which chart each DECLARED column type is drawn as when the recipe named no chart for it.
504
+ #:
505
+ #: The declared type is the one to read wherever there is one: it is what the agent meant, and the
506
+ #: engine narrows several declarations onto one sealed type. ``json`` is the case that makes the
507
+ #: difference visible -- it seals as text, and counting documents as if they were category labels
508
+ #: is the mistake the recipe parser refuses to let anyone ask for explicitly.
509
+ #:
510
+ #: ``string`` is absent from both maps on purpose: it is the one type whose honest default depends
511
+ #: on the values rather than on the type, because a country name repeated across a million rows is
512
+ #: a category and a case identifier is not, and nothing but the observed spread separates them.
513
+ _DEFAULT_CHART_BY_DECLARED_TYPE = {
514
+ "boolean": "share",
515
+ "date": "timeline",
516
+ "decimal": "histogram",
517
+ "float": "histogram",
518
+ "integer": "histogram",
519
+ "json": "none",
520
+ "timestamp": "timeline",
521
+ }
522
+
523
+ #: The same table against the type the ENGINE sealed, which is what the v3 producer path has: it
524
+ #: carries no recipe, so there is no declaration to read and the sealed type is the whole of what
525
+ #: is known about the column.
526
+ _DEFAULT_CHART_BY_ENGINE_TYPE = {
527
+ "boolean": "share",
528
+ "date": "timeline",
529
+ "decimal": "histogram",
530
+ "float64": "histogram",
531
+ "int64": "histogram",
532
+ "null": "none",
533
+ "timestamp_utc": "timeline",
534
+ }
535
+
536
+ #: The widest a string column's values may spread before counting them stops meaning anything.
537
+ #: Either bound admits the count: at most twelve distinct values is a category list whatever the
538
+ #: row count, and at most half the rows being distinct is a category list however many there are.
539
+ MAX_TOP_VALUES_DISTINCT_COUNT = MAX_RELEASED_DISTRIBUTION_ITEMS
540
+ MAX_TOP_VALUES_DISTINCT_RATE_PPM = 500_000
541
+
542
+ #: Which distribution each chart is drawn from. ``share`` is a PRESENTATION of two counted values
543
+ #: rather than a shape of its own: the frame draws one split bar, and what it draws from is the
544
+ #: same value counts a category list is drawn from.
545
+ _DISTRIBUTION_KIND_BY_CHART = {
546
+ "histogram": "histogram",
547
+ "none": "none",
548
+ "share": "value_counts",
549
+ "timeline": "timeline",
550
+ "top_values": "value_counts",
551
+ }
552
+
553
+ #: Every engine type this profile can describe. ``string`` is missing from the default map above
554
+ #: because its default is decided by the values rather than by its type; it belongs here because
555
+ #: every chart that admits any type at all admits it.
556
+ _PROFILE_ENGINE_TYPES = (*_DEFAULT_CHART_BY_ENGINE_TYPE, "string")
557
+
558
+ #: Which engine types each chart can be drawn from at all. The recipe parser already refuses a
559
+ #: chart the DECLARED type cannot carry; this is the same rule stated against the type the engine
560
+ #: actually sealed, so a declaration that outlived a plan whose output type moved falls back to the
561
+ #: default rather than crashing inside a binning loop.
562
+ _CHART_ENGINE_TYPES = {
563
+ "histogram": ("decimal", "float64", "int64"),
564
+ "none": _PROFILE_ENGINE_TYPES,
565
+ "share": ("boolean",),
566
+ "timeline": ("date", "timestamp_utc"),
567
+ "top_values": _PROFILE_ENGINE_TYPES,
568
+ }
569
+
484
570
  MAX_HOSTED_DOWNLOAD_BYTES = (
485
571
  pipeline.MAX_CANDIDATE_BYTES + MAX_CANDIDATE_ENVELOPE_BYTES + MAX_TABLE_PREVIEW_BYTES
486
572
  )
@@ -4948,7 +5034,9 @@ def _nearest_rank_summary(values: list[int | float | Decimal]) -> dict[str, str]
4948
5034
  }
4949
5035
 
4950
5036
 
4951
- def _histogram_distribution(values: list[int | float], distinct_count: int) -> dict[str, Any]:
5037
+ def _histogram_distribution(
5038
+ values: list[int | float | Decimal], distinct_count: int, *, bins: int | None = None
5039
+ ) -> dict[str, Any]:
4952
5040
  if not values:
4953
5041
  return {
4954
5042
  "kind": "histogram",
@@ -4962,7 +5050,7 @@ def _histogram_distribution(values: list[int | float], distinct_count: int) -> d
4962
5050
  if minimum == maximum:
4963
5051
  items = [{"label": _profile_value_text(minimum), "count": len(values)}]
4964
5052
  else:
4965
- bins = min(8, max(4, math.isqrt(len(values))))
5053
+ bins = DEFAULT_DISTRIBUTION_BINS if bins is None else bins
4966
5054
  counts = [0] * bins
4967
5055
  items: list[dict[str, Any]] = []
4968
5056
  if all(isinstance(value, int) for value in values):
@@ -5050,6 +5138,203 @@ def _value_count_distribution(values: list[Any]) -> tuple[int, dict[str, Any]]:
5050
5138
  }
5051
5139
 
5052
5140
 
5141
+ def _none_distribution(distinct_count: int, observed_count: int) -> dict[str, Any]:
5142
+ """The distribution of a column that is drawn as nothing, and says so.
5143
+
5144
+ An identifier or a paragraph of free text has a shape, and every shape a chart could draw over
5145
+ it would be an artefact of which rows arrived rather than a fact about the data. So the frame
5146
+ carries no marks at all and the counts say why: everything distinct is hidden, and nothing is
5147
+ shown.
5148
+ """
5149
+
5150
+ return {
5151
+ "kind": "none",
5152
+ "status": "exact_all_rows",
5153
+ "items": [],
5154
+ "shown_distinct_count": 0,
5155
+ "hidden_distinct_count": distinct_count,
5156
+ "hidden_value_count": observed_count,
5157
+ }
5158
+
5159
+
5160
+ _EPOCH = datetime(1970, 1, 1, tzinfo=UTC)
5161
+ _ONE_HOUR = timedelta(hours=1)
5162
+
5163
+
5164
+ def _as_utc(value: date | datetime) -> datetime:
5165
+ """One instant for a value that may be a day or a moment.
5166
+
5167
+ A ``date`` column and a ``timestamp_utc`` column reach this lane as different Python types and
5168
+ are bucketed by the same arithmetic, so a day becomes the instant it starts. A moment that
5169
+ arrives with a zone is converted rather than stripped: dropping a ``+02:00`` would move an
5170
+ event across a bucket boundary twice a year.
5171
+ """
5172
+
5173
+ if isinstance(value, datetime):
5174
+ return value.astimezone(UTC) if value.tzinfo is not None else value.replace(tzinfo=UTC)
5175
+ return datetime(value.year, value.month, value.day, tzinfo=UTC)
5176
+
5177
+
5178
+ def _bucket_ordinal(moment: datetime, bucket: str) -> int:
5179
+ """Which bucket one instant falls in, counted so that consecutive buckets are consecutive.
5180
+
5181
+ An ordinal rather than a start time, because what the timeline needs is the ability to walk
5182
+ from the first observed bucket to the last WITHOUT skipping the empty ones -- and calendar
5183
+ months and quarters are not a fixed number of seconds apart, so stepping by a duration would
5184
+ drift.
5185
+ """
5186
+
5187
+ if bucket == "hour":
5188
+ # Floor division on the timedelta, never `int(total_seconds())`: truncation toward zero
5189
+ # would put the last fractional second before the epoch in the hour after it.
5190
+ return (moment - _EPOCH) // _ONE_HOUR
5191
+ if bucket == "day":
5192
+ return moment.date().toordinal()
5193
+ if bucket == "week":
5194
+ day = moment.date().toordinal()
5195
+ return (day - moment.weekday() - 1) // 7
5196
+ if bucket == "month":
5197
+ return moment.year * 12 + moment.month - 1
5198
+ if bucket == "quarter":
5199
+ return moment.year * 4 + (moment.month - 1) // 3
5200
+ return moment.year
5201
+
5202
+
5203
+ def _bucket_label(ordinal: int, bucket: str) -> str:
5204
+ """The bucket's START, in ISO-8601, and never a range.
5205
+
5206
+ A label naming only where a bucket begins is what lets a reader put two timelines beside each
5207
+ other: ranges would have to agree about whether the end is inclusive, and one that disagreed
5208
+ would look like a different bucket rather than a different convention.
5209
+ """
5210
+
5211
+ if bucket == "hour":
5212
+ return (_EPOCH + timedelta(hours=ordinal)).strftime("%Y-%m-%dT%H:00Z")
5213
+ if bucket == "day":
5214
+ return date.fromordinal(ordinal).isoformat()
5215
+ if bucket == "week":
5216
+ return date.fromordinal(ordinal * 7 + 1).isoformat()
5217
+ if bucket == "month":
5218
+ return date(ordinal // 12, ordinal % 12 + 1, 1).isoformat()
5219
+ if bucket == "quarter":
5220
+ return date(ordinal // 4, (ordinal % 4) * 3 + 1, 1).isoformat()
5221
+ return date(ordinal, 1, 1).isoformat()
5222
+
5223
+
5224
+ def _timeline_bucket(
5225
+ earliest: datetime, latest: datetime, declared: str | None, bins: int | None
5226
+ ) -> str | None:
5227
+ """The grain this column is drawn at, or ``None`` when no grain in the vocabulary fits.
5228
+
5229
+ THE DEFAULT IS THE FINEST GRAIN THAT FITS, not the one that reads most naturally: a week of
5230
+ readings drawn per year is one bar, and a bar is not a timeline. A DECLARED grain is used when
5231
+ the observed span fits inside it and widened when it does not -- a document written before the
5232
+ data arrived cannot know how far the values would spread, and a chart with two hundred marks is
5233
+ not the chart it asked for either.
5234
+
5235
+ ``bins`` LOWERS THE CEILING AND CANNOT TURN THE CHART OFF. It is a preference for a coarser
5236
+ reading, so a span that fits under it is drawn under it; a span that fits under no grain at
5237
+ that ceiling is drawn at the finest grain that fits under the profile's own twelve. Letting a
5238
+ stated four make a five-year series undrawable would turn a request to read a chart differently
5239
+ into a request not to have one.
5240
+
5241
+ ``None`` is therefore reached only by a span twelve buckets of the coarsest grain cannot cover
5242
+ -- more than twelve years -- and the caller draws nothing rather than a timeline whose buckets
5243
+ are a lie about their own width.
5244
+
5245
+ THE TWO ENDS DECIDE, not every value. ``_bucket_ordinal`` rises with the moment, so the
5246
+ earliest and latest values bound the bucket count at every grain; trying six grains over ten
5247
+ million rows would otherwise walk the column six times to learn what two values already say.
5248
+ """
5249
+
5250
+ start = TIMELINE_BUCKETS.index(declared) if declared else 0
5251
+ ceilings = (
5252
+ (MAX_RELEASED_DISTRIBUTION_ITEMS,)
5253
+ if bins is None
5254
+ else (bins, MAX_RELEASED_DISTRIBUTION_ITEMS)
5255
+ )
5256
+ for ceiling in ceilings:
5257
+ for bucket in TIMELINE_BUCKETS[start:]:
5258
+ width = _bucket_ordinal(latest, bucket) - _bucket_ordinal(earliest, bucket) + 1
5259
+ if width <= ceiling:
5260
+ return bucket
5261
+ return None
5262
+
5263
+
5264
+ def _timeline_distribution(
5265
+ values: list[date | datetime], distinct_count: int, bucket: str
5266
+ ) -> dict[str, Any]:
5267
+ """Contiguous buckets from the first observed one to the last, empty ones included.
5268
+
5269
+ THE EMPTY BUCKETS ARE THE POINT. A distribution that listed only the buckets something landed
5270
+ in would draw a gap as if it were not there, and "nothing arrived for three days" is usually
5271
+ the most interesting thing a timeline has to say.
5272
+
5273
+ The counter is fed from a generator rather than from a list of converted moments: a column may
5274
+ carry ten million rows, and a second full-length list of freshly allocated instants beside the
5275
+ one already in memory is peak memory this lane has no use for.
5276
+ """
5277
+
5278
+ counts = Counter(_bucket_ordinal(_as_utc(value), bucket) for value in values)
5279
+ items = [
5280
+ {"label": _bucket_label(ordinal, bucket), "count": counts[ordinal]}
5281
+ for ordinal in (range(min(counts), max(counts) + 1) if counts else ())
5282
+ ]
5283
+ return {
5284
+ "kind": "timeline",
5285
+ "status": "exact_all_rows",
5286
+ "bucket": bucket,
5287
+ "items": items,
5288
+ "shown_distinct_count": distinct_count,
5289
+ "hidden_distinct_count": 0,
5290
+ "hidden_value_count": 0,
5291
+ }
5292
+
5293
+
5294
+ def _default_chart(
5295
+ engine_type: str, declared_type: str | None, distinct_count: int, distinct_rate_ppm: int
5296
+ ) -> str:
5297
+ """What a column is drawn as when the recipe named no chart for it.
5298
+
5299
+ THE DECLARED TYPE IS READ WHEREVER THERE IS ONE. It is what the agent meant, and the engine
5300
+ narrows several declarations onto one sealed type -- ``json`` most visibly, which seals as text
5301
+ and would otherwise be counted as if its documents were category labels. The v3 producer path
5302
+ carries no recipe, passes ``None``, and reads the sealed type alone.
5303
+
5304
+ A DECLARATION THE SEALED TYPE CONTRADICTS IS NOT FOLLOWED. The engine holds a build to its
5305
+ declared output types, so the two agreeing is the ordinary case; where they do not, what
5306
+ arrived is what can honestly be drawn, and binning text would be a crash rather than a chart.
5307
+ """
5308
+
5309
+ if declared_type is not None:
5310
+ wanted = _from_type(
5311
+ _DEFAULT_CHART_BY_DECLARED_TYPE, declared_type, distinct_count, distinct_rate_ppm
5312
+ )
5313
+ if engine_type in _CHART_ENGINE_TYPES[wanted]:
5314
+ return wanted
5315
+ return _from_type(_DEFAULT_CHART_BY_ENGINE_TYPE, engine_type, distinct_count, distinct_rate_ppm)
5316
+
5317
+
5318
+ def _from_type(
5319
+ charts: Mapping[str, str], name: str, distinct_count: int, distinct_rate_ppm: int
5320
+ ) -> str:
5321
+ """One type's default, with the one rule that is a measurement rather than a lookup.
5322
+
5323
+ Text is the only type whose honest default depends on the values: a count of the twelve
5324
+ commonest case identifiers says only that the sample is a sample, and a count of the twelve
5325
+ commonest countries is the whole column.
5326
+ """
5327
+
5328
+ if name != "string":
5329
+ return charts.get(name, "none")
5330
+ if (
5331
+ distinct_count <= MAX_TOP_VALUES_DISTINCT_COUNT
5332
+ or distinct_rate_ppm <= MAX_TOP_VALUES_DISTINCT_RATE_PPM
5333
+ ):
5334
+ return "top_values"
5335
+ return "none"
5336
+
5337
+
5053
5338
  def _column_lineage(lineage: Any, name: str) -> tuple[list[dict[str, str]], list[str]]:
5054
5339
  if not isinstance(lineage, dict):
5055
5340
  raise HostedWorkerError("COLUMN_PROFILE_INVALID", "sealed lineage is not an object")
@@ -5103,6 +5388,92 @@ def _column_lineage(lineage: Any, name: str) -> tuple[list[dict[str, str]], list
5103
5388
  return source_inputs, list(operations)
5104
5389
 
5105
5390
 
5391
+ def _column_presentation(
5392
+ engine_type: str,
5393
+ declared: V4Column | None,
5394
+ *,
5395
+ values: list[Any],
5396
+ distinct_count: int,
5397
+ distinct_rate_ppm: int,
5398
+ ) -> tuple[dict[str, Any], dict[str, Any]]:
5399
+ """Decide what one column is drawn as, and draw it.
5400
+
5401
+ **THE DOCUMENT DECIDES AND THE PRODUCER FALLS BACK.** An agent that wrote the recipe knows
5402
+ what the column is for and says so; nothing here is inferred where a declaration exists. Where
5403
+ none exists, the producer picks the honest chart for the type rather than leaving the column
5404
+ blank, and the echo records which of the two happened -- a reader who cannot tell a decision
5405
+ from a default cannot tell how much the chart is worth.
5406
+
5407
+ A declaration is followed as far as the values allow and no further. A declared grain the
5408
+ observed span outgrew is widened to the finest grain that fits, which leaves the chart the
5409
+ document asked for intact. A chart the sealed type cannot carry, a timeline over a span no
5410
+ grain in the vocabulary covers, and a column where nothing at all was observed are the three
5411
+ ways a declared chart is DISCARDED rather than adjusted.
5412
+
5413
+ ``source`` SAYS WHETHER THE CHART THAT WAS DRAWN IS THE ONE THE DOCUMENT ASKED FOR, and it is
5414
+ derived from exactly that comparison rather than assigned by whichever branch got there. A
5415
+ discarded declaration takes its story with it: the sentence was written about a chart nobody
5416
+ is looking at, and a caption under the wrong picture is worse than no caption. What grain a
5417
+ timeline was drawn at is on the DISTRIBUTION, which is the only place a reader reads it from
5418
+ and is why the echo carries no second copy of it.
5419
+
5420
+ **NOTHING OBSERVED IS DRAWN AS NOTHING, WHATEVER THE TYPE.** An all-null column has no shape,
5421
+ and an empty histogram or a timeline of no buckets invites a reader to look for one.
5422
+ """
5423
+
5424
+ presented = declared.presentation if declared is not None else None
5425
+ # ``wanted`` is the declaration where the drawing can honour it and ``None`` everywhere else,
5426
+ # so the chart, the bins and the grain read one answer rather than three conditions.
5427
+ wanted = (
5428
+ presented
5429
+ if presented is not None and engine_type in _CHART_ENGINE_TYPES[presented.chart]
5430
+ else None
5431
+ )
5432
+ chart = (
5433
+ wanted.chart
5434
+ if wanted is not None
5435
+ else _default_chart(
5436
+ engine_type,
5437
+ declared.type if declared is not None else None,
5438
+ distinct_count,
5439
+ distinct_rate_ppm,
5440
+ )
5441
+ )
5442
+ bins = wanted.bins if wanted is not None else None
5443
+ bucket: str | None = None
5444
+ if not values:
5445
+ chart = "none"
5446
+ elif chart == "timeline":
5447
+ # The two ends, converted, and nothing else held: the grain is a function of the span.
5448
+ bucket = _timeline_bucket(
5449
+ _as_utc(min(values)),
5450
+ _as_utc(max(values)),
5451
+ wanted.bucket if wanted is not None else None,
5452
+ bins,
5453
+ )
5454
+ if bucket is None:
5455
+ chart = "none"
5456
+
5457
+ kind = _DISTRIBUTION_KIND_BY_CHART[chart]
5458
+ if kind == "timeline" and bucket is not None:
5459
+ distribution = _timeline_distribution(values, distinct_count, bucket)
5460
+ elif kind == "histogram":
5461
+ distribution = _histogram_distribution(values, distinct_count, bins=bins)
5462
+ elif kind == "none":
5463
+ distribution = _none_distribution(distinct_count, len(values))
5464
+ else:
5465
+ distribution = _value_count_distribution(values)[1]
5466
+
5467
+ asked_for = presented is not None and presented.chart == chart
5468
+ presentation: dict[str, Any] = {
5469
+ "chart": chart,
5470
+ "source": "declared" if asked_for else "default",
5471
+ }
5472
+ if asked_for and presented is not None and presented.story is not None:
5473
+ presentation["story"] = presented.story
5474
+ return presentation, distribution
5475
+
5476
+
5106
5477
  def _released_column_profile(
5107
5478
  profile_raw: bytes,
5108
5479
  lineage_raw: bytes,
@@ -5111,9 +5482,18 @@ def _released_column_profile(
5111
5482
  workspace_id: UUID,
5112
5483
  run_id: UUID,
5113
5484
  candidate_digest: str,
5485
+ declared_columns: Mapping[str, V4Column] = MappingProxyType({}),
5114
5486
  ) -> bytes:
5115
5487
  """Build the bounded, all-row notebook-equivalent analytical projection.
5116
5488
 
5489
+ ``declared_columns`` is the recipe's own table plan keyed by column name, passed in by the v4
5490
+ caller that already holds the parsed document rather than read back out of the job here: a
5491
+ second reader of the same document is a second chance for the two to disagree. The parsed
5492
+ column carries both halves the chart needs -- what the agent asked to be shown, and the type it
5493
+ declared, which is the only thing that separates a table of documents from a list of
5494
+ categories once both have been sealed as text. The v3 producer path declares nothing and every
5495
+ column takes the default for the type the engine sealed.
5496
+
5117
5497
  **THE ROW CEILING IS THE RELEASE PATH'S OWN, READ BY REFERENCE.** Both bounds below are
5118
5498
  :data:`MAX_SEALED_CANDIDATE_ROWS` -- ``plan_graph.HARD_MAX_OUTPUT_ROWS``, the widest table the
5119
5499
  graph engine may lawfully seal -- and not the v1 parse ceiling they used to restate. The two
@@ -5196,7 +5576,29 @@ def _released_column_profile(
5196
5576
  if value is not None and not (isinstance(value, float) and math.isnan(value))
5197
5577
  ]
5198
5578
  missing_count = declared_nulls + nan_count
5199
- distinct_count, distribution = _value_count_distribution(observed)
5579
+ # The distinct key is what refuses a non-finite value, so it is computed for every column
5580
+ # rather than only for the ones whose chart happens to count values.
5581
+ distinct_count = len({_profile_distinct_key(value) for value in observed})
5582
+ distinct_rate_ppm = _rate_ppm(distinct_count, len(observed))
5583
+ numeric_summary = None
5584
+ if engine_type in {"int64", "float64", "decimal"} and observed:
5585
+ numeric = [
5586
+ value
5587
+ for value in observed
5588
+ if isinstance(value, (int, float, Decimal)) and not isinstance(value, bool)
5589
+ ]
5590
+ if len(numeric) != len(observed):
5591
+ raise HostedWorkerError(
5592
+ "COLUMN_PROFILE_INVALID", f"numeric values for {name!r} are inconsistent"
5593
+ )
5594
+ numeric_summary = _nearest_rank_summary(numeric)
5595
+ presentation, distribution = _column_presentation(
5596
+ str(engine_type),
5597
+ declared_columns.get(name),
5598
+ values=observed,
5599
+ distinct_count=distinct_count,
5600
+ distinct_rate_ppm=distinct_rate_ppm,
5601
+ )
5200
5602
  column: dict[str, Any] = {
5201
5603
  "name": name,
5202
5604
  "logical_type": logical_type,
@@ -5208,23 +5610,13 @@ def _released_column_profile(
5208
5610
  "missing_rate_ppm": _rate_ppm(missing_count, row_count),
5209
5611
  "missing_policy": "null_or_nan",
5210
5612
  "distinct_count": distinct_count,
5211
- "distinct_rate_ppm": _rate_ppm(distinct_count, len(observed)),
5613
+ "distinct_rate_ppm": distinct_rate_ppm,
5212
5614
  "distinct_policy": "typed_exact; null_and_nan_excluded; signed_zero_collapsed",
5213
5615
  "distribution": distribution,
5616
+ "presentation": presentation,
5214
5617
  }
5215
- if engine_type in {"int64", "float64", "decimal"} and observed:
5216
- numeric = [
5217
- value
5218
- for value in observed
5219
- if isinstance(value, (int, float, Decimal)) and not isinstance(value, bool)
5220
- ]
5221
- if len(numeric) != len(observed):
5222
- raise HostedWorkerError(
5223
- "COLUMN_PROFILE_INVALID", f"numeric values for {name!r} are inconsistent"
5224
- )
5225
- column["numeric_summary"] = _nearest_rank_summary(numeric)
5226
- if engine_type in {"int64", "float64"}:
5227
- column["distribution"] = _histogram_distribution(numeric, distinct_count)
5618
+ if numeric_summary is not None:
5619
+ column["numeric_summary"] = numeric_summary
5228
5620
  source_inputs, transformations = _column_lineage(lineage, name)
5229
5621
  column["source_inputs"] = source_inputs
5230
5622
  column["transformations"] = transformations
@@ -174,6 +174,7 @@ V4_FAILURE_CODES: tuple[str, ...] = (
174
174
  "CLAIM_KIND_UNKNOWN",
175
175
  "CLAMP_EXCEEDED",
176
176
  "CLAMP_UNSUPPORTED_FORMAT",
177
+ "COLUMN_PRESENTATION_INCOMPATIBLE",
177
178
  "DECLARED_CHECKS_INVALID",
178
179
  "DECLARED_CHECK_COLUMN_UNKNOWN",
179
180
  "DECLARED_CHECK_DUPLICATE",