mostlyright-data 0.16.2__tar.gz → 0.17.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/PKG-INFO +1 -1
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/pyproject.toml +1 -1
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/skills/mr-data-build/SKILL.md +94 -14
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/http.py +162 -2
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/parsing.py +18 -9
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/sandbox.py +79 -19
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/bounded_query.py +15 -0
- mostlyright_data-0.17.0/src/mostlyright/data_harness/delta.py +353 -0
- mostlyright_data-0.17.0/src/mostlyright/data_harness/delta_checks.py +465 -0
- mostlyright_data-0.17.0/src/mostlyright/data_harness/delta_classifier.py +875 -0
- mostlyright_data-0.17.0/src/mostlyright/data_harness/delta_persist.py +750 -0
- mostlyright_data-0.17.0/src/mostlyright/data_harness/delta_recompute.py +348 -0
- mostlyright_data-0.17.0/src/mostlyright/data_harness/delta_rows.py +626 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_bootstrap.py +1 -1
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_run_worker.py +3478 -1033
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_session_worker.py +0 -2
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_worker.py +55 -8
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/inprocess_acquisition.py +231 -18
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/local_contracts.py +150 -1
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/pipeline.py +15 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/run_execution_v4.py +472 -78
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/run_phase_timing.py +8 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sql_transform_engine.py +96 -1
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_subscription_sealer.py +41 -5
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/studio_boundary.py +1 -1
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/table_manifest.py +22 -2
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/table_profile.py +57 -2
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4.py +37 -10
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_artifacts.py +1 -1
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_datasets.py +119 -15
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_tables.py +76 -9
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/remediation.py +1 -1
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_closed_source.py +40 -9
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_required_controls.py +7 -4
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_stream_recording.py +14 -9
- mostlyright_data-0.16.2/src/mostlyright/data_harness/source_collection_bundle.py +0 -154
- mostlyright_data-0.16.2/src/mostlyright/data_harness/source_collection_contract.py +0 -62
- mostlyright_data-0.16.2/src/mostlyright/data_harness/source_collection_inputs.py +0 -148
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/.gitignore +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/README.md +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/scripts/hatch_build.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/skills/mr-data-build/agents/openai.yaml +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/sandbox_bootstrap.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/agent_runtime.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/protocol.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/reference.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/registry.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/bounded_scratch_sink.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/canonical.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/catalog_job.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/cli.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/compact_worker.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/contracts.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/coordinator.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/crosswalks.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/declared_checks.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/deploy.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/deploy_target.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/capture.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/contracts.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/lane.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/ocr.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/pdf.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/registry.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/selections.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/tables.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/events.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/fast_delimited.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/formats.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/governors.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_ingestion_worker.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/incremental_slice_executor.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/incremental_worker.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ingestion/store.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/key_seam.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/document.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/status.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/notebook.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/offline.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/operation_registry.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/operator_setup.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/part_check_evidence.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/plan_graph.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/engine.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/errors.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/gates.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/joins.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/profile.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/table.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/progress_events.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/budgets.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/containers.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/contracts.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/delimited.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/registry.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/himawari-hsd-b13-complete.zip +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/samples.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/tabular.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/vector.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/recipe.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/review.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/rowset.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/session_probes.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/signing.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/skill_assets.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_bootstrap.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_bundle_writer.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_discovery.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_history_candidate_child.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_history_transform_child.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_inventory.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_partition.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_raw_inventory.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/source_state_index.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/adapters.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/cadence.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/collections.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/contracts.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/dataset.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/deletion.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/fitness.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/governance.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/hosted.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/integration.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/registry.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/sports.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_order_vector.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_recovery_objects.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_segment_spill.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_subscription_worker.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_venue.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/studio_subscription_control.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/table_parts.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/acquire.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/activity.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/approvals.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/commands.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/download.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/narrative.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/parity.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/probe.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/propose.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/recipe.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/research.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/router.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/runs.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/session.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/stream.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/transport.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_connections.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/thin/workers.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/unit_flow.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/units.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/attendance.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/clarification.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/credentials.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/headline.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/local_review.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/login.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/readers.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/ux/render.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_recipe.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_transform.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/v4_window.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/store.py +0 -0
- {mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mostlyright-data
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.17.0
|
|
4
4
|
Summary: Mostly Right CLI for reproducible, reviewed Parquet datasets
|
|
5
5
|
Project-URL: Homepage, https://mostlyright.md/
|
|
6
6
|
Project-URL: Documentation, https://mostlyright.md/docs/guides/cli/
|
|
@@ -112,7 +112,7 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
|
|
|
112
112
|
| `mr-data whoami` | Use the compatibility alias for the remotely validated `auth status` answer. |
|
|
113
113
|
| `mr-data clarify` | Say whether one clarifying question may be put to the user right now, and compose the record of their answer. It reaches nothing, asks nobody and waits for nothing. Exits non-zero when no person can answer or when a recipe is already registered. |
|
|
114
114
|
| `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. |
|
|
115
|
-
| `mr-data dataset` | Bring the dataset page into existence before there is anything on it, then fill it in while somebody watches. `dataset create --name TEXT` mints it and prints the `dataset_id`; `dataset show ID` reads it back; `dataset set ID --name TEXT --description-file F` writes the title and the description under the version it was read at, retrying once if somebody else wrote first; `dataset note ID --heading H --blocks-file B` writes one cell of the decision record that OUTLIVES every run, and `--list` reads it back; `dataset watch ID` follows the page's own event stream; `dataset activity ID --phase P --message TEXT` says what is happening right now, silently, and is never a chat message and never a cell; `dataset archive ID --confirm-name TITLE` retires the page and frees its title, deleting nothing. |
|
|
115
|
+
| `mr-data dataset` | Bring the dataset page into existence before there is anything on it, then fill it in while somebody watches. `dataset create --name TEXT` mints it and prints the `dataset_id`; `dataset show ID` reads it back; `dataset set ID --name TEXT --topics "a,b,c" --license ID --description-file F` writes the title, the categories, the SPDX licence and the description under the version it was read at, retrying once if somebody else wrote first, and an empty `--topics` or `--license` takes that value off the page; `dataset note ID --heading H --blocks-file B` writes one cell of the decision record that OUTLIVES every run, and `--list` reads it back; `dataset watch ID` follows the page's own event stream; `dataset activity ID --phase P --message TEXT` says what is happening right now, silently, and is never a chat message and never a cell; `dataset archive ID --confirm-name TITLE` retires the page and frees its title, deleting nothing. |
|
|
116
116
|
| `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. |
|
|
117
117
|
| `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. |
|
|
118
118
|
| `mr-data run` | Start one run against a registered recipe, named as `--recipe RECIPE_ID --digest RECIPE_DIGEST` — both required, neither positional, and the digest is the bare hex the registration receipt printed. The command accepts `--sample`, `--full`, `--refresh`, `--backfill` and `--window`, and the worker executes `--sample`, `--full` and `--refresh`. A refresh narrows each source that declares a supported address window and merges its returned relation into retained source state; unwindowed sources are conditionally revalidated or re-acquired whole, then the full declared transform runs. `--backfill` and a `--window` on a sample or full are refused before acquisition. `--max-rows` and `--max-source-bytes` remain supported, and each bounds ONE SOURCE rather than the finished table. 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. |
|
|
@@ -307,7 +307,8 @@ and a title that never changes is fine too. Where the address cannot be minted,
|
|
|
307
307
|
plain dashboard address rather than blocking.
|
|
308
308
|
|
|
309
309
|
Hold the `dataset_id` for the rest of the session: stage 3 writes the decision record to it, stage
|
|
310
|
-
4 writes its title, description and cover, and the recipe binds to it by naming
|
|
310
|
+
4 writes its title, topics, licence, description and cover, and the recipe binds to it by naming
|
|
311
|
+
it as `dataset.id`.
|
|
311
312
|
|
|
312
313
|
### 2. Probe — read a source before committing to it
|
|
313
314
|
|
|
@@ -470,18 +471,63 @@ and is settled once, at stage 4.
|
|
|
470
471
|
Every grain, key, join and cutoff settled after stage 3 is a further `decision` block on the
|
|
471
472
|
DATASET's record — `mr-data dataset note DATASET_ID` — because the fact outlives every run.
|
|
472
473
|
|
|
473
|
-
**Write the title and the description before the first run
|
|
474
|
-
open since stage 1 under a working title
|
|
474
|
+
**Write the title, the topics, the licence and the description before the first run.** The page has
|
|
475
|
+
been open since stage 1 under a working title. This is where it settles. One call carries the title,
|
|
476
|
+
the topics and the licence, so the title and the chips land together; the description arrives after
|
|
477
|
+
it, through the draft snapshots and the final commit. (The worked example below is a different
|
|
478
|
+
dataset from the Kathmandu one the earlier stages follow, chosen because its numbers are easy to
|
|
479
|
+
count.)
|
|
475
480
|
|
|
476
481
|
```sh
|
|
477
|
-
mr-data dataset set DATASET_ID --name "
|
|
478
|
-
|
|
482
|
+
mr-data dataset set DATASET_ID --name "Hourly weather at Prague Airport (LKPR), 2000-2026" \
|
|
483
|
+
--topics "weather,prague,czech republic,metar,iowa environmental mesonet" \
|
|
484
|
+
--license "CC-BY-4.0" --json
|
|
479
485
|
```
|
|
480
486
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
487
|
+
The call reads the version first and writes under it, so a page somebody else has since edited is
|
|
488
|
+
retried once and then reported rather than silently overwritten. The licence is the SPDX identifier
|
|
489
|
+
of the rights basis the sources actually grant -- for example `CC-BY-4.0`, `ODbL-1.0`, `CC0-1.0`;
|
|
490
|
+
where the sources' terms are not an open licence, leave `--license` off and say so under "Source and
|
|
491
|
+
rights" instead. Never invent a licence.
|
|
492
|
+
|
|
493
|
+
While composing, send bounded snapshots with `mr-data dataset draft DATASET_ID --description-file DRAFT.md --expected-version VERSION --json`. Chain the returned version into the next snapshot, writing a meaningful paragraph at a time. These snapshots are temporary and do not replace the saved description. Commit the complete documentation with `mr-data dataset set DATASET_ID --description-file DESCRIPTION.md --expected-version VERSION --json`. If another edit moved that version, stop the draft and reconcile it with the user’s text; never retry by blindly advancing the version. Do not send fabricated partial text or delay completed text to simulate writing.
|
|
494
|
+
|
|
495
|
+
**What search engines and answer engines read.** These are the three fields search engines and
|
|
496
|
+
answer engines index. A search engine (Google, Bing) ranks the page by the words a person types.
|
|
497
|
+
An answer engine (ChatGPT, Perplexity, Claude, Google AI Overviews) quotes the page as a source
|
|
498
|
+
when a person asks a question. Making the page rank is called SEO. Making the page quotable is
|
|
499
|
+
called GEO. Both read the same three fields, and each field lands in fixed places with fixed
|
|
500
|
+
limits. The rules below are mechanical: apply them, then run the check at the end. Do not
|
|
501
|
+
interpret them.
|
|
502
|
+
|
|
503
|
+
| You write | Where it appears | Limit |
|
|
504
|
+
| --- | --- | --- |
|
|
505
|
+
| `--name` | browser tab title (`{name} \| Mostly Right`), the page heading, the JSON-LD `name` | at most 60 characters, or search results cut it |
|
|
506
|
+
| the opening paragraph of DESCRIPTION.md | the meta description, the social card, the JSON-LD `description`, the `Summary:` line answer engines fetch | search engines cut at 300 characters; answer engines cut at 240 |
|
|
507
|
+
| `--topics` | category chips and the category filter on the /datasets directory, JSON-LD `keywords`, the `Topics:` line answer engines fetch, the `topic` filter in the public API and MCP | 3 to 8 topics, each at most 40 characters |
|
|
508
|
+
|
|
509
|
+
**Title rules**
|
|
510
|
+
1. Shape: subject, place, period. `Hourly weather at Prague Airport (LKPR), 2000-2026`.
|
|
511
|
+
2. At most 60 characters. Count them.
|
|
512
|
+
3. Use the words a person would type: the common place name, and the official identifier in
|
|
513
|
+
parentheses once if one exists (ICAO code, station id, ticker, constituency name).
|
|
514
|
+
4. Never: a brand, the word "dataset" or "data", a colon, a pipe, an exclamation mark, a version
|
|
515
|
+
number, a run date.
|
|
516
|
+
5. Sentence case. No trailing full stop.
|
|
517
|
+
|
|
518
|
+
**Topic rules**
|
|
519
|
+
1. 3 to 8 topics, comma-separated, no duplicates.
|
|
520
|
+
2. Topic one is the category, chosen from this list and no other:
|
|
521
|
+
`weather, climate, air quality, hydrology, energy, transport, aviation, public health,
|
|
522
|
+
economics, finance, elections, sports, prediction markets, demographics, geospatial,
|
|
523
|
+
agriculture`.
|
|
524
|
+
3. Then, in this order, one each where it applies: the city or region, the country, the
|
|
525
|
+
phenomenon or instrument, the publisher or programme. After those, up to three more, each a
|
|
526
|
+
distinct thing a person would type that none of the earlier topics already names.
|
|
527
|
+
4. Form: lowercase; ASCII letters, digits, spaces and hyphens only; one to three words; at most
|
|
528
|
+
40 characters.
|
|
529
|
+
5. Never: a column name, a unit, a bare year, a second word from the category list, a market or
|
|
530
|
+
venue name unless the dataset is about that market.
|
|
485
531
|
|
|
486
532
|
**The dataset description is the documentation, and it is read by people and by search engines.**
|
|
487
533
|
`dataset.description` is Markdown, rendered on the dataset page with headings and lists, and it
|
|
@@ -490,7 +536,7 @@ seconds -- not a paragraph, and not a report. Use exactly this shape, in this or
|
|
|
490
536
|
section out only when there is genuinely nothing to say (shown indented here; the document
|
|
491
537
|
itself carries the headings at column one):
|
|
492
538
|
|
|
493
|
-
|
|
539
|
+
Two plain sentences: what each row is, where it comes from, and the period it covers.
|
|
494
540
|
|
|
495
541
|
## Coverage
|
|
496
542
|
- **Window:** the exact dates and the time zone.
|
|
@@ -510,13 +556,47 @@ itself carries the headings at column one):
|
|
|
510
556
|
## Source and rights
|
|
511
557
|
The publisher, the programme, and the rights basis, in one or two sentences.
|
|
512
558
|
|
|
559
|
+
That is six sections: the opening paragraph, and the five headings under it.
|
|
560
|
+
|
|
561
|
+
**Opening paragraph rules** (everything before the first `##` heading)
|
|
562
|
+
1. Two sentences, 150 to 240 characters together. The first sentence ends before character 200
|
|
563
|
+
and is complete on its own.
|
|
564
|
+
2. Sentence one says what each row is, for where, over what window, from which publisher:
|
|
565
|
+
`Each row is one hourly METAR observation at Prague Václav Havel Airport (LKPR), January 2000
|
|
566
|
+
to August 2026, from the Iowa Environmental Mesonet ASOS archive.`
|
|
567
|
+
3. Sentence two gives the size and the measured quantities, as numbers and nouns:
|
|
568
|
+
`43,812 rows of temperature, dew point, wind, pressure and visibility.`
|
|
569
|
+
4. Full names on first use with the abbreviation in parentheses once. Never "this dataset",
|
|
570
|
+
"we", "it", "here".
|
|
571
|
+
5. No Markdown in the opening paragraph: no bold, no links, no bullets, no code.
|
|
572
|
+
|
|
573
|
+
**Body rules** (the five sections under the headings)
|
|
574
|
+
1. Every sentence must stay true and complete when quoted alone, away from the page. Never
|
|
575
|
+
"as above", "see below", "it", "they", "the same".
|
|
576
|
+
2. Numbers, not adjectives: `one row per hour, about 720 rows a month`, not `high-frequency`.
|
|
577
|
+
3. Keep the five headings exactly as given, in that relative order, omitting only a section with
|
|
578
|
+
genuinely nothing to say. Answer engines match headings to questions: "what does it cover",
|
|
579
|
+
"what is it suitable for".
|
|
580
|
+
4. Say what is absent as plainly as what is present: gaps, sentinels, the years the source did
|
|
581
|
+
not record.
|
|
582
|
+
5. Everything in the paragraph below still applies.
|
|
583
|
+
|
|
513
584
|
Rules that keep it readable: short sentences; no sentence over about twenty-five words; bullets
|
|
514
585
|
rather than comma lists; no tables, no code blocks, no links to internal tools, no headings beyond
|
|
515
586
|
the ones above. Spell out the names a reader would search for -- the place, the identifiers in
|
|
516
587
|
every common form, the programme and the publisher -- once each, in the opening sentences and
|
|
517
|
-
never as a keyword list.
|
|
518
|
-
|
|
519
|
-
|
|
588
|
+
never as a keyword list. A one-line description is a defect to fix in the revision, not a style
|
|
589
|
+
choice. Give `table.description` the grain and the window.
|
|
590
|
+
|
|
591
|
+
**Check before writing.** Fix and re-check until every line passes:
|
|
592
|
+
- title: at most 60 characters, contains the place, contains no colon, pipe or exclamation mark,
|
|
593
|
+
no brand, no "dataset" or "data", no version number, no run date
|
|
594
|
+
- opening paragraph: 150 to 240 characters, first full stop before character 200, no Markdown
|
|
595
|
+
- topics: 3 to 8, no duplicates, first one is on the category list, all lowercase, each at most
|
|
596
|
+
40 characters, none is a column name, a unit, a year, a second word from the category list, or
|
|
597
|
+
a market or venue name unless the dataset is about that market
|
|
598
|
+
- licence: an SPDX identifier the sources actually grant, or `--license` left off
|
|
599
|
+
- every `##` heading in DESCRIPTION.md is one of the five, in that relative order, none repeated
|
|
520
600
|
|
|
521
601
|
**Every dataset gets a cover before its first run is presented.** Once the description is
|
|
522
602
|
written, generate one with
|
{mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/acquisition/http.py
RENAMED
|
@@ -17,6 +17,7 @@ import threading
|
|
|
17
17
|
import time
|
|
18
18
|
from collections.abc import Callable, Iterator, Mapping
|
|
19
19
|
from dataclasses import dataclass, replace
|
|
20
|
+
from datetime import UTC, datetime
|
|
20
21
|
from pathlib import Path, PurePosixPath
|
|
21
22
|
from typing import TYPE_CHECKING, Protocol
|
|
22
23
|
from urllib.parse import unquote_to_bytes, urljoin, urlsplit
|
|
@@ -184,6 +185,71 @@ _CONTENT_RANGE = re.compile(rf"bytes ({_DECIMAL})-({_DECIMAL})/({_DECIMAL}|\*)")
|
|
|
184
185
|
# written out again, so one edit moves both and the two headers cannot drift apart.
|
|
185
186
|
_DECIMAL_ONLY = re.compile(_DECIMAL)
|
|
186
187
|
|
|
188
|
+
# The statuses on which ``Retry-After`` says anything a fetch may act on. RFC 9110 defines the
|
|
189
|
+
# field for 503 and for a 3xx; RFC 6585 gives 429 the same reading. A redirect is followed here
|
|
190
|
+
# rather than waited out, so the two that remain are these. Read on any other status the field
|
|
191
|
+
# would be either absent or about something this path does not do, and a 500 that carries one
|
|
192
|
+
# must not be able to talk a caller into a wait it never reviewed.
|
|
193
|
+
RETRY_AFTER_STATUSES: frozenset[int] = frozenset({429, 503})
|
|
194
|
+
# Long enough for either spelling a compliant origin may send -- an IMF-fixdate is 29 characters
|
|
195
|
+
# and a bounded delta-seconds is at most 16 -- and short enough that a value past it is refused
|
|
196
|
+
# as a value rather than parsed. A longer field is not truncated and re-read: it is dropped, and
|
|
197
|
+
# the caller falls back to the wait it reviewed for itself.
|
|
198
|
+
MAX_RETRY_AFTER_CHARS = 64
|
|
199
|
+
# ``delta-seconds`` is ``1*DIGIT`` (RFC 9110 5.6.7), which is NOT ``_DECIMAL`` above: that one
|
|
200
|
+
# refuses a leading zero, because the value it reads is sealed or compared and one span spelled
|
|
201
|
+
# two ways would be two spellings in the evidence. A wait is neither, so ``Retry-After: 07`` is a
|
|
202
|
+
# perfectly ordinary seven seconds and refusing it would only lose the origin's answer.
|
|
203
|
+
#
|
|
204
|
+
# The digit bound is defence in depth rather than the thing that keeps this bounded:
|
|
205
|
+
# ``MAX_RETRY_AFTER_CHARS`` already caps the string long before the grammar sees it, and a
|
|
206
|
+
# 17-digit wait would be refused by the caller's ceiling anyway. It is here so the bound does not
|
|
207
|
+
# depend on either of those staying true.
|
|
208
|
+
_RETRY_AFTER_DELTA = re.compile(r"[0-9]{1,16}")
|
|
209
|
+
# The one date spelling this parser admits: the same RFC 9110 IMF-fixdate FIELD that
|
|
210
|
+
# ``_IMF_FIXDATE`` below holds ``Last-Modified`` to, written separately because the two do
|
|
211
|
+
# different work with it. That one is a shape check on a value echoed back to the publisher
|
|
212
|
+
# unchanged, so it is stricter per character and deliberately admits a 31st of February; this
|
|
213
|
+
# one is turned into an instant a run will wait for, so it captures its fields and hands the
|
|
214
|
+
# calendar the job of refusing a day that does not exist.
|
|
215
|
+
#
|
|
216
|
+
# RFC 9110 5.6.7 requires a sender to use IMF-fixdate and permits a recipient to see two
|
|
217
|
+
# obsolete forms; those two are deliberately NOT parsed. The 850-style form carries a two-digit
|
|
218
|
+
# year, and a windowing rule for it is a guess about which century an origin meant -- a guess
|
|
219
|
+
# this module would then spend a run's seconds on. An unreadable value costs nothing, because
|
|
220
|
+
# every caller of ``parse_retry_after_seconds`` treats ``None`` as "the origin said nothing" and
|
|
221
|
+
# waits its own reviewed backoff instead.
|
|
222
|
+
#
|
|
223
|
+
# ``[0-9]`` rather than ``\d`` throughout, because ``\d`` also matches the digits of every other
|
|
224
|
+
# script Unicode has, and ``float`` reads those too: an origin could otherwise name its wait in
|
|
225
|
+
# Arabic-Indic digits and have it honoured. The parser table in ``tests/h3/test_http.py`` sends
|
|
226
|
+
# three alphabets' worth, which is what makes this a property rather than a preference.
|
|
227
|
+
#
|
|
228
|
+
# The month names are written once, in ``_RETRY_AFTER_MONTHS``, and the alternation is built from
|
|
229
|
+
# it. The tuple is also what turns a captured name into a month number, and the two are read one
|
|
230
|
+
# after the other on the same value: a name the pattern admitted but the tuple did not hold would
|
|
231
|
+
# raise inside the ``try`` below and read as "the origin said nothing", which is a silent way to
|
|
232
|
+
# lose a spelling. One source, so they cannot disagree.
|
|
233
|
+
_RETRY_AFTER_MONTHS = (
|
|
234
|
+
"Jan",
|
|
235
|
+
"Feb",
|
|
236
|
+
"Mar",
|
|
237
|
+
"Apr",
|
|
238
|
+
"May",
|
|
239
|
+
"Jun",
|
|
240
|
+
"Jul",
|
|
241
|
+
"Aug",
|
|
242
|
+
"Sep",
|
|
243
|
+
"Oct",
|
|
244
|
+
"Nov",
|
|
245
|
+
"Dec",
|
|
246
|
+
)
|
|
247
|
+
_RETRY_AFTER_DATE = re.compile(
|
|
248
|
+
r"(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), "
|
|
249
|
+
rf"([0-9]{{2}}) ({'|'.join(_RETRY_AFTER_MONTHS)}) ([0-9]{{4}}) "
|
|
250
|
+
r"([0-9]{2}):([0-9]{2}):([0-9]{2}) GMT"
|
|
251
|
+
)
|
|
252
|
+
|
|
187
253
|
|
|
188
254
|
@dataclass(frozen=True)
|
|
189
255
|
class DatagovRateObservation:
|
|
@@ -1219,7 +1285,21 @@ class PeerAttemptError(AcquisitionSecurityError):
|
|
|
1219
1285
|
# everywhere else, so a caller that reads it fails closed rather than retrying a
|
|
1220
1286
|
# refusal whose origin never answered.
|
|
1221
1287
|
http_status: int | None = None,
|
|
1288
|
+
# The origin's own ``Retry-After``, exactly as it wrote it, and only from a status that
|
|
1289
|
+
# gives the field meaning (``RETRY_AFTER_STATUSES``). It rides here for the reason
|
|
1290
|
+
# ``http_status`` does: a caller deciding whether and when to ask again is answering a
|
|
1291
|
+
# question about this response, and the typed code cannot carry the answer. Absent
|
|
1292
|
+
# everywhere else, and never interpreted here -- ``parse_retry_after_seconds`` reads it,
|
|
1293
|
+
# and the caller that will spend the wait bounds it.
|
|
1294
|
+
retry_after: str | None = None,
|
|
1222
1295
|
) -> None:
|
|
1296
|
+
if retry_after is not None and (
|
|
1297
|
+
type(retry_after) is not str or len(retry_after) > MAX_RETRY_AFTER_CHARS
|
|
1298
|
+
):
|
|
1299
|
+
raise AcquisitionSecurityError(
|
|
1300
|
+
"TRANSPORT_EVIDENCE",
|
|
1301
|
+
"peer-attempt Retry-After evidence is invalid",
|
|
1302
|
+
)
|
|
1223
1303
|
if any(not isinstance(attempt, PeerAttempt) for attempt in peer_attempts):
|
|
1224
1304
|
raise AcquisitionSecurityError(
|
|
1225
1305
|
"TRANSPORT_EVIDENCE",
|
|
@@ -1233,6 +1313,7 @@ class PeerAttemptError(AcquisitionSecurityError):
|
|
|
1233
1313
|
self.peer_attempts = peer_attempts
|
|
1234
1314
|
self.hops = hops
|
|
1235
1315
|
self.http_status = http_status
|
|
1316
|
+
self.retry_after = retry_after
|
|
1236
1317
|
self.total_response_body_size_bytes = sum(
|
|
1237
1318
|
attempt.response_body_size_bytes for attempt in peer_attempts
|
|
1238
1319
|
)
|
|
@@ -1772,7 +1853,8 @@ class PinnedHttpsRetriever:
|
|
|
1772
1853
|
|
|
1773
1854
|
Redirect bodies are discarded after their digest is measured. A peer retry starts a
|
|
1774
1855
|
fresh request only after the failed attempt records its consumed bytes; the caller must
|
|
1775
|
-
therefore use a fresh staging file per acquisition
|
|
1856
|
+
therefore use a fresh staging file per acquisition, or truncate it through ``reset_sink``
|
|
1857
|
+
before re-attempting, and discard it on any exception it does not re-attempt.
|
|
1776
1858
|
"""
|
|
1777
1859
|
if not callable(sink):
|
|
1778
1860
|
raise AcquisitionSecurityError("STREAM_SINK", "stream sink must be callable")
|
|
@@ -1944,6 +2026,7 @@ class PinnedHttpsRetriever:
|
|
|
1944
2026
|
tuple(attempts),
|
|
1945
2027
|
hops=tuple(hops),
|
|
1946
2028
|
http_status=response.status,
|
|
2029
|
+
retry_after=_retry_after_header(response),
|
|
1947
2030
|
)
|
|
1948
2031
|
media_type = _media_type(response.header("content-type"))
|
|
1949
2032
|
if media_type not in self._limits.allowed_media_types:
|
|
@@ -2652,6 +2735,7 @@ class PinnedHttpsRetriever:
|
|
|
2652
2735
|
peer_attempts,
|
|
2653
2736
|
hops,
|
|
2654
2737
|
http_status=response.status,
|
|
2738
|
+
retry_after=_retry_after_header(response),
|
|
2655
2739
|
)
|
|
2656
2740
|
content_type = self._response_header(response, "content-type", peer_attempts, hops)
|
|
2657
2741
|
try:
|
|
@@ -2724,6 +2808,7 @@ class PinnedHttpsRetriever:
|
|
|
2724
2808
|
hops: list[RetrievalHop],
|
|
2725
2809
|
*,
|
|
2726
2810
|
http_status: int | None = None,
|
|
2811
|
+
retry_after: str | None = None,
|
|
2727
2812
|
) -> None:
|
|
2728
2813
|
latest = peer_attempts[-1]
|
|
2729
2814
|
peer_attempts[-1] = PeerAttempt(
|
|
@@ -2733,7 +2818,12 @@ class PinnedHttpsRetriever:
|
|
|
2733
2818
|
response_body_size_bytes=latest.response_body_size_bytes,
|
|
2734
2819
|
)
|
|
2735
2820
|
raise PeerAttemptError(
|
|
2736
|
-
code,
|
|
2821
|
+
code,
|
|
2822
|
+
detail,
|
|
2823
|
+
tuple(peer_attempts),
|
|
2824
|
+
hops=tuple(hops),
|
|
2825
|
+
http_status=http_status,
|
|
2826
|
+
retry_after=retry_after,
|
|
2737
2827
|
)
|
|
2738
2828
|
|
|
2739
2829
|
def _response_header(
|
|
@@ -3026,6 +3116,76 @@ def _remaining_socket_timeout(deadline: float, *, configured: float) -> float:
|
|
|
3026
3116
|
return min(configured, remaining)
|
|
3027
3117
|
|
|
3028
3118
|
|
|
3119
|
+
def parse_retry_after_seconds(value: str | None, *, now: float) -> float | None:
|
|
3120
|
+
"""Read one ``Retry-After`` field as a wait in seconds from ``now``, or decline to read it.
|
|
3121
|
+
|
|
3122
|
+
Both spellings RFC 9110 defines are admitted: delta-seconds, and an absolute IMF-fixdate,
|
|
3123
|
+
which is subtracted from ``now`` (a POSIX timestamp) to give the same kind of answer. A date
|
|
3124
|
+
already in the past is not a negative wait -- it is the origin saying "now", and it returns
|
|
3125
|
+
``0.0``, which a caller floors at its own backoff.
|
|
3126
|
+
|
|
3127
|
+
``None`` means only that this field was not readable as a wait: absent, empty, one of the two
|
|
3128
|
+
obsolete date spellings RFC 9110 lets a recipient see, a calendar date that does not exist, or
|
|
3129
|
+
anything else. It is never a verdict about the origin, and never a longer or shorter wait than
|
|
3130
|
+
the caller would have taken on its own.
|
|
3131
|
+
|
|
3132
|
+
The ``MAX_RETRY_AFTER_CHARS`` test below can never be the reason: the longest string either
|
|
3133
|
+
grammar admits is an IMF-fixdate's 29 characters, so a value past the cap is already refused
|
|
3134
|
+
as a value. It is kept because this function is public and its bound should not depend on a
|
|
3135
|
+
grammar someone widens later.
|
|
3136
|
+
|
|
3137
|
+
NOTHING HERE BOUNDS THE ANSWER: a readable field is reported as the origin wrote it, and how
|
|
3138
|
+
long a run may actually wait is the caller's ceiling to apply, because this function has no
|
|
3139
|
+
idea what budget it is spending.
|
|
3140
|
+
"""
|
|
3141
|
+
|
|
3142
|
+
if value is None:
|
|
3143
|
+
return None
|
|
3144
|
+
candidate = value.strip()
|
|
3145
|
+
if not candidate or len(candidate) > MAX_RETRY_AFTER_CHARS:
|
|
3146
|
+
return None
|
|
3147
|
+
if _RETRY_AFTER_DELTA.fullmatch(candidate):
|
|
3148
|
+
return float(candidate)
|
|
3149
|
+
match = _RETRY_AFTER_DATE.fullmatch(candidate)
|
|
3150
|
+
if match is None:
|
|
3151
|
+
return None
|
|
3152
|
+
try:
|
|
3153
|
+
moment = datetime(
|
|
3154
|
+
int(match.group(3)),
|
|
3155
|
+
_RETRY_AFTER_MONTHS.index(match.group(2)) + 1,
|
|
3156
|
+
int(match.group(1)),
|
|
3157
|
+
int(match.group(4)),
|
|
3158
|
+
int(match.group(5)),
|
|
3159
|
+
int(match.group(6)),
|
|
3160
|
+
tzinfo=UTC,
|
|
3161
|
+
)
|
|
3162
|
+
except ValueError:
|
|
3163
|
+
# A day the month does not have, or a leap second: a spelling this parser cannot turn
|
|
3164
|
+
# into an instant is one it declines, exactly as an unparseable one.
|
|
3165
|
+
return None
|
|
3166
|
+
return max(0.0, moment.timestamp() - now)
|
|
3167
|
+
|
|
3168
|
+
|
|
3169
|
+
def _retry_after_header(response: TransportResponse | StreamedTransportResponse) -> str | None:
|
|
3170
|
+
"""The response's ``Retry-After`` field when the status is one that gives it meaning.
|
|
3171
|
+
|
|
3172
|
+
Reading it must never change what a refusal IS. A hostile origin that repeats the field
|
|
3173
|
+
would otherwise turn a plain 429 into a ``RESPONSE_HEADER_DUPLICATE``, so a refusal to read
|
|
3174
|
+
the field is answered here with ``None`` -- the caller then waits its own reviewed backoff,
|
|
3175
|
+
which is exactly what it does for an origin that sent no field at all.
|
|
3176
|
+
"""
|
|
3177
|
+
|
|
3178
|
+
if response.status not in RETRY_AFTER_STATUSES:
|
|
3179
|
+
return None
|
|
3180
|
+
try:
|
|
3181
|
+
value = response.header("retry-after")
|
|
3182
|
+
except AcquisitionSecurityError:
|
|
3183
|
+
return None
|
|
3184
|
+
if value is None or len(value) > MAX_RETRY_AFTER_CHARS:
|
|
3185
|
+
return None
|
|
3186
|
+
return value
|
|
3187
|
+
|
|
3188
|
+
|
|
3029
3189
|
def _datagov_rate_observation(response: TransportResponse) -> DatagovRateObservation | None:
|
|
3030
3190
|
"""Parse only the bounded numeric Data.gov rate headers; retain no arbitrary headers."""
|
|
3031
3191
|
|
|
@@ -47,6 +47,7 @@ _FORBIDDEN_REFERENCE_KEYS = frozenset(
|
|
|
47
47
|
_SAFE_COLUMN = re.compile(r"^[^\x00-\x1f\x7f]{1,256}$")
|
|
48
48
|
_ISO_DATE = re.compile(r"\d{4}-\d{2}-\d{2}\Z")
|
|
49
49
|
_ISO_TIMESTAMP = re.compile(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?Z\Z")
|
|
50
|
+
_ISO_SPACE_MINUTE_TIMESTAMP = re.compile(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}\Z")
|
|
50
51
|
_MAX_REUSABLE_CSV_ROW_BYTES = 256 * 1024
|
|
51
52
|
_STREAMING_ROW_HASH_BATCH_ROWS = 1_024
|
|
52
53
|
# One input character can become a six-byte JSON escape; the per-row estimate also includes the
|
|
@@ -1084,17 +1085,25 @@ def _partition_key_and_date(value: str, *, encoding: str) -> tuple[str, datetime
|
|
|
1084
1085
|
raise AcquisitionSecurityError(
|
|
1085
1086
|
"WINDOW_STREAM_PARTITION", "partition value is not a canonical date"
|
|
1086
1087
|
)
|
|
1087
|
-
if encoding == "iso_date_prefix" and value != key and _ISO_TIMESTAMP.fullmatch(value) is None:
|
|
1088
|
-
raise AcquisitionSecurityError(
|
|
1089
|
-
"WINDOW_STREAM_PARTITION", "partition value is not canonical"
|
|
1090
|
-
)
|
|
1091
1088
|
if encoding == "iso_date_prefix" and value != key:
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1089
|
+
if _ISO_TIMESTAMP.fullmatch(value) is not None:
|
|
1090
|
+
try:
|
|
1091
|
+
datetime.datetime.fromisoformat(value)
|
|
1092
|
+
except ValueError:
|
|
1093
|
+
raise AcquisitionSecurityError(
|
|
1094
|
+
"WINDOW_STREAM_PARTITION", "partition timestamp is not real"
|
|
1095
|
+
) from None
|
|
1096
|
+
elif _ISO_SPACE_MINUTE_TIMESTAMP.fullmatch(value) is not None:
|
|
1097
|
+
try:
|
|
1098
|
+
datetime.datetime.strptime(value, "%Y-%m-%d %H:%M")
|
|
1099
|
+
except ValueError:
|
|
1100
|
+
raise AcquisitionSecurityError(
|
|
1101
|
+
"WINDOW_STREAM_PARTITION", "partition timestamp is not real"
|
|
1102
|
+
) from None
|
|
1103
|
+
else:
|
|
1095
1104
|
raise AcquisitionSecurityError(
|
|
1096
|
-
"WINDOW_STREAM_PARTITION", "partition
|
|
1097
|
-
)
|
|
1105
|
+
"WINDOW_STREAM_PARTITION", "partition value is not canonical"
|
|
1106
|
+
)
|
|
1098
1107
|
return (key, parsed_date)
|
|
1099
1108
|
|
|
1100
1109
|
|
|
@@ -769,6 +769,41 @@ class CrawlerSandbox:
|
|
|
769
769
|
request would have been given. Retrieval therefore spawns cold.
|
|
770
770
|
"""
|
|
771
771
|
|
|
772
|
+
admitted = self._admitted_warm_pool(size)
|
|
773
|
+
if admitted is None:
|
|
774
|
+
return 0
|
|
775
|
+
pool, launch, admitted_size = admitted
|
|
776
|
+
return pool.fill(launch, size=admitted_size)
|
|
777
|
+
|
|
778
|
+
def top_up_warm_pool(self, *, limit: int) -> int:
|
|
779
|
+
"""Add at most ONE idle child, never taking the pool past ``limit``. Answers what is ready.
|
|
780
|
+
|
|
781
|
+
The refill a long-lived owner wants between requests, and the reason it is not
|
|
782
|
+
``start_warm_pool`` with a smaller number: a child handed out between the owner's count
|
|
783
|
+
and its call turns "one more" into "the whole pool", spawned under one hold of the pool's
|
|
784
|
+
lock, and every request that arrives during that hold waits for all of it. This decides
|
|
785
|
+
the increment inside the lock, so a call costs one spawn or none.
|
|
786
|
+
|
|
787
|
+
The boundary rules are ``start_warm_pool``'s, unchanged and applied here too: an invalid
|
|
788
|
+
ceiling is refused, a coordinator holding a bounded cgroup root gets zero and a ceiling of
|
|
789
|
+
zero closes the pool. Believe the count rather than the ceiling, for the same reason.
|
|
790
|
+
"""
|
|
791
|
+
|
|
792
|
+
admitted = self._admitted_warm_pool(limit)
|
|
793
|
+
if admitted is None:
|
|
794
|
+
return 0
|
|
795
|
+
pool, launch, admitted_limit = admitted
|
|
796
|
+
return pool.add_one(launch, limit=admitted_limit)
|
|
797
|
+
|
|
798
|
+
def _admitted_warm_pool(self, size: int) -> tuple[_WarmSandboxPool, _WorkerLaunch, int] | None:
|
|
799
|
+
"""Check the requested size against the boundary and open the pool it admits.
|
|
800
|
+
|
|
801
|
+
One place, because ``start_warm_pool`` and ``top_up_warm_pool`` must not be able to
|
|
802
|
+
disagree about what the boundary permits: the size validation, the bounded-cgroup clamp
|
|
803
|
+
and the zero-closes-the-pool rule are the pool's admission decision, not either caller's.
|
|
804
|
+
``None`` means the boundary admits no pool at all and the caller answers zero.
|
|
805
|
+
"""
|
|
806
|
+
|
|
772
807
|
if type(size) is not int or not 0 <= size <= MAX_WARM_POOL_SIZE:
|
|
773
808
|
raise AcquisitionSecurityError(
|
|
774
809
|
"SANDBOX_WARM_POOL",
|
|
@@ -778,8 +813,7 @@ class CrawlerSandbox:
|
|
|
778
813
|
size = min(size, BOUNDED_CGROUP_WARM_POOL_SIZE)
|
|
779
814
|
if size == 0:
|
|
780
815
|
self.close_warm_pool()
|
|
781
|
-
return
|
|
782
|
-
launch = self._worker_launch(prewarm=True)
|
|
816
|
+
return None
|
|
783
817
|
if self._warm_pool is None:
|
|
784
818
|
self._warm_pool = _WarmSandboxPool(
|
|
785
819
|
timeout_seconds=self._timeout_seconds,
|
|
@@ -788,7 +822,7 @@ class CrawlerSandbox:
|
|
|
788
822
|
child_address_space_bytes=self._child_address_space_bytes,
|
|
789
823
|
networkless_child=self._child_is_networkless(),
|
|
790
824
|
)
|
|
791
|
-
return self._warm_pool.
|
|
825
|
+
return self._warm_pool, self._worker_launch(prewarm=True), size
|
|
792
826
|
|
|
793
827
|
def warm_pool_ready_count(self) -> int:
|
|
794
828
|
"""How many pre-spawned children are idle and unbound right now."""
|
|
@@ -6713,23 +6747,49 @@ class _WarmSandboxPool:
|
|
|
6713
6747
|
|
|
6714
6748
|
with self._lock:
|
|
6715
6749
|
self._prune(launch)
|
|
6716
|
-
|
|
6717
|
-
|
|
6718
|
-
|
|
6719
|
-
|
|
6720
|
-
|
|
6721
|
-
|
|
6722
|
-
|
|
6723
|
-
|
|
6724
|
-
|
|
6725
|
-
|
|
6726
|
-
|
|
6727
|
-
|
|
6728
|
-
|
|
6729
|
-
|
|
6730
|
-
|
|
6750
|
+
return self._fill_locked(launch, size=size)
|
|
6751
|
+
|
|
6752
|
+
def add_one(self, launch: _WorkerLaunch, *, limit: int) -> int:
|
|
6753
|
+
"""Add at most one child, never taking the pool past ``limit``. Answers what is ready.
|
|
6754
|
+
|
|
6755
|
+
AN INCREMENT, NOT A TARGET, AND THE DIFFERENCE IS A LOCK HOLD. A caller that reads
|
|
6756
|
+
``ready_count`` and then asks ``fill`` for "one more than that" is making two calls with
|
|
6757
|
+
a gap between them: a take landing in the gap empties the pool, and the fill then spawns
|
|
6758
|
+
the whole difference under a single hold of this lock -- which is the wait every taker
|
|
6759
|
+
queued behind it inherits, and the opposite of what topping up by one is for. Here the
|
|
6760
|
+
count and the spawn are one critical section, so a pass adds one child or none whatever
|
|
6761
|
+
else is running.
|
|
6762
|
+
|
|
6763
|
+
``limit`` is a ceiling on the pool, not a number to reach. A pool already at or above it
|
|
6764
|
+
spawns nothing and reports what it holds.
|
|
6765
|
+
"""
|
|
6766
|
+
|
|
6767
|
+
with self._lock:
|
|
6768
|
+
self._prune(launch)
|
|
6769
|
+
if len(self._ready) >= limit:
|
|
6770
|
+
return len(self._ready)
|
|
6771
|
+
return self._fill_locked(launch, size=len(self._ready) + 1)
|
|
6772
|
+
|
|
6773
|
+
def _fill_locked(self, launch: _WorkerLaunch, *, size: int) -> int:
|
|
6774
|
+
"""Spawn until the pool holds ``size``. Callers hold ``_lock`` and have pruned."""
|
|
6775
|
+
|
|
6776
|
+
deadline = time.monotonic() + WARM_POOL_FILL_TIMEOUT_SECONDS
|
|
6777
|
+
while len(self._ready) < size:
|
|
6778
|
+
self._ready.append(
|
|
6779
|
+
_prepare_worker(
|
|
6780
|
+
launch,
|
|
6781
|
+
timeout_seconds=self._timeout_seconds,
|
|
6782
|
+
memory_cgroup_root_fd=self._memory_cgroup_root_fd,
|
|
6783
|
+
hosted_session_container_memory_bytes=(
|
|
6784
|
+
self._hosted_session_container_memory_bytes
|
|
6785
|
+
),
|
|
6786
|
+
child_address_space_bytes=self._child_address_space_bytes,
|
|
6787
|
+
networkless_child=self._networkless_child,
|
|
6788
|
+
track_deadline=False,
|
|
6789
|
+
ready_timeout_seconds=max(deadline - time.monotonic(), 0.0),
|
|
6731
6790
|
)
|
|
6732
|
-
|
|
6791
|
+
)
|
|
6792
|
+
return len(self._ready)
|
|
6733
6793
|
|
|
6734
6794
|
def take(self, launch: _WorkerLaunch) -> _PreparedWorker | None:
|
|
6735
6795
|
"""Hand out one live child started from exactly ``launch``, or nothing.
|
{mostlyright_data-0.16.2 → mostlyright_data-0.17.0}/src/mostlyright/data_harness/bounded_query.py
RENAMED
|
@@ -118,6 +118,21 @@ MAX_QUERY_ROWS = 1_000_000
|
|
|
118
118
|
#: reference table selects one or two; an unpruned read of a billion-row table selects three
|
|
119
119
|
#: hundred and eighteen. The ceiling is where the list stops being a query and starts being an
|
|
120
120
|
#: export, and the refusal names ``prune`` as the fix rather than raising the ceiling.
|
|
121
|
+
#:
|
|
122
|
+
#: ⚠ THIS IS THE REPOSITORY'S ONLY COPY OF THE NUMBER, AND IT IS THE ENFORCED ONE.
|
|
123
|
+
#: :func:`bind_parts` refuses over it and ``hosted_session_worker`` returns it as a claim's
|
|
124
|
+
#: ceiling, so a second declaration elsewhere could drift from the wall that actually refuses and
|
|
125
|
+
#: nothing would fail. ``hosted_run_worker`` imports THIS one to decide the severity of an
|
|
126
|
+
#: appending version's part-count report, and ``test_stream_refresh_append`` pins it to Studio's
|
|
127
|
+
#: own ``v4/table_parts.MAX_QUERY_PARTS`` under ``STUDIO_ROOT``.
|
|
128
|
+
#:
|
|
129
|
+
#: ⚠ AND IT IS ALSO STUDIO'S QUERY WALL, WHICH IS THE ONE PRODUCTION MEETS. A read Studio cannot
|
|
130
|
+
#: prune below this many parts is refused ``QUERY_TOO_MANY_PARTS`` -- and an UNPRUNED read prunes
|
|
131
|
+
#: nothing at all (``v4/table_parts.select_parts`` returns every part when the query states no
|
|
132
|
+
#: ``prune`` block), so a plain "show me this table" meets this number and not the format's own
|
|
133
|
+
#: 4,096. It is eight times lower than
|
|
134
|
+
#: :data:`~mostlyright.data_harness.table_manifest.MAX_PARTS_PER_VERSION`, which is why a writer
|
|
135
|
+
#: that watched only the format's ceiling would watch the wall nobody hits first.
|
|
121
136
|
MAX_QUERY_PARTS = 512
|
|
122
137
|
|
|
123
138
|
#: How many rows are taken from the engine at a time. The running byte budget is checked BETWEEN
|