mostlyright-data 0.10.1__tar.gz → 0.10.2__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.10.1 → mostlyright_data-0.10.2}/PKG-INFO +1 -1
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/pyproject.toml +1 -1
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/skills/mr-data-build/SKILL.md +18 -15
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/sandbox.py +61 -80
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/cli.py +4 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/formats.py +38 -23
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_bootstrap.py +37 -2
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler.py +32 -6
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler_job.py +10 -2
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_ingestion_job.py +22 -3
- mostlyright_data-0.10.2/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +123 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_run_worker.py +8 -77
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_session_container_smoke.py +5 -3
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_session_worker.py +21 -8
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/inprocess_acquisition.py +33 -19
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/pipeline.py +8 -1
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/adapters.py +6 -1
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sql_transform_engine.py +41 -8
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/studio_boundary.py +1 -1
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/router.py +11 -1
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4.py +24 -0
- mostlyright_data-0.10.2/src/mostlyright/data_harness/thin/v4_dataset_covers.py +142 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_query.py +2 -2
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_runs.py +11 -8
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/vocabulary.py +9 -4
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/remediation.py +1 -1
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/render.py +1 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_acquisition.py +22 -48
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/.gitignore +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/README.md +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/scripts/hatch_build.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/skills/mr-data-build/agents/openai.yaml +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/http.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/agent_runtime.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/protocol.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/reference.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/registry.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/bounded_query.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/canonical.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/catalog_job.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/coordinator.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/crosswalks.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/declared_checks.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/deploy.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/deploy_target.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/capture.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/lane.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/ocr.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/pdf.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/registry.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/selections.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/tables.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/event_presentation.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/events.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/fast_delimited.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/fleet.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/governors.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_worker.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ingestion/store.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/key_seam.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/local_search/service.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/document.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/status.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/notebook.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/offline.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/operation_registry.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/operator_setup.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/plan_graph.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/engine.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/errors.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/gates.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/joins.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/profile.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/table.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/progress_events.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/budgets.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/containers.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/delimited.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/registry.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/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.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/samples.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/tabular.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/vector.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/recipe.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/repair/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/repair/adapters.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/repair/contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/repair/errors.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/review.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/rowset.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/run_execution_v4.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/serving.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/serving_edge.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/serving_http.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/session_probes.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/signing.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/skill_assets.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/source_discovery.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/cadence.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/collections.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/dataset.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/deletion.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/fitness.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/governance.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/hosted.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/integration.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/registry.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/sports.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/stream_venue.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/acquire.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/approvals.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/commands.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/download.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/narrative.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/parity.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/probe.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/propose.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/recipe.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/research.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/runs.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/session.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/stream.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/transport.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/v4_tables.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/thin/workers.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/unit_flow.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/units.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/approve.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/credentials.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/diffing.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/headline.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/inventory.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/local_review.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/login.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/peek.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/preflight.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/readers.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/ux/workload.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_recipe.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_required_controls.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/v4_transform.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/viewer.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/query.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/store.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
- {mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/watch.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mostlyright-data
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.2
|
|
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/
|
|
@@ -92,7 +92,7 @@ here, then the ones that do not, grouped by why.
|
|
|
92
92
|
|
|
93
93
|
## Commands
|
|
94
94
|
|
|
95
|
-
These twenty-
|
|
95
|
+
These twenty-two are the whole surface a hosted install runs. Every other name in
|
|
96
96
|
[Hosted parity](../../docs/HOSTED-PARITY.md) refuses here.
|
|
97
97
|
|
|
98
98
|
| Command | What it does |
|
|
@@ -102,9 +102,10 @@ These twenty-one are the whole surface a hosted install runs. Every other name i
|
|
|
102
102
|
| `mr-data whoami` | Use the compatibility alias for the remotely validated `auth status` answer. |
|
|
103
103
|
| `mr-data probe` | Ask one registered source one question and print the answer. **Currently unusable:** it reaches `/v3/sessions`, which Studio refuses, and it takes a question identifier that no v4 receipt returns. Do not plan a source inspection around it. |
|
|
104
104
|
| `mr-data recipe` | Register one recipe document — dataset, question, table plan, sources, transform, checks and units — in one call, and print the identifiers the server derived. `mr-data recipe show ID` reads one back. |
|
|
105
|
-
| `mr-data
|
|
106
|
-
| `mr-data
|
|
107
|
-
| `mr-data
|
|
105
|
+
| `mr-data cover` | Generate and attach one branded 1200×630 dataset cover. Give it the dataset ID and what the image should depict; Studio fixes the model, single-color style, curated random palette, dimensions and storage. |
|
|
106
|
+
| `mr-data run` | Start one run against a registered recipe: `--sample`, `--full`, `--refresh` or `--backfill`, under `--max-rows`, `--max-source-bytes` and `--window`. A large run is held for a spend confirmation, which `--confirm` settles; a sample-first held full requires Studio's interactive human approval instead. `--cancel RUN` stops one. |
|
|
107
|
+
| `mr-data status` | Report which of the seven states one run is in, what it delivered and whether a ceiling cut it short, and — on a failure — what failed and where. Exits non-zero on a failed run. |
|
|
108
|
+
| `mr-data runs` | Report this workspace's own runs: identifier, mode, state and creation time, plus the failure triple of any that failed. `--status` and `--mode` narrow it and are refused for a word outside the seven or the four; `--limit` says how many, and pages are followed to reach it. |
|
|
108
109
|
| `mr-data watch` | Stream one run's live progress under the durable event type of each stage, resuming across stream cuts. Exits non-zero when the run failed. |
|
|
109
110
|
| `mr-data query` | Run one bounded read-only SQL statement over a finished run's own table and print the rows. Bounded on rows, on answer bytes and on time, and refused by name when a bound is crossed. |
|
|
110
111
|
| `mr-data peek` | Print the columns, types and first rows of one run's table. |
|
|
@@ -119,11 +120,10 @@ These twenty-one are the whole surface a hosted install runs. Every other name i
|
|
|
119
120
|
| `mr-data unpin` | Resume tracking the latest passing version. |
|
|
120
121
|
| `mr-data demote` | Detach the schedule and withdraw the live pointer. |
|
|
121
122
|
|
|
122
|
-
`auth`, `login` and `whoami` are the same implementation in both profiles. The other
|
|
123
|
-
answer from Studio
|
|
124
|
-
`
|
|
125
|
-
|
|
126
|
-
`pin`, `unpin` and `demote`.
|
|
123
|
+
`auth`, `login` and `whoami` are the same implementation in both profiles. The other nineteen
|
|
124
|
+
answer from Studio. Eight only read: `status`, `runs`, `watch`, `peek`, `receipt`, `checks`,
|
|
125
|
+
`download` and `diff`. Eleven start or change something: `recipe`, `cover`, `run`, `query`,
|
|
126
|
+
`probe`, `keys`, `open`, `promote`, `pin`, `unpin` and `demote`.
|
|
127
127
|
|
|
128
128
|
**Any successful run is readable straight away.** There is no approval, no admission and no release
|
|
129
129
|
step between a run finishing and reading it: `download`, `receipt`, `checks`, `peek` and `query`
|
|
@@ -528,12 +528,15 @@ proved, and a run that emitted none produces the same build as a run that emitte
|
|
|
528
528
|
Never turn a progress count into a percentage, never infer activity from elapsed time, and never
|
|
529
529
|
cite a progress event where a receipt is what is being asked for.
|
|
530
530
|
|
|
531
|
-
**
|
|
532
|
-
`failed` or `cancelled`. Three of them are terminal and
|
|
533
|
-
`cancelled`. `awaiting_confirmation` is the spend
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
531
|
+
**Seven states, one machine.** A run is `queued`, `running`, `awaiting_confirmation`,
|
|
532
|
+
`awaiting_sample_approval`, `succeeded`, `failed` or `cancelled`. Three of them are terminal and
|
|
533
|
+
end a watch: `succeeded`, `failed` and `cancelled`. `awaiting_confirmation` is the ordinary spend
|
|
534
|
+
gate: nothing has been executed, and `mr-data run --confirm RUN` releases it.
|
|
535
|
+
`awaiting_sample_approval` is different: a bounded sample must seal a downloadable
|
|
536
|
+
`table_parquet`, then a person completes Studio's fresh operation-bound interactive approval before
|
|
537
|
+
the linked full run dispatches. Do not present `--confirm` as an alternative for that state. Keep
|
|
538
|
+
the raw state internal. Say what product decision is needed and give the person the single action
|
|
539
|
+
that lets the build continue.
|
|
537
540
|
|
|
538
541
|
**A failed run always carries the same three members** — `failure_code`, `failure_detail` and
|
|
539
542
|
`failed_stage` — and carries them on three surfaces: the run record, the terminal event on the
|
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import base64
|
|
6
6
|
import contextlib
|
|
7
|
+
import errno
|
|
7
8
|
import fcntl
|
|
8
9
|
import ipaddress
|
|
9
10
|
import json
|
|
@@ -74,7 +75,6 @@ from mostlyright.data_harness.formats import (
|
|
|
74
75
|
)
|
|
75
76
|
from mostlyright.data_harness.linux_process_boundary import (
|
|
76
77
|
_close_landlock_runtime_roots,
|
|
77
|
-
_disable_process_dumpability,
|
|
78
78
|
_install_landlock_filesystem_confinement,
|
|
79
79
|
_install_landlock_filesystem_confinement_from_coordinates,
|
|
80
80
|
_install_networkless_seccomp,
|
|
@@ -566,38 +566,18 @@ class CrawlerSandbox:
|
|
|
566
566
|
if external_network_policy_attestation is not None:
|
|
567
567
|
_require_digest(external_network_policy_attestation, "external network policy")
|
|
568
568
|
self._external_network_policy_attestation = external_network_policy_attestation
|
|
569
|
-
if
|
|
569
|
+
if child_address_space_bytes is None:
|
|
570
|
+
child_address_space_bytes = READER_WORKER_MEMORY_BYTES
|
|
571
|
+
if (
|
|
572
|
+
type(child_address_space_bytes) is not int
|
|
573
|
+
or not MIN_CHILD_ADDRESS_SPACE_BYTES
|
|
574
|
+
<= child_address_space_bytes
|
|
575
|
+
<= MAX_CHILD_ADDRESS_SPACE_BYTES
|
|
576
|
+
):
|
|
570
577
|
raise AcquisitionSecurityError(
|
|
571
578
|
"SANDBOX_MEMORY_BOUNDARY",
|
|
572
|
-
"
|
|
579
|
+
"the child address-space ceiling is outside the reviewed range",
|
|
573
580
|
)
|
|
574
|
-
if memory_cgroup_root_fd is not None:
|
|
575
|
-
_require_bounded_cgroup_root(memory_cgroup_root_fd)
|
|
576
|
-
if hosted_session_container_memory_bytes is not None:
|
|
577
|
-
try:
|
|
578
|
-
_disable_process_dumpability()
|
|
579
|
-
except OSError as error:
|
|
580
|
-
raise AcquisitionSecurityError(
|
|
581
|
-
"SANDBOX_OS_BOUNDARY",
|
|
582
|
-
"hosted-session coordinator process hardening is unavailable",
|
|
583
|
-
) from error
|
|
584
|
-
_require_hosted_session_container_boundary(hosted_session_container_memory_bytes)
|
|
585
|
-
if child_address_space_bytes is not None:
|
|
586
|
-
if memory_cgroup_root_fd is not None:
|
|
587
|
-
raise AcquisitionSecurityError(
|
|
588
|
-
"SANDBOX_MEMORY_BOUNDARY",
|
|
589
|
-
"delegated and address-space memory boundaries are mutually exclusive",
|
|
590
|
-
)
|
|
591
|
-
if (
|
|
592
|
-
type(child_address_space_bytes) is not int
|
|
593
|
-
or not MIN_CHILD_ADDRESS_SPACE_BYTES
|
|
594
|
-
<= child_address_space_bytes
|
|
595
|
-
<= MAX_CHILD_ADDRESS_SPACE_BYTES
|
|
596
|
-
):
|
|
597
|
-
raise AcquisitionSecurityError(
|
|
598
|
-
"SANDBOX_MEMORY_BOUNDARY",
|
|
599
|
-
"the child address-space ceiling is outside the reviewed range",
|
|
600
|
-
)
|
|
601
581
|
self._memory_cgroup_root_fd = memory_cgroup_root_fd
|
|
602
582
|
self._hosted_session_container_memory_bytes = hosted_session_container_memory_bytes
|
|
603
583
|
self._child_address_space_bytes = child_address_space_bytes
|
|
@@ -1163,18 +1143,6 @@ class CrawlerSandbox:
|
|
|
1163
1143
|
# ceiling says a decode cannot take the coordinator down with it. Until an address-space
|
|
1164
1144
|
# bound existed there was no way to state the second without a delegated cgroup, which is
|
|
1165
1145
|
# why this arm could not be written before.
|
|
1166
|
-
if (
|
|
1167
|
-
self._external_network_policy_attestation is None
|
|
1168
|
-
and self._hosted_session_container_memory_bytes is None
|
|
1169
|
-
and self._child_address_space_bytes is None
|
|
1170
|
-
):
|
|
1171
|
-
raise AcquisitionSecurityError(
|
|
1172
|
-
"SANDBOX_OS_BOUNDARY",
|
|
1173
|
-
(
|
|
1174
|
-
"crawler execution requires an explicit externally enforced "
|
|
1175
|
-
"deny-default network policy attestation"
|
|
1176
|
-
),
|
|
1177
|
-
)
|
|
1178
1146
|
return _WorkerLaunch(
|
|
1179
1147
|
command=tuple(command),
|
|
1180
1148
|
cwd=self._staging_root,
|
|
@@ -1185,18 +1153,20 @@ class CrawlerSandbox:
|
|
|
1185
1153
|
def _operation_refusal(self, operation: str) -> AcquisitionSecurityError | None:
|
|
1186
1154
|
"""The refusals that depend on WHICH operation this confinement is asked for.
|
|
1187
1155
|
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
no cgroup job at all, so the only ceiling is the container the coordinator itself lives in
|
|
1192
|
-
and a decoder that overran it would take the coordinator and the run's own reporting with
|
|
1193
|
-
it. Off Linux there is no cgroup to build a job from in the first place.
|
|
1156
|
+
Linux is the sole clean-room implementation. It is where a child gets both its
|
|
1157
|
+
``RLIMIT_AS`` ceiling and seccomp boundary; every other launcher would be an ordinary
|
|
1158
|
+
subprocess, regardless of whether a caller supplied an egress attestation.
|
|
1194
1159
|
|
|
1195
1160
|
Returned rather than raised so the same decision can be REPORTED without being taken --
|
|
1196
1161
|
see :meth:`confinement_refusal`. A caller that has to know whether a decode is admissible
|
|
1197
1162
|
before it spends a fetch cannot find out by attempting one.
|
|
1198
1163
|
"""
|
|
1199
1164
|
|
|
1165
|
+
if sys.platform != "linux":
|
|
1166
|
+
return AcquisitionSecurityError(
|
|
1167
|
+
"SANDBOX_OS_BOUNDARY",
|
|
1168
|
+
"clean-room execution requires the Linux RLIMIT_AS and seccomp boundaries",
|
|
1169
|
+
)
|
|
1200
1170
|
# THE ADDRESS-SPACE CEILING ADMITS A DECODE; THE HOSTED-SESSION CONTAINER DOES NOT, and
|
|
1201
1171
|
# the difference is which process dies. Under the container bound the child has no ceiling
|
|
1202
1172
|
# of its own, so a runaway decode takes the coordinator with it and the run reports
|
|
@@ -1205,24 +1175,11 @@ class CrawlerSandbox:
|
|
|
1205
1175
|
# reason a per-child bound is required for a Reader and a container limit is not enough.
|
|
1206
1176
|
if (
|
|
1207
1177
|
self._hosted_session_container_memory_bytes is not None
|
|
1208
|
-
and
|
|
1209
|
-
and operation not in HOSTED_SESSION_CONTAINER_OPERATIONS
|
|
1178
|
+
and operation in NETWORK_PERFORMING_OPERATIONS
|
|
1210
1179
|
):
|
|
1211
1180
|
return AcquisitionSecurityError(
|
|
1212
1181
|
"SANDBOX_OS_BOUNDARY",
|
|
1213
|
-
"the hosted-session
|
|
1214
|
-
"confinement admits no-network parsing and nothing else",
|
|
1215
|
-
)
|
|
1216
|
-
# Was darwin-only, and is now every host that is not Linux. The refusal never really
|
|
1217
|
-
# was about macOS: it was about there being no cgroup to bound a Reader's memory with,
|
|
1218
|
-
# which is true of every host without cgroups v2. Seatbelt used to make macOS the one
|
|
1219
|
-
# non-Linux host that got this far with a boundary of its own; with it gone (ADR 0021
|
|
1220
|
-
# ADR 0021) there is no reason to keep naming one platform. The typed code is unchanged,
|
|
1221
|
-
# because ``SANDBOX_MEMORY_BOUNDARY`` is what callers and receipts already read.
|
|
1222
|
-
if operation in READER_PERFORMING_OPERATIONS and sys.platform != "linux":
|
|
1223
|
-
return AcquisitionSecurityError(
|
|
1224
|
-
"SANDBOX_MEMORY_BOUNDARY",
|
|
1225
|
-
"Clean room Reader execution has no enforceable memory boundary off Linux",
|
|
1182
|
+
"the hosted-session clean room is networkless and cannot perform retrieval",
|
|
1226
1183
|
)
|
|
1227
1184
|
return None
|
|
1228
1185
|
|
|
@@ -1241,16 +1198,6 @@ class CrawlerSandbox:
|
|
|
1241
1198
|
def _memory_boundary_refusal(self) -> AcquisitionSecurityError | None:
|
|
1242
1199
|
"""Whether this confinement can bound a child's memory at all, for any operation."""
|
|
1243
1200
|
|
|
1244
|
-
if (
|
|
1245
|
-
sys.platform == "linux"
|
|
1246
|
-
and self._memory_cgroup_root_fd is None
|
|
1247
|
-
and self._hosted_session_container_memory_bytes is None
|
|
1248
|
-
and self._child_address_space_bytes is None
|
|
1249
|
-
):
|
|
1250
|
-
return AcquisitionSecurityError(
|
|
1251
|
-
"SANDBOX_MEMORY_BOUNDARY",
|
|
1252
|
-
"Linux Clean room execution requires a trusted bounded cgroup root",
|
|
1253
|
-
)
|
|
1254
1201
|
return None
|
|
1255
1202
|
|
|
1256
1203
|
def confinement_refusal(self, operation: str) -> AcquisitionSecurityError | None:
|
|
@@ -1350,7 +1297,10 @@ class CrawlerSandbox:
|
|
|
1350
1297
|
prepared,
|
|
1351
1298
|
request_bytes=request_bytes,
|
|
1352
1299
|
timeout_seconds=self._timeout_seconds,
|
|
1353
|
-
terminate_process_group=(
|
|
1300
|
+
terminate_process_group=(
|
|
1301
|
+
self._hosted_session_container_memory_bytes is not None
|
|
1302
|
+
or self._child_is_networkless()
|
|
1303
|
+
),
|
|
1354
1304
|
)
|
|
1355
1305
|
if returncode != 0:
|
|
1356
1306
|
refusal = _bounded_worker_error(stderr, returncode=returncode)
|
|
@@ -1488,6 +1438,27 @@ def worker_main(*, prewarm: bool = False) -> int:
|
|
|
1488
1438
|
except (AcquisitionSecurityError, ValueError, TypeError) as exc:
|
|
1489
1439
|
code = getattr(exc, "code", "SANDBOX_REQUEST")
|
|
1490
1440
|
return _worker_error(code, str(exc))
|
|
1441
|
+
# ``RLIMIT_AS`` is the production per-child memory boundary on Cloud Run: the
|
|
1442
|
+
# platform supplies no writable cgroup subtree for a batch parser. An
|
|
1443
|
+
# allocation refused by that boundary is an expected, safely actionable
|
|
1444
|
+
# terminal condition, not an unmapped implementation defect. Preserve no
|
|
1445
|
+
# exception text -- allocation errors can arise deep in a native decoder --
|
|
1446
|
+
# but give Studio the stable code it needs to report the failure truthfully.
|
|
1447
|
+
except MemoryError:
|
|
1448
|
+
return _worker_error(
|
|
1449
|
+
"SANDBOX_MEMORY_LIMIT",
|
|
1450
|
+
"the worker address-space limit refused an allocation",
|
|
1451
|
+
)
|
|
1452
|
+
except OSError as exc:
|
|
1453
|
+
if exc.errno == errno.ENOMEM:
|
|
1454
|
+
return _worker_error(
|
|
1455
|
+
"SANDBOX_MEMORY_LIMIT",
|
|
1456
|
+
"the worker address-space limit refused an allocation",
|
|
1457
|
+
)
|
|
1458
|
+
return _worker_error(
|
|
1459
|
+
"SANDBOX_UNEXPECTED",
|
|
1460
|
+
f"the worker raised {type(exc).__name__}, which no refusal maps",
|
|
1461
|
+
)
|
|
1491
1462
|
except Exception as exc:
|
|
1492
1463
|
return _worker_error(
|
|
1493
1464
|
"SANDBOX_UNEXPECTED",
|
|
@@ -3469,7 +3440,15 @@ def _probe_network_denials(
|
|
|
3469
3440
|
results: list[tuple[str, int]] = []
|
|
3470
3441
|
for label, ip, port in targets:
|
|
3471
3442
|
family = socket.AF_INET6 if ":" in ip else socket.AF_INET
|
|
3472
|
-
|
|
3443
|
+
# A networkless seccomp profile may reject the socket syscall itself rather than letting
|
|
3444
|
+
# it create a descriptor and rejecting connect(2). Both outcomes prove the same boundary;
|
|
3445
|
+
# socket construction therefore belongs in the typed denial path too. Leaving it outside
|
|
3446
|
+
# the try turned one valid kernel posture into SANDBOX_UNEXPECTED.
|
|
3447
|
+
try:
|
|
3448
|
+
probe = socket.socket(family, socket.SOCK_STREAM)
|
|
3449
|
+
except OSError as exc:
|
|
3450
|
+
results.append((label, exc.errno or 1))
|
|
3451
|
+
continue
|
|
3473
3452
|
try:
|
|
3474
3453
|
probe.settimeout(0.25)
|
|
3475
3454
|
error = probe.connect_ex((ip, port))
|
|
@@ -3890,8 +3869,8 @@ def _drain_worker_ipc(
|
|
|
3890
3869
|
"The Clean room process returned more data than this job allows",
|
|
3891
3870
|
)
|
|
3892
3871
|
|
|
3893
|
-
#
|
|
3894
|
-
#
|
|
3872
|
+
# Networkless children may fork bounded parser helpers, but no helper may outlive the one
|
|
3873
|
+
# request. Signal the still-owned process group before reaping its leader: this covers
|
|
3895
3874
|
# the success path, catches descendants that deliberately closed all inherited pipes, and
|
|
3896
3875
|
# avoids signalling a numeric group id after the leader pid could have been reused.
|
|
3897
3876
|
if terminate_process_group:
|
|
@@ -4920,10 +4899,10 @@ def _prepare_worker(
|
|
|
4920
4899
|
raise error
|
|
4921
4900
|
if isinstance(error, AcquisitionSecurityError):
|
|
4922
4901
|
raise
|
|
4923
|
-
if hosted_session_container_memory_bytes is not None:
|
|
4902
|
+
if hosted_session_container_memory_bytes is not None or networkless_child:
|
|
4924
4903
|
raise AcquisitionSecurityError(
|
|
4925
4904
|
"SANDBOX_OS_BOUNDARY",
|
|
4926
|
-
"
|
|
4905
|
+
"networkless process boundary could not be established before exec",
|
|
4927
4906
|
) from error
|
|
4928
4907
|
raise AcquisitionSecurityError(
|
|
4929
4908
|
"SANDBOX_MEMORY_BOUNDARY",
|
|
@@ -5190,7 +5169,9 @@ def _run_worker_command(
|
|
|
5190
5169
|
prepared,
|
|
5191
5170
|
request_bytes=request_bytes,
|
|
5192
5171
|
timeout_seconds=timeout_seconds,
|
|
5193
|
-
terminate_process_group=
|
|
5172
|
+
terminate_process_group=(
|
|
5173
|
+
hosted_session_container_memory_bytes is not None or networkless_child
|
|
5174
|
+
),
|
|
5194
5175
|
)
|
|
5195
5176
|
|
|
5196
5177
|
|
|
@@ -2029,6 +2029,10 @@ def _parser(
|
|
|
2029
2029
|
|
|
2030
2030
|
_recipe.declare_arguments(_add("recipe", help=_recipe.COMMAND_HELP))
|
|
2031
2031
|
|
|
2032
|
+
from mostlyright.data_harness.thin import v4_dataset_covers as _v4_dataset_covers
|
|
2033
|
+
|
|
2034
|
+
_v4_dataset_covers.declare_arguments(_add("cover", help=_v4_dataset_covers.COMMAND_HELP))
|
|
2035
|
+
|
|
2032
2036
|
# The commands that read a run back once it has finished, declared the same way and for the
|
|
2033
2037
|
# same reason: one declaration, two front doors, no argument that can differ between them.
|
|
2034
2038
|
from mostlyright.data_harness.thin import v4_artifacts as _v4_artifacts
|
|
@@ -46,6 +46,7 @@ __all__ = [
|
|
|
46
46
|
"SNAPSHOT_SUFFIXES",
|
|
47
47
|
"SNAPSHOT_SUFFIX_PATTERN",
|
|
48
48
|
"WEAK_TEXT_MEDIA_TYPES",
|
|
49
|
+
"resolve_direct_data_format",
|
|
49
50
|
]
|
|
50
51
|
|
|
51
52
|
# The label of the Reader contract a recipe pins itself to. A Reader family is the code
|
|
@@ -153,32 +154,17 @@ DIRECT_FETCH_MEDIA_TYPES: Mapping[str, frozenset[str]] = MappingProxyType(
|
|
|
153
154
|
}
|
|
154
155
|
)
|
|
155
156
|
|
|
156
|
-
#
|
|
157
|
-
#
|
|
158
|
-
#
|
|
159
|
-
|
|
160
|
-
# what the response actually carried, through the inverse of the map above. That inverse is only
|
|
161
|
-
# a function over the set below.
|
|
162
|
-
#
|
|
163
|
-
# ``text/plain`` is accepted for every text-shaped format, so an inverse taken over ``csv``,
|
|
164
|
-
# ``json`` and ``ndjson`` at once would have to answer one weak label with three formats and pick
|
|
165
|
-
# between them -- which is a guess wearing a table's clothes. Narrowing the domain is what makes
|
|
166
|
-
# the inverse total and unambiguous instead of merely plausible.
|
|
167
|
-
#
|
|
168
|
-
# One member today, and that is three independent constraints rather than a preference: a
|
|
169
|
-
# transform plan admits exactly one input encoding, the only bridge from any other encoding into
|
|
170
|
-
# it is a Reader family, and the in-process acquisition path refuses a Reader-pinned source
|
|
171
|
-
# outright. A second member becomes admissible only when all three of those move, and the
|
|
172
|
-
# derivation below REFUSES rather than choosing if one is added while a label stays shared.
|
|
173
|
-
INFERRED_DATA_FORMATS: frozenset[str] = frozenset({"csv"})
|
|
157
|
+
# Formats that direct, unpinned fetches can resolve after receiving their response. This is
|
|
158
|
+
# deliberately a literal closed set: adding a parser format is not enough to make it a native
|
|
159
|
+
# direct format; its fetch resolution and DuckDB dispatch must move with it.
|
|
160
|
+
INFERRED_DATA_FORMATS: frozenset[str] = frozenset({"csv", "json", "ndjson", "parquet"})
|
|
174
161
|
|
|
175
162
|
|
|
176
163
|
def _inverted_media_types(data_formats: frozenset[str]) -> dict[str, str]:
|
|
177
|
-
"""Invert
|
|
164
|
+
"""Invert the strong media-type table over ``data_formats``, refusing a shared label.
|
|
178
165
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
fetchable, and the two directions cannot come to disagree about one label.
|
|
166
|
+
``text/plain`` is a weak label shared by text formats. It therefore cannot appear in this
|
|
167
|
+
table: it is resolved only from a bounded content prefix after fetch.
|
|
182
168
|
|
|
183
169
|
Taking the set as an argument rather than reading the constant is what lets the shared-label
|
|
184
170
|
refusal be exercised: it is unreachable while the domain has one member, and a guard nothing
|
|
@@ -187,7 +173,7 @@ def _inverted_media_types(data_formats: frozenset[str]) -> dict[str, str]:
|
|
|
187
173
|
|
|
188
174
|
inverse: dict[str, str] = {}
|
|
189
175
|
for data_format in sorted(data_formats):
|
|
190
|
-
accepted =
|
|
176
|
+
accepted = FORMAT_MEDIA_TYPES.get(data_format)
|
|
191
177
|
if accepted is None:
|
|
192
178
|
raise ValueError(
|
|
193
179
|
f"{data_format} has no accepted media types, so nothing can be read back into it"
|
|
@@ -212,6 +198,35 @@ MEDIA_TYPE_DATA_FORMATS: Mapping[str, str] = MappingProxyType(
|
|
|
212
198
|
_inverted_media_types(INFERRED_DATA_FORMATS)
|
|
213
199
|
)
|
|
214
200
|
|
|
201
|
+
|
|
202
|
+
def resolve_direct_data_format(media_type: str, content: bytes) -> str | None:
|
|
203
|
+
"""Resolve an unpinned direct response without guessing from an ambiguous weak label."""
|
|
204
|
+
|
|
205
|
+
normalized = str(media_type).split(";", 1)[0].strip().lower()
|
|
206
|
+
for data_format, accepted in FORMAT_MEDIA_TYPES.items():
|
|
207
|
+
if normalized in accepted:
|
|
208
|
+
return data_format
|
|
209
|
+
if normalized not in WEAK_TEXT_MEDIA_TYPES:
|
|
210
|
+
return None
|
|
211
|
+
|
|
212
|
+
sample = content[: 64 * 1024].lstrip()
|
|
213
|
+
if sample.startswith(b"["):
|
|
214
|
+
return "json"
|
|
215
|
+
if sample.startswith(b"{"):
|
|
216
|
+
return "ndjson"
|
|
217
|
+
try:
|
|
218
|
+
lines = sample.decode("utf-8").splitlines()
|
|
219
|
+
except UnicodeDecodeError:
|
|
220
|
+
return None
|
|
221
|
+
nonempty = [line for line in lines if line.strip()]
|
|
222
|
+
if len(nonempty) < 2:
|
|
223
|
+
return None
|
|
224
|
+
header, first_row = nonempty[:2]
|
|
225
|
+
if header.count(",") > 0 and header.count(",") == first_row.count(","):
|
|
226
|
+
return "csv"
|
|
227
|
+
return None
|
|
228
|
+
|
|
229
|
+
|
|
215
230
|
# Filename suffixes accepted for each wire format. A format may carry more than one.
|
|
216
231
|
FORMAT_SUFFIXES: Mapping[str, frozenset[str]] = MappingProxyType(
|
|
217
232
|
{
|
{mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_bootstrap.py
RENAMED
|
@@ -850,6 +850,24 @@ def _validate_v4_bootstrap_response(value: dict[str, Any]) -> tuple[dict[str, by
|
|
|
850
850
|
if len(capability_raw) > MAX_CAPABILITY_BYTES:
|
|
851
851
|
raise HostedWorkerError("BOOTSTRAP_TOO_LARGE", "capability exceeds its byte limit")
|
|
852
852
|
parse_capability(capability_raw)
|
|
853
|
+
attempt_id = value["attempt_id"]
|
|
854
|
+
if not isinstance(attempt_id, str):
|
|
855
|
+
raise HostedWorkerError(
|
|
856
|
+
"BOOTSTRAP_RESPONSE_INVALID",
|
|
857
|
+
"v4 bootstrap attempt_id must be a canonical UUID",
|
|
858
|
+
)
|
|
859
|
+
try:
|
|
860
|
+
parsed_attempt_id = UUID(attempt_id)
|
|
861
|
+
except ValueError as error:
|
|
862
|
+
raise HostedWorkerError(
|
|
863
|
+
"BOOTSTRAP_RESPONSE_INVALID",
|
|
864
|
+
"v4 bootstrap attempt_id must be a canonical UUID",
|
|
865
|
+
) from error
|
|
866
|
+
if str(parsed_attempt_id) != attempt_id:
|
|
867
|
+
raise HostedWorkerError(
|
|
868
|
+
"BOOTSTRAP_RESPONSE_INVALID",
|
|
869
|
+
"v4 bootstrap attempt_id must be a canonical UUID",
|
|
870
|
+
)
|
|
853
871
|
job_raw = canonical_json_bytes(dict(job_wire))
|
|
854
872
|
if len(job_raw) > MAX_DESCRIPTOR_BYTES:
|
|
855
873
|
raise HostedWorkerError("BOOTSTRAP_TOO_LARGE", "worker job exceeds its byte limit")
|
|
@@ -866,7 +884,11 @@ def _validate_v4_bootstrap_response(value: dict[str, Any]) -> tuple[dict[str, by
|
|
|
866
884
|
"BOOTSTRAP_RESPONSE_INVALID",
|
|
867
885
|
"v4 job carries no canonical workspace id",
|
|
868
886
|
)
|
|
869
|
-
return {
|
|
887
|
+
return {
|
|
888
|
+
"job": job_raw,
|
|
889
|
+
"capability": capability_raw,
|
|
890
|
+
"attempt_id": attempt_id.encode("ascii"),
|
|
891
|
+
}, _V4AdmissionJob(workspace_id)
|
|
870
892
|
|
|
871
893
|
|
|
872
894
|
def _anonymous_payload(raw: bytes, label: str) -> _AnonymousPayload:
|
|
@@ -988,6 +1010,8 @@ def _worker_argv(
|
|
|
988
1010
|
"--capability-fd",
|
|
989
1011
|
str(payloads["capability"].descriptor),
|
|
990
1012
|
]
|
|
1013
|
+
if "attempt_id" in payloads:
|
|
1014
|
+
arguments.extend(("--attempt-id-fd", str(payloads["attempt_id"].descriptor)))
|
|
991
1015
|
return arguments
|
|
992
1016
|
|
|
993
1017
|
|
|
@@ -1357,7 +1381,18 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
1357
1381
|
)
|
|
1358
1382
|
)
|
|
1359
1383
|
except HostedWorkerError as error:
|
|
1360
|
-
|
|
1384
|
+
sys.stderr.buffer.write(
|
|
1385
|
+
canonical_json_bytes(
|
|
1386
|
+
{
|
|
1387
|
+
"status": "failed",
|
|
1388
|
+
"code": error.code,
|
|
1389
|
+
"detail": error.detail,
|
|
1390
|
+
"stage": "bootstrap",
|
|
1391
|
+
}
|
|
1392
|
+
)
|
|
1393
|
+
+ b"\n"
|
|
1394
|
+
)
|
|
1395
|
+
sys.stderr.flush()
|
|
1361
1396
|
return 1
|
|
1362
1397
|
return 0
|
|
1363
1398
|
|
{mostlyright_data-0.10.1 → mostlyright_data-0.10.2}/src/mostlyright/data_harness/hosted_crawler.py
RENAMED
|
@@ -34,7 +34,12 @@ from mostlyright.data_harness.canonical import (
|
|
|
34
34
|
parse_canonical_json,
|
|
35
35
|
sha256_bytes,
|
|
36
36
|
)
|
|
37
|
-
from mostlyright.data_harness.formats import
|
|
37
|
+
from mostlyright.data_harness.formats import (
|
|
38
|
+
DATA_FORMATS,
|
|
39
|
+
DIRECT_FETCH_MEDIA_TYPES,
|
|
40
|
+
FORMAT_SUFFIXES,
|
|
41
|
+
resolve_direct_data_format,
|
|
42
|
+
)
|
|
38
43
|
from mostlyright.data_harness.hosted_crawler_protocol import (
|
|
39
44
|
CRAWLER_REQUEST_SCHEMA_V3,
|
|
40
45
|
CRAWLER_RESULT_SCHEMA_V1,
|
|
@@ -480,7 +485,7 @@ def _public_https_query(value: Any) -> dict[str, Any]:
|
|
|
480
485
|
_canonical_url_host(url)
|
|
481
486
|
data_format = value["data_format"]
|
|
482
487
|
filename = value["filename"]
|
|
483
|
-
if data_format not in DATA_FORMATS:
|
|
488
|
+
if data_format not in DATA_FORMATS | {"auto"}:
|
|
484
489
|
raise HostedCrawlerError("CRAWLER_QUERY_INVALID", "public HTTPS format is unsupported")
|
|
485
490
|
if (
|
|
486
491
|
not isinstance(filename, str)
|
|
@@ -519,6 +524,10 @@ def _public_https_query(value: Any) -> dict[str, Any]:
|
|
|
519
524
|
"CRAWLER_QUERY_INVALID", "public HTTPS max_nesting_depth must be exactly 1"
|
|
520
525
|
)
|
|
521
526
|
if reader is not None:
|
|
527
|
+
if data_format == "auto":
|
|
528
|
+
raise HostedCrawlerError(
|
|
529
|
+
"CRAWLER_QUERY_INVALID", "a Reader pin must declare its output format"
|
|
530
|
+
)
|
|
522
531
|
if not isinstance(reader, dict) or set(reader) != {
|
|
523
532
|
"family_id",
|
|
524
533
|
"family_version",
|
|
@@ -560,13 +569,25 @@ def _public_expected_media_types(query: dict[str, Any]) -> tuple[str, ...]:
|
|
|
560
569
|
# admitted set from the pinned family, and a fetch with no pin has no recipe to
|
|
561
570
|
# protect, so the weak text label a public agency serves for CSV or JSON is
|
|
562
571
|
# admitted here or nowhere.
|
|
563
|
-
|
|
564
|
-
|
|
572
|
+
if query["data_format"] == "auto":
|
|
573
|
+
return tuple(sorted(set().union(*DIRECT_FETCH_MEDIA_TYPES.values())))
|
|
565
574
|
return tuple(sorted(DIRECT_FETCH_MEDIA_TYPES[query["data_format"]]))
|
|
566
575
|
family = TOOLBOX.resolve(reader["family_id"], reader["family_version"])
|
|
567
576
|
return family.accepted_media_types
|
|
568
577
|
|
|
569
578
|
|
|
579
|
+
def _resolve_direct_public_format(media_type: str, content: bytes) -> str | None:
|
|
580
|
+
return resolve_direct_data_format(media_type, content)
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
def _normalized_filename(filename: str, data_format: str) -> str:
|
|
584
|
+
suffixes = FORMAT_SUFFIXES[data_format]
|
|
585
|
+
if filename.endswith(tuple(suffixes)):
|
|
586
|
+
return filename
|
|
587
|
+
stem = filename.rsplit(".", 1)[0] if "." in filename else filename
|
|
588
|
+
return f"{stem}{sorted(suffixes)[0]}"
|
|
589
|
+
|
|
590
|
+
|
|
570
591
|
def _normalize_public_https_response(
|
|
571
592
|
request: HostedCrawlerRequest,
|
|
572
593
|
*,
|
|
@@ -593,9 +614,14 @@ def _normalize_public_https_response(
|
|
|
593
614
|
reader = query["reader_pin"]
|
|
594
615
|
if reader is None:
|
|
595
616
|
normalized = raw
|
|
596
|
-
normalized_format =
|
|
617
|
+
normalized_format = _resolve_direct_public_format(media_type, raw)
|
|
618
|
+
if normalized_format is None:
|
|
619
|
+
raise HostedCrawlerError(
|
|
620
|
+
"CRAWLER_FORMAT_UNRESOLVED",
|
|
621
|
+
"public HTTPS response did not provide a deterministic tabular format",
|
|
622
|
+
)
|
|
597
623
|
normalized_media_type = media_type
|
|
598
|
-
normalized_filename = query["filename"]
|
|
624
|
+
normalized_filename = _normalized_filename(query["filename"], normalized_format)
|
|
599
625
|
family_id = family_version = options_digest = None
|
|
600
626
|
decode_flags: list[str] = []
|
|
601
627
|
reader_budgets = None
|
|
@@ -1037,12 +1037,20 @@ def _validate_public_https_result(
|
|
|
1037
1037
|
query = request.query
|
|
1038
1038
|
reader = query.get("reader_pin")
|
|
1039
1039
|
if reader is None:
|
|
1040
|
+
from mostlyright.data_harness.hosted_crawler import (
|
|
1041
|
+
_normalized_filename,
|
|
1042
|
+
_resolve_direct_public_format,
|
|
1043
|
+
)
|
|
1044
|
+
|
|
1040
1045
|
reader_identity = (None, None, None)
|
|
1041
1046
|
expected_resource_caps = None
|
|
1042
1047
|
expected_reader_budgets = None
|
|
1048
|
+
resolved_format = _resolve_direct_public_format(retrieved.media_type, retrieved.content)
|
|
1049
|
+
if resolved_format is None:
|
|
1050
|
+
_fail("CRAWLER_CHILD_INVALID", "public HTTPS format could not be resolved")
|
|
1043
1051
|
direct_identity = (
|
|
1044
|
-
|
|
1045
|
-
query.get("filename"),
|
|
1052
|
+
resolved_format,
|
|
1053
|
+
_normalized_filename(query.get("filename", ""), resolved_format),
|
|
1046
1054
|
retrieved.media_type,
|
|
1047
1055
|
)
|
|
1048
1056
|
else:
|
|
@@ -322,7 +322,7 @@ def ingestion_job_main(argv: Sequence[str] | None = None) -> int:
|
|
|
322
322
|
try:
|
|
323
323
|
dispatch = parse_ingestion_dispatch(arguments)
|
|
324
324
|
except HostedIngestionJobError as error:
|
|
325
|
-
|
|
325
|
+
_write_terminal_failure(error)
|
|
326
326
|
return 2
|
|
327
327
|
try:
|
|
328
328
|
config = IngestionJobConfig.from_environment()
|
|
@@ -331,15 +331,34 @@ def ingestion_job_main(argv: Sequence[str] | None = None) -> int:
|
|
|
331
331
|
except HostedIngestionJobError as error:
|
|
332
332
|
if error.code in CONSUMED_INGESTION_DISPATCH_CODES:
|
|
333
333
|
return 0
|
|
334
|
-
|
|
334
|
+
_write_terminal_failure(error)
|
|
335
335
|
return 1
|
|
336
336
|
# The deliberately closed dispatch contract has no source URL, generic callback endpoint or
|
|
337
337
|
# credential. A later reviewed connector/callback slice must call run_hosted_ingestion_delivery
|
|
338
338
|
# instead of making this entrypoint silently invent one of those authorities.
|
|
339
|
-
|
|
339
|
+
_write_terminal_failure(
|
|
340
|
+
HostedIngestionJobError(
|
|
341
|
+
"INGESTION_DELIVERY_PROCESSOR_UNWIRED", "no reviewed connector is installed"
|
|
342
|
+
)
|
|
343
|
+
)
|
|
340
344
|
return 1
|
|
341
345
|
|
|
342
346
|
|
|
347
|
+
def _write_terminal_failure(error: HostedIngestionJobError) -> None:
|
|
348
|
+
sys.stderr.buffer.write(
|
|
349
|
+
canonical_json_bytes(
|
|
350
|
+
{
|
|
351
|
+
"status": "failed",
|
|
352
|
+
"code": error.code,
|
|
353
|
+
"detail": error.detail,
|
|
354
|
+
"stage": "ingestion",
|
|
355
|
+
}
|
|
356
|
+
)
|
|
357
|
+
+ b"\n"
|
|
358
|
+
)
|
|
359
|
+
sys.stderr.flush()
|
|
360
|
+
|
|
361
|
+
|
|
343
362
|
__all__ = [
|
|
344
363
|
"CHECKPOINT_RESERVE_SECONDS",
|
|
345
364
|
"CONSUMED_INGESTION_DISPATCH_CODES",
|