mostlyright-data 0.14.2__tar.gz → 0.15.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.
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/PKG-INFO +1 -1
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/pyproject.toml +1 -1
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/skills/mr-data-build/SKILL.md +21 -12
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/http.py +231 -1
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/bounded_query.py +66 -20
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/declared_checks.py +124 -1
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_crawler_fetch.py +98 -9
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_run_worker.py +1525 -57
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_session_worker.py +149 -12
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_worker.py +271 -10
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/inprocess_acquisition.py +87 -3
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/pipeline.py +107 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/run_execution_v4.py +319 -30
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/stream_subscription_worker.py +64 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/studio_boundary.py +2 -2
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/studio_subscription_control.py +28 -6
- mostlyright_data-0.15.0/src/mostlyright/data_harness/table_manifest.py +1050 -0
- mostlyright_data-0.15.0/src/mostlyright/data_harness/table_parts.py +743 -0
- mostlyright_data-0.15.0/src/mostlyright/data_harness/table_profile.py +332 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/activity.py +2 -2
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/router.py +8 -1
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4.py +53 -14
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_artifacts.py +269 -16
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_datasets.py +86 -5
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_tables.py +185 -1
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/vocabulary.py +12 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/headline.py +1 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/remediation.py +35 -1
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/render.py +5 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_acquisition.py +32 -1
- mostlyright_data-0.15.0/src/mostlyright/data_harness/v4_closed_source.py +289 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_recipe.py +311 -1
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_required_controls.py +16 -2
- mostlyright_data-0.15.0/src/mostlyright/data_harness/v4_window.py +717 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/.gitignore +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/README.md +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/scripts/hatch_build.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/skills/mr-data-build/agents/openai.yaml +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/agent_runtime.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/protocol.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/reference.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/registry.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/canonical.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/catalog_job.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/cli.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/coordinator.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/crosswalks.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/deploy.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/deploy_target.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/capture.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/lane.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/ocr.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/pdf.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/registry.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/selections.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/tables.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/events.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/fast_delimited.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/formats.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/governors.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ingestion/store.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/key_seam.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/local_search/service.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/document.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/status.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/notebook.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/offline.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/operation_registry.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/operator_setup.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/plan_graph.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/engine.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/errors.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/gates.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/joins.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/profile.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/table.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/progress_events.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/budgets.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/containers.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/delimited.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/registry.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.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
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.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
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.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
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/samples.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/tabular.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/vector.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/recipe.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/repair/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/repair/adapters.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/repair/contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/repair/errors.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/review.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/rowset.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/session_probes.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/signing.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/skill_assets.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/source_discovery.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/adapters.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/cadence.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/collections.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/dataset.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/deletion.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/fitness.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/governance.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/hosted.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/integration.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/registry.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/sports.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/stream_subscription_sealer.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/stream_venue.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/acquire.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/approvals.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/commands.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/download.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/narrative.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/parity.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/probe.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/propose.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/recipe.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/research.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/runs.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/session.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/stream.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/transport.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/thin/workers.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/unit_flow.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/units.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/approve.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/attendance.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/clarification.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/credentials.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/diffing.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/inventory.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/local_review.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/login.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/peek.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/preflight.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/readers.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/ux/workload.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/v4_transform.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/query.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/visual_run/store.py +0 -0
- {mostlyright_data-0.14.2 → mostlyright_data-0.15.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.
|
|
3
|
+
Version: 0.15.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/
|
|
@@ -102,7 +102,7 @@ absence as a defect.
|
|
|
102
102
|
|
|
103
103
|
## Commands
|
|
104
104
|
|
|
105
|
-
These
|
|
105
|
+
These thirty are the whole surface, alongside `acquire-slices`, which names a capability
|
|
106
106
|
gap rather than doing anything, and `export-hosted-candidate`, which is a backend operator step.
|
|
107
107
|
|
|
108
108
|
| Command | What it does |
|
|
@@ -124,7 +124,9 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
|
|
|
124
124
|
| `mr-data receipt` | Print what one run recorded about how it was built: every source it fetched and what those bytes hashed to, the coverage it delivered, and the members of its raw snapshot. |
|
|
125
125
|
| `mr-data checks` | Report how each check the recipe declared came out — the name, whether it passed, what it found. Exits non-zero when one did not pass. |
|
|
126
126
|
| `mr-data note` | Write one cell of a run's decision record — a heading, a body, and the typed blocks that carry a source, a decision or a clarification onto the stage its phase names. The body comes from `--markdown-file FILE`, which is the form to use; standard input is read when no file is named and is refused when it is a terminal or empty. `--list` reads back what is written. |
|
|
127
|
-
| `mr-data download` | Bring one run's artifacts back to this computer, each one's bytes checked against the digest Studio sealed them under. `--kind` selects out of `table_parquet`, `column_profile`, `preview`, `receipt` and `raw_snapshot`; without it, the table and the receipt. |
|
|
127
|
+
| `mr-data download` | Bring one run's artifacts back to this computer, each one's bytes checked against the digest Studio sealed them under. `--kind` selects out of `table_parquet`, `table_manifest`, `table_part`, `column_profile`, `preview`, `receipt` and `raw_snapshot`; without it, the table and the receipt — and for a run whose table is a manifest over parts, the manifest, its parts and the receipt, written as `table/manifest.json` beside `table/parts/<part_key>.parquet`. |
|
|
128
|
+
| `mr-data verify` | Hold one run's sealed table manifest against the parts it names, and report every disagreement. Without `--deep` it fetches the manifest alone; with `--deep` it fetches every part the run sealed and re-hashes it against the digest the manifest states. Exits non-zero when anything disagrees. |
|
|
129
|
+
| `mr-data parts` | List one table version's parts — the identifier, the row count, the byte size and the recorded bounds of each — so a training loader can shard them across workers and read a table no single file should hold. `--version` names a version rather than the live one, and `--from`/`--to` keep only the parts a value range cannot rule out. Nothing is downloaded by listing them; see [training loaders](../../docs/TRAINING-LOADERS.md) for the pattern. |
|
|
128
130
|
| `mr-data diff` | Compare two runs and say what changed. |
|
|
129
131
|
| `mr-data keys` | Enrol a source credential by name, list the names with their created and rotated times, and delete one. `keys set` reads the value from a file or from standard input and never from the command line; no command prints a value back. |
|
|
130
132
|
| `mr-data stream` | Record a public `wss://` venue so a build can read it. `stream document register --file F` admits the connector document, `stream registry create --digest D` admits a set of them, `stream probe` listens briefly and seals nothing, `stream capture --seconds N` records a bounded window, `stream subscribe` keeps recording, `stream subscription {show|pause|resume|stop} ID` moves one, `stream status ID` reads a capture or a probe, and `stream recordings --document-digest D` names what a build could read and until when. `--seconds` is at most 600. `mr-data run` takes no duration: a build reads sealed batches and is bounded by them. |
|
|
@@ -137,8 +139,9 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
|
|
|
137
139
|
| `mr-data demote` | Ask Studio to withdraw the pointer and any schedule it owns, for one table or for as many as you name: `demote TABLE [TABLE ...]` withdraws them one after another, attempts every one of them whatever the one before it answered, prints a line for each, and exits non-zero if any is still live. Pair it with `table archive` when you are retiring a set: a live table cannot be archived, so it is withdraw-then-archive, two commands rather than a loop. |
|
|
138
140
|
|
|
139
141
|
`auth`, `login`, `whoami` and `clarify` are the same implementation in both profiles, and
|
|
140
|
-
`clarify` alone reaches nothing at all. The other twenty-
|
|
141
|
-
read: `status`, `runs`, `watch`, `peek`, `receipt`, `checks`, `download` and
|
|
142
|
+
`clarify` alone reaches nothing at all. The other twenty-six answer from Studio. Ten only
|
|
143
|
+
read: `status`, `runs`, `watch`, `peek`, `receipt`, `checks`, `download`, `verify`, `parts` and
|
|
144
|
+
`diff`.
|
|
142
145
|
Sixteen start or change something: `dataset`, `recipe`, `cover`, `run`, `query`, `probe`, `keys`,
|
|
143
146
|
`stream`, `open`, `note`, `promote`, `reschedule`, `table`, `pin`, `unpin` and `demote`. The split
|
|
144
147
|
is over names, not over invocations: `table TABLE` reads and `table rename` writes, and the name
|
|
@@ -248,8 +251,8 @@ every stage below writes to it as it goes rather than composing the page at the
|
|
|
248
251
|
Authenticate first: run the Cloud authentication preflight above once, before the first cloud
|
|
249
252
|
command of the session.
|
|
250
253
|
|
|
251
|
-
**Then stage 1, and nothing before it.** `mr-data dataset create` and
|
|
252
|
-
two
|
|
254
|
+
**Then stage 1, and nothing before it.** `mr-data dataset create --handoff` and opening its navigation URL are the first
|
|
255
|
+
two actions of the session after the preflight. They come before the durable notes are read,
|
|
253
256
|
before `mr-data runs`, before a catalog is searched, before a provider's documentation is opened
|
|
254
257
|
and before any URL is fetched. The lookups below are research, research is what fills the page, and
|
|
255
258
|
a page created after the research has already happened is the assertion this stage exists to
|
|
@@ -291,14 +294,13 @@ message that contradicts you.
|
|
|
291
294
|
Create the dataset from a working title and put it in front of whoever is watching, **before any
|
|
292
295
|
source lookup**. These are the first two commands after the preflight — nothing reads a note,
|
|
293
296
|
searches a catalog, opens a provider page or fetches a URL until they have both returned. It costs
|
|
294
|
-
|
|
297
|
+
one command and one host navigation, and it is what turns a build into something a person can follow:
|
|
295
298
|
|
|
296
299
|
```sh
|
|
297
|
-
mr-data dataset create --name "Kathmandu monsoon flooding" --json
|
|
298
|
-
mr-data open /datasets/DATASET_ID
|
|
300
|
+
mr-data dataset create --name "Kathmandu monsoon flooding" --handoff --json
|
|
299
301
|
```
|
|
300
302
|
|
|
301
|
-
|
|
303
|
+
Consume the creation receipt’s `navigation.url` immediately in the host’s in-app browser. Creation has succeeded even if `navigation.status` says `handoff_unavailable`; open the fallback URL or retry only `mr-data open`, never create again. Navigate to that address immediately, and keep that one tab for the whole
|
|
302
304
|
build. The working title is allowed to be provisional — stage 4 writes the title it settles on —
|
|
303
305
|
and a title that never changes is fine too. Where the address cannot be minted, carry on with the
|
|
304
306
|
plain dashboard address rather than blocking.
|
|
@@ -478,8 +480,7 @@ mr-data dataset set DATASET_ID --description-file DESCRIPTION.md --json
|
|
|
478
480
|
Two calls rather than one, so the person watching sees the title land and then the text arrive.
|
|
479
481
|
Each call reads the version first and writes under it, so a description you wrote against a page
|
|
480
482
|
somebody else has since edited is retried once and then reported rather than silently overwriting
|
|
481
|
-
them.
|
|
482
|
-
do not send it in pieces.
|
|
483
|
+
them. While composing, send bounded snapshots with `mr-data dataset draft DATASET_ID --description-file DRAFT.md --expected-version VERSION --json`. Chain the returned version into the next snapshot, writing a meaningful paragraph at a time. These snapshots are temporary and do not replace the saved description. Commit the complete documentation with `mr-data dataset set DATASET_ID --description-file DESCRIPTION.md --expected-version VERSION --json`. If another edit moved that version, stop the draft and reconcile it with the user’s text; never retry by blindly advancing the version. Do not send fabricated partial text or delay completed text to simulate writing.
|
|
483
484
|
|
|
484
485
|
**The dataset description is the documentation, and it is read by people and by search engines.**
|
|
485
486
|
`dataset.description` is Markdown, rendered on the dataset page with headings and lists, and it
|
|
@@ -1700,3 +1701,11 @@ When comparing sources, use a compact `Source | Decision | Evidence` table, then
|
|
|
1700
1701
|
source and its main limitation in one sentence each. Use field and quality tables for contracts.
|
|
1701
1702
|
Give fields readable descriptions; do not rely on names such as `pm25_daily_mean` to explain
|
|
1702
1703
|
themselves. Do not present a sequence of unlabeled paragraphs or default to a bullet dump.
|
|
1704
|
+
|
|
1705
|
+
### Agent presence lifecycle
|
|
1706
|
+
|
|
1707
|
+
The floating pill represents only your active work. Start `dataset activity` immediately after creation, update the sentence when your task changes, and renew at least once a minute while you are actively working. The default lease is two minutes. Do not leave a detached heartbeat running after your turn ends. Worker ingestion progress has its own table surface and is not proof that you are working.
|
|
1708
|
+
|
|
1709
|
+
When recovering, report what you are trying now; an earlier failed attempt belongs in the record. Before every final handoff, cancellation, or exhausted stop, report `--phase done` with a truthful final sentence (for example, “Dataset ready to explore” or “Stopped before the build completed”). Do this even when tables are not enabled. Only use `waiting_on_you` when you have actually asked for an answer. Promotion does not finish your agent session.
|
|
1710
|
+
|
|
1711
|
+
The host opens the dataset before research begins and keeps the same tab. Enable its optional Follow agent control for a watch-along experience; manual scrolling pauses it and must never be overridden.
|
{mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/acquisition/http.py
RENAMED
|
@@ -755,6 +755,138 @@ class ByteRange:
|
|
|
755
755
|
_PRESENCE_PROBE_RANGE = ByteRange(first_byte=0, last_byte=0)
|
|
756
756
|
|
|
757
757
|
|
|
758
|
+
NOT_MODIFIED_STATUS = 304
|
|
759
|
+
# ``entity-tag = [ weak ] opaque-tag`` with ``etagc = %x21 / %x23-7E`` (RFC 9110 8.8.3). The
|
|
760
|
+
# obs-text range is excluded: a validator this boundary cannot spell back byte for byte is a
|
|
761
|
+
# validator it will not send. The length bound is the one the response-header reader already
|
|
762
|
+
# holds validators to elsewhere in this repository.
|
|
763
|
+
_ENTITY_TAG = re.compile(r'(?:W/)?"[\x21\x23-\x7e]{0,256}"')
|
|
764
|
+
# ``IMF-fixdate``, and only that. RFC 9110 5.6.7 requires a sender to use it and permits a
|
|
765
|
+
# recipient to parse the two obsolete forms; a recipient that RE-SENDS what it parsed is a
|
|
766
|
+
# sender, so the obsolete forms are refused here rather than normalized. A publisher whose
|
|
767
|
+
# ``Last-Modified`` is not an IMF-fixdate simply has no reusable date validator.
|
|
768
|
+
#
|
|
769
|
+
# The calendar is NOT checked -- a 31st of February matches -- and that is the right depth for
|
|
770
|
+
# what this pattern is for. The value is echoed back to the publisher that minted it, never
|
|
771
|
+
# interpreted as a moment, so what has to be guaranteed is the shape a request header may carry:
|
|
772
|
+
# a fixed length, a fixed field order, and no character that could end the header line.
|
|
773
|
+
_IMF_FIXDATE = re.compile(
|
|
774
|
+
r"(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), [0-3][0-9] "
|
|
775
|
+
r"(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) "
|
|
776
|
+
r"[0-9]{4} [0-2][0-9]:[0-5][0-9]:[0-6][0-9] GMT"
|
|
777
|
+
)
|
|
778
|
+
|
|
779
|
+
|
|
780
|
+
@dataclass(frozen=True)
|
|
781
|
+
class ConditionalValidators:
|
|
782
|
+
"""What a publisher said about an edition, offered back to it as a precondition.
|
|
783
|
+
|
|
784
|
+
A conditional request is ordered through this typed value rather than through a caller
|
|
785
|
+
supplied header mapping, for the reason :class:`ByteRange` is: a general ``extra_headers``
|
|
786
|
+
argument would put a header-injection surface at the most security-sensitive seam in this
|
|
787
|
+
package. A validator validates itself against the grammar its own header field names and
|
|
788
|
+
renders to exactly the header values that grammar admits, so no caller composes a request
|
|
789
|
+
header character by character.
|
|
790
|
+
|
|
791
|
+
Both members are publisher-controlled text. Nothing here interprets them -- no comparison
|
|
792
|
+
is made against a later response, no edition is inferred -- because the only party that can
|
|
793
|
+
say whether an entity tag still names the current edition is the publisher that minted it.
|
|
794
|
+
They are carried, spelled back, and otherwise opaque.
|
|
795
|
+
|
|
796
|
+
A WEAK ENTITY TAG IS A VALID PRECONDITION HERE. ``If-None-Match`` uses the weak comparison
|
|
797
|
+
function (RFC 9110 8.8.3.2), so ``W/"..."`` is exactly as usable as a strong tag for asking
|
|
798
|
+
"has this changed"; it is only ``If-Match`` and ranged revalidation that need a strong one,
|
|
799
|
+
and neither is ordered through this type.
|
|
800
|
+
"""
|
|
801
|
+
|
|
802
|
+
etag: str | None = None
|
|
803
|
+
last_modified: str | None = None
|
|
804
|
+
|
|
805
|
+
def __post_init__(self) -> None:
|
|
806
|
+
if self.etag is None and self.last_modified is None:
|
|
807
|
+
raise AcquisitionSecurityError(
|
|
808
|
+
"CONDITIONAL_VALIDATOR",
|
|
809
|
+
"a conditional request states at least one validator",
|
|
810
|
+
)
|
|
811
|
+
if self.etag is not None and (
|
|
812
|
+
not isinstance(self.etag, str) or _ENTITY_TAG.fullmatch(self.etag) is None
|
|
813
|
+
):
|
|
814
|
+
raise AcquisitionSecurityError(
|
|
815
|
+
"CONDITIONAL_VALIDATOR",
|
|
816
|
+
"the entity tag is not an RFC 9110 entity-tag",
|
|
817
|
+
)
|
|
818
|
+
if self.last_modified is not None and (
|
|
819
|
+
not isinstance(self.last_modified, str)
|
|
820
|
+
or _IMF_FIXDATE.fullmatch(self.last_modified) is None
|
|
821
|
+
):
|
|
822
|
+
raise AcquisitionSecurityError(
|
|
823
|
+
"CONDITIONAL_VALIDATOR",
|
|
824
|
+
"the modification date is not an IMF-fixdate",
|
|
825
|
+
)
|
|
826
|
+
|
|
827
|
+
@classmethod
|
|
828
|
+
def from_values(
|
|
829
|
+
cls, etag: str | None, last_modified: str | None
|
|
830
|
+
) -> ConditionalValidators | None:
|
|
831
|
+
"""The validators worth offering back, or ``None`` when neither is.
|
|
832
|
+
|
|
833
|
+
A publisher that stated something this boundary will not spell back -- an obsolete date
|
|
834
|
+
form, a tag with a character the grammar excludes -- gets a full request next time, which
|
|
835
|
+
is the outcome that already exists. Refusing the whole acquisition over it would turn a
|
|
836
|
+
saving into an outage.
|
|
837
|
+
"""
|
|
838
|
+
|
|
839
|
+
tag = etag if isinstance(etag, str) and _ENTITY_TAG.fullmatch(etag) else None
|
|
840
|
+
date = (
|
|
841
|
+
last_modified
|
|
842
|
+
if isinstance(last_modified, str) and _IMF_FIXDATE.fullmatch(last_modified)
|
|
843
|
+
else None
|
|
844
|
+
)
|
|
845
|
+
if tag is None and date is None:
|
|
846
|
+
return None
|
|
847
|
+
return cls(etag=tag, last_modified=date)
|
|
848
|
+
|
|
849
|
+
def header_values(self) -> tuple[tuple[str, str], ...]:
|
|
850
|
+
"""The exact request headers this precondition renders to.
|
|
851
|
+
|
|
852
|
+
The entity tag is preferred and the date accompanies it: a publisher evaluates
|
|
853
|
+
``If-None-Match`` and ignores ``If-Modified-Since`` when both are present (RFC 9110
|
|
854
|
+
13.2.2), so sending both costs nothing and leaves a date-only publisher answerable.
|
|
855
|
+
"""
|
|
856
|
+
|
|
857
|
+
headers: list[tuple[str, str]] = []
|
|
858
|
+
if self.etag is not None:
|
|
859
|
+
headers.append(("If-None-Match", self.etag))
|
|
860
|
+
if self.last_modified is not None:
|
|
861
|
+
headers.append(("If-Modified-Since", self.last_modified))
|
|
862
|
+
return tuple(headers)
|
|
863
|
+
|
|
864
|
+
|
|
865
|
+
class NotModified(AcquisitionSecurityError):
|
|
866
|
+
"""The publisher answered a precondition with 304: this edition is the one already held.
|
|
867
|
+
|
|
868
|
+
It carries the same measured hop evidence a retrieval carries, because a 304 exchange is a
|
|
869
|
+
real exchange -- a DNS epoch, a pinned connection, a response with headers -- and the bytes
|
|
870
|
+
it did not cost are as much a fact of the run as the bytes a 200 did. There is no content
|
|
871
|
+
and no media type: nothing was delivered, which is the point.
|
|
872
|
+
|
|
873
|
+
Raised rather than returned so the retriever's one success shape stays
|
|
874
|
+
:class:`RetrievedBytes`, and only a caller that asked a question by sending a precondition
|
|
875
|
+
can be answered with it.
|
|
876
|
+
"""
|
|
877
|
+
|
|
878
|
+
def __init__(
|
|
879
|
+
self,
|
|
880
|
+
*,
|
|
881
|
+
hops: tuple[RetrievalHop, ...],
|
|
882
|
+
transport_evidence_digest: str,
|
|
883
|
+
) -> None:
|
|
884
|
+
self.hops = hops
|
|
885
|
+
self.transport_evidence_digest = transport_evidence_digest
|
|
886
|
+
self.total_response_body_size_bytes = sum(hop.response_body_size_bytes for hop in hops)
|
|
887
|
+
super().__init__("NOT_MODIFIED", "source answered the precondition with 304")
|
|
888
|
+
|
|
889
|
+
|
|
758
890
|
@dataclass(frozen=True)
|
|
759
891
|
class RetrievalLimits:
|
|
760
892
|
max_response_bytes: int = 16 * 1024 * 1024
|
|
@@ -1477,17 +1609,48 @@ class PinnedHttpsRetriever:
|
|
|
1477
1609
|
clock=self._clock,
|
|
1478
1610
|
)
|
|
1479
1611
|
|
|
1480
|
-
def retrieve(
|
|
1612
|
+
def retrieve(
|
|
1613
|
+
self,
|
|
1614
|
+
url: str,
|
|
1615
|
+
*,
|
|
1616
|
+
byte_range: ByteRange | None = None,
|
|
1617
|
+
validators: ConditionalValidators | None = None,
|
|
1618
|
+
) -> RetrievedBytes:
|
|
1619
|
+
"""Retrieve one address, optionally conditioned on the edition already held.
|
|
1620
|
+
|
|
1621
|
+
``validators`` makes this a conditional GET. A publisher that answers 304 has stated
|
|
1622
|
+
that the edition named by the precondition is still the current one, and that answer is
|
|
1623
|
+
raised as :class:`NotModified` rather than returned: nothing was delivered, so there are
|
|
1624
|
+
no bytes to hand back. Every other answer is retrieved exactly as an unconditional one
|
|
1625
|
+
would be, including a 200 whose entity tag has not moved -- what the bytes are is decided
|
|
1626
|
+
by the bytes.
|
|
1627
|
+
"""
|
|
1628
|
+
|
|
1481
1629
|
if byte_range is not None and not isinstance(byte_range, ByteRange):
|
|
1482
1630
|
raise AcquisitionSecurityError(
|
|
1483
1631
|
"BYTE_RANGE",
|
|
1484
1632
|
"a slice is ordered only through a validated byte range",
|
|
1485
1633
|
)
|
|
1634
|
+
if validators is not None and not isinstance(validators, ConditionalValidators):
|
|
1635
|
+
raise AcquisitionSecurityError(
|
|
1636
|
+
"CONDITIONAL_VALIDATOR",
|
|
1637
|
+
"a precondition is ordered only through validated conditional validators",
|
|
1638
|
+
)
|
|
1639
|
+
if validators is not None and byte_range is not None:
|
|
1640
|
+
# A conditional ranged request is two questions in one exchange and the answers do
|
|
1641
|
+
# not compose: 304 speaks about the whole representation while 206 speaks about the
|
|
1642
|
+
# span, and the delivery check below has nothing to hold a 304 against. Ranged
|
|
1643
|
+
# revalidation belongs to ``If-Range`` and is not ordered here.
|
|
1644
|
+
raise AcquisitionSecurityError(
|
|
1645
|
+
"CONDITIONAL_VALIDATOR",
|
|
1646
|
+
"a precondition and a slice are not ordered in one request",
|
|
1647
|
+
)
|
|
1486
1648
|
return self._fetch(
|
|
1487
1649
|
url,
|
|
1488
1650
|
byte_range=byte_range,
|
|
1489
1651
|
presence_probe=False,
|
|
1490
1652
|
datagov_authorization=None,
|
|
1653
|
+
validators=validators,
|
|
1491
1654
|
)
|
|
1492
1655
|
|
|
1493
1656
|
def retrieve_datagov_v4(
|
|
@@ -1639,7 +1802,24 @@ class PinnedHttpsRetriever:
|
|
|
1639
1802
|
frozen_headers: Mapping[str, str] | None = None,
|
|
1640
1803
|
frozen_method: str = "GET",
|
|
1641
1804
|
frozen_body: bytes | None = None,
|
|
1805
|
+
validators: ConditionalValidators | None = None,
|
|
1642
1806
|
) -> RetrievedBytes:
|
|
1807
|
+
if validators is not None and (
|
|
1808
|
+
presence_probe
|
|
1809
|
+
or byte_range is not None
|
|
1810
|
+
or datagov_authorization is not None
|
|
1811
|
+
or authenticated_authorization is not None
|
|
1812
|
+
or frozen_headers is not None
|
|
1813
|
+
):
|
|
1814
|
+
# A precondition is offered on the plain public path and nowhere else. A probe keeps
|
|
1815
|
+
# nothing, so it has no edition to condition on; the credentialed paths compose their
|
|
1816
|
+
# request headers under an authorization that rejects echoes and pins its own exact
|
|
1817
|
+
# shape, and a second source of headers there would be a second thing to reason about
|
|
1818
|
+
# at the seam that most needs one.
|
|
1819
|
+
raise AcquisitionSecurityError(
|
|
1820
|
+
"CONDITIONAL_VALIDATOR",
|
|
1821
|
+
"a precondition is offered only on an unauthenticated whole-document retrieval",
|
|
1822
|
+
)
|
|
1643
1823
|
started = float(self._clock())
|
|
1644
1824
|
current_url = url
|
|
1645
1825
|
hops: list[RetrievalHop] = []
|
|
@@ -1678,6 +1858,13 @@ class PinnedHttpsRetriever:
|
|
|
1678
1858
|
}
|
|
1679
1859
|
if frozen_headers is not None:
|
|
1680
1860
|
headers.update(frozen_headers)
|
|
1861
|
+
if validators is not None:
|
|
1862
|
+
# Offered on every hop of the chain rather than on the first alone. A
|
|
1863
|
+
# precondition is a fact about the representation the address names, and an
|
|
1864
|
+
# address that redirects still names it; dropping the precondition at a redirect
|
|
1865
|
+
# would turn a revalidation into a full download at exactly the sources that
|
|
1866
|
+
# front their objects behind one.
|
|
1867
|
+
headers.update(validators.header_values())
|
|
1681
1868
|
if datagov_authorization is not None:
|
|
1682
1869
|
name, value = datagov_authorization.header_for(target.normalized_url)
|
|
1683
1870
|
headers[name] = value
|
|
@@ -1925,6 +2112,49 @@ class PinnedHttpsRetriever:
|
|
|
1925
2112
|
peer_attempts,
|
|
1926
2113
|
hops,
|
|
1927
2114
|
)
|
|
2115
|
+
# THE ANSWER TO A PRECONDITION, AND ONLY WHEN ONE WAS ASKED. A 304 to a request that
|
|
2116
|
+
# sent no validator is a publisher answering a question nobody put, so it falls
|
|
2117
|
+
# through to the generic status refusal below and stays a failure.
|
|
2118
|
+
#
|
|
2119
|
+
# IT IS SETTLED BEFORE THE REPRESENTATION CHECKS BECAUSE A 304 DESCRIBES A
|
|
2120
|
+
# REPRESENTATION IT DID NOT SEND. RFC 9110 9.3.1 lets a 304 carry the header fields
|
|
2121
|
+
# a 200 would have carried, so its ``Content-Length`` states the size of the object
|
|
2122
|
+
# that was NOT transferred and its ``Content-Encoding`` names how that object would
|
|
2123
|
+
# have been encoded. Held against the empty body those two are a mismatch and a
|
|
2124
|
+
# forbidden encoding, and the exchange that saved the whole download would be refused
|
|
2125
|
+
# as malformed. The body is checked against nothing else: a 304 carrying one is
|
|
2126
|
+
# refused outright.
|
|
2127
|
+
if validators is not None and response.status == NOT_MODIFIED_STATUS:
|
|
2128
|
+
if response.body:
|
|
2129
|
+
self._raise_peer_failure(
|
|
2130
|
+
"NOT_MODIFIED_BODY",
|
|
2131
|
+
"source answered 304 with a response body",
|
|
2132
|
+
peer_attempts,
|
|
2133
|
+
hops,
|
|
2134
|
+
)
|
|
2135
|
+
hops.append(
|
|
2136
|
+
RetrievalHop(
|
|
2137
|
+
url=target.normalized_url,
|
|
2138
|
+
resolution_digest=target.resolution_digest,
|
|
2139
|
+
connected_peer=peer,
|
|
2140
|
+
status=response.status,
|
|
2141
|
+
response_headers_digest=canonical_sha256(normalized_headers),
|
|
2142
|
+
response_body_size_bytes=0,
|
|
2143
|
+
response_body_sha256=sha256_bytes(b""),
|
|
2144
|
+
requested_range=None,
|
|
2145
|
+
observed_content_range=None,
|
|
2146
|
+
etag=self._response_header(response, "etag", peer_attempts, hops),
|
|
2147
|
+
last_modified=self._response_header(
|
|
2148
|
+
response, "last-modified", peer_attempts, hops
|
|
2149
|
+
),
|
|
2150
|
+
peer_attempts=tuple(peer_attempts),
|
|
2151
|
+
approved_ips=target.approved_ips,
|
|
2152
|
+
)
|
|
2153
|
+
)
|
|
2154
|
+
raise NotModified(
|
|
2155
|
+
hops=tuple(hops),
|
|
2156
|
+
transport_evidence_digest=canonical_sha256([item.to_dict() for item in hops]),
|
|
2157
|
+
)
|
|
1928
2158
|
content_length = self._response_header(response, "content-length", peer_attempts, hops)
|
|
1929
2159
|
declared_length: int | None = None
|
|
1930
2160
|
if content_length is not None:
|
{mostlyright_data-0.14.2 → mostlyright_data-0.15.0}/src/mostlyright/data_harness/bounded_query.py
RENAMED
|
@@ -32,12 +32,19 @@ enumerated here because a reader who wants to weaken one should have to argue wi
|
|
|
32
32
|
named here rather than left for a reader to discover.
|
|
33
33
|
|
|
34
34
|
3. **One view, over this run's own parquet, and no path is ever built from caller input.** The only
|
|
35
|
-
file
|
|
36
|
-
loop downloaded
|
|
37
|
-
|
|
38
|
-
view resolve while every other path on the same disk stays unreachable. The caller's
|
|
39
|
-
passed to the engine and to nothing else: it is never concatenated into a path, a
|
|
40
|
-
view definition.
|
|
35
|
+
file names this module composes are the local paths it was HANDED -- the temporary files the
|
|
36
|
+
claim loop downloaded this version's selected parts into. ``allowed_paths`` is set to exactly
|
|
37
|
+
those files (plus, by DuckDB itself, the throwaway catalog it must read), which is what lets the
|
|
38
|
+
bound view resolve while every other path on the same disk stays unreachable. The caller's
|
|
39
|
+
``sql`` is passed to the engine and to nothing else: it is never concatenated into a path, a
|
|
40
|
+
setting, or a view definition.
|
|
41
|
+
|
|
42
|
+
**A table version is a list of parts, and the list is what is admitted.** A v1 version hands one
|
|
43
|
+
path and a partitioned one hands the parts Studio's ``prune`` block selected; the property is
|
|
44
|
+
unchanged either way, because the admitted set is still exactly the files this claim delivered
|
|
45
|
+
and is still composed from arguments rather than from ``sql``. :data:`MAX_QUERY_PARTS` bounds
|
|
46
|
+
how long that list may be, so a version with four thousand parts is a named refusal rather than
|
|
47
|
+
four thousand open file handles.
|
|
41
48
|
|
|
42
49
|
4. **The caps.** Rows TRUNCATE at the ``max_rows`` Studio sent and the answer says ``truncated``;
|
|
43
50
|
bytes and time REFUSE. The byte ceiling is a refusal and never a truncation, because "a short
|
|
@@ -107,6 +114,12 @@ QUERY_RESULT_MAX_BYTES = 262_144
|
|
|
107
114
|
#: all. Property 4 says the boundary is the worker's; a cap the worker does not check is Studio's.
|
|
108
115
|
MAX_QUERY_ROWS = 1_000_000
|
|
109
116
|
|
|
117
|
+
#: How many parts one bounded question may be bound over. A pruned one-day range on the format's
|
|
118
|
+
#: reference table selects one or two; an unpruned read of a billion-row table selects three
|
|
119
|
+
#: hundred and eighteen. The ceiling is where the list stops being a query and starts being an
|
|
120
|
+
#: export, and the refusal names ``prune`` as the fix rather than raising the ceiling.
|
|
121
|
+
MAX_QUERY_PARTS = 512
|
|
122
|
+
|
|
110
123
|
#: How many rows are taken from the engine at a time. The running byte budget is checked BETWEEN
|
|
111
124
|
#: chunks, so what a refused answer materializes on the Python side is bounded by ONE chunk rather
|
|
112
125
|
#: than by the row cap -- ``fetchmany(max_rows + 1)`` took every cell of every row before anything
|
|
@@ -162,6 +175,10 @@ QUERY_RESULT_TOO_LARGE = "QUERY_RESULT_TOO_LARGE"
|
|
|
162
175
|
#: The worker's own wall clock ran out, before the statement or during it.
|
|
163
176
|
QUERY_TIMEOUT = "QUERY_TIMEOUT"
|
|
164
177
|
|
|
178
|
+
#: The claim named more parts than one bounded question binds. Its sentence names ``prune``,
|
|
179
|
+
#: because the fix is to ask for a slice of the table rather than for a larger engine.
|
|
180
|
+
QUERY_TOO_MANY_PARTS = "QUERY_TOO_MANY_PARTS"
|
|
181
|
+
|
|
165
182
|
#: What an engine failure whose class name cannot be rendered as Studio's grammar reports as.
|
|
166
183
|
#:
|
|
167
184
|
#: NOT in ``WORKER_REFUSAL_CODES`` and not in the inventory's ``worker_refusals``, because it is
|
|
@@ -181,6 +198,7 @@ WORKER_REFUSAL_CODES: tuple[str, ...] = (
|
|
|
181
198
|
QUERY_STATEMENT_NOT_SINGLE,
|
|
182
199
|
QUERY_RESULT_TOO_LARGE,
|
|
183
200
|
QUERY_TIMEOUT,
|
|
201
|
+
QUERY_TOO_MANY_PARTS,
|
|
184
202
|
)
|
|
185
203
|
|
|
186
204
|
#: Studio's grammar for a worker-reported ``failure_code``
|
|
@@ -277,7 +295,7 @@ def _import_engine() -> Any:
|
|
|
277
295
|
return duckdb
|
|
278
296
|
|
|
279
297
|
|
|
280
|
-
def _confine(connection: Any, *,
|
|
298
|
+
def _confine(connection: Any, *, table_paths: Sequence[Path], duckdb: Any) -> None:
|
|
281
299
|
"""Establish the four properties plus the pinned clock, in the one order that makes them true.
|
|
282
300
|
|
|
283
301
|
``allowed_paths`` first, because it is what will let the bound view read the one file once the
|
|
@@ -298,9 +316,9 @@ def _confine(connection: Any, *, table_path: Path, duckdb: Any) -> None:
|
|
|
298
316
|
five must not answer.
|
|
299
317
|
"""
|
|
300
318
|
|
|
301
|
-
|
|
319
|
+
admitted = ", ".join(_path_literal(path) for path in table_paths)
|
|
302
320
|
settings = (
|
|
303
|
-
f"set allowed_paths = [
|
|
321
|
+
f"set allowed_paths = [{admitted}]",
|
|
304
322
|
"set enable_external_access = false",
|
|
305
323
|
f"set memory_limit = '{MEMORY_LIMIT}'",
|
|
306
324
|
"set TimeZone = 'UTC'",
|
|
@@ -316,6 +334,17 @@ def _confine(connection: Any, *, table_path: Path, duckdb: Any) -> None:
|
|
|
316
334
|
) from error
|
|
317
335
|
|
|
318
336
|
|
|
337
|
+
def _path_literal(path: Path) -> str:
|
|
338
|
+
"""One local path as a single-quoted SQL literal, with its own quotes doubled.
|
|
339
|
+
|
|
340
|
+
The path never comes from ``sql`` -- property 3 -- so this is not an escaping defence against
|
|
341
|
+
the caller; it is what keeps a path a legal literal when the container's own scratch directory
|
|
342
|
+
contains an apostrophe.
|
|
343
|
+
"""
|
|
344
|
+
|
|
345
|
+
return "'" + str(path).replace("'", "''") + "'"
|
|
346
|
+
|
|
347
|
+
|
|
319
348
|
def _require_single_statement(connection: Any, sql: str, *, duckdb: Any) -> None:
|
|
320
349
|
"""Ask DuckDB's own parser how many statements this is.
|
|
321
350
|
|
|
@@ -342,18 +371,19 @@ def _require_single_statement(connection: Any, sql: str, *, duckdb: Any) -> None
|
|
|
342
371
|
def execute_bounded_query(
|
|
343
372
|
*,
|
|
344
373
|
sql: str,
|
|
345
|
-
|
|
374
|
+
table_paths: Sequence[Path],
|
|
346
375
|
max_rows: int,
|
|
347
376
|
deadline_seconds: float,
|
|
348
377
|
max_result_bytes: int = QUERY_RESULT_MAX_BYTES,
|
|
349
378
|
monotonic: Callable[[], float] = time.monotonic,
|
|
350
379
|
timer_factory: Callable[[float, Callable[[], None]], Any] = threading.Timer,
|
|
351
380
|
) -> BoundedQueryResult:
|
|
352
|
-
"""Answer one bounded statement against one
|
|
381
|
+
"""Answer one bounded statement against one table version's parts, inside the four properties.
|
|
353
382
|
|
|
354
|
-
``
|
|
355
|
-
|
|
356
|
-
|
|
383
|
+
``table_paths`` are the local files the claim loop downloaded this version's selected parts
|
|
384
|
+
into -- one for a v1 version, and whatever Studio's ``prune`` block selected for a partitioned
|
|
385
|
+
one. They are the ONLY file names this function composes, and they are composed from this
|
|
386
|
+
argument and never from ``sql``.
|
|
357
387
|
|
|
358
388
|
``timer_factory`` exists so the deadline can be asserted without spending one: it decides WHEN
|
|
359
389
|
the engine is interrupted and can neither weaken nor widen anything the connection is confined
|
|
@@ -372,11 +402,25 @@ def execute_bounded_query(
|
|
|
372
402
|
f"a bounded query runs under a row cap of 1..{MAX_QUERY_ROWS}; this one asked for "
|
|
373
403
|
f"{max_rows}",
|
|
374
404
|
)
|
|
375
|
-
|
|
376
|
-
|
|
405
|
+
if len(table_paths) > MAX_QUERY_PARTS:
|
|
406
|
+
raise HostedWorkerError(
|
|
407
|
+
"QUERY_TOO_MANY_PARTS",
|
|
408
|
+
f"this question binds {len(table_paths)} parts against a ceiling of "
|
|
409
|
+
f"{MAX_QUERY_PARTS}; narrow it with a prune block naming a field range or a partition",
|
|
410
|
+
)
|
|
411
|
+
if not table_paths:
|
|
412
|
+
raise HostedWorkerError(
|
|
413
|
+
"QUERY_TABLE_UNAVAILABLE",
|
|
414
|
+
"this question selected no part of the table; a prune block that matches nothing has "
|
|
415
|
+
"no rows to read and no schema to bind",
|
|
416
|
+
)
|
|
417
|
+
resolved = [path.resolve() for path in table_paths]
|
|
418
|
+
missing = [path for path in resolved if not path.is_file()]
|
|
419
|
+
if missing:
|
|
377
420
|
raise HostedWorkerError(
|
|
378
421
|
"QUERY_TABLE_UNAVAILABLE",
|
|
379
|
-
"this
|
|
422
|
+
f"{len(missing)} of this version's {len(resolved)} parts are not on local disk; the "
|
|
423
|
+
"download did not produce every file",
|
|
380
424
|
)
|
|
381
425
|
started = monotonic()
|
|
382
426
|
|
|
@@ -392,9 +436,9 @@ def execute_bounded_query(
|
|
|
392
436
|
"QUERY_ENGINE_UNCONFINED", f"the engine would not start: {_sentence(error)}"
|
|
393
437
|
) from error
|
|
394
438
|
try:
|
|
439
|
+
listed = ", ".join(_path_literal(path) for path in resolved)
|
|
395
440
|
builder.execute(
|
|
396
|
-
f"create view {BOUND_VIEW_NAME} as "
|
|
397
|
-
f"select * from read_parquet('{str(resolved).replace(chr(39), chr(39) * 2)}')"
|
|
441
|
+
f"create view {BOUND_VIEW_NAME} as select * from read_parquet([{listed}])"
|
|
398
442
|
)
|
|
399
443
|
except duckdb.Error as error:
|
|
400
444
|
raise HostedWorkerError(
|
|
@@ -412,7 +456,7 @@ def execute_bounded_query(
|
|
|
412
456
|
f"the engine would not re-open read-only: {_sentence(error)}",
|
|
413
457
|
) from error
|
|
414
458
|
try:
|
|
415
|
-
_confine(connection,
|
|
459
|
+
_confine(connection, table_paths=resolved, duckdb=duckdb)
|
|
416
460
|
_require_single_statement(connection, sql, duckdb=duckdb)
|
|
417
461
|
remaining = deadline_seconds - (monotonic() - started)
|
|
418
462
|
if remaining <= 0:
|
|
@@ -650,6 +694,7 @@ __all__ = [
|
|
|
650
694
|
"FETCH_CHUNK_ROWS",
|
|
651
695
|
"MATERIALIZATION_FACTOR",
|
|
652
696
|
"MAX_FAILURE_DETAIL",
|
|
697
|
+
"MAX_QUERY_PARTS",
|
|
653
698
|
"MAX_QUERY_ROWS",
|
|
654
699
|
"MEMORY_LIMIT",
|
|
655
700
|
"QUERY_ENGINE_REFUSED",
|
|
@@ -660,6 +705,7 @@ __all__ = [
|
|
|
660
705
|
"QUERY_STATEMENT_NOT_SINGLE",
|
|
661
706
|
"QUERY_TABLE_UNAVAILABLE",
|
|
662
707
|
"QUERY_TIMEOUT",
|
|
708
|
+
"QUERY_TOO_MANY_PARTS",
|
|
663
709
|
"WORKER_REFUSAL_CODES",
|
|
664
710
|
"BoundedQueryError",
|
|
665
711
|
"BoundedQueryResult",
|