mostlyright-data 0.9.4__tar.gz → 0.9.5__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.5}/PKG-INFO +1 -1
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/pyproject.toml +1 -1
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/acquisition/url_policy.py +57 -28
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/cli.py +44 -3
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_crawler_job.py +54 -5
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_worker.py +809 -388
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/recipe.py +44 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/__init__.py +12 -6
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/stream.py +289 -33
- mostlyright_data-0.9.5/src/mostlyright/data_harness/sources/stream_capture_session.py +1347 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/stream_connector.py +81 -51
- mostlyright_data-0.9.5/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +39 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/stream_recorder.py +291 -42
- mostlyright_data-0.9.5/src/mostlyright/data_harness/sources/stream_registry.py +565 -0
- mostlyright_data-0.9.5/src/mostlyright/data_harness/sources/stream_rotation.py +727 -0
- mostlyright_data-0.9.5/src/mostlyright/data_harness/sources/stream_series.py +1320 -0
- mostlyright_data-0.9.5/src/mostlyright/data_harness/sources/stream_transport.py +943 -0
- mostlyright_data-0.9.5/src/mostlyright/data_harness/ux/commands/record.py +1039 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/headline.py +2 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/remediation.py +1 -1
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/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.5}/.gitignore +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/README.md +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/scripts/hatch_build.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/acquisition/http.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/agent_runtime.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/backends/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/backends/protocol.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/backends/reference.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/backends/registry.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/canonical.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/catalog_job.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/coordinator.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/deploy.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/deploy_target.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/event_presentation.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/events.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/fast_delimited.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/fleet.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/formats.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/governors.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ingestion/store.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/key_seam.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/local_contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/local_search/service.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/document.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/status.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/notebook.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/offline.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/operation_registry.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/operator_setup.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/pipeline.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/plan_graph.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/preparation/engine.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/preparation/errors.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/preparation/gates.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/preparation/joins.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/preparation/profile.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/preparation/table.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/progress_events.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/containers.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/delimited.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/registry.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/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.5}/src/mostlyright/data_harness/readers/samples.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/readers/tabular.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/repair/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/repair/adapters.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/repair/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/repair/errors.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/review.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/rowset.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/serving.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/serving_edge.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/serving_http.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/session_probes.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/signing.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/source_discovery.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/adapters.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/cadence.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/collections.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/deletion.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/fitness.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/governance.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/hosted.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/integration.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/registry.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/sources/sports.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/studio_boundary.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/acquire.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/approvals.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/commands.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/download.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/narrative.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/parity.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/propose.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/research.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/router.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/runs.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/session.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/stream.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/transport.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/thin/workers.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/unit_flow.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/units.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/approve.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/credentials.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/diffing.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/inventory.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/local_review.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/login.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/peek.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/preflight.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/readers.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/ux/workload.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/viewer.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/visual_run/query.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/visual_run/store.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
- {mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/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.5
|
|
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/
|
|
@@ -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
|
|
@@ -209,6 +209,9 @@ from mostlyright.data_harness.sources.stream_recorder import (
|
|
|
209
209
|
from mostlyright.data_harness.sources.stream_recorder import (
|
|
210
210
|
ledger_root as stream_ledger_root,
|
|
211
211
|
)
|
|
212
|
+
from mostlyright.data_harness.sources.stream_registry import (
|
|
213
|
+
load_stream_connector_registry,
|
|
214
|
+
)
|
|
212
215
|
from mostlyright.data_harness.ux.commands import discovered_commands
|
|
213
216
|
from mostlyright.data_harness.ux.credentials import LoginError, resolve_cloud_credentials
|
|
214
217
|
from mostlyright.data_harness.ux.headline import (
|
|
@@ -1014,6 +1017,7 @@ def _dispatch(
|
|
|
1014
1017
|
producer_principal=args.producer_principal,
|
|
1015
1018
|
producer_attempt=args.producer_attempt,
|
|
1016
1019
|
previous_run_dir=args.previous_run_dir,
|
|
1020
|
+
connector_registry=args.connector_registry,
|
|
1017
1021
|
visual_store=visual_store,
|
|
1018
1022
|
)
|
|
1019
1023
|
payload = result.to_dict()
|
|
@@ -1979,6 +1983,14 @@ def _parser(
|
|
|
1979
1983
|
help="the run settings: which recipe fingerprint and engine versions this run is pinned to",
|
|
1980
1984
|
)
|
|
1981
1985
|
recipe_run.add_argument("--input-root", type=Path, required=True, help=_INPUT_ROOT)
|
|
1986
|
+
recipe_run.add_argument(
|
|
1987
|
+
"--connector-registry",
|
|
1988
|
+
type=Path,
|
|
1989
|
+
help=(
|
|
1990
|
+
"the folder of stream source documents the captures under the input folder were "
|
|
1991
|
+
"recorded under; without it, only the ones this build ships are held"
|
|
1992
|
+
),
|
|
1993
|
+
)
|
|
1982
1994
|
recipe_run.add_argument("--output", type=Path, required=True, help=_OUTPUT_NEW)
|
|
1983
1995
|
recipe_run.add_argument("--previous-run-dir", type=Path, help=_PREVIOUS_BUILD)
|
|
1984
1996
|
recipe_run.add_argument("--producer-principal", required=True, help=_BUILT_BY)
|
|
@@ -3058,6 +3070,7 @@ def _local_recipe_registry(
|
|
|
3058
3070
|
sandbox: CrawlerSandbox,
|
|
3059
3071
|
stock_sources: tuple[Any, ...],
|
|
3060
3072
|
stream_sources: tuple[Any, ...],
|
|
3073
|
+
connector_registry: Path | None = None,
|
|
3061
3074
|
) -> AdapterRegistry:
|
|
3062
3075
|
"""Build the exact allowlist this local run is permitted to use.
|
|
3063
3076
|
|
|
@@ -3069,6 +3082,14 @@ def _local_recipe_registry(
|
|
|
3069
3082
|
host allowlist against the address in the query and the other hands the fetch to Studio's
|
|
3070
3083
|
hosted clean room. A recorded capture has no address and no hosted home yet, so an adapter
|
|
3071
3084
|
registered in either of those would claim a capability it cannot honestly provide.
|
|
3085
|
+
|
|
3086
|
+
``connector_registry`` is the folder of source documents an operator wrote, the same one they
|
|
3087
|
+
recorded the capture under. ``None`` means the versions this build ships. It has to be
|
|
3088
|
+
sayable here: a sealed capture pins the digest of the source document it was recorded under,
|
|
3089
|
+
and a build that could only look in the documents it ships would refuse every capture taken
|
|
3090
|
+
from a source somebody wrote -- which is every live capture, because the one source this build
|
|
3091
|
+
ships may not be captured live at all. It is not a way to reinterpret a capture: the manifest
|
|
3092
|
+
still names its own digest, and this only says where that version may be looked up.
|
|
3072
3093
|
"""
|
|
3073
3094
|
|
|
3074
3095
|
adapters: list[Any] = []
|
|
@@ -3082,19 +3103,37 @@ def _local_recipe_registry(
|
|
|
3082
3103
|
)
|
|
3083
3104
|
if stream_sources:
|
|
3084
3105
|
captures_root = input_root / _CAPTURES_DIRECTORY_NAME
|
|
3085
|
-
|
|
3106
|
+
# Read once, here, before any Build work: a folder that is not there, or is a link to
|
|
3107
|
+
# one, is refused with STREAM_CONNECTOR_REGISTRY_ROOT at the start of the run rather
|
|
3108
|
+
# than found missing halfway through it. With no folder named, this is the registry of
|
|
3109
|
+
# documents the build ships, which is what every run did before the folder could be said.
|
|
3110
|
+
held = load_stream_connector_registry(
|
|
3111
|
+
None if connector_registry is None else connector_registry.absolute()
|
|
3112
|
+
)
|
|
3113
|
+
reader = RecordedStreamGateway(
|
|
3086
3114
|
captures_root=captures_root,
|
|
3087
3115
|
# Coordinator times, not capture times. The adapter checks the batch it gets back
|
|
3088
3116
|
# against the observation evidence recorded here, and a gateway that answered with
|
|
3089
3117
|
# times it read out of a file would make that check a tautology.
|
|
3090
3118
|
observed_at=execution.requested_at,
|
|
3091
3119
|
available_at=execution.requested_at,
|
|
3120
|
+
registry=held,
|
|
3092
3121
|
)
|
|
3122
|
+
governance = _recorded_stream_governance(execution, stream_sources, reader)
|
|
3123
|
+
# The same gateway, stamping a batch with the availability this coordinator just wrote
|
|
3124
|
+
# down rather than with the moment the run started. The two are not the same fact: a
|
|
3125
|
+
# capture stops being extended when its Recorder stops, and the observation above says
|
|
3126
|
+
# so deliberately, so a gateway still stamping "now" would hand the adapter a batch its
|
|
3127
|
+
# own evidence contradicts and every build over a capture older than an instant would
|
|
3128
|
+
# be refused with STREAM_TEMPORAL_BINDING. This is still a coordinator input -- the
|
|
3129
|
+
# value is read once, into the evidence, and handed on -- and not the gateway reading a
|
|
3130
|
+
# time out of the file it is serving.
|
|
3131
|
+
gateway = replace(reader, available_at=governance.observation.available_at)
|
|
3093
3132
|
adapters.append(
|
|
3094
3133
|
StreamBatchAdapter(
|
|
3095
3134
|
gateway=gateway,
|
|
3096
3135
|
sandbox=sandbox,
|
|
3097
|
-
governance=
|
|
3136
|
+
governance=governance,
|
|
3098
3137
|
watermark_store=StreamWatermarkStore(stream_ledger_root(captures_root)),
|
|
3099
3138
|
)
|
|
3100
3139
|
)
|
|
@@ -3111,6 +3150,7 @@ def _execute_public_recipe_run(
|
|
|
3111
3150
|
producer_principal: str,
|
|
3112
3151
|
producer_attempt: str,
|
|
3113
3152
|
previous_run_dir: Path | None,
|
|
3153
|
+
connector_registry: Path | None = None,
|
|
3114
3154
|
visual_store: VisualRunStore | None = None,
|
|
3115
3155
|
) -> Any:
|
|
3116
3156
|
stock_sources = _stock_local_reader_sources(recipe, execution)
|
|
@@ -3147,6 +3187,7 @@ def _execute_public_recipe_run(
|
|
|
3147
3187
|
sandbox=sandbox,
|
|
3148
3188
|
stock_sources=stock_sources,
|
|
3149
3189
|
stream_sources=stream_sources,
|
|
3190
|
+
connector_registry=connector_registry,
|
|
3150
3191
|
)
|
|
3151
3192
|
|
|
3152
3193
|
def _context(source: Any, operation: str) -> AcquisitionContext:
|
{mostlyright_data-0.9.4 → mostlyright_data-0.9.5}/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
|
)
|