mostlyright-data 0.9.4__tar.gz → 0.9.6__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.9.4 → mostlyright_data-0.9.6}/PKG-INFO +12 -13
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/README.md +11 -12
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/pyproject.toml +1 -1
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/url_policy.py +57 -28
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/cli.py +90 -13
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_job.py +54 -5
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_worker.py +163 -18
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_worker.py +945 -402
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/pipeline.py +9 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/progress_events.py +75 -2
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/recipe.py +44 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving.py +17 -4
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/session_probes.py +26 -3
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/__init__.py +12 -6
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream.py +289 -33
- mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_capture_session.py +1347 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_connector.py +81 -51
- mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +39 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_recorder.py +291 -42
- mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_registry.py +565 -0
- mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_rotation.py +727 -0
- mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_series.py +1320 -0
- mostlyright_data-0.9.6/src/mostlyright/data_harness/sources/stream_transport.py +943 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/acquire.py +16 -6
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/download.py +80 -11
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/stream.py +6 -1
- mostlyright_data-0.9.6/src/mostlyright/data_harness/ux/commands/record.py +1039 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/headline.py +2 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/remediation.py +1 -1
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/render.py +38 -0
- mostlyright_data-0.9.4/src/mostlyright/data_harness/ux/commands/record.py +0 -107
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/.gitignore +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/scripts/hatch_build.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/http.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/agent_runtime.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/protocol.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/reference.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/registry.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/canonical.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/catalog_job.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/coordinator.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deploy.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deploy_target.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/event_presentation.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/events.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/fast_delimited.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/fleet.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/formats.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/governors.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/store.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/key_seam.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/service.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/document.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/status.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/notebook.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/offline.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/operation_registry.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/operator_setup.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/plan_graph.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/engine.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/errors.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/gates.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/joins.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/profile.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/table.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/containers.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/delimited.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/registry.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/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.9.4 → mostlyright_data-0.9.6}/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.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/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.9.4 → mostlyright_data-0.9.6}/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.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/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.9.4 → mostlyright_data-0.9.6}/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.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/tabular.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/adapters.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/errors.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/review.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/rowset.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving_edge.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving_http.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/signing.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/source_discovery.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/adapters.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/collections.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/deletion.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/fitness.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/governance.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/hosted.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/integration.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/registry.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/sports.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/studio_boundary.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/approvals.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/commands.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/narrative.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/parity.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/propose.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/research.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/router.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/runs.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/session.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/transport.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/workers.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/unit_flow.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/units.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/approve.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credentials.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/diffing.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/inventory.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/local_review.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/login.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/peek.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/preflight.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/readers.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/workload.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/viewer.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/query.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/store.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/watch.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mostlyright-data
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.6
|
|
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/
|
|
@@ -81,12 +81,11 @@ Description-Content-Type: text/markdown
|
|
|
81
81
|
|
|
82
82
|
# mostlyright-data
|
|
83
83
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
source links, timestamps, and check results.
|
|
84
|
+
Browse datasets built by our community or create your own with agents that find the sources and
|
|
85
|
+
configure the pipeline. Mostly Right keeps the dataset live.
|
|
87
86
|
|
|
88
|
-
`mostlyright-data` is the command-line client. It
|
|
89
|
-
|
|
87
|
+
`mostlyright-data` is the command-line client. It opens hosted research sessions, starts and
|
|
88
|
+
follows hosted dataset runs, and downloads verified datasets after they finish.
|
|
90
89
|
|
|
91
90
|
## Requirements
|
|
92
91
|
|
|
@@ -119,20 +118,20 @@ mr-data --help
|
|
|
119
118
|
Use `mr-data research-open`, `mr-data research-status`, and `mr-data research-close` for hosted
|
|
120
119
|
research sessions. `research-status` shows the current state.
|
|
121
120
|
|
|
122
|
-
## Local
|
|
121
|
+
## Local execution
|
|
123
122
|
|
|
124
|
-
The
|
|
123
|
+
The local execution lane runs only on Linux:
|
|
125
124
|
|
|
126
125
|
```bash
|
|
127
126
|
python -m pip install "mostlyright-data[local]"
|
|
128
127
|
```
|
|
129
128
|
|
|
130
|
-
|
|
129
|
+
It builds and checks worker inputs. It is not required for the hosted client.
|
|
131
130
|
|
|
132
131
|
## Documentation
|
|
133
132
|
|
|
134
133
|
- [CLI guide](https://mostlyright.md/docs/guides/cli/)
|
|
135
|
-
- [
|
|
134
|
+
- [Hosted research sessions](https://mostlyright.md/docs/guides/hosted-research/)
|
|
136
135
|
- [Credentials](https://mostlyright.md/docs/guides/credentials/)
|
|
137
136
|
- [Public datasets](https://mostlyright.md/docs/guides/use-public-datasets/)
|
|
138
137
|
|
|
@@ -141,11 +140,11 @@ Use `mr-data --help` for the full command list and options. Commands that suppor
|
|
|
141
140
|
|
|
142
141
|
For local builds, `--input-root` and `--output` may use relative paths.
|
|
143
142
|
|
|
144
|
-
##
|
|
143
|
+
## Behavior and limits
|
|
145
144
|
|
|
146
145
|
- `mr-data review --local RUN_DIR` exits 1 when a check fails.
|
|
147
|
-
- The weather
|
|
148
|
-
- Hosted credential-free acquisition
|
|
146
|
+
- The weather reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
|
|
147
|
+
- Hosted credential-free acquisition supports one single-address public HTTPS object. Bounded collections require both local attestations.
|
|
149
148
|
|
|
150
149
|
## Verification
|
|
151
150
|
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
# mostlyright-data
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
source links, timestamps, and check results.
|
|
3
|
+
Browse datasets built by our community or create your own with agents that find the sources and
|
|
4
|
+
configure the pipeline. Mostly Right keeps the dataset live.
|
|
6
5
|
|
|
7
|
-
`mostlyright-data` is the command-line client. It
|
|
8
|
-
|
|
6
|
+
`mostlyright-data` is the command-line client. It opens hosted research sessions, starts and
|
|
7
|
+
follows hosted dataset runs, and downloads verified datasets after they finish.
|
|
9
8
|
|
|
10
9
|
## Requirements
|
|
11
10
|
|
|
@@ -38,20 +37,20 @@ mr-data --help
|
|
|
38
37
|
Use `mr-data research-open`, `mr-data research-status`, and `mr-data research-close` for hosted
|
|
39
38
|
research sessions. `research-status` shows the current state.
|
|
40
39
|
|
|
41
|
-
## Local
|
|
40
|
+
## Local execution
|
|
42
41
|
|
|
43
|
-
The
|
|
42
|
+
The local execution lane runs only on Linux:
|
|
44
43
|
|
|
45
44
|
```bash
|
|
46
45
|
python -m pip install "mostlyright-data[local]"
|
|
47
46
|
```
|
|
48
47
|
|
|
49
|
-
|
|
48
|
+
It builds and checks worker inputs. It is not required for the hosted client.
|
|
50
49
|
|
|
51
50
|
## Documentation
|
|
52
51
|
|
|
53
52
|
- [CLI guide](https://mostlyright.md/docs/guides/cli/)
|
|
54
|
-
- [
|
|
53
|
+
- [Hosted research sessions](https://mostlyright.md/docs/guides/hosted-research/)
|
|
55
54
|
- [Credentials](https://mostlyright.md/docs/guides/credentials/)
|
|
56
55
|
- [Public datasets](https://mostlyright.md/docs/guides/use-public-datasets/)
|
|
57
56
|
|
|
@@ -60,11 +59,11 @@ Use `mr-data --help` for the full command list and options. Commands that suppor
|
|
|
60
59
|
|
|
61
60
|
For local builds, `--input-root` and `--output` may use relative paths.
|
|
62
61
|
|
|
63
|
-
##
|
|
62
|
+
## Behavior and limits
|
|
64
63
|
|
|
65
64
|
- `mr-data review --local RUN_DIR` exits 1 when a check fails.
|
|
66
|
-
- The weather
|
|
67
|
-
- Hosted credential-free acquisition
|
|
65
|
+
- The weather reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
|
|
66
|
+
- Hosted credential-free acquisition supports one single-address public HTTPS object. Bounded collections require both local attestations.
|
|
68
67
|
|
|
69
68
|
## Verification
|
|
70
69
|
|
|
@@ -188,6 +188,62 @@ class ValidatedTarget:
|
|
|
188
188
|
return urlunsplit(("", "", parsed.path or "/", parsed.query, ""))
|
|
189
189
|
|
|
190
190
|
|
|
191
|
+
def approved_public_addresses(
|
|
192
|
+
hostname: str,
|
|
193
|
+
port: int,
|
|
194
|
+
*,
|
|
195
|
+
resolver: Resolver | None = None,
|
|
196
|
+
) -> tuple[str, ...]:
|
|
197
|
+
"""Return every address a hostname answers with, once each has been proved publicly routable.
|
|
198
|
+
|
|
199
|
+
The part of :func:`validate_public_https_url` that is about *where a name leads* rather than
|
|
200
|
+
about a URL or an allowlist, so that a transport which is not fetching a URL can hold the same
|
|
201
|
+
rule without holding a second copy of it. A client that hands a hostname to the operating
|
|
202
|
+
system and lets it connect has delegated the decision to DNS: a document naming
|
|
203
|
+
``stream.example.test`` reaches whatever that name resolves to, and inside a network that is
|
|
204
|
+
an internal service that never expected a stranger.
|
|
205
|
+
|
|
206
|
+
Every answer is checked, and one bad answer refuses the whole resolution. Approving the public
|
|
207
|
+
members of a mixed set would be deciding *after* a resolver has already demonstrated that it
|
|
208
|
+
can put an address of its choosing in front of the caller.
|
|
209
|
+
|
|
210
|
+
A caller that connects to one of these addresses -- rather than handing the name back to the
|
|
211
|
+
operating system, which would resolve it a second time and need not agree -- has the answer it
|
|
212
|
+
checked.
|
|
213
|
+
"""
|
|
214
|
+
|
|
215
|
+
if _looks_like_obfuscated_ip(hostname):
|
|
216
|
+
raise AcquisitionSecurityError(
|
|
217
|
+
"OBFUSCATED_IP",
|
|
218
|
+
"non-canonical numeric IP hostnames are denied",
|
|
219
|
+
)
|
|
220
|
+
literal = _parse_ip_literal(hostname)
|
|
221
|
+
if literal is not None:
|
|
222
|
+
addresses: tuple[str, ...] = (literal.compressed,)
|
|
223
|
+
else:
|
|
224
|
+
addresses = (SystemResolver() if resolver is None else resolver).resolve(hostname, port)
|
|
225
|
+
approved: list[str] = []
|
|
226
|
+
for raw in addresses:
|
|
227
|
+
try:
|
|
228
|
+
address = ipaddress.ip_address(raw)
|
|
229
|
+
except ValueError:
|
|
230
|
+
raise AcquisitionSecurityError(
|
|
231
|
+
"DNS_ADDRESS",
|
|
232
|
+
"resolver returned a non-IP address",
|
|
233
|
+
) from None
|
|
234
|
+
_require_globally_routable(address)
|
|
235
|
+
approved.append(address.compressed)
|
|
236
|
+
approved_ips = tuple(sorted(dict.fromkeys(approved)))
|
|
237
|
+
if not approved_ips:
|
|
238
|
+
raise AcquisitionSecurityError("DNS_EMPTY", "target has no approved public addresses")
|
|
239
|
+
if len(approved_ips) > MAX_DNS_ANSWERS:
|
|
240
|
+
raise AcquisitionSecurityError(
|
|
241
|
+
"DNS_ANSWER_LIMIT",
|
|
242
|
+
f"target has more than {MAX_DNS_ANSWERS} approved addresses",
|
|
243
|
+
)
|
|
244
|
+
return approved_ips
|
|
245
|
+
|
|
246
|
+
|
|
191
247
|
def validate_public_https_url(
|
|
192
248
|
url: str,
|
|
193
249
|
*,
|
|
@@ -222,34 +278,7 @@ def validate_public_https_url(
|
|
|
222
278
|
raise AcquisitionSecurityError("METADATA_DESTINATION", "metadata/internal hosts are denied")
|
|
223
279
|
|
|
224
280
|
literal = _parse_ip_literal(hostname)
|
|
225
|
-
|
|
226
|
-
addresses = (literal.compressed,)
|
|
227
|
-
else:
|
|
228
|
-
if _looks_like_obfuscated_ip(hostname):
|
|
229
|
-
raise AcquisitionSecurityError(
|
|
230
|
-
"OBFUSCATED_IP",
|
|
231
|
-
"non-canonical numeric IP hostnames are denied",
|
|
232
|
-
)
|
|
233
|
-
addresses = resolver.resolve(hostname, effective_port)
|
|
234
|
-
approved: list[str] = []
|
|
235
|
-
for raw in addresses:
|
|
236
|
-
try:
|
|
237
|
-
address = ipaddress.ip_address(raw)
|
|
238
|
-
except ValueError:
|
|
239
|
-
raise AcquisitionSecurityError(
|
|
240
|
-
"DNS_ADDRESS",
|
|
241
|
-
"resolver returned a non-IP address",
|
|
242
|
-
) from None
|
|
243
|
-
_require_globally_routable(address)
|
|
244
|
-
approved.append(address.compressed)
|
|
245
|
-
approved_ips = tuple(sorted(dict.fromkeys(approved)))
|
|
246
|
-
if not approved_ips:
|
|
247
|
-
raise AcquisitionSecurityError("DNS_EMPTY", "target has no approved public addresses")
|
|
248
|
-
if len(approved_ips) > MAX_DNS_ANSWERS:
|
|
249
|
-
raise AcquisitionSecurityError(
|
|
250
|
-
"DNS_ANSWER_LIMIT",
|
|
251
|
-
f"target has more than {MAX_DNS_ANSWERS} approved addresses",
|
|
252
|
-
)
|
|
281
|
+
approved_ips = approved_public_addresses(hostname, effective_port, resolver=resolver)
|
|
253
282
|
|
|
254
283
|
netloc = hostname
|
|
255
284
|
if ":" in hostname and literal is not None:
|
|
@@ -23,7 +23,7 @@ import sys
|
|
|
23
23
|
import tempfile
|
|
24
24
|
import time
|
|
25
25
|
from collections.abc import Callable, Iterator, Mapping, Sequence
|
|
26
|
-
from dataclasses import dataclass
|
|
26
|
+
from dataclasses import dataclass, replace
|
|
27
27
|
from datetime import datetime
|
|
28
28
|
from pathlib import Path
|
|
29
29
|
from typing import Any
|
|
@@ -96,7 +96,6 @@ from mostlyright.data_harness.offline import (
|
|
|
96
96
|
)
|
|
97
97
|
from mostlyright.data_harness.pipeline import (
|
|
98
98
|
_VERIFY_ALLOWLISTED_ENGINES,
|
|
99
|
-
MAX_ROWS,
|
|
100
99
|
SOURCE_PROPOSAL_SET_VERSION,
|
|
101
100
|
BuildError,
|
|
102
101
|
ResourceLimits,
|
|
@@ -106,7 +105,10 @@ from mostlyright.data_harness.pipeline import (
|
|
|
106
105
|
verify_candidate, # noqa: F401 - retained for compatibility/security-route monkeypatch tests
|
|
107
106
|
)
|
|
108
107
|
from mostlyright.data_harness.plan_graph import (
|
|
108
|
+
HARD_MAX_INTERMEDIATE_ROWS,
|
|
109
|
+
HARD_MAX_OUTPUT_ROWS,
|
|
109
110
|
HARD_MAX_RETAINED_BYTES,
|
|
111
|
+
HARD_MAX_SOURCE_ROWS,
|
|
110
112
|
GraphResourcePolicy,
|
|
111
113
|
)
|
|
112
114
|
from mostlyright.data_harness.readers.contracts import ReaderError
|
|
@@ -209,6 +211,9 @@ from mostlyright.data_harness.sources.stream_recorder import (
|
|
|
209
211
|
from mostlyright.data_harness.sources.stream_recorder import (
|
|
210
212
|
ledger_root as stream_ledger_root,
|
|
211
213
|
)
|
|
214
|
+
from mostlyright.data_harness.sources.stream_registry import (
|
|
215
|
+
load_stream_connector_registry,
|
|
216
|
+
)
|
|
212
217
|
from mostlyright.data_harness.ux.commands import discovered_commands
|
|
213
218
|
from mostlyright.data_harness.ux.credentials import LoginError, resolve_cloud_credentials
|
|
214
219
|
from mostlyright.data_harness.ux.headline import (
|
|
@@ -390,17 +395,44 @@ def _selected_graph_limits(
|
|
|
390
395
|
max_intermediate_rows: int | None,
|
|
391
396
|
max_retained_bytes: int | None,
|
|
392
397
|
) -> ResourceLimits | None:
|
|
393
|
-
"""
|
|
398
|
+
"""Narrow the trusted graph policy by exactly the dimensions the operator named.
|
|
399
|
+
|
|
400
|
+
These flags are a NARROWING instrument and nothing else. The baseline is what a build with no
|
|
401
|
+
flags at all already runs under -- ``GraphResourcePolicy()``, whose defaults are the engine's
|
|
402
|
+
own hard ceilings -- so an unnamed dimension keeps that ceiling and a named one lowers only
|
|
403
|
+
itself. The invariant is worth stating because it is what makes the flags safe to reach for:
|
|
404
|
+
for every dimension, the policy this returns is at most the no-flag default, and equals it
|
|
405
|
+
unless the flag naming that dimension was supplied.
|
|
406
|
+
|
|
407
|
+
It used to default every row dimension to ``pipeline.MAX_ROWS`` instead. That is the v1 plan's
|
|
408
|
+
row policy, not the graph engine's, and it is 1/100th of ``HARD_MAX_SOURCE_ROWS``: naming a
|
|
409
|
+
byte budget alone silently cut a v2 build's row ceiling to 100k, which is the opposite of what
|
|
410
|
+
an operator raising a budget is asking for. ``build`` only reaches this function for a v2 plan
|
|
411
|
+
-- a graph flag on a v1 plan is refused as ``GRAPH_POLICY_V1`` before the build starts -- so
|
|
412
|
+
there is no v1 caller whose 100k cap this could be speaking for.
|
|
413
|
+
|
|
414
|
+
``--graph-max-rows`` sets the source AND output ceilings, as its help says: one number for
|
|
415
|
+
"how many rows this build may read and release". The intermediate ceiling is separate because
|
|
416
|
+
the engine's own contract separates them (``HARD_MAX_INTERMEDIATE_ROWS`` is four times
|
|
417
|
+
``HARD_MAX_SOURCE_ROWS``, sized for a union of several year-scale sources), so an operator who
|
|
418
|
+
wants a narrower working set says so with the flag that means it.
|
|
419
|
+
"""
|
|
394
420
|
|
|
395
421
|
if max_rows is None and max_intermediate_rows is None and max_retained_bytes is None:
|
|
396
422
|
return None
|
|
397
|
-
selected_rows = max_rows or
|
|
423
|
+
selected_rows = max_rows or HARD_MAX_SOURCE_ROWS
|
|
398
424
|
return ResourceLimits(
|
|
425
|
+
# The v1 field, carried for a v2 build so `_replay_graph_derivations` streams sources under
|
|
426
|
+
# the policy rather than under the 100k default. It re-derives the same value from
|
|
427
|
+
# `graph_policy` anyway; agreeing here keeps the two from reading differently.
|
|
399
428
|
max_rows=selected_rows,
|
|
400
429
|
graph_policy=GraphResourcePolicy(
|
|
401
430
|
max_source_rows=selected_rows,
|
|
402
|
-
max_intermediate_rows=max_intermediate_rows or
|
|
403
|
-
|
|
431
|
+
max_intermediate_rows=max_intermediate_rows or HARD_MAX_INTERMEDIATE_ROWS,
|
|
432
|
+
# `min` because the two ceilings are equal today and are not the same contract: a
|
|
433
|
+
# source ceiling that ever rose above the output one must not raise the output one
|
|
434
|
+
# with it.
|
|
435
|
+
max_output_rows=min(selected_rows, HARD_MAX_OUTPUT_ROWS),
|
|
404
436
|
max_retained_bytes=max_retained_bytes or HARD_MAX_RETAINED_BYTES,
|
|
405
437
|
),
|
|
406
438
|
)
|
|
@@ -1014,6 +1046,7 @@ def _dispatch(
|
|
|
1014
1046
|
producer_principal=args.producer_principal,
|
|
1015
1047
|
producer_attempt=args.producer_attempt,
|
|
1016
1048
|
previous_run_dir=args.previous_run_dir,
|
|
1049
|
+
connector_registry=args.connector_registry,
|
|
1017
1050
|
visual_store=visual_store,
|
|
1018
1051
|
)
|
|
1019
1052
|
payload = result.to_dict()
|
|
@@ -1830,22 +1863,29 @@ def _parser(
|
|
|
1830
1863
|
build.add_argument("--producer-principal", required=True, help=_BUILT_BY)
|
|
1831
1864
|
build.add_argument("--producer-attempt", required=True, help=_BUILD_ATTEMPT)
|
|
1832
1865
|
build.add_argument("--research-dir", type=Path, help="existing visual research directory")
|
|
1866
|
+
# ⚠ THE ARGPARSE MAXIMA ARE THE ENGINE'S OWN HARD CEILINGS, and deliberately not a second,
|
|
1867
|
+
# smaller policy. `GraphResourcePolicy.__post_init__` is the single enforcement point -- it
|
|
1868
|
+
# refuses anything above a ceiling whatever route the value arrived by -- so a smaller number
|
|
1869
|
+
# here would not be a safety property, only a cap the CLI applies and the library does not.
|
|
1870
|
+
# The previous maxima (1M rows, 2M intermediate, 256 MiB retained) were 1/10th, 1/20th and
|
|
1871
|
+
# 1/64th of the ceilings they front, with nothing written down deriving them, and they made
|
|
1872
|
+
# the year-scale capacity the graph engine documents unreachable from the command line.
|
|
1833
1873
|
build.add_argument(
|
|
1834
1874
|
"--graph-max-rows",
|
|
1835
|
-
type=_integer_between(1,
|
|
1836
|
-
metavar="1..
|
|
1875
|
+
type=_integer_between(1, HARD_MAX_SOURCE_ROWS),
|
|
1876
|
+
metavar=f"1..{HARD_MAX_SOURCE_ROWS}",
|
|
1837
1877
|
help="trusted graph source/output row ceiling (v2 plans only)",
|
|
1838
1878
|
)
|
|
1839
1879
|
build.add_argument(
|
|
1840
1880
|
"--graph-max-intermediate-rows",
|
|
1841
|
-
type=_integer_between(1,
|
|
1881
|
+
type=_integer_between(1, HARD_MAX_INTERMEDIATE_ROWS),
|
|
1842
1882
|
default=None,
|
|
1843
|
-
metavar="1..
|
|
1883
|
+
metavar=f"1..{HARD_MAX_INTERMEDIATE_ROWS}",
|
|
1844
1884
|
help="trusted graph intermediate row ceiling",
|
|
1845
1885
|
)
|
|
1846
1886
|
build.add_argument(
|
|
1847
1887
|
"--graph-max-retained-bytes",
|
|
1848
|
-
type=_integer_between(1,
|
|
1888
|
+
type=_integer_between(1, HARD_MAX_RETAINED_BYTES),
|
|
1849
1889
|
default=None,
|
|
1850
1890
|
metavar="BYTES",
|
|
1851
1891
|
help="trusted graph retained-byte ceiling",
|
|
@@ -1979,6 +2019,14 @@ def _parser(
|
|
|
1979
2019
|
help="the run settings: which recipe fingerprint and engine versions this run is pinned to",
|
|
1980
2020
|
)
|
|
1981
2021
|
recipe_run.add_argument("--input-root", type=Path, required=True, help=_INPUT_ROOT)
|
|
2022
|
+
recipe_run.add_argument(
|
|
2023
|
+
"--connector-registry",
|
|
2024
|
+
type=Path,
|
|
2025
|
+
help=(
|
|
2026
|
+
"the folder of stream source documents the captures under the input folder were "
|
|
2027
|
+
"recorded under; without it, only the ones this build ships are held"
|
|
2028
|
+
),
|
|
2029
|
+
)
|
|
1982
2030
|
recipe_run.add_argument("--output", type=Path, required=True, help=_OUTPUT_NEW)
|
|
1983
2031
|
recipe_run.add_argument("--previous-run-dir", type=Path, help=_PREVIOUS_BUILD)
|
|
1984
2032
|
recipe_run.add_argument("--producer-principal", required=True, help=_BUILT_BY)
|
|
@@ -3058,6 +3106,7 @@ def _local_recipe_registry(
|
|
|
3058
3106
|
sandbox: CrawlerSandbox,
|
|
3059
3107
|
stock_sources: tuple[Any, ...],
|
|
3060
3108
|
stream_sources: tuple[Any, ...],
|
|
3109
|
+
connector_registry: Path | None = None,
|
|
3061
3110
|
) -> AdapterRegistry:
|
|
3062
3111
|
"""Build the exact allowlist this local run is permitted to use.
|
|
3063
3112
|
|
|
@@ -3069,6 +3118,14 @@ def _local_recipe_registry(
|
|
|
3069
3118
|
host allowlist against the address in the query and the other hands the fetch to Studio's
|
|
3070
3119
|
hosted clean room. A recorded capture has no address and no hosted home yet, so an adapter
|
|
3071
3120
|
registered in either of those would claim a capability it cannot honestly provide.
|
|
3121
|
+
|
|
3122
|
+
``connector_registry`` is the folder of source documents an operator wrote, the same one they
|
|
3123
|
+
recorded the capture under. ``None`` means the versions this build ships. It has to be
|
|
3124
|
+
sayable here: a sealed capture pins the digest of the source document it was recorded under,
|
|
3125
|
+
and a build that could only look in the documents it ships would refuse every capture taken
|
|
3126
|
+
from a source somebody wrote -- which is every live capture, because the one source this build
|
|
3127
|
+
ships may not be captured live at all. It is not a way to reinterpret a capture: the manifest
|
|
3128
|
+
still names its own digest, and this only says where that version may be looked up.
|
|
3072
3129
|
"""
|
|
3073
3130
|
|
|
3074
3131
|
adapters: list[Any] = []
|
|
@@ -3082,19 +3139,37 @@ def _local_recipe_registry(
|
|
|
3082
3139
|
)
|
|
3083
3140
|
if stream_sources:
|
|
3084
3141
|
captures_root = input_root / _CAPTURES_DIRECTORY_NAME
|
|
3085
|
-
|
|
3142
|
+
# Read once, here, before any Build work: a folder that is not there, or is a link to
|
|
3143
|
+
# one, is refused with STREAM_CONNECTOR_REGISTRY_ROOT at the start of the run rather
|
|
3144
|
+
# than found missing halfway through it. With no folder named, this is the registry of
|
|
3145
|
+
# documents the build ships, which is what every run did before the folder could be said.
|
|
3146
|
+
held = load_stream_connector_registry(
|
|
3147
|
+
None if connector_registry is None else connector_registry.absolute()
|
|
3148
|
+
)
|
|
3149
|
+
reader = RecordedStreamGateway(
|
|
3086
3150
|
captures_root=captures_root,
|
|
3087
3151
|
# Coordinator times, not capture times. The adapter checks the batch it gets back
|
|
3088
3152
|
# against the observation evidence recorded here, and a gateway that answered with
|
|
3089
3153
|
# times it read out of a file would make that check a tautology.
|
|
3090
3154
|
observed_at=execution.requested_at,
|
|
3091
3155
|
available_at=execution.requested_at,
|
|
3156
|
+
registry=held,
|
|
3092
3157
|
)
|
|
3158
|
+
governance = _recorded_stream_governance(execution, stream_sources, reader)
|
|
3159
|
+
# The same gateway, stamping a batch with the availability this coordinator just wrote
|
|
3160
|
+
# down rather than with the moment the run started. The two are not the same fact: a
|
|
3161
|
+
# capture stops being extended when its Recorder stops, and the observation above says
|
|
3162
|
+
# so deliberately, so a gateway still stamping "now" would hand the adapter a batch its
|
|
3163
|
+
# own evidence contradicts and every build over a capture older than an instant would
|
|
3164
|
+
# be refused with STREAM_TEMPORAL_BINDING. This is still a coordinator input -- the
|
|
3165
|
+
# value is read once, into the evidence, and handed on -- and not the gateway reading a
|
|
3166
|
+
# time out of the file it is serving.
|
|
3167
|
+
gateway = replace(reader, available_at=governance.observation.available_at)
|
|
3093
3168
|
adapters.append(
|
|
3094
3169
|
StreamBatchAdapter(
|
|
3095
3170
|
gateway=gateway,
|
|
3096
3171
|
sandbox=sandbox,
|
|
3097
|
-
governance=
|
|
3172
|
+
governance=governance,
|
|
3098
3173
|
watermark_store=StreamWatermarkStore(stream_ledger_root(captures_root)),
|
|
3099
3174
|
)
|
|
3100
3175
|
)
|
|
@@ -3111,6 +3186,7 @@ def _execute_public_recipe_run(
|
|
|
3111
3186
|
producer_principal: str,
|
|
3112
3187
|
producer_attempt: str,
|
|
3113
3188
|
previous_run_dir: Path | None,
|
|
3189
|
+
connector_registry: Path | None = None,
|
|
3114
3190
|
visual_store: VisualRunStore | None = None,
|
|
3115
3191
|
) -> Any:
|
|
3116
3192
|
stock_sources = _stock_local_reader_sources(recipe, execution)
|
|
@@ -3147,6 +3223,7 @@ def _execute_public_recipe_run(
|
|
|
3147
3223
|
sandbox=sandbox,
|
|
3148
3224
|
stock_sources=stock_sources,
|
|
3149
3225
|
stream_sources=stream_sources,
|
|
3226
|
+
connector_registry=connector_registry,
|
|
3150
3227
|
)
|
|
3151
3228
|
|
|
3152
3229
|
def _context(source: Any, operation: str) -> AcquisitionContext:
|
{mostlyright_data-0.9.4 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_job.py
RENAMED
|
@@ -35,6 +35,7 @@ from mostlyright.data_harness.canonical import (
|
|
|
35
35
|
from mostlyright.data_harness.hosted_crawler import (
|
|
36
36
|
CRAWLER_EGRESS_POLICY_ENV,
|
|
37
37
|
WARM_UP_RESULT_SCHEMA,
|
|
38
|
+
HostedCrawlerError,
|
|
38
39
|
encode_normalization_input,
|
|
39
40
|
)
|
|
40
41
|
from mostlyright.data_harness.hosted_crawler_fetch import fetch_crawler_source
|
|
@@ -80,6 +81,24 @@ PRE_BOOTSTRAP_FAILURE_CODES = frozenset(
|
|
|
80
81
|
"CRAWLER_BOOTSTRAP_RESPONSE_TOO_LARGE",
|
|
81
82
|
}
|
|
82
83
|
)
|
|
84
|
+
# Wrapper deaths after bootstrap: the fetch may have succeeded, so these must
|
|
85
|
+
# never become sealed refusals (a refusal is the source's answer, and the
|
|
86
|
+
# source never answered "no"). Without a control-plane report the session
|
|
87
|
+
# dangles until the producer's poll deadline expires and the run dies blind
|
|
88
|
+
# (harness#400). Keep this closed in lock-step with Studio's
|
|
89
|
+
# ``WRAPPER_FAILURE_CODES``; a Studio that predates that set refuses the
|
|
90
|
+
# report with 400 and the job still exits non-zero, so deploy order is free.
|
|
91
|
+
WRAPPER_FAILURE_CODES = frozenset(
|
|
92
|
+
{
|
|
93
|
+
"CRAWLER_CHILD_FAILED",
|
|
94
|
+
"CRAWLER_CHILD_INVALID",
|
|
95
|
+
"CRAWLER_EXECUTABLE_UNAVAILABLE",
|
|
96
|
+
"CRAWLER_JOB_FAILED",
|
|
97
|
+
"CRAWLER_RESULTS_BUCKET_REQUIRED",
|
|
98
|
+
"CRAWLER_UPLOAD_FAILED",
|
|
99
|
+
"CRAWLER_WORKLOAD_IDENTITY_UNAVAILABLE",
|
|
100
|
+
}
|
|
101
|
+
)
|
|
83
102
|
# Sized for an EPA-scale year: the streamed decode, the streamed verification pass, and
|
|
84
103
|
# the chunked result encode are each one pure-Python walk over ~200M cells, which a live
|
|
85
104
|
# run spends 12-15 minutes on. The old 600 was calibrated to decode alone and killed a
|
|
@@ -474,7 +493,7 @@ def _report_crawler_bootstrap_failure(
|
|
|
474
493
|
can cross back into the crawler through this path.
|
|
475
494
|
"""
|
|
476
495
|
|
|
477
|
-
if failure_code not in PRE_BOOTSTRAP_FAILURE_CODES:
|
|
496
|
+
if failure_code not in PRE_BOOTSTRAP_FAILURE_CODES | WRAPPER_FAILURE_CODES:
|
|
478
497
|
return False
|
|
479
498
|
token: bytearray | None = None
|
|
480
499
|
response: bytearray | None = None
|
|
@@ -1028,19 +1047,23 @@ def _validate_public_https_result(
|
|
|
1028
1047
|
from mostlyright.data_harness.readers.contracts import ReaderPin
|
|
1029
1048
|
|
|
1030
1049
|
try:
|
|
1050
|
+
from mostlyright.data_harness.readers.registry import TOOLBOX
|
|
1051
|
+
|
|
1052
|
+
family = TOOLBOX.resolve(reader["family_id"], reader["family_version"])
|
|
1053
|
+
# The child digests the ADMITTED options -- ``validate_options``
|
|
1054
|
+
# fills family defaults -- so the expected identity must digest the
|
|
1055
|
+
# same bytes. Digesting the sealed pin raw made every recipe that
|
|
1056
|
+
# omitted a defaulted key fail ``reader_identity`` on every crawl.
|
|
1031
1057
|
pin = ReaderPin(
|
|
1032
1058
|
reader["family_id"],
|
|
1033
1059
|
reader["family_version"],
|
|
1034
|
-
reader["decode_options"],
|
|
1060
|
+
dict(family.validate_options(reader["decode_options"])),
|
|
1035
1061
|
)
|
|
1036
1062
|
except (KeyError, TypeError, ValueError):
|
|
1037
1063
|
_fail("CRAWLER_CHILD_INVALID", "public HTTPS Reader identity is invalid")
|
|
1038
1064
|
reader_identity = (pin.family_id, pin.family_version, pin.options_digest)
|
|
1039
1065
|
resource_caps = query.get("resource_caps")
|
|
1040
1066
|
try:
|
|
1041
|
-
from mostlyright.data_harness.readers.registry import TOOLBOX
|
|
1042
|
-
|
|
1043
|
-
family = TOOLBOX.resolve(pin.family_id, pin.family_version)
|
|
1044
1067
|
expected_reader_budgets = asdict(
|
|
1045
1068
|
family.default_budgets.narrowed_by(
|
|
1046
1069
|
{
|
|
@@ -1324,6 +1347,10 @@ def crawler_job_main(argv: list[str] | None = None) -> int:
|
|
|
1324
1347
|
return 0
|
|
1325
1348
|
except (
|
|
1326
1349
|
CanonicalJSONError,
|
|
1350
|
+
# HostedCrawlerError is a RuntimeError, not a ValueError; leaving it out
|
|
1351
|
+
# let every request/normalization refusal escape as a raw traceback with
|
|
1352
|
+
# no sealed failure and no session report (harness#400).
|
|
1353
|
+
HostedCrawlerError,
|
|
1327
1354
|
HostedCrawlerJobError,
|
|
1328
1355
|
HostedCrawlerProtocolError,
|
|
1329
1356
|
TypeError,
|
|
@@ -1366,6 +1393,28 @@ def crawler_job_main(argv: list[str] | None = None) -> int:
|
|
|
1366
1393
|
)
|
|
1367
1394
|
sys.stderr.write("\n")
|
|
1368
1395
|
return 0
|
|
1396
|
+
if code in WRAPPER_FAILURE_CODES:
|
|
1397
|
+
# A post-bootstrap wrapper death has no sealed-refusal lane (the
|
|
1398
|
+
# source never refused), so terminalize the session through the
|
|
1399
|
+
# ``:fail`` control-plane route instead of leaving it to dangle
|
|
1400
|
+
# into the producer's poll deadline. Best-effort: the job exits
|
|
1401
|
+
# non-zero either way, and an older Studio refuses the code.
|
|
1402
|
+
reported = _report_crawler_bootstrap_failure(
|
|
1403
|
+
crawler_session_id=crawler_session_id,
|
|
1404
|
+
failure_code=code,
|
|
1405
|
+
)
|
|
1406
|
+
sys.stderr.write(
|
|
1407
|
+
canonical_json_bytes(
|
|
1408
|
+
{
|
|
1409
|
+
"status": "failed",
|
|
1410
|
+
"code": code,
|
|
1411
|
+
"detail": detail,
|
|
1412
|
+
"session_failure_reported": reported,
|
|
1413
|
+
}
|
|
1414
|
+
).decode()
|
|
1415
|
+
)
|
|
1416
|
+
sys.stderr.write("\n")
|
|
1417
|
+
return 1
|
|
1369
1418
|
sys.stderr.write(
|
|
1370
1419
|
canonical_json_bytes({"status": "failed", "code": code, "detail": detail}).decode()
|
|
1371
1420
|
)
|