mostlyright-data 0.12.0__tar.gz → 0.13.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.12.0 → mostlyright_data-0.13.0}/PKG-INFO +1 -1
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/pyproject.toml +1 -1
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/skills/mr-data-build/SKILL.md +133 -35
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/cli.py +15 -2
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +2 -2
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +178 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/run_execution_v4.py +76 -5
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_rotation.py +27 -7
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_series.py +1261 -105
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/stream_subscription_sealer.py +51 -1
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/stream_subscription_worker.py +811 -15
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/stream_venue.py +9 -1
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/studio_boundary.py +2 -2
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/studio_subscription_control.py +109 -5
- mostlyright_data-0.13.0/src/mostlyright/data_harness/thin/activity.py +902 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/recipe.py +99 -1
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/router.py +27 -2
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/stream_venue.py +338 -33
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/transport.py +25 -4
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4.py +95 -4
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_artifacts.py +14 -4
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_datasets.py +267 -38
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_runs.py +4 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_tables.py +395 -17
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/vocabulary.py +5 -2
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/clarify.py +49 -2
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/remediation.py +1 -1
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/render.py +19 -2
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/.gitignore +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/README.md +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/scripts/hatch_build.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/skills/mr-data-build/agents/openai.yaml +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/http.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/agent_runtime.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/protocol.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/reference.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/registry.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/bounded_query.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/canonical.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/catalog_job.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/coordinator.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/crosswalks.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/declared_checks.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/deploy.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/deploy_target.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/capture.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/lane.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/ocr.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/pdf.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/registry.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/selections.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/tables.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/events.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/fast_delimited.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/formats.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/governors.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_run_worker.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/hosted_worker.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ingestion/store.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/inprocess_acquisition.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/key_seam.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/local_search/service.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/document.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/status.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/notebook.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/offline.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/operation_registry.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/operator_setup.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/pipeline.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/plan_graph.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/engine.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/errors.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/gates.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/joins.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/profile.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/table.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/progress_events.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/budgets.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/containers.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/delimited.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/registry.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/samples.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/tabular.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/vector.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/recipe.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/repair/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/repair/adapters.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/repair/contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/repair/errors.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/review.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/rowset.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/session_probes.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/signing.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/skill_assets.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/source_discovery.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/adapters.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/cadence.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/collections.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/dataset.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/deletion.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/fitness.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/governance.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/hosted.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/integration.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/registry.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/sports.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/acquire.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/approvals.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/commands.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/download.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/narrative.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/parity.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/probe.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/propose.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/research.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/runs.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/session.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/stream.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/thin/workers.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/unit_flow.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/units.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/approve.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/attendance.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/clarification.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/credentials.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/diffing.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/headline.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/inventory.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/local_review.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/login.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/peek.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/preflight.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/readers.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/ux/workload.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_recipe.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_required_controls.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/v4_transform.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/query.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.0}/src/mostlyright/data_harness/visual_run/store.py +0 -0
- {mostlyright_data-0.12.0 → mostlyright_data-0.13.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.13.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/
|
|
@@ -59,6 +59,13 @@ not the other: silent work stays silent in both, and a message that is not worth
|
|
|
59
59
|
not worth sending. This is a rule about the messages this contract already allows — it does not
|
|
60
60
|
license one extra update.
|
|
61
61
|
|
|
62
|
+
**Activity is not narration.** Setting the dataset's activity is a routine, silent act like any
|
|
63
|
+
other command: it never produces a chat message and never a cell. The rule above governs what is
|
|
64
|
+
said; activity governs what is happening. They answer different questions and never stand in for
|
|
65
|
+
each other — a phase is not a message, and a message is not a substitute for the phase. So
|
|
66
|
+
`mr-data dataset activity` is written wherever the stages below say to write it, in silence, under
|
|
67
|
+
the same rule that keeps authentication checks and receipt parsing silent.
|
|
68
|
+
|
|
62
69
|
For hosted work, register the Dataset first and open its canonical page immediately in the host's
|
|
63
70
|
in-app browser: `mr-data open /datasets/DATASET_ID` mints a single-use address for it, and
|
|
64
71
|
when that address cannot be minted, carry on without it rather than blocking.
|
|
@@ -105,7 +112,7 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
|
|
|
105
112
|
| `mr-data whoami` | Use the compatibility alias for the remotely validated `auth status` answer. |
|
|
106
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. |
|
|
107
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. |
|
|
108
|
-
| `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. |
|
|
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. |
|
|
109
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. |
|
|
110
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. |
|
|
111
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 re-acquires the declared addresses over the previous version and claims no window); `--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. |
|
|
@@ -124,16 +131,18 @@ gap rather than doing anything, and `export-hosted-candidate`, which is a backen
|
|
|
124
131
|
| `mr-data open` | Mint a single-use, short-lived address that continues this session in a browser at one dashboard path, and print it. `--open` hands it to the platform opener. The credential decides who mints: a device credential — what `mr-data login` stores — mints at Cloud, and a personal access token mints at Studio. |
|
|
125
132
|
| `mr-data promote` | Ask Studio to publish one table after a person's decision. The Harness worker does not perform the catch-up or scheduled refresh; report those only when another deployed component returns durable evidence that it did. |
|
|
126
133
|
| `mr-data reschedule` | Change how often one live table refreshes, without the demote and promote that would reset its bookkeeping and buy a catch-up run. `--cadence` takes a cron expression or an interval such as `every 6h`; `--why` records the reasoning. It starts no run. `--lock` freezes the schedule so Studio stops adjusting it; `--unlock` lets it follow the source again. |
|
|
127
|
-
| `mr-data table` | Report what one table is serving and how its refresh schedule is going: the state in plain words, the schedule in force, the next refresh, the schedule that was asked for and the reason given for it, and — once Studio has settled on one — the interval it measured and how many source updates that rests on. |
|
|
134
|
+
| `mr-data table` | Report what one table is serving and how its refresh schedule is going: the state in plain words, the schedule in force, the next refresh, the schedule that was asked for and the reason given for it, and — once Studio has settled on one — the interval it measured and how many source updates that rests on. `table rename TABLE --name NAME` writes a new name, lowercase snake_case and unique within its dataset, fenced on that dataset's version and retried once if somebody else wrote first; nothing is rebuilt, because every run, version and schedule hangs off the identifier, which does not move. `table archive TABLE --confirm-name NAME` retires the table and frees its name; a live table is refused until you `demote` it, and nothing built is deleted. |
|
|
128
135
|
| `mr-data pin` | Ask Studio to freeze one table pointer on an exact version, for a rollback or a hold. |
|
|
129
136
|
| `mr-data unpin` | Ask Studio to resume pointer tracking; read the returned state before claiming it resumed. |
|
|
130
137
|
| `mr-data demote` | Ask Studio to withdraw the pointer and any schedule it owns. |
|
|
131
138
|
|
|
132
139
|
`auth`, `login`, `whoami` and `clarify` are the same implementation in both profiles, and
|
|
133
|
-
`clarify` alone reaches nothing at all. The other twenty-four answer from Studio.
|
|
134
|
-
read: `status`, `runs`, `watch`, `peek`, `receipt`, `checks`, `download
|
|
135
|
-
|
|
136
|
-
`stream`, `open`, `note`, `promote`, `reschedule`, `pin`, `unpin` and `demote`.
|
|
140
|
+
`clarify` alone reaches nothing at all. The other twenty-four answer from Studio. Eight only
|
|
141
|
+
read: `status`, `runs`, `watch`, `peek`, `receipt`, `checks`, `download` and `diff`.
|
|
142
|
+
Sixteen start or change something: `dataset`, `recipe`, `cover`, `run`, `query`, `probe`, `keys`,
|
|
143
|
+
`stream`, `open`, `note`, `promote`, `reschedule`, `table`, `pin`, `unpin` and `demote`. The split
|
|
144
|
+
is over names, not over invocations: `table TABLE` reads and `table rename` writes, and the name
|
|
145
|
+
sits on the side of whichever half changes something.
|
|
137
146
|
|
|
138
147
|
**Any successful run is readable straight away.** There is no approval, no admission and no release
|
|
139
148
|
step between a run finishing and reading it: `download`, `receipt`, `checks`, `peek` and `query`
|
|
@@ -221,7 +230,10 @@ live data key is refused with `THIN_AUTHENTICATION_FAILED` rather than failing t
|
|
|
221
230
|
There is one loop, and it is short: open the page before you have anything to put on it, probe the
|
|
222
231
|
sources, say out loud what you chose and what you refused, draft one recipe document, build a
|
|
223
232
|
sample, interrogate what came back, fix the document, build again. Then present only what you
|
|
224
|
-
inspected, with its caveats.
|
|
233
|
+
inspected, with its caveats. The last two steps are conditional and `truncated` is what decides
|
|
234
|
+
them: a sample that came back complete IS the table a full run would have sealed, so there is
|
|
235
|
+
nothing to build again and nothing to ask about — only a TRUNCATED sample sends you round the
|
|
236
|
+
loop. Nothing between a run finishing and reading it is held for a person,
|
|
225
237
|
so there is no approval to seek, no separate body of evidence to read back, and no state to wait
|
|
226
238
|
for; the only human gate in the product is [Promote](#promote), which comes after the loop has
|
|
227
239
|
produced a table worth making live.
|
|
@@ -296,6 +308,30 @@ Hold the `dataset_id` for the rest of the session: stage 3 writes the decision r
|
|
|
296
308
|
|
|
297
309
|
### 2. Probe — read a source before committing to it
|
|
298
310
|
|
|
311
|
+
**Say what is happening, three times, silently.** The dataset's activity is the state the page's
|
|
312
|
+
own indicator reads. It is not a message and not a cell: write it and say nothing, exactly as you
|
|
313
|
+
run every other command. Write it as the search starts, again once the shortlist is in hand, and
|
|
314
|
+
again when the document is being written:
|
|
315
|
+
|
|
316
|
+
```sh
|
|
317
|
+
mr-data dataset activity DATASET_ID --phase researching \
|
|
318
|
+
--message "Looking for feeds that carry hourly stage for the Bagmati" --json
|
|
319
|
+
mr-data dataset activity DATASET_ID --phase comparing \
|
|
320
|
+
--message "Comparing four candidate gauges against the question" \
|
|
321
|
+
--fact candidates=4 --fact sources_probed=2 --json
|
|
322
|
+
mr-data dataset activity DATASET_ID --phase drafting \
|
|
323
|
+
--message "Writing the recipe: three gauges, one hourly table" --json
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
The message is one plain line about what you are doing right now, and the facts are counts you
|
|
327
|
+
already hold — how many sources the discovery lanes shortlisted, how many of them you actually
|
|
328
|
+
opened. Do not invent either; a fact you have not counted is a fact to leave out.
|
|
329
|
+
|
|
330
|
+
**Then stop writing it by hand.** Every later phase comes from the commands themselves:
|
|
331
|
+
registering a recipe, starting a run, reading a finished one, asking the user a question and
|
|
332
|
+
promoting a table each move the page on their own. Stage 2 is the one stretch of the build where
|
|
333
|
+
nothing has been submitted yet, which is why it is the one stretch that has to say so.
|
|
334
|
+
|
|
299
335
|
**Judge the sources.** This stays with the external agent and is the substance of the task. Search
|
|
300
336
|
every available discovery lane with no lane priority: a configured sealed catalog, host public-web
|
|
301
337
|
search, official provider catalogs/APIs/download indexes/documentation, and user-supplied sources.
|
|
@@ -558,6 +594,11 @@ window into any source request, so any stated `--window` is refused before acqui
|
|
|
558
594
|
mr-data run --recipe RECIPE_ID --digest RECIPE_DIGEST --sample --max-rows 2000 --json
|
|
559
595
|
```
|
|
560
596
|
|
|
597
|
+
Two thousand is the number to use before you have measured anything: it exercises every column,
|
|
598
|
+
every cast and every declared check, and it comes back while the person who asked is still
|
|
599
|
+
watching. Once stage 2 has measured the sources, raise it above the largest of them — the
|
|
600
|
+
paragraphs below say why a ceiling under the real size costs more than the run it saved.
|
|
601
|
+
|
|
561
602
|
**Both flags are required and neither is a positional.** `mr-data run RECIPE_ID` is refused:
|
|
562
603
|
`--recipe` names the registered recipe and `--digest` states which bytes of it you mean to run,
|
|
563
604
|
as the bare lowercase hex `recipe_digest` the registration receipt printed — no `sha256:` prefix.
|
|
@@ -566,16 +607,40 @@ a revision nobody read, which is why the client will not derive it for you. Hold
|
|
|
566
607
|
from the registration receipt: every run of that recipe needs the pair.
|
|
567
608
|
|
|
568
609
|
**`--max-rows` is a per-source ceiling, not a table size.** Each acquired source is truncated at
|
|
569
|
-
that many rows, so a recipe with eight sources delivers up to eight times the number you
|
|
570
|
-
— 2,000 becomes 16,000. Read the delivered size off the run's `coverage` and say the
|
|
571
|
-
reports, never the number you passed.
|
|
572
|
-
|
|
573
|
-
**
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
610
|
+
that many rows on its own, so a recipe with eight sources delivers up to eight times the number you
|
|
611
|
+
asked for — 2,000 becomes 16,000. Read the delivered size off the run's `coverage` and say the
|
|
612
|
+
number the run reports, never the number you passed.
|
|
613
|
+
|
|
614
|
+
**And because it is per source, a low ceiling breaks a multi-source recipe's own checks.** Eight
|
|
615
|
+
sources each cut at 2,000 rows are eight partial spans stitched into one table, and the seams are
|
|
616
|
+
gaps that exist nowhere in the data: a continuity or completeness check that would pass over the
|
|
617
|
+
whole thing fails over the sample, and it fails for a reason that has nothing to do with the
|
|
618
|
+
recipe. Debugging that costs more than the run it saved. The ceiling is there to stop a source you
|
|
619
|
+
have not measured from running away with the afternoon, not to make a small table.
|
|
620
|
+
|
|
621
|
+
**So: when you have measured the sources, set the ceiling above the largest one.** Stage 2 opened
|
|
622
|
+
these feeds and knows roughly how many rows each carries. Pick a number comfortably above the
|
|
623
|
+
biggest of them and the sample acquires every source whole — no artificial seams, every declared
|
|
624
|
+
check meaningful, and `coverage` untruncated on every entry, which is what makes the sample
|
|
625
|
+
finished work rather than a shape test. Where a source was never opened, and its size is therefore
|
|
626
|
+
a guess, two thousand rows a source is the fallback: it exercises every column, every cast and
|
|
627
|
+
every declared check, and it comes back while the person who asked is still watching the page.
|
|
628
|
+
|
|
629
|
+
**One Reader holds about 3 MiB of one source at a time, and that bounds what a source DELIVERS.**
|
|
630
|
+
It is the largest single source rather than the total — one Reader opens one source at a time — and
|
|
631
|
+
a source that really delivers more than that dies mid-run with `SANDBOX_MEMORY_LIMIT`. This is
|
|
632
|
+
yours to apply to the sizes stage 2 measured, not something the command decides for you:
|
|
633
|
+
`limits.max_source_bytes` states where fetching STOPS rather than how big the source is, so
|
|
634
|
+
`mr-data recipe` does not refuse a large one. It registers the document and puts one sentence on
|
|
635
|
+
the receipt under `warnings`, naming the source and both numbers. Read that as "go and check this
|
|
636
|
+
one", not as a failure: a document declaring 8 MiB over a feed that answers 40 KB is fine.
|
|
637
|
+
|
|
638
|
+
**If a source really does deliver more than the Reader holds, do not answer it by lowering the
|
|
639
|
+
ceiling on that source:** that does not fetch less data, it truncates the sample or refuses the
|
|
640
|
+
full run. Split the window across several sources — one per month, per region, or per whatever the
|
|
641
|
+
publisher paginates on — and union them in a first transform step. A recipe names up to 64 sources,
|
|
642
|
+
which is a great many windows. [The recipe document](../../docs/RECIPE-DOCUMENT.md) carries the
|
|
643
|
+
measured numbers behind the ceiling.
|
|
579
644
|
|
|
580
645
|
**The dataset's record is the primary one; a run's own record is for what happened inside that
|
|
581
646
|
run.** The sources, the decisions and the questions went onto the dataset in stage 3, where they
|
|
@@ -692,38 +757,71 @@ the checks and the coverage say what you need them to say.
|
|
|
692
757
|
### 8. Present — only what survived inspection, with caveats
|
|
693
758
|
|
|
694
759
|
Report what you inspected, and nothing you did not. Nothing else checks this run: `verified` is not
|
|
695
|
-
a word some other worker said about it, it is what you established by reading it.
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
> Inspected 2,000 rows from the acquired source snapshot — a sample. All four declared checks
|
|
699
|
-
> passed. Coverage was truncated at the row ceiling, and no run window was applied, so this is not
|
|
700
|
-
> evidence for a stated calendar interval.
|
|
701
|
-
|
|
702
|
-
Three facts carry that sentence and all three are on the run: how many rows you actually looked at,
|
|
703
|
-
what the declared checks reported, and whether `coverage.truncated` was true. A null coverage
|
|
760
|
+
a word some other worker said about it, it is what you established by reading it. Three facts carry
|
|
761
|
+
whatever you say and all three are on the run: how many rows you actually looked at, what the
|
|
762
|
+
declared checks reported, and whether `coverage.truncated` was true on any entry. A null coverage
|
|
704
763
|
window means the acquisition was unwindowed, not that it covered all time. Never present a sampled
|
|
705
764
|
row as a whole-population value, never call a run verified because it succeeded, and never report
|
|
706
765
|
coverage you did not read off `coverage`.
|
|
707
766
|
|
|
708
|
-
**
|
|
709
|
-
|
|
710
|
-
|
|
767
|
+
**Read `truncated` first, because it decides which of two endings this is.** Every coverage entry
|
|
768
|
+
carries it. When it is false on every source, nothing was cut: each source was acquired whole, and
|
|
769
|
+
the table this run sealed is the table a full run would have sealed. When it is true anywhere,
|
|
770
|
+
something was cut, and what you have is a shape rather than an answer.
|
|
771
|
+
|
|
772
|
+
**A complete sample is the build. Present it as one.** The mode a run was started in is not what
|
|
773
|
+
makes a table finished — untruncated coverage is — and calling a complete table "a sample" tells
|
|
774
|
+
somebody their dataset does not exist yet when it does. Say what was built and offer the decision
|
|
775
|
+
that is actually in front of them, which is whether to make it live:
|
|
711
776
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
777
|
+
> Built 43,812 rows from four sources, every source acquired whole and nothing truncated. All four
|
|
778
|
+
> declared checks passed. This is the table, not a sample of it.
|
|
779
|
+
|
|
780
|
+
Then offer to enable it, and enable it when they say so — `mr-data promote TABLE_ID --cadence
|
|
781
|
+
"every 6h" --why "..."`, which is [Promote](#promote), the one human gate. Do not run the whole
|
|
782
|
+
thing again to produce a table you already have.
|
|
783
|
+
|
|
784
|
+
**A truncated sample is not the build, and this is where the pause is.** State what the sample
|
|
785
|
+
established, name what was cut and on which sources, say what a full run would cover, and ask. This
|
|
786
|
+
pause is the second one this document allows alongside the promote decision, and it exists only
|
|
787
|
+
here: a full run over a real window costs real time and real money, and it is a decision about the
|
|
788
|
+
user's data rather than about the recipe, so it is theirs and not yours. Only when they say so:
|
|
717
789
|
|
|
718
790
|
```sh
|
|
719
791
|
mr-data run --recipe RECIPE_ID --digest RECIPE_DIGEST --full --json
|
|
720
792
|
```
|
|
721
793
|
|
|
794
|
+
**The same decision is a button on the dataset page.** A truncated sample puts "Run the full
|
|
795
|
+
build" on the agent pill, and pressing it starts the full run through the same spend gate the
|
|
796
|
+
command does, bare — the exact coordinate the command above names — so the answer to this pause
|
|
797
|
+
can arrive as words here or as a run you did not start. Ask, then give the turn back; do not hold
|
|
798
|
+
a stream open waiting for either. Before acting on this recipe again — on their answer, or on your
|
|
799
|
+
next turn — read `mr-data runs --json --mode full` and, for any run newer than the sample that you
|
|
800
|
+
did not start, `mr-data status RUN_ID --json` to see whether it names this recipe and digest. One
|
|
801
|
+
that does, with empty `clamps` and the default `resource_class`, is the pill's run, and its state
|
|
802
|
+
says what to do. `queued`, `running` or `succeeded` is the full run, so adopt it as if the command
|
|
803
|
+
above had started it — write its stage 5 cell, `mr-data watch RUN_ID --json` if it has not ended,
|
|
804
|
+
then stage 6. `awaiting_confirmation` is the spend gate, which they settle from the page or by
|
|
805
|
+
telling you to run the command again with `--confirm`. `awaiting_sample_approval` means Studio is
|
|
806
|
+
sampling first: read its `sample_run_id` off that status and treat that sample as another stage 6
|
|
807
|
+
while the full waits on their approval on the page, and if the sample is itself
|
|
808
|
+
`awaiting_confirmation` that is the spend gate above, on the sample. `failed` is the full run too:
|
|
809
|
+
read its triple as stage 6 says and report it, and do not start another, because a bare run of
|
|
810
|
+
this coordinate replays that failure and a new attempt is a revision (stage 7). `cancelled` means
|
|
811
|
+
they withdrew the decision, so say so and ask nothing further unless they raise it. Start a full
|
|
812
|
+
run yourself only when they said so here and that list shows none, and start it bare — no
|
|
813
|
+
ceiling, no resource class — because one coordinate is one run and a clamp is what would make a
|
|
814
|
+
second.
|
|
815
|
+
|
|
722
816
|
Then interrogate that run as stage 6 says, and present it with the sample's caveats removed and
|
|
723
817
|
its own read off `coverage`. Do not start a full run because the sample looked good, because the
|
|
724
818
|
checks passed, or because the user asked for the dataset in the first place — the request was for a
|
|
725
819
|
dataset, and the decision in front of them is whether THIS is the recipe to spend a full run on.
|
|
726
820
|
|
|
821
|
+
**Either way, offer the bytes.** A sealed table is downloadable whatever mode produced it —
|
|
822
|
+
`mr-data download RUN --output DIR --json` — so somebody who wants to look before agreeing to
|
|
823
|
+
anything can. Say so.
|
|
824
|
+
|
|
727
825
|
## Live run
|
|
728
826
|
|
|
729
827
|
`mr-data run` answers with the run identifier and Studio's own run record. These are machine-facing
|
|
@@ -1102,7 +1200,7 @@ Own the run until the requested outcome is delivered: a run that succeeded, its
|
|
|
1102
1200
|
read, its coverage inspected, and a publication request made when the user asked for it. Promotion
|
|
1103
1201
|
is complete only when Studio returns the resulting live state; catch-up and continuing freshness
|
|
1104
1202
|
require separate durable evidence from the deployed component that owns them. The allowed user pauses
|
|
1105
|
-
are the promote decision, the decision to start a full run after
|
|
1203
|
+
are the promote decision, the decision to start a full run after a TRUNCATED sample, and a spend
|
|
1106
1204
|
confirmation on a run over the threshold. Do not ask the user to choose sources, Readers, engines,
|
|
1107
1205
|
formats, workspaces, retry tactics, cleaning operations, or validation repairs. Make those
|
|
1108
1206
|
operational decisions from the question, observed evidence, registered capabilities, and
|
|
@@ -1371,6 +1371,11 @@ def _parser(
|
|
|
1371
1371
|
parser.add_argument("--version", action="version", version=f"%(prog)s {package_version()}")
|
|
1372
1372
|
subparsers = parser.add_subparsers(dest="command", required=True)
|
|
1373
1373
|
|
|
1374
|
+
# ⚠ IMPORTED HERE RATHER THAN AT MODULE SCOPE, the rule every thin-lane import in this file
|
|
1375
|
+
# follows: `cli` is the local front door and the hosted lane is loaded when a parser is built,
|
|
1376
|
+
# not when this module is.
|
|
1377
|
+
from mostlyright.data_harness.thin import activity as _thin_activity
|
|
1378
|
+
|
|
1374
1379
|
# `--json` lives on the subcommands, never on the top-level parser: one dest declared at both
|
|
1375
1380
|
# levels lets the subparser default silently overwrite a value the caller gave up front.
|
|
1376
1381
|
json_parent = argparse.ArgumentParser(add_help=False)
|
|
@@ -1381,9 +1386,17 @@ def _parser(
|
|
|
1381
1386
|
)
|
|
1382
1387
|
|
|
1383
1388
|
def _add(*args: Any, **kwargs: Any) -> argparse.ArgumentParser:
|
|
1384
|
-
"""Add one subcommand. Every subcommand takes `--json`; that is not optional.
|
|
1389
|
+
"""Add one subcommand. Every subcommand takes `--json`; that is not optional.
|
|
1390
|
+
|
|
1391
|
+
And the commands that tell the dataset page what they are doing take `--no-activity`,
|
|
1392
|
+
through the same function `thin.router` calls: every gate in the suite holds the two front
|
|
1393
|
+
doors' argument surfaces equal command for command, so a flag one of them grows is a flag
|
|
1394
|
+
the other grows in the same commit or not at all.
|
|
1395
|
+
"""
|
|
1385
1396
|
|
|
1386
|
-
|
|
1397
|
+
added = subparsers.add_parser(*args, parents=[json_parent], **kwargs)
|
|
1398
|
+
_thin_activity.declare_opt_out(str(args[0]) if args else "", added)
|
|
1399
|
+
return added
|
|
1387
1400
|
|
|
1388
1401
|
# The arguments several commands share, written once. `--help` is the first thing anyone reads
|
|
1389
1402
|
# and often the only thing, so an argument that says nothing is an argument someone has to go
|
|
@@ -137,7 +137,7 @@ from mostlyright.data_harness.sources.stream_registry import (
|
|
|
137
137
|
)
|
|
138
138
|
from mostlyright.data_harness.sources.stream_rotation import run_series_rotation
|
|
139
139
|
from mostlyright.data_harness.sources.stream_series import (
|
|
140
|
-
|
|
140
|
+
STREAM_SERIES_VERSIONS,
|
|
141
141
|
load_stream_series,
|
|
142
142
|
series_gap_report,
|
|
143
143
|
series_windows,
|
|
@@ -1354,7 +1354,7 @@ def _sort_series_documents(registry_root: Path, series_root: Path) -> None:
|
|
|
1354
1354
|
document = parse_json(path.read_bytes())
|
|
1355
1355
|
except (CanonicalJSONError, OSError, TypeError, ValueError):
|
|
1356
1356
|
continue
|
|
1357
|
-
if isinstance(document, dict) and document.get("schema_version")
|
|
1357
|
+
if isinstance(document, dict) and document.get("schema_version") in STREAM_SERIES_VERSIONS:
|
|
1358
1358
|
os.rename(path, series_root / name)
|
|
1359
1359
|
|
|
1360
1360
|
|
|
@@ -29,6 +29,12 @@ from pathlib import Path
|
|
|
29
29
|
from typing import Any, Protocol
|
|
30
30
|
from urllib.parse import urlsplit
|
|
31
31
|
|
|
32
|
+
from mostlyright.data_harness.acquisition.http import (
|
|
33
|
+
PinnedHttpsRetriever,
|
|
34
|
+
RetrievalLimits,
|
|
35
|
+
StdlibPinnedTransport,
|
|
36
|
+
)
|
|
37
|
+
from mostlyright.data_harness.acquisition.url_policy import EgressPolicy, SystemResolver
|
|
32
38
|
from mostlyright.data_harness.canonical import sha256_bytes
|
|
33
39
|
from mostlyright.data_harness.hosted_bootstrap import (
|
|
34
40
|
BootstrapTransport,
|
|
@@ -38,6 +44,9 @@ from mostlyright.data_harness.hosted_bootstrap import (
|
|
|
38
44
|
from mostlyright.data_harness.hosted_stream_recorder_job import (
|
|
39
45
|
_production_prelude_transport as _recorder_prelude_transport,
|
|
40
46
|
)
|
|
47
|
+
from mostlyright.data_harness.hosted_stream_recorder_job import (
|
|
48
|
+
_sort_series_documents,
|
|
49
|
+
)
|
|
41
50
|
from mostlyright.data_harness.ingestion.gcs_store import (
|
|
42
51
|
GCSObjectTransport,
|
|
43
52
|
GoogleCloudStorageJSONTransport,
|
|
@@ -55,6 +64,12 @@ from mostlyright.data_harness.sources.stream_registry import (
|
|
|
55
64
|
StreamConnectorEntry,
|
|
56
65
|
load_stream_connector_registry,
|
|
57
66
|
)
|
|
67
|
+
from mostlyright.data_harness.sources.stream_series import (
|
|
68
|
+
MAX_DISCOVERY_RESPONSE_BYTES,
|
|
69
|
+
SERIES_DIRECTORY_NAME,
|
|
70
|
+
StreamSeriesConfig,
|
|
71
|
+
load_stream_series_documents,
|
|
72
|
+
)
|
|
58
73
|
from mostlyright.data_harness.stream_subscription_feed import (
|
|
59
74
|
ConnectorFrameDecoder,
|
|
60
75
|
ThreadedConnectorFeed,
|
|
@@ -64,9 +79,12 @@ from mostlyright.data_harness.stream_subscription_worker import (
|
|
|
64
79
|
MAX_ACTIVE_SUBSCRIPTIONS,
|
|
65
80
|
ClaimedSubscription,
|
|
66
81
|
ContinuousSubscriptionWorker,
|
|
82
|
+
DiscoveryTransport,
|
|
83
|
+
RosterPlanner,
|
|
67
84
|
StreamSubscriptionError,
|
|
68
85
|
SubscriptionFeed,
|
|
69
86
|
install_shutdown_handlers,
|
|
87
|
+
utc_now,
|
|
70
88
|
)
|
|
71
89
|
from mostlyright.data_harness.stream_venue import StreamVenueError, materialize_connector_registry
|
|
72
90
|
from mostlyright.data_harness.studio_subscription_control import StudioSubscriptionControl
|
|
@@ -302,6 +320,154 @@ def _claim_text(value: str | None, label: str) -> str:
|
|
|
302
320
|
return value
|
|
303
321
|
|
|
304
322
|
|
|
323
|
+
class SubscriptionRosterResolver(Protocol):
|
|
324
|
+
"""Build the roster planner one series-following claim needs."""
|
|
325
|
+
|
|
326
|
+
def create(self, claim: ClaimedSubscription) -> RosterPlanner: ...
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
class ProductionSubscriptionRosterResolver:
|
|
330
|
+
"""Resolve a claim's pinned series document into the planner that walks its roster.
|
|
331
|
+
|
|
332
|
+
The series arrives the way the connector does: as bytes inside the registry the claim pinned,
|
|
333
|
+
materialized into one private temporary directory, checked against the digest the claim named,
|
|
334
|
+
and parsed by the harness grammar that owns it. Nothing about what a series SAYS is decided
|
|
335
|
+
here, and no second document reader exists: the recorder Job and this worker sort a flat
|
|
336
|
+
registry into its two loaders by the same rule.
|
|
337
|
+
|
|
338
|
+
The discovery leg is a pinned-egress HTTPS retriever narrowed to the one host the document
|
|
339
|
+
names, no redirects, JSON only, one bounded answer per page. It is built per claim so a
|
|
340
|
+
series can never reach a host its own document did not write down.
|
|
341
|
+
"""
|
|
342
|
+
|
|
343
|
+
def __init__(
|
|
344
|
+
self,
|
|
345
|
+
*,
|
|
346
|
+
work_root: Path,
|
|
347
|
+
objects: GCSObjectTransport | None = None,
|
|
348
|
+
discovery_transport: Callable[[StreamSeriesConfig], DiscoveryTransport] | None = None,
|
|
349
|
+
utc_clock: Callable[[], str] | None = None,
|
|
350
|
+
) -> None:
|
|
351
|
+
self.work_root = work_root
|
|
352
|
+
self.objects = GoogleCloudStorageJSONTransport() if objects is None else objects
|
|
353
|
+
self.discovery_transport = (
|
|
354
|
+
_production_discovery_transport if discovery_transport is None else discovery_transport
|
|
355
|
+
)
|
|
356
|
+
self.utc_clock = utc_now if utc_clock is None else utc_clock
|
|
357
|
+
|
|
358
|
+
def create(self, claim: ClaimedSubscription) -> RosterPlanner:
|
|
359
|
+
series = claim.series
|
|
360
|
+
if series is None:
|
|
361
|
+
raise StreamSubscriptionError(
|
|
362
|
+
"STREAM_SUBSCRIPTION_SERIES_INVALID", "claim follows no series"
|
|
363
|
+
)
|
|
364
|
+
config = _materialized_claim_series(claim, self.objects, self.work_root)
|
|
365
|
+
if series.selection_rule is not None and config.selection_rule != series.selection_rule:
|
|
366
|
+
# Checked only where the claim states it: the document is the authority for the rule,
|
|
367
|
+
# and a claim that restates it and disagrees is a claim about another document.
|
|
368
|
+
raise StreamSubscriptionError(
|
|
369
|
+
"STREAM_SUBSCRIPTION_SERIES_INVALID", "materialized series selection rule"
|
|
370
|
+
)
|
|
371
|
+
return RosterPlanner(
|
|
372
|
+
config=config,
|
|
373
|
+
now=self.utc_clock,
|
|
374
|
+
discover=self.discovery_transport(config) if config.discovered else None,
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
def _materialized_claim_series(
|
|
379
|
+
claim: ClaimedSubscription, objects: GCSObjectTransport, work_root: Path
|
|
380
|
+
) -> StreamSeriesConfig:
|
|
381
|
+
"""Materialize and verify precisely the series document this lease was granted for."""
|
|
382
|
+
|
|
383
|
+
series = claim.series
|
|
384
|
+
assert series is not None # the caller refuses a claim that follows none
|
|
385
|
+
root = Path(tempfile.mkdtemp(prefix="stream-subscription-series-", dir=work_root))
|
|
386
|
+
try:
|
|
387
|
+
os.chmod(root, 0o700)
|
|
388
|
+
registry_root = root / "registry"
|
|
389
|
+
registry_root.mkdir(mode=0o700)
|
|
390
|
+
series_root = registry_root / SERIES_DIRECTORY_NAME
|
|
391
|
+
series_root.mkdir(mode=0o700)
|
|
392
|
+
materialize_connector_registry(
|
|
393
|
+
transport=objects,
|
|
394
|
+
bucket=_claim_text(claim.stream_venue_bucket, "stream venue bucket"),
|
|
395
|
+
registry_prefix=_claim_text(claim.connector_registry_prefix, "registry prefix"),
|
|
396
|
+
registry_digest=_claim_text(claim.connector_registry_digest, "registry digest"),
|
|
397
|
+
root=registry_root,
|
|
398
|
+
)
|
|
399
|
+
_sort_series_documents(registry_root, series_root)
|
|
400
|
+
documents = load_stream_series_documents(registry_root)
|
|
401
|
+
held = documents.get(series.series_id)
|
|
402
|
+
if held is None:
|
|
403
|
+
raise StreamSubscriptionError(
|
|
404
|
+
"STREAM_SUBSCRIPTION_SERIES_INVALID", "series is not in the pinned registry"
|
|
405
|
+
)
|
|
406
|
+
if held.document_digest != series.series_document_digest:
|
|
407
|
+
raise StreamSubscriptionError(
|
|
408
|
+
"STREAM_SUBSCRIPTION_SERIES_INVALID", "materialized series document digest"
|
|
409
|
+
)
|
|
410
|
+
if held.config.connector_id != claim.connector_id:
|
|
411
|
+
raise StreamSubscriptionError(
|
|
412
|
+
"STREAM_SUBSCRIPTION_SERIES_INVALID", "series rotates another connector"
|
|
413
|
+
)
|
|
414
|
+
return held.config
|
|
415
|
+
except StreamSubscriptionError:
|
|
416
|
+
raise
|
|
417
|
+
except (OSError, SourceContractError, StreamVenueError) as error:
|
|
418
|
+
raise StreamSubscriptionError(
|
|
419
|
+
"STREAM_SUBSCRIPTION_SERIES_INVALID", type(error).__name__
|
|
420
|
+
) from error
|
|
421
|
+
finally:
|
|
422
|
+
shutil.rmtree(root, ignore_errors=True)
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def _production_discovery_transport(config: StreamSeriesConfig) -> DiscoveryTransport:
|
|
426
|
+
"""The pinned HTTPS leg one discovered series reads its listing over.
|
|
427
|
+
|
|
428
|
+
This worker builds no HTTP client of its own: the retriever is the same pinned-egress one the
|
|
429
|
+
keyed acquisition lane uses, narrowed here to the one host the series document names, port
|
|
430
|
+
443, no redirects, JSON only, and one bounded answer per request. A roster is read from a
|
|
431
|
+
literal address a reviewer approved, or it is not read.
|
|
432
|
+
"""
|
|
433
|
+
|
|
434
|
+
discovery = config.discovery
|
|
435
|
+
if discovery is None: # pragma: no cover - only a discovered series reaches this
|
|
436
|
+
raise StreamSubscriptionError(
|
|
437
|
+
"STREAM_SUBSCRIPTION_SERIES_INVALID", "series declares no discovery"
|
|
438
|
+
)
|
|
439
|
+
hostname = urlsplit(discovery.url).hostname
|
|
440
|
+
if not hostname:
|
|
441
|
+
raise StreamSubscriptionError(
|
|
442
|
+
"STREAM_SUBSCRIPTION_DISCOVERY_INVALID", "discovery address names no host"
|
|
443
|
+
)
|
|
444
|
+
retriever = PinnedHttpsRetriever(
|
|
445
|
+
resolver=SystemResolver(),
|
|
446
|
+
egress_policy=EgressPolicy(allowed_hostnames=(hostname,), allowed_ports=frozenset({443})),
|
|
447
|
+
transport=StdlibPinnedTransport(),
|
|
448
|
+
limits=RetrievalLimits(
|
|
449
|
+
max_response_bytes=MAX_DISCOVERY_RESPONSE_BYTES,
|
|
450
|
+
max_aggregate_response_bytes=MAX_DISCOVERY_RESPONSE_BYTES,
|
|
451
|
+
max_redirects=0,
|
|
452
|
+
# More than one request per page so a host answering on several addresses can be
|
|
453
|
+
# reached at all: the budget is spent walking the approved peer set, not following
|
|
454
|
+
# redirects, and a single-attempt budget dies on the first unroutable address.
|
|
455
|
+
max_requests=4,
|
|
456
|
+
max_ranges=1,
|
|
457
|
+
connect_timeout_seconds=5.0,
|
|
458
|
+
read_timeout_seconds=30.0,
|
|
459
|
+
total_timeout_seconds=45.0,
|
|
460
|
+
max_concurrency=1,
|
|
461
|
+
allowed_media_types=("application/json",),
|
|
462
|
+
),
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
def fetch(url: str) -> bytes:
|
|
466
|
+
return retriever.retrieve(url).content
|
|
467
|
+
|
|
468
|
+
return fetch
|
|
469
|
+
|
|
470
|
+
|
|
305
471
|
@dataclass(frozen=True)
|
|
306
472
|
class SubscriptionWorkerRuntimeConfig:
|
|
307
473
|
"""Bounded deployment inputs; provider policy remains in the claimed subscription."""
|
|
@@ -381,6 +547,7 @@ def build_worker(
|
|
|
381
547
|
sealer: GCSSubscriptionSealer | None = None,
|
|
382
548
|
feed_resolver: SubscriptionFeedResolver | None = None,
|
|
383
549
|
credential_resolver: SubscriptionCredentialResolver | None = None,
|
|
550
|
+
roster_resolver: SubscriptionRosterResolver | None = None,
|
|
384
551
|
object_transport: GCSObjectTransport | None = None,
|
|
385
552
|
stream_connect: StreamConnect | None = None,
|
|
386
553
|
prelude_transport: Callable[[StreamConnectorEntry], PreludeTransport | None] | None = None,
|
|
@@ -420,12 +587,21 @@ def build_worker(
|
|
|
420
587
|
if feed_resolver is None
|
|
421
588
|
else feed_resolver
|
|
422
589
|
)
|
|
590
|
+
active_rosters = (
|
|
591
|
+
ProductionSubscriptionRosterResolver(
|
|
592
|
+
work_root=config.work_root,
|
|
593
|
+
objects=active_objects,
|
|
594
|
+
)
|
|
595
|
+
if roster_resolver is None
|
|
596
|
+
else roster_resolver
|
|
597
|
+
)
|
|
423
598
|
return ContinuousSubscriptionWorker(
|
|
424
599
|
control=active_control,
|
|
425
600
|
sealer=active_sealer,
|
|
426
601
|
feed_factory=lambda claim: active_feeds.create(
|
|
427
602
|
claim, credential_resolver=active_credentials
|
|
428
603
|
),
|
|
604
|
+
roster_factory=active_rosters.create,
|
|
429
605
|
max_active_subscriptions=config.max_active_subscriptions,
|
|
430
606
|
heartbeat_seconds=config.heartbeat_seconds,
|
|
431
607
|
idle_poll_seconds=config.idle_poll_seconds,
|
|
@@ -540,8 +716,10 @@ def _bounded_float(
|
|
|
540
716
|
__all__ = [
|
|
541
717
|
"DEFAULT_WORK_ROOT",
|
|
542
718
|
"HostedStreamSubscriptionWorkerError",
|
|
719
|
+
"ProductionSubscriptionRosterResolver",
|
|
543
720
|
"SubscriptionCredentialResolver",
|
|
544
721
|
"SubscriptionFeedResolver",
|
|
722
|
+
"SubscriptionRosterResolver",
|
|
545
723
|
"SubscriptionWorkerRuntimeConfig",
|
|
546
724
|
"build_control",
|
|
547
725
|
"build_worker",
|