mostlyright-data 0.18.1__tar.gz → 0.18.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/PKG-INFO +1 -1
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/pyproject.toml +1 -1
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connector.py +14 -5
- mostlyright_data-0.18.2/src/mostlyright/data_harness/sources/stream_numbers.py +338 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_segment_spill.py +27 -5
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_subscription_feed.py +78 -6
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_subscription_worker.py +99 -3
- mostlyright_data-0.18.1/src/mostlyright/data_harness/sources/stream_numbers.py +0 -93
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/.gitignore +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/README.md +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/scripts/hatch_build.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/skills/mr-data-build/SKILL.md +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/skills/mr-data-build/agents/openai.yaml +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/http.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/sandbox_bootstrap.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/agent_runtime.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/protocol.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/reference.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/registry.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/bounded_query.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/bounded_scratch_sink.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/canonical.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/catalog_job.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/cli.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/compact_worker.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/contracts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/coordinator.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/crosswalks.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/declared_checks.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta_checks.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta_classifier.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta_persist.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta_recompute.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta_rows.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/deploy.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/deploy_target.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/capture.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/contracts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/lane.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/ocr.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/pdf.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/registry.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/selections.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/tables.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/events.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/fast_delimited.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/fetch_egress_smoke.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/formats.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/governors.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_ingestion_worker.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_run_worker.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_worker.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/incremental_slice_executor.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/incremental_worker.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/store.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/inprocess_acquisition.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/key_seam.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/legacy_table_recovery.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/legacy_table_recovery_contract.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/local_contracts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/document.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/status.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/notebook.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/offline.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/operation_registry.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/operator_setup.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/page_coverage.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/part_check_evidence.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/pipeline.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/plan_graph.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/engine.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/errors.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/gates.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/joins.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/profile.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/table.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/progress_events.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/budgets.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/configurable_delimited.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/containers.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/contracts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/delimited.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/registry.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/2.0.0/publisher_preamble/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/2.0.0/publisher_preamble/indices.csv +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.1.0/article_text_order/article.html +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.1.0/article_text_order/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/himawari-hsd-b13-complete.zip +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/tabular.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/vector.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/recipe.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/review.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/rowset.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/run_execution_v4.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/run_phase_timing.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/session_probes.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/signing.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/skill_assets.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_bootstrap.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_bundle_writer.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_discovery.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_history_candidate_child.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_history_transform_child.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_inventory.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_partition.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_raw_inventory.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_state_index.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/adapters.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/cadence.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/collections.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/contracts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/dataset.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/deletion.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/fitness.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/governance.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/hosted.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/integration.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/page_collections.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/registry.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/sports.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.array-frames.v4.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.json-keepalive.v4.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.loose-frames.v4.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.text-keepalive.v4.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_order_vector.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_recovery_objects.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_subscription_sealer.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_venue.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/studio_boundary.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/studio_subscription_control.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/table_manifest.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/table_parts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/table_profile.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/acquire.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/activity.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/approvals.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/categories.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/collection_plan.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/commands.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/dataset-categories-v1.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/download.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/narrative.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/parity.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/probe.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/propose.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/recipe.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/research.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/router.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/runs.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/session.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/stream.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/transport.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/user_agent.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_catalog.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_connections.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_datasets.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_tables.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/workers.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/unit_flow.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/units.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/attendance.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/clarification.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/credentials.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/headline.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/local_review.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/login.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/readers.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/remediation.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/render.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_closed_source.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_recipe.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_required_controls.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_transform.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_window.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/store.py +0 -0
- {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/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.18.
|
|
3
|
+
Version: 0.18.2
|
|
4
4
|
Summary: Mostly Right CLI for reproducible, reviewed Parquet datasets
|
|
5
5
|
Project-URL: Homepage, https://mostlyright.md/
|
|
6
6
|
Project-URL: Documentation, https://mostlyright.md/docs/guides/cli/
|
|
@@ -57,7 +57,6 @@ from mostlyright.data_harness.canonical import (
|
|
|
57
57
|
CanonicalJSONError,
|
|
58
58
|
canonical_json_bytes,
|
|
59
59
|
canonical_sha256,
|
|
60
|
-
parse_json,
|
|
61
60
|
)
|
|
62
61
|
from mostlyright.data_harness.sources.authenticated_https import _canonical_origin
|
|
63
62
|
from mostlyright.data_harness.sources.authenticated_https_v2 import (
|
|
@@ -69,7 +68,7 @@ from mostlyright.data_harness.sources.authenticated_https_v2 import (
|
|
|
69
68
|
_parse_request,
|
|
70
69
|
)
|
|
71
70
|
from mostlyright.data_harness.sources.contracts import SourceContractError
|
|
72
|
-
from mostlyright.data_harness.sources.stream_numbers import
|
|
71
|
+
from mostlyright.data_harness.sources.stream_numbers import parse_frame_json
|
|
73
72
|
|
|
74
73
|
STREAM_CONNECTOR_VERSION = "harness-stream-connector.v1"
|
|
75
74
|
STREAM_CONNECTOR_VERSION_V2 = "harness-stream-connector.v2"
|
|
@@ -860,11 +859,21 @@ class StreamConnectorConfig:
|
|
|
860
859
|
The single reader every caller that reads a frame of this venue picks up, so a capture, a
|
|
861
860
|
credential acknowledgement and a probe cannot disagree about whether ``0.5`` is a message
|
|
862
861
|
or a decode error.
|
|
862
|
+
|
|
863
|
+
BOTH READINGS GO THROUGH THE FRAME READER, which differs from the document reader in one
|
|
864
|
+
bound and one only: how many JSON members one frame may carry. A frame is bounded by bytes
|
|
865
|
+
where it was assembled, and a venue asked about a large roster answers the whole roster in
|
|
866
|
+
one array; the canonical member ceiling was written for what this build seals, and applying
|
|
867
|
+
it here refused an answer this build had asked for. Whether that array IS a batch is this
|
|
868
|
+
document's word (``frame_shape``), and the reader is told it, because a batch is sealed
|
|
869
|
+
element by element and a single message is sealed whole: each is held at the read to what
|
|
870
|
+
its seal will hold it to. See
|
|
871
|
+
:func:`~mostlyright.data_harness.sources.stream_numbers.parse_frame_json`.
|
|
863
872
|
"""
|
|
864
873
|
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
874
|
+
return parse_frame_json(
|
|
875
|
+
text, numbers_as_text=self.numbers == NUMBERS_TEXT, batches=self.admits_array_frames
|
|
876
|
+
)
|
|
868
877
|
|
|
869
878
|
@property
|
|
870
879
|
def ignores_untyped_messages(self) -> bool:
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"""Read a venue frame, in either number reading, under the bounds a frame actually has.
|
|
2
|
+
|
|
3
|
+
The text reading is a third reading beside :func:`parse_json` and :func:`parse_foreign_json`, for
|
|
4
|
+
a document whose numbers have to survive being sealed. A venue that writes a price as ``0.5``
|
|
5
|
+
writes a fractional number, and :func:`parse_json` refuses one because nothing fractional may
|
|
6
|
+
reach a digest;
|
|
7
|
+
:func:`parse_foreign_json` reads it as a float, which may be inspected but never written, so a frame
|
|
8
|
+
read that way could not become a recorded line. Neither answer is available to a reader whose
|
|
9
|
+
whole job is to keep the frame.
|
|
10
|
+
|
|
11
|
+
So the number is kept as the literal its sender wrote. ``parse_int`` and ``parse_float`` are
|
|
12
|
+
handed the exact text JSON's own grammar matched -- ``0.5``, ``-3``, ``1e9`` -- and that text is the
|
|
13
|
+
value. No precision is chosen, because none is computed: the string that comes back is the string
|
|
14
|
+
that went in, so ``0.10`` and ``0.1`` stay the two different things the venue said them as, and a
|
|
15
|
+
seventy-seven-digit integer keeps all seventy-seven digits. The result holds a string wherever a
|
|
16
|
+
number stood and is therefore an ordinary value of the canonical data model:
|
|
17
|
+
:func:`~mostlyright.data_harness.canonical.canonical_json_bytes` seals it and :func:`parse_json`
|
|
18
|
+
reads it back unchanged.
|
|
19
|
+
|
|
20
|
+
Everything else is exactly as strict as the canonical reader. ``NaN`` and ``Infinity`` are still
|
|
21
|
+
refused, and so are duplicate object keys, byte-order marks, non-strict UTF-8, unpaired surrogates,
|
|
22
|
+
and the depth and string-length bounds. The reader lives beside the canonical module rather than
|
|
23
|
+
inside it because that module's bytes are a cross-system pin.
|
|
24
|
+
|
|
25
|
+
THE MEMBER BOUND IS THE ONE THING A FRAME DOES NOT SHARE WITH A DOCUMENT, and
|
|
26
|
+
:func:`parse_frame_json` is the reader that says so, for BOTH number readings. A frame is already
|
|
27
|
+
bounded, by bytes, at the transport that assembled it; the canonical member ceiling was written for
|
|
28
|
+
what this build seals and digests, where a hundred thousand members is far past anything authored
|
|
29
|
+
here. A venue asked about a roster of sixteen hundred members answers all sixteen hundred in one
|
|
30
|
+
array, and a count written for a different kind of document refused the answer it had been asked
|
|
31
|
+
for. See :data:`MAX_FRAME_MEMBERS` for where the frame's ceiling comes from instead, and
|
|
32
|
+
:func:`parse_frame_json` for why nothing it admits is ever sealed as one value.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
from __future__ import annotations
|
|
36
|
+
|
|
37
|
+
import json
|
|
38
|
+
import math
|
|
39
|
+
from collections.abc import Callable
|
|
40
|
+
from typing import Any
|
|
41
|
+
|
|
42
|
+
from mostlyright.data_harness.canonical import (
|
|
43
|
+
MAX_CANONICAL_DEPTH,
|
|
44
|
+
MAX_CANONICAL_INTEGER,
|
|
45
|
+
MAX_CANONICAL_MEMBERS,
|
|
46
|
+
MAX_CANONICAL_STRING_LENGTH,
|
|
47
|
+
CanonicalJSONError,
|
|
48
|
+
_parse_integer,
|
|
49
|
+
_reject_constant,
|
|
50
|
+
_reject_duplicate_pairs,
|
|
51
|
+
_reject_fraction,
|
|
52
|
+
_validate_unicode,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
__all__ = [
|
|
56
|
+
"MAX_FRAME_MEMBERS",
|
|
57
|
+
"MAX_MESSAGE_MEMBERS",
|
|
58
|
+
"RECORDED_LINE_WRAPPER_MEMBERS",
|
|
59
|
+
"parse_frame_json",
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
#: The largest number of JSON members one frame off a socket may be read as.
|
|
63
|
+
#:
|
|
64
|
+
#: A FRAME IS NOT A DOCUMENT THIS BUILD WRITES, and the canonical member ceiling was written for
|
|
65
|
+
#: one that is. :data:`~mostlyright.data_harness.canonical.MAX_CANONICAL_MEMBERS` bounds what may
|
|
66
|
+
#: be sealed, digested and read back, where a hundred thousand members is already far past
|
|
67
|
+
#: anything this repository authors. A frame is a venue's own answer to a subscription, and a
|
|
68
|
+
#: venue that is asked about sixteen hundred members may answer all sixteen hundred in one array,
|
|
69
|
+
#: each an object of a few dozen members with nested sides of its own. That frame is bounded
|
|
70
|
+
#: already -- by bytes, at the transport, where an assembled message past
|
|
71
|
+
#: ``MAX_MESSAGE_BYTES`` is refused before a reader ever sees it -- and bounding it a second time
|
|
72
|
+
#: by a count written for a different kind of document refuses an answer the venue was asked for.
|
|
73
|
+
#:
|
|
74
|
+
#: So the ceiling here is DERIVED FROM THE BOUND THAT ALREADY HOLDS rather than chosen: the
|
|
75
|
+
#: smallest JSON member is two bytes (``[]`` is one member in one pair of bytes, and every member
|
|
76
|
+
#: inside a container costs at least a delimiter and a character), so a frame of at most N bytes
|
|
77
|
+
#: cannot hold more than N // 2 members. The count therefore adds no capacity the byte bound did
|
|
78
|
+
#: not already grant -- it stays a real ceiling for a reader walking a value that is not bytes,
|
|
79
|
+
#: while never being the bound that decides a frame. The relationship is asserted against the
|
|
80
|
+
#: transport's own constant in the connector's tests; it is not imported, because the reader of a
|
|
81
|
+
#: frame's bytes has no business reaching the socket that assembled them.
|
|
82
|
+
MAX_FRAME_MEMBERS = (8 * 1024 * 1024) // 2
|
|
83
|
+
|
|
84
|
+
#: How many JSON members the WIDEST line this build writes adds around the message it carries.
|
|
85
|
+
#:
|
|
86
|
+
#: A venue message is written down more than once on its way to a table. The capture session
|
|
87
|
+
#: and the segment recorder write it as ``{"epoch": …, "message": …, "received_at": …}``, three
|
|
88
|
+
#: members it did not bring; the Recorder then seals it as one line of exactly the members
|
|
89
|
+
#: ``sources.stream.SEALED_FRAME_KEYS`` names -- the line object and seven scalar siblings
|
|
90
|
+
#: beside ``message`` -- which is eight. The ceiling below is derived from the widest of those,
|
|
91
|
+
#: because a message that fits the first line and not the last is admitted at the read and
|
|
92
|
+
#: refused at the seal, which is the failure this module exists to remove. The number is stated
|
|
93
|
+
#: here rather than imported, for the reason the frame ceiling states its own: this reader has
|
|
94
|
+
#: no business reaching the Recorder, and the tests hold the two equal so a key added to the
|
|
95
|
+
#: sealed line moves this or fails the build.
|
|
96
|
+
RECORDED_LINE_WRAPPER_MEMBERS = 8
|
|
97
|
+
|
|
98
|
+
#: The largest number of JSON members ONE MESSAGE may carry and still be sealed as one line.
|
|
99
|
+
#:
|
|
100
|
+
#: The frame ceiling above is about what a venue may answer with; this is about what this build
|
|
101
|
+
#: may write down, and it is the canonical ceiling less the widest line's wrapper. A message is
|
|
102
|
+
#: sealed by the canonical writer as one recorded line and read back by the strict reader as one,
|
|
103
|
+
#: so a message past this count is one the seal refuses whatever the read admitted. THE READ
|
|
104
|
+
#: THEREFORE HOLDS IT TOO: a frame that is one message is read under this ceiling exactly as it
|
|
105
|
+
#: always was, and a batch frame's elements are each read under it, because each becomes one
|
|
106
|
+
#: line. Only the batch as a whole may exceed it, up to the frame ceiling, because a batch is
|
|
107
|
+
#: never sealed whole. Nothing this reader admits is refused one step later for its size.
|
|
108
|
+
MAX_MESSAGE_MEMBERS = MAX_CANONICAL_MEMBERS - RECORDED_LINE_WRAPPER_MEMBERS
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def parse_frame_json(
|
|
112
|
+
value: str | bytes | bytearray | memoryview, *, numbers_as_text: bool, batches: bool
|
|
113
|
+
) -> Any:
|
|
114
|
+
"""Read ONE FRAME off a socket, in either number reading, bounded the way a frame is bounded.
|
|
115
|
+
|
|
116
|
+
The two readings are the same reader here on purpose. Whether ``0.5`` is a message or a decode
|
|
117
|
+
error is the venue document's statement and is answered by ``numbers_as_text``; how large an
|
|
118
|
+
answer a venue may give is not a number-reading question at all, and a frame ceiling that
|
|
119
|
+
applied to only one of the two readings would be a build where a venue's answer was admitted
|
|
120
|
+
or refused according to how its prices are spelled.
|
|
121
|
+
|
|
122
|
+
EVERY OTHER BOUND IS THE CANONICAL ONE, UNCHANGED: duplicate object keys, byte-order marks,
|
|
123
|
+
non-strict UTF-8, ``NaN``/``Infinity``, out-of-range integers, unpaired surrogates, the
|
|
124
|
+
sixty-four-level nesting bound and the string-length bound all refuse exactly what they refuse
|
|
125
|
+
for a document. Only the member count differs, and it differs by what will be sealed.
|
|
126
|
+
|
|
127
|
+
``batches`` is the document's word on whether an array frame is a batch of messages, and it
|
|
128
|
+
decides which ceiling holds over what. A frame that is ONE MESSAGE is read under
|
|
129
|
+
:data:`MAX_MESSAGE_MEMBERS`, because it becomes one recorded line and a line past the canonical
|
|
130
|
+
ceiling is one the seal refuses -- which is the count a frame was always read under, less the
|
|
131
|
+
widest line's wrapper. A frame that is a BATCH is read under :data:`MAX_FRAME_MEMBERS` as a
|
|
132
|
+
whole and under :data:`MAX_MESSAGE_MEMBERS` per element, because ``_admit_batch``
|
|
133
|
+
and the hosted feed's ``_frame_messages`` write each element as its own line with its own
|
|
134
|
+
sequence and the frame's arrival time, and the strict reader that reads a recording back
|
|
135
|
+
(``stream_recorder``) reads those LINES, one message each. So a frame carrying a venue's whole
|
|
136
|
+
roster becomes a thousand-odd ordinary documents, every one of them under the canonical
|
|
137
|
+
member ceiling, and that ceiling goes on holding over everything this build writes and
|
|
138
|
+
digests. A refusal for size is raised HERE, at the read every lane already guards, and
|
|
139
|
+
never one step later at a write no lane guards; the transport bounds the bytes, and every
|
|
140
|
+
place a frame is written down afterwards holds whatever the transport admitted.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
return _read(
|
|
144
|
+
value,
|
|
145
|
+
number=_number_literal if numbers_as_text else None,
|
|
146
|
+
max_members=MAX_MESSAGE_MEMBERS,
|
|
147
|
+
batch_ceiling=MAX_FRAME_MEMBERS if batches else None,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _read(
|
|
152
|
+
value: str | bytes | bytearray | memoryview,
|
|
153
|
+
*,
|
|
154
|
+
number: Callable[[str], str] | None,
|
|
155
|
+
max_members: int,
|
|
156
|
+
batch_ceiling: int | None = None,
|
|
157
|
+
) -> Any:
|
|
158
|
+
"""The one reading both entry points are, differing only in numbers and in member ceiling.
|
|
159
|
+
|
|
160
|
+
``max_members`` bounds whatever is read as ONE VALUE: a document, a message, or one element
|
|
161
|
+
of a batch. With a ``batch_ceiling``, a top-level array is a batch -- walked one element at a
|
|
162
|
+
time, each under ``max_members`` with a count of its own, and the array as a whole held to
|
|
163
|
+
the batch ceiling beside them; anything that is not a top-level array is one value as
|
|
164
|
+
before. The paths and the depth are exactly what one walk over the whole array would have
|
|
165
|
+
named, so a refusal reads the same whichever way the array was walked.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
if isinstance(value, str):
|
|
169
|
+
text = value
|
|
170
|
+
elif isinstance(value, (bytes, bytearray, memoryview)):
|
|
171
|
+
raw = bytes(value)
|
|
172
|
+
if raw.startswith(b"\xef\xbb\xbf"):
|
|
173
|
+
raise CanonicalJSONError("JSON_BOM", "$", "UTF-8 byte-order marks are not allowed")
|
|
174
|
+
try:
|
|
175
|
+
text = raw.decode("utf-8", errors="strict")
|
|
176
|
+
except UnicodeDecodeError as exc:
|
|
177
|
+
raise CanonicalJSONError(
|
|
178
|
+
"JSON_UTF8",
|
|
179
|
+
"$",
|
|
180
|
+
f"input is not strict UTF-8 at byte {exc.start}",
|
|
181
|
+
) from None
|
|
182
|
+
else:
|
|
183
|
+
raise CanonicalJSONError(
|
|
184
|
+
"JSON_INPUT_TYPE",
|
|
185
|
+
"$",
|
|
186
|
+
"JSON input must be text or a bytes-like value",
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
if text.startswith("\ufeff"):
|
|
190
|
+
raise CanonicalJSONError("JSON_BOM", "$", "Unicode byte-order marks are not allowed")
|
|
191
|
+
try:
|
|
192
|
+
parsed = json.loads(
|
|
193
|
+
text,
|
|
194
|
+
object_pairs_hook=_reject_duplicate_pairs,
|
|
195
|
+
parse_int=number or _parse_integer,
|
|
196
|
+
parse_float=number or _reject_fraction,
|
|
197
|
+
parse_constant=_reject_constant,
|
|
198
|
+
)
|
|
199
|
+
except CanonicalJSONError:
|
|
200
|
+
raise
|
|
201
|
+
except json.JSONDecodeError as exc:
|
|
202
|
+
raise CanonicalJSONError(
|
|
203
|
+
"JSON_SYNTAX",
|
|
204
|
+
"$",
|
|
205
|
+
f"invalid JSON at line {exc.lineno}, column {exc.colno}",
|
|
206
|
+
) from None
|
|
207
|
+
if batch_ceiling is None or not isinstance(parsed, list):
|
|
208
|
+
return _normalize(parsed, "$", depth=0, members=[0], max_members=max_members)
|
|
209
|
+
total = 1
|
|
210
|
+
for index, element in enumerate(parsed):
|
|
211
|
+
counted = [0]
|
|
212
|
+
_normalize(element, f"$[{index}]", depth=1, members=counted, max_members=max_members)
|
|
213
|
+
total += counted[0]
|
|
214
|
+
if total > batch_ceiling:
|
|
215
|
+
raise CanonicalJSONError("JSON_MEMBERS", "$", f"value exceeds {batch_ceiling} members")
|
|
216
|
+
return parsed
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _normalize(
|
|
220
|
+
value: Any,
|
|
221
|
+
path: str,
|
|
222
|
+
*,
|
|
223
|
+
depth: int,
|
|
224
|
+
members: list[int],
|
|
225
|
+
max_members: int,
|
|
226
|
+
) -> Any:
|
|
227
|
+
""":func:`~mostlyright.data_harness.canonical._normalize_json`, with the ceiling as an argument.
|
|
228
|
+
|
|
229
|
+
Written here rather than reached for there because the canonical module's BYTES ARE A
|
|
230
|
+
CROSS-SYSTEM PIN and may not move to grow a parameter. Every bound below is the canonical
|
|
231
|
+
one, spelled the same way and raising the same code at the same path; ``max_members`` is the
|
|
232
|
+
only thing this walk is told rather than knows. That the two agree is not asserted by reading
|
|
233
|
+
them side by side -- ``tests/test_canonical.py`` walks a corpus through both and requires the
|
|
234
|
+
same value or the same refusal from each.
|
|
235
|
+
|
|
236
|
+
IT VALIDATES IN PLACE AND BUILDS NOTHING. The canonical walk returns a fresh tree because it
|
|
237
|
+
is handed arbitrary Python values -- tuples, ordered mappings, whatever a caller composed --
|
|
238
|
+
and has to hand back the one shape it seals. This walk is handed only what ``json.loads``
|
|
239
|
+
just built from a frame, which is already that shape, so a second tree of it would be the
|
|
240
|
+
same value at twice the cost. The cost matters because the frame is a venue's: eight
|
|
241
|
+
mebibytes of two-byte containers is millions of objects, and the parse that builds them is
|
|
242
|
+
the peak a hostile frame can reach in this process -- the same peak the canonical reader has
|
|
243
|
+
always reached on such a frame before its own count could trip -- and this walk does not
|
|
244
|
+
raise it. The parse is bounded by the transport's byte bound and by nothing else; nothing
|
|
245
|
+
here pretends the member count bounds memory, because it never did.
|
|
246
|
+
|
|
247
|
+
The fractional-number branch is here for the canonical module's non-finite refusal only.
|
|
248
|
+
A frame is read either strictly, where a fraction is refused at the scanner before this walk
|
|
249
|
+
ever sees it, or as text, where it never became a float; no caller of this reader admits one,
|
|
250
|
+
so the foreign-document allowance has nothing to correspond to, but a float that did arrive
|
|
251
|
+
would be refused with the same code the canonical walk gives it.
|
|
252
|
+
"""
|
|
253
|
+
|
|
254
|
+
if depth > MAX_CANONICAL_DEPTH:
|
|
255
|
+
raise CanonicalJSONError(
|
|
256
|
+
"JSON_DEPTH",
|
|
257
|
+
path,
|
|
258
|
+
f"nesting exceeds {MAX_CANONICAL_DEPTH} levels",
|
|
259
|
+
)
|
|
260
|
+
members[0] += 1
|
|
261
|
+
if members[0] > max_members:
|
|
262
|
+
raise CanonicalJSONError(
|
|
263
|
+
"JSON_MEMBERS",
|
|
264
|
+
path,
|
|
265
|
+
f"value exceeds {max_members} members",
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
if value is None or type(value) is bool:
|
|
269
|
+
return value
|
|
270
|
+
if type(value) is int:
|
|
271
|
+
if not -MAX_CANONICAL_INTEGER - 1 <= value <= MAX_CANONICAL_INTEGER:
|
|
272
|
+
raise CanonicalJSONError(
|
|
273
|
+
"JSON_INTEGER_RANGE",
|
|
274
|
+
path,
|
|
275
|
+
"integer is outside the signed 64-bit range",
|
|
276
|
+
)
|
|
277
|
+
return value
|
|
278
|
+
if type(value) is float:
|
|
279
|
+
if not math.isfinite(value):
|
|
280
|
+
raise CanonicalJSONError(
|
|
281
|
+
"JSON_NONFINITE",
|
|
282
|
+
path,
|
|
283
|
+
"non-finite JSON numbers are unsupported",
|
|
284
|
+
)
|
|
285
|
+
raise CanonicalJSONError(
|
|
286
|
+
"JSON_NONINTEGER_NUMBER",
|
|
287
|
+
path,
|
|
288
|
+
"non-integer JSON numbers are unsupported",
|
|
289
|
+
)
|
|
290
|
+
if isinstance(value, str):
|
|
291
|
+
if len(value) > MAX_CANONICAL_STRING_LENGTH:
|
|
292
|
+
raise CanonicalJSONError(
|
|
293
|
+
"JSON_STRING_LENGTH",
|
|
294
|
+
path,
|
|
295
|
+
f"string exceeds {MAX_CANONICAL_STRING_LENGTH} code points",
|
|
296
|
+
)
|
|
297
|
+
_validate_unicode(value, path)
|
|
298
|
+
return value
|
|
299
|
+
if isinstance(value, dict):
|
|
300
|
+
if any(not isinstance(key, str) for key in value):
|
|
301
|
+
raise CanonicalJSONError(
|
|
302
|
+
"JSON_OBJECT_KEY",
|
|
303
|
+
path,
|
|
304
|
+
"object keys must all be strings",
|
|
305
|
+
)
|
|
306
|
+
for key, item in value.items():
|
|
307
|
+
_validate_unicode(key, f"{path}.<key>")
|
|
308
|
+
child = f"{path}.{key}" if key else f"{path}['']"
|
|
309
|
+
_normalize(item, child, depth=depth + 1, members=members, max_members=max_members)
|
|
310
|
+
return value
|
|
311
|
+
if isinstance(value, list):
|
|
312
|
+
for index, item in enumerate(value):
|
|
313
|
+
_normalize(
|
|
314
|
+
item,
|
|
315
|
+
f"{path}[{index}]",
|
|
316
|
+
depth=depth + 1,
|
|
317
|
+
members=members,
|
|
318
|
+
max_members=max_members,
|
|
319
|
+
)
|
|
320
|
+
return value
|
|
321
|
+
# A tuple is the one shape the canonical walk copies into a list. A walk that copies nothing
|
|
322
|
+
# cannot, and ``json.loads`` never produces one, so it is refused rather than half-handled.
|
|
323
|
+
raise CanonicalJSONError(
|
|
324
|
+
"JSON_VALUE_TYPE",
|
|
325
|
+
path,
|
|
326
|
+
f"unsupported value type {type(value).__name__}",
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def _number_literal(value: str) -> str:
|
|
331
|
+
"""Return a JSON number exactly as it was written, as text.
|
|
332
|
+
|
|
333
|
+
The hook JSON's own scanner hands the matched literal to, so this is the sender's spelling and
|
|
334
|
+
not a rendering of something parsed out of it. Nothing is widened, narrowed or rounded on the
|
|
335
|
+
way through, because nothing is converted.
|
|
336
|
+
"""
|
|
337
|
+
|
|
338
|
+
return value
|
|
@@ -20,7 +20,11 @@ every frame to disk as it goes -- and this is what lets the pending prefix reach
|
|
|
20
20
|
of waiting in RAM for the rest of the segment.
|
|
21
21
|
|
|
22
22
|
The file is an ordinary append log, one canonical JSON object per line, raw frame bytes carried in
|
|
23
|
-
base64 because a provider frame is bytes and a line is text
|
|
23
|
+
base64 because a provider frame is bytes and a line is text -- in a LIST of pieces, because a
|
|
24
|
+
canonical string is bounded at ``MAX_CANONICAL_STRING_LENGTH`` code points and a frame the
|
|
25
|
+
transport admits may be eight mebibytes: every frame the feed accepted has to be one this file
|
|
26
|
+
can hold, whatever its size, or a segment fails at its high-water mark for one frame that had
|
|
27
|
+
nowhere else to go. It is written with the work root's
|
|
24
28
|
own permissions, it is never delivered anywhere, and it is discarded the moment the segment it
|
|
25
29
|
belongs to is sealed or abandoned. Nothing about it is evidence: the evidence is what the
|
|
26
30
|
recorder seals from it.
|
|
@@ -40,6 +44,7 @@ from collections.abc import Iterator, Sequence
|
|
|
40
44
|
from pathlib import Path
|
|
41
45
|
|
|
42
46
|
from mostlyright.data_harness.canonical import (
|
|
47
|
+
MAX_CANONICAL_STRING_LENGTH,
|
|
43
48
|
CanonicalJSONError,
|
|
44
49
|
canonical_json_bytes,
|
|
45
50
|
parse_json,
|
|
@@ -53,6 +58,10 @@ from mostlyright.data_harness.stream_subscription_worker import (
|
|
|
53
58
|
#: The file one spilled segment lives in, beneath its own directory.
|
|
54
59
|
SPILL_FILE_NAME = "frames.ndjson"
|
|
55
60
|
|
|
61
|
+
#: How many raw bytes one piece of a spilled frame carries: what one canonical string holds in
|
|
62
|
+
#: base64, which writes four characters for every three bytes. Derived so the two cannot drift.
|
|
63
|
+
SPILL_PIECE_BYTES = (MAX_CANONICAL_STRING_LENGTH // 4) * 3
|
|
64
|
+
|
|
56
65
|
#: The exact members one spilled record carries. Equality in both directions, so a record written
|
|
57
66
|
#: by a build that knew about one more field is refused rather than partly read.
|
|
58
67
|
_RECORD_MEMBERS = frozenset(
|
|
@@ -149,7 +158,16 @@ class SegmentSpill:
|
|
|
149
158
|
landed_bytes = 0
|
|
150
159
|
try:
|
|
151
160
|
for frame in frames:
|
|
152
|
-
|
|
161
|
+
try:
|
|
162
|
+
line = canonical_json_bytes(_record(frame))
|
|
163
|
+
except CanonicalJSONError as error:
|
|
164
|
+
# Unreachable for any frame the transport admits, since the pieces are cut to
|
|
165
|
+
# what one canonical string holds; kept so a refusal here is this module's
|
|
166
|
+
# own word rather than an escaping reader error.
|
|
167
|
+
raise StreamSubscriptionError(
|
|
168
|
+
"STREAM_SUBSCRIPTION_SEGMENT_INVALID", "spilled frame could not be written"
|
|
169
|
+
) from error
|
|
170
|
+
_write(descriptor, line + b"\n")
|
|
153
171
|
landed += 1
|
|
154
172
|
landed_bytes += len(frame.raw)
|
|
155
173
|
# Once, after the batch rather than after every frame: the durability this needs is
|
|
@@ -204,10 +222,14 @@ _SAFE_ID_CHARACTERS = frozenset("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU
|
|
|
204
222
|
|
|
205
223
|
|
|
206
224
|
def _record(frame: StreamFrame) -> dict[str, object]:
|
|
225
|
+
pieces = [
|
|
226
|
+
base64.b64encode(frame.raw[start : start + SPILL_PIECE_BYTES]).decode("ascii")
|
|
227
|
+
for start in range(0, len(frame.raw), SPILL_PIECE_BYTES)
|
|
228
|
+
]
|
|
207
229
|
return {
|
|
208
230
|
"provider_event_id": frame.provider_event_id,
|
|
209
231
|
"cursor": frame.cursor,
|
|
210
|
-
"raw":
|
|
232
|
+
"raw": pieces,
|
|
211
233
|
"received_at": frame.received_at,
|
|
212
234
|
"connection_epoch": frame.connection_epoch,
|
|
213
235
|
"snapshot": frame.snapshot,
|
|
@@ -226,12 +248,12 @@ def _frame(line: bytes) -> StreamFrame:
|
|
|
226
248
|
"STREAM_SUBSCRIPTION_SEGMENT_INVALID", "spilled frame does not carry its exact members"
|
|
227
249
|
)
|
|
228
250
|
raw = value["raw"]
|
|
229
|
-
if not isinstance(raw, str):
|
|
251
|
+
if not isinstance(raw, list) or not all(isinstance(piece, str) for piece in raw):
|
|
230
252
|
raise StreamSubscriptionError(
|
|
231
253
|
"STREAM_SUBSCRIPTION_SEGMENT_INVALID", "spilled frame carries no readable payload"
|
|
232
254
|
)
|
|
233
255
|
try:
|
|
234
|
-
decoded = base64.b64decode(
|
|
256
|
+
decoded = b"".join(base64.b64decode(piece, validate=True) for piece in raw)
|
|
235
257
|
except (binascii.Error, ValueError) as error:
|
|
236
258
|
raise StreamSubscriptionError(
|
|
237
259
|
"STREAM_SUBSCRIPTION_SEGMENT_INVALID", "spilled frame carries no readable payload"
|
|
@@ -11,15 +11,16 @@ from __future__ import annotations
|
|
|
11
11
|
import asyncio
|
|
12
12
|
import contextlib
|
|
13
13
|
import logging
|
|
14
|
+
import re
|
|
14
15
|
import threading
|
|
15
16
|
import time
|
|
16
|
-
from collections.abc import Callable
|
|
17
|
+
from collections.abc import Callable, Iterator
|
|
17
18
|
from concurrent.futures import Future
|
|
18
19
|
from dataclasses import replace
|
|
19
20
|
from datetime import UTC, datetime
|
|
20
21
|
from typing import Any
|
|
21
22
|
|
|
22
|
-
from mostlyright.data_harness.canonical import canonical_json_bytes
|
|
23
|
+
from mostlyright.data_harness.canonical import CanonicalJSONError, canonical_json_bytes
|
|
23
24
|
from mostlyright.data_harness.sources.contracts import SourceContractError
|
|
24
25
|
from mostlyright.data_harness.sources.stream_capture_session import (
|
|
25
26
|
is_keepalive_reply,
|
|
@@ -44,7 +45,9 @@ from mostlyright.data_harness.stream_subscription_worker import (
|
|
|
44
45
|
CursorReplayUnavailable,
|
|
45
46
|
FrameMemoryBudget,
|
|
46
47
|
StreamFrame,
|
|
48
|
+
StreamReadingRefused,
|
|
47
49
|
StreamSubscriptionError,
|
|
50
|
+
_logged_refusal_detail,
|
|
48
51
|
)
|
|
49
52
|
|
|
50
53
|
LOGGER = logging.getLogger(__name__)
|
|
@@ -726,9 +729,68 @@ class ThreadedConnectorFeed:
|
|
|
726
729
|
|
|
727
730
|
|
|
728
731
|
def _typed_error(error: BaseException) -> StreamSubscriptionError:
|
|
732
|
+
"""One coded failure for whatever ended a read, keeping what a strict-JSON refusal said.
|
|
733
|
+
|
|
734
|
+
THE CLASS NAME ALONE THREW AWAY THE ONLY THING THAT NAMED THE CAUSE. A strict-JSON refusal
|
|
735
|
+
states the bound it hit, the path it hit it at and the code for it; every one of those was
|
|
736
|
+
dropped, and what reached the log was a class name shared by every reading failure there is.
|
|
737
|
+
A subscription that failed on a document bound and one that failed on a truncated frame were
|
|
738
|
+
indistinguishable from the outside, so both looked like a venue being down.
|
|
739
|
+
|
|
740
|
+
THAT REFUSAL IS THE ONLY ONE WHOSE WORDS ARE KEPT, and it is kept under its own type so the
|
|
741
|
+
claim line can tell it apart. Its sentence is this build's: a code, a bound and where in the
|
|
742
|
+
frame the bound tripped. Any other exception's ``str`` is somebody else's sentence -- a
|
|
743
|
+
socket library quoting the request it sent, a venue's text quoting back what the subscribe
|
|
744
|
+
frame carried -- and is reduced to its class name exactly as it always was.
|
|
745
|
+
|
|
746
|
+
THE PATH IS CUT TO ITS TOP-LEVEL INDEX, AND THE SENTENCE IS KEPT ONLY FOR THE CODES WHOSE
|
|
747
|
+
SENTENCE HOLDS NO VENUE TEXT. A refusal's path names the venue's own keys on the way down,
|
|
748
|
+
and three of the strict reader's refusals quote the venue back -- the duplicate key it found,
|
|
749
|
+
the number literal it would not read -- so a venue that reflects what this run presented as a
|
|
750
|
+
key or a value would have that text in a log line through the one route this build composes
|
|
751
|
+
itself. So only what is this build's is kept: the ``$`` and, for a batch, which element -- a
|
|
752
|
+
number -- with an ellipsis where the venue's spelling was; and the sentence only under a code
|
|
753
|
+
:data:`_REFUSALS_STATED_IN_THIS_BUILDS_WORDS` lists, where it is a bound, a count or a
|
|
754
|
+
position and nothing quoted. That is what an operator needs: which element, which bound,
|
|
755
|
+
which code. The whole line is then scrubbed ONCE, at the length a record carries, so nothing
|
|
756
|
+
is cut twice.
|
|
757
|
+
"""
|
|
758
|
+
|
|
729
759
|
if isinstance(error, StreamSubscriptionError):
|
|
730
760
|
return error
|
|
731
|
-
|
|
761
|
+
name = type(error).__name__
|
|
762
|
+
if not isinstance(error, CanonicalJSONError):
|
|
763
|
+
return StreamSubscriptionError("STREAM_SUBSCRIPTION_FEED_FAILED", name)
|
|
764
|
+
where = _TOP_LEVEL_INDEX.match(error.path)
|
|
765
|
+
prefix = "$" if where is None else where.group(0)
|
|
766
|
+
shaped = prefix if prefix == error.path else f"{prefix}..."
|
|
767
|
+
words = f" {error.detail}" if error.code in _REFUSALS_STATED_IN_THIS_BUILDS_WORDS else ""
|
|
768
|
+
said = _logged_refusal_detail(f"{name}: {shaped}:{words} [{error.code}]")
|
|
769
|
+
return StreamReadingRefused("STREAM_SUBSCRIPTION_FEED_FAILED", said)
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
#: The part of a refusal's path this build wrote: the root, and for a batch the element's index.
|
|
773
|
+
_TOP_LEVEL_INDEX = re.compile(r"^\$(\[\d+\])?")
|
|
774
|
+
|
|
775
|
+
#: The strict reader's refusals whose sentence is a bound, a count or a position and quotes
|
|
776
|
+
#: nothing the venue wrote. A duplicate key names the key and a number refusal names the literal,
|
|
777
|
+
#: so those carry their code alone. Closed on purpose: a code not listed here says its name.
|
|
778
|
+
_REFUSALS_STATED_IN_THIS_BUILDS_WORDS = frozenset(
|
|
779
|
+
{
|
|
780
|
+
"JSON_BOM",
|
|
781
|
+
"JSON_DEPTH",
|
|
782
|
+
"JSON_INPUT_TYPE",
|
|
783
|
+
"JSON_INTEGER_RANGE",
|
|
784
|
+
"JSON_MEMBERS",
|
|
785
|
+
"JSON_NONCANONICAL",
|
|
786
|
+
"JSON_OBJECT_KEY",
|
|
787
|
+
"JSON_STRING_LENGTH",
|
|
788
|
+
"JSON_SYNTAX",
|
|
789
|
+
"JSON_UNICODE",
|
|
790
|
+
"JSON_UTF8",
|
|
791
|
+
"JSON_VALUE_TYPE",
|
|
792
|
+
}
|
|
793
|
+
)
|
|
732
794
|
|
|
733
795
|
|
|
734
796
|
def _put_end_if_possible(queue: asyncio.Queue[StreamFrame | BaseException | object]) -> None:
|
|
@@ -803,7 +865,7 @@ def _reconnect_delay(attempt: int) -> float:
|
|
|
803
865
|
|
|
804
866
|
def _frame_messages(
|
|
805
867
|
config: StreamConnectorConfig, decoded: Any, raw: bytes
|
|
806
|
-
) ->
|
|
868
|
+
) -> Iterator[tuple[dict[str, Any], bytes]]:
|
|
807
869
|
"""The messages one text frame carries, each with the bytes that are its own.
|
|
808
870
|
|
|
809
871
|
One object, unless the connector declares that a frame may be a batch. An array frame is the
|
|
@@ -815,6 +877,14 @@ def _frame_messages(
|
|
|
815
877
|
carries no type to classify and no id to extract, and the capture lane of the same document
|
|
816
878
|
has always refused it, so admitting it here would be the two lanes disagreeing about one
|
|
817
879
|
frame.
|
|
880
|
+
|
|
881
|
+
EVERY ELEMENT IS CHECKED BEFORE ANY IS RENDERED, AND EACH IS RENDERED ONLY WHEN ASKED FOR.
|
|
882
|
+
The check is a walk over the batch that allocates nothing, so a malformed element refuses
|
|
883
|
+
the frame before a byte of it is handed on; the rendering is a generator, because a batch
|
|
884
|
+
may now hold a venue's whole roster and rendering all of it at once would put every
|
|
885
|
+
element's bytes in memory beside the frame's, outside the claim's ledger, before the first
|
|
886
|
+
one had been offered to it. Rendered one at a time, the resident cost is the frame plus the
|
|
887
|
+
element in hand, and the ledger sees each element as it always has.
|
|
818
888
|
"""
|
|
819
889
|
|
|
820
890
|
if config.admits_array_frames and isinstance(decoded, list):
|
|
@@ -824,13 +894,15 @@ def _frame_messages(
|
|
|
824
894
|
"STREAM_SUBSCRIPTION_FRAME_INVALID",
|
|
825
895
|
f"provider batch element {index} is not a non-empty object",
|
|
826
896
|
)
|
|
827
|
-
|
|
897
|
+
for element in decoded:
|
|
898
|
+
yield element, canonical_json_bytes(element)
|
|
899
|
+
return
|
|
828
900
|
if not isinstance(decoded, dict) or not decoded:
|
|
829
901
|
raise StreamSubscriptionError(
|
|
830
902
|
"STREAM_SUBSCRIPTION_FRAME_INVALID",
|
|
831
903
|
"provider text frame is not a non-empty object",
|
|
832
904
|
)
|
|
833
|
-
|
|
905
|
+
yield decoded, raw
|
|
834
906
|
|
|
835
907
|
|
|
836
908
|
def subscription_for_cursor(
|