mostlyright-data 0.9.0__py3-none-any.whl
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_harness/__init__.py +158 -0
- mostlyright/data_harness/acquisition/__init__.py +55 -0
- mostlyright/data_harness/acquisition/http.py +2773 -0
- mostlyright/data_harness/acquisition/parsing.py +809 -0
- mostlyright/data_harness/acquisition/ranges.py +495 -0
- mostlyright/data_harness/acquisition/result_download.py +360 -0
- mostlyright/data_harness/acquisition/retention_admission.py +248 -0
- mostlyright/data_harness/acquisition/sandbox.py +4888 -0
- mostlyright/data_harness/acquisition/url_policy.py +530 -0
- mostlyright/data_harness/agent_runtime.py +2743 -0
- mostlyright/data_harness/assets/logo-ink.svg +31 -0
- mostlyright/data_harness/backends/__init__.py +28 -0
- mostlyright/data_harness/backends/pandas_backend.py +350 -0
- mostlyright/data_harness/backends/polars_backend.py +366 -0
- mostlyright/data_harness/backends/protocol.py +124 -0
- mostlyright/data_harness/backends/reference.py +83 -0
- mostlyright/data_harness/backends/registry.py +55 -0
- mostlyright/data_harness/backends/restrictions.py +126 -0
- mostlyright/data_harness/canonical.py +333 -0
- mostlyright/data_harness/catalog_job.py +625 -0
- mostlyright/data_harness/cli.py +5398 -0
- mostlyright/data_harness/contracts.py +53 -0
- mostlyright/data_harness/coordinator.py +1307 -0
- mostlyright/data_harness/deploy.py +924 -0
- mostlyright/data_harness/deploy_target.py +312 -0
- mostlyright/data_harness/deployment_evidence.py +1067 -0
- mostlyright/data_harness/event_presentation.py +576 -0
- mostlyright/data_harness/events.py +2152 -0
- mostlyright/data_harness/fast_delimited.py +239 -0
- mostlyright/data_harness/fleet.py +237 -0
- mostlyright/data_harness/formats.py +236 -0
- mostlyright/data_harness/governors.py +1163 -0
- mostlyright/data_harness/hosted_bootstrap.py +972 -0
- mostlyright/data_harness/hosted_crawler.py +1115 -0
- mostlyright/data_harness/hosted_crawler_container_smoke.py +351 -0
- mostlyright/data_harness/hosted_crawler_fetch.py +423 -0
- mostlyright/data_harness/hosted_crawler_job.py +1277 -0
- mostlyright/data_harness/hosted_crawler_protocol.py +676 -0
- mostlyright/data_harness/hosted_dataset.py +1500 -0
- mostlyright/data_harness/hosted_deploy.py +3037 -0
- mostlyright/data_harness/hosted_handoff.py +62 -0
- mostlyright/data_harness/hosted_ingestion_contract.py +504 -0
- mostlyright/data_harness/hosted_ingestion_job.py +356 -0
- mostlyright/data_harness/hosted_ingestion_job_smoke.py +40 -0
- mostlyright/data_harness/hosted_session_container_smoke.py +194 -0
- mostlyright/data_harness/hosted_session_worker.py +3554 -0
- mostlyright/data_harness/hosted_session_worker_job_smoke.py +46 -0
- mostlyright/data_harness/hosted_worker.py +6784 -0
- mostlyright/data_harness/ingestion/__init__.py +56 -0
- mostlyright/data_harness/ingestion/contracts.py +461 -0
- mostlyright/data_harness/ingestion/faults.py +42 -0
- mostlyright/data_harness/ingestion/gcs_store.py +1162 -0
- mostlyright/data_harness/ingestion/spool.py +130 -0
- mostlyright/data_harness/ingestion/store.py +885 -0
- mostlyright/data_harness/key_seam.py +434 -0
- mostlyright/data_harness/linux_process_boundary.py +262 -0
- mostlyright/data_harness/local_contracts.py +2880 -0
- mostlyright/data_harness/local_search/__init__.py +5 -0
- mostlyright/data_harness/local_search/build_index.py +1087 -0
- mostlyright/data_harness/local_search/contracts.py +920 -0
- mostlyright/data_harness/local_search/query_trace.py +266 -0
- mostlyright/data_harness/local_search/retrieval.py +700 -0
- mostlyright/data_harness/local_search/sealed.py +474 -0
- mostlyright/data_harness/local_search/service.py +784 -0
- mostlyright/data_harness/nbrender/CONTRACT.md +212 -0
- mostlyright/data_harness/nbrender/__init__.py +12 -0
- mostlyright/data_harness/nbrender/chrome.py +359 -0
- mostlyright/data_harness/nbrender/code_body.py +266 -0
- mostlyright/data_harness/nbrender/document.py +407 -0
- mostlyright/data_harness/nbrender/frame.py +275 -0
- mostlyright/data_harness/nbrender/interactive.py +337 -0
- mostlyright/data_harness/nbrender/markdown_body.py +477 -0
- mostlyright/data_harness/nbrender/mr_components.py +134 -0
- mostlyright/data_harness/nbrender/outputs_data.py +595 -0
- mostlyright/data_harness/nbrender/outputs_rich.py +906 -0
- mostlyright/data_harness/nbrender/outputs_source.py +260 -0
- mostlyright/data_harness/nbrender/outputs_stage.py +176 -0
- mostlyright/data_harness/nbrender/outputs_text.py +400 -0
- mostlyright/data_harness/nbrender/parse.py +394 -0
- mostlyright/data_harness/nbrender/status.py +40 -0
- mostlyright/data_harness/nbrender/tokens.py +1295 -0
- mostlyright/data_harness/notebook.py +1710 -0
- mostlyright/data_harness/offline.py +2049 -0
- mostlyright/data_harness/operation_registry.py +1007 -0
- mostlyright/data_harness/operator_setup.py +239 -0
- mostlyright/data_harness/pipeline.py +6428 -0
- mostlyright/data_harness/plan_graph.py +2026 -0
- mostlyright/data_harness/preparation/__init__.py +104 -0
- mostlyright/data_harness/preparation/contracts.py +1017 -0
- mostlyright/data_harness/preparation/engine.py +221 -0
- mostlyright/data_harness/preparation/errors.py +14 -0
- mostlyright/data_harness/preparation/gates.py +751 -0
- mostlyright/data_harness/preparation/joins.py +574 -0
- mostlyright/data_harness/preparation/profile.py +384 -0
- mostlyright/data_harness/preparation/table.py +217 -0
- mostlyright/data_harness/preparation/transforms.py +568 -0
- mostlyright/data_harness/progress_events.py +534 -0
- mostlyright/data_harness/readers/__init__.py +46 -0
- mostlyright/data_harness/readers/containers.py +963 -0
- mostlyright/data_harness/readers/contracts.py +542 -0
- mostlyright/data_harness/readers/delimited.py +257 -0
- mostlyright/data_harness/readers/grib2/__init__.py +33 -0
- mostlyright/data_harness/readers/grib2/admission.py +722 -0
- mostlyright/data_harness/readers/grib2/decode.py +1009 -0
- mostlyright/data_harness/readers/grib2/geometry.py +1133 -0
- mostlyright/data_harness/readers/grib2/portable_math.py +501 -0
- mostlyright/data_harness/readers/json_tabular.py +485 -0
- mostlyright/data_harness/readers/registry.py +514 -0
- mostlyright/data_harness/readers/samples/README.md +110 -0
- mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
- mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +24 -0
- mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
- mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +24 -0
- mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
- mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +24 -0
- mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
- mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +24 -0
- mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
- mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +25 -0
- mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +25 -0
- mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
- mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +25 -0
- mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +3 -0
- mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +23 -0
- mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +5 -0
- mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +25 -0
- mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +30 -0
- mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +5 -0
- mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +44 -0
- mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +1 -0
- mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +48 -0
- mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +4 -0
- mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
- mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +24 -0
- mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +27 -0
- mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +27 -0
- mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
- mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +20 -0
- mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +55 -0
- mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
- mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +54 -0
- mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +54 -0
- mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
- mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +54 -0
- mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
- mostlyright/data_harness/readers/samples.py +582 -0
- mostlyright/data_harness/readers/spreadsheet.py +803 -0
- mostlyright/data_harness/readers/tabular.py +510 -0
- mostlyright/data_harness/recipe.py +5321 -0
- mostlyright/data_harness/repair/__init__.py +78 -0
- mostlyright/data_harness/repair/adapters.py +274 -0
- mostlyright/data_harness/repair/contracts.py +872 -0
- mostlyright/data_harness/repair/coordinator.py +1099 -0
- mostlyright/data_harness/repair/errors.py +16 -0
- mostlyright/data_harness/review.py +2533 -0
- mostlyright/data_harness/rowset.py +283 -0
- mostlyright/data_harness/serving.py +1975 -0
- mostlyright/data_harness/serving_edge.py +590 -0
- mostlyright/data_harness/serving_http.py +1031 -0
- mostlyright/data_harness/session_probes.py +759 -0
- mostlyright/data_harness/signing.py +101 -0
- mostlyright/data_harness/source_discovery.py +898 -0
- mostlyright/data_harness/sources/__init__.py +209 -0
- mostlyright/data_harness/sources/_adapter_steps.py +213 -0
- mostlyright/data_harness/sources/adapters.py +1214 -0
- mostlyright/data_harness/sources/cadence.py +1428 -0
- mostlyright/data_harness/sources/cadence_emission.py +453 -0
- mostlyright/data_harness/sources/cadence_history.py +546 -0
- mostlyright/data_harness/sources/catalog/__init__.py +17 -0
- mostlyright/data_harness/sources/catalog/admission.py +477 -0
- mostlyright/data_harness/sources/catalog/authoring.py +1701 -0
- mostlyright/data_harness/sources/catalog/authoring_policy.py +701 -0
- mostlyright/data_harness/sources/catalog/authoring_shards.py +1217 -0
- mostlyright/data_harness/sources/catalog/bounded_io.py +231 -0
- mostlyright/data_harness/sources/catalog/channel.py +523 -0
- mostlyright/data_harness/sources/catalog/channel_client.py +296 -0
- mostlyright/data_harness/sources/catalog/contracts.py +825 -0
- mostlyright/data_harness/sources/catalog/coverage.py +137 -0
- mostlyright/data_harness/sources/catalog/delta.py +1340 -0
- mostlyright/data_harness/sources/catalog/embedding.py +532 -0
- mostlyright/data_harness/sources/catalog/entry_v2.py +1182 -0
- mostlyright/data_harness/sources/catalog/fill.py +3889 -0
- mostlyright/data_harness/sources/catalog/fill_partitions.py +459 -0
- mostlyright/data_harness/sources/catalog/fill_staging.py +1105 -0
- mostlyright/data_harness/sources/catalog/gating.py +374 -0
- mostlyright/data_harness/sources/catalog/generation_receipt.py +1607 -0
- mostlyright/data_harness/sources/catalog/harvest/__init__.py +7 -0
- mostlyright/data_harness/sources/catalog/harvest/ckan.py +384 -0
- mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +798 -0
- mostlyright/data_harness/sources/catalog/harvest/protocol.py +964 -0
- mostlyright/data_harness/sources/catalog/harvest/sdmx.py +445 -0
- mostlyright/data_harness/sources/catalog/harvest/stac.py +384 -0
- mostlyright/data_harness/sources/catalog/health.py +447 -0
- mostlyright/data_harness/sources/catalog/hosted_catalog.py +105 -0
- mostlyright/data_harness/sources/catalog/identity_history.py +1549 -0
- mostlyright/data_harness/sources/catalog/neural.py +1618 -0
- mostlyright/data_harness/sources/catalog/packed_catalog.py +2345 -0
- mostlyright/data_harness/sources/catalog/packed_retrieval.py +1517 -0
- mostlyright/data_harness/sources/catalog/packed_writer.py +2802 -0
- mostlyright/data_harness/sources/catalog/query_trace.py +1037 -0
- mostlyright/data_harness/sources/catalog/recommend.py +171 -0
- mostlyright/data_harness/sources/catalog/retrieval.py +230 -0
- mostlyright/data_harness/sources/catalog/retrieval_manifest.py +995 -0
- mostlyright/data_harness/sources/catalog/rights_decisions.py +254 -0
- mostlyright/data_harness/sources/catalog/sealed.py +560 -0
- mostlyright/data_harness/sources/catalog/search.py +230 -0
- mostlyright/data_harness/sources/catalog/streaming_delta.py +1097 -0
- mostlyright/data_harness/sources/catalog/update.py +891 -0
- mostlyright/data_harness/sources/collections.py +815 -0
- mostlyright/data_harness/sources/contracts.py +2223 -0
- mostlyright/data_harness/sources/deletion.py +761 -0
- mostlyright/data_harness/sources/fitness.py +162 -0
- mostlyright/data_harness/sources/governance.py +163 -0
- mostlyright/data_harness/sources/hosted.py +173 -0
- mostlyright/data_harness/sources/integration.py +218 -0
- mostlyright/data_harness/sources/range_reader.py +418 -0
- mostlyright/data_harness/sources/registry.py +514 -0
- mostlyright/data_harness/sources/rights_rule.py +59 -0
- mostlyright/data_harness/sources/source_cadence_vectors.v1.json +1 -0
- mostlyright/data_harness/sources/sports.py +521 -0
- mostlyright/data_harness/sources/stream.py +524 -0
- mostlyright/data_harness/sources/stream_connector.py +418 -0
- mostlyright/data_harness/sources/stream_recorder.py +1404 -0
- mostlyright/data_harness/studio_boundary.py +2019 -0
- mostlyright/data_harness/thin/__init__.py +37 -0
- mostlyright/data_harness/thin/acquire.py +1137 -0
- mostlyright/data_harness/thin/acquire_cancel.py +579 -0
- mostlyright/data_harness/thin/approvals.py +617 -0
- mostlyright/data_harness/thin/commands.py +406 -0
- mostlyright/data_harness/thin/download.py +194 -0
- mostlyright/data_harness/thin/narrative.py +589 -0
- mostlyright/data_harness/thin/parity.py +1070 -0
- mostlyright/data_harness/thin/propose.py +2759 -0
- mostlyright/data_harness/thin/research.py +1663 -0
- mostlyright/data_harness/thin/router.py +924 -0
- mostlyright/data_harness/thin/runs.py +519 -0
- mostlyright/data_harness/thin/session.py +281 -0
- mostlyright/data_harness/thin/stream.py +501 -0
- mostlyright/data_harness/thin/transport.py +187 -0
- mostlyright/data_harness/thin/vocabulary.py +368 -0
- mostlyright/data_harness/thin/workers.py +164 -0
- mostlyright/data_harness/ucum/TABLE-PIN.json +40 -0
- mostlyright/data_harness/ucum/ucum-subset.v1.json +632 -0
- mostlyright/data_harness/unit_flow.py +927 -0
- mostlyright/data_harness/units.py +572 -0
- mostlyright/data_harness/ux/__init__.py +9 -0
- mostlyright/data_harness/ux/approve.py +485 -0
- mostlyright/data_harness/ux/author_yaml.py +597 -0
- mostlyright/data_harness/ux/cloud_auth.py +447 -0
- mostlyright/data_harness/ux/commands/__init__.py +260 -0
- mostlyright/data_harness/ux/commands/approve.py +136 -0
- mostlyright/data_harness/ux/commands/auth.py +744 -0
- mostlyright/data_harness/ux/commands/author.py +79 -0
- mostlyright/data_harness/ux/commands/catalog_author.py +403 -0
- mostlyright/data_harness/ux/commands/catalog_fill.py +523 -0
- mostlyright/data_harness/ux/commands/catalog_harvest.py +545 -0
- mostlyright/data_harness/ux/commands/catalog_publish.py +1838 -0
- mostlyright/data_harness/ux/commands/catalog_search.py +71 -0
- mostlyright/data_harness/ux/commands/catalog_update.py +437 -0
- mostlyright/data_harness/ux/commands/deploy.py +134 -0
- mostlyright/data_harness/ux/commands/deploy_dataset.py +98 -0
- mostlyright/data_harness/ux/commands/deploy_plan.py +105 -0
- mostlyright/data_harness/ux/commands/deploy_status.py +104 -0
- mostlyright/data_harness/ux/commands/diff.py +74 -0
- mostlyright/data_harness/ux/commands/index.py +84 -0
- mostlyright/data_harness/ux/commands/inventory.py +47 -0
- mostlyright/data_harness/ux/commands/list_builds.py +143 -0
- mostlyright/data_harness/ux/commands/login.py +63 -0
- mostlyright/data_harness/ux/commands/peek.py +236 -0
- mostlyright/data_harness/ux/commands/plan_check.py +90 -0
- mostlyright/data_harness/ux/commands/preflight.py +97 -0
- mostlyright/data_harness/ux/commands/record.py +107 -0
- mostlyright/data_harness/ux/commands/review_setup.py +47 -0
- mostlyright/data_harness/ux/commands/search.py +440 -0
- mostlyright/data_harness/ux/commands/show.py +61 -0
- mostlyright/data_harness/ux/commands/whoami.py +37 -0
- mostlyright/data_harness/ux/credential_native.py +551 -0
- mostlyright/data_harness/ux/credential_store.py +1055 -0
- mostlyright/data_harness/ux/credentials.py +631 -0
- mostlyright/data_harness/ux/diffing.py +444 -0
- mostlyright/data_harness/ux/headline.py +671 -0
- mostlyright/data_harness/ux/hosted_acquisition.py +974 -0
- mostlyright/data_harness/ux/hosted_run_status.py +619 -0
- mostlyright/data_harness/ux/inventory.py +427 -0
- mostlyright/data_harness/ux/local_review.py +375 -0
- mostlyright/data_harness/ux/login.py +691 -0
- mostlyright/data_harness/ux/path_kind.py +147 -0
- mostlyright/data_harness/ux/peek.py +1000 -0
- mostlyright/data_harness/ux/plain_file.py +178 -0
- mostlyright/data_harness/ux/plan_check.py +311 -0
- mostlyright/data_harness/ux/preflight.py +918 -0
- mostlyright/data_harness/ux/readers.py +1124 -0
- mostlyright/data_harness/ux/remediation.py +2195 -0
- mostlyright/data_harness/ux/render.py +657 -0
- mostlyright/data_harness/ux/workload.py +1077 -0
- mostlyright/data_harness/viewer.py +3713 -0
- mostlyright/data_harness/visual_run/__init__.py +83 -0
- mostlyright/data_harness/visual_run/authoring.py +235 -0
- mostlyright/data_harness/visual_run/contracts.py +673 -0
- mostlyright/data_harness/visual_run/materialize.py +486 -0
- mostlyright/data_harness/visual_run/observations.py +874 -0
- mostlyright/data_harness/visual_run/query.py +259 -0
- mostlyright/data_harness/visual_run/reducer.py +280 -0
- mostlyright/data_harness/visual_run/sdk.py +892 -0
- mostlyright/data_harness/visual_run/store.py +584 -0
- mostlyright/data_harness/visual_run/transport.py +239 -0
- mostlyright/data_harness/watch.py +2999 -0
- mostlyright_data-0.9.0.dist-info/METADATA +607 -0
- mostlyright_data-0.9.0.dist-info/RECORD +314 -0
- mostlyright_data-0.9.0.dist-info/WHEEL +4 -0
- mostlyright_data-0.9.0.dist-info/entry_points.txt +12 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"""Versioned source adapter and evidence contracts.
|
|
2
|
+
|
|
3
|
+
Acquisition runs in three steps. A caller builds an ``AcquisitionRequest`` and passes it with an
|
|
4
|
+
``AcquisitionContext`` to ``AdapterRegistry.acquire``. The registry resolves the allowlisted
|
|
5
|
+
adapter for the requested adapter id and version and calls its ``acquire`` method. The adapter
|
|
6
|
+
returns an ``AcquisitionOutput`` holding the digest-bound receipt and the source observation, plus
|
|
7
|
+
the optional parsed schema digest, content-addressed snapshot path, and next stream watermark.
|
|
8
|
+
|
|
9
|
+
``docs/SOURCES-AND-ACQUISITION.md`` describes that boundary in full, including catalog-provider
|
|
10
|
+
ownership, the sports comparison, stream batches, and deletion.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from mostlyright.data_harness.sources.adapters import (
|
|
14
|
+
AdapterGovernance,
|
|
15
|
+
LocalFileAdapter,
|
|
16
|
+
ObservationPolicy,
|
|
17
|
+
PublicHttpsAdapter,
|
|
18
|
+
RangeReaderHttpsAdapter,
|
|
19
|
+
)
|
|
20
|
+
from mostlyright.data_harness.sources.cadence import (
|
|
21
|
+
SOURCE_CADENCE_ALGORITHM_DIGEST,
|
|
22
|
+
SOURCE_CADENCE_ALGORITHM_VERSION,
|
|
23
|
+
SOURCE_CADENCE_INFERENCE_SCHEMA,
|
|
24
|
+
SOURCE_CADENCE_OBSERVATION_SCHEMA,
|
|
25
|
+
CadenceContractError,
|
|
26
|
+
CadenceInference,
|
|
27
|
+
EmpiricalSourceObservation,
|
|
28
|
+
PartitionDigest,
|
|
29
|
+
SourceFrontier,
|
|
30
|
+
infer_source_cadence,
|
|
31
|
+
parse_cadence_inference,
|
|
32
|
+
parse_empirical_source_observation,
|
|
33
|
+
source_cadence_algorithm_spec,
|
|
34
|
+
validate_observation_history,
|
|
35
|
+
)
|
|
36
|
+
from mostlyright.data_harness.sources.collections import (
|
|
37
|
+
CollectionMember,
|
|
38
|
+
PublicHttpsCollectionAdapter,
|
|
39
|
+
collection_members,
|
|
40
|
+
)
|
|
41
|
+
from mostlyright.data_harness.sources.contracts import (
|
|
42
|
+
AcquisitionReceipt,
|
|
43
|
+
AcquisitionReceiptV2,
|
|
44
|
+
AcquisitionReceiptV3,
|
|
45
|
+
AcquisitionRequest,
|
|
46
|
+
AdapterDescriptor,
|
|
47
|
+
CollectionMemberEvidence,
|
|
48
|
+
DeletionTombstone,
|
|
49
|
+
EvidenceReference,
|
|
50
|
+
FetchedMember,
|
|
51
|
+
FitnessEvidence,
|
|
52
|
+
FitnessReport,
|
|
53
|
+
LicenseObligation,
|
|
54
|
+
RetentionPolicy,
|
|
55
|
+
RightsEvidence,
|
|
56
|
+
SnapshotReference,
|
|
57
|
+
SourceContractError,
|
|
58
|
+
SourceObservation,
|
|
59
|
+
evaluate_obligations,
|
|
60
|
+
parse_adapter_descriptor,
|
|
61
|
+
)
|
|
62
|
+
from mostlyright.data_harness.sources.deletion import (
|
|
63
|
+
DeletionCoordinator,
|
|
64
|
+
DeletionOutcome,
|
|
65
|
+
RetentionDecision,
|
|
66
|
+
load_sealed_tombstone,
|
|
67
|
+
project_availability,
|
|
68
|
+
require_source_available,
|
|
69
|
+
retention_decision,
|
|
70
|
+
)
|
|
71
|
+
from mostlyright.data_harness.sources.fitness import (
|
|
72
|
+
FitnessSignals,
|
|
73
|
+
build_fitness_report,
|
|
74
|
+
select_one_source,
|
|
75
|
+
)
|
|
76
|
+
from mostlyright.data_harness.sources.governance import (
|
|
77
|
+
ClassificationFinding,
|
|
78
|
+
ClassificationResult,
|
|
79
|
+
classify_and_require_admissible,
|
|
80
|
+
classify_before_persistence,
|
|
81
|
+
require_admissible,
|
|
82
|
+
)
|
|
83
|
+
from mostlyright.data_harness.sources.integration import (
|
|
84
|
+
AcquiredOneToOneJoinEvidence,
|
|
85
|
+
OneToOneJoinEvidence,
|
|
86
|
+
join_acquired_sources_one_to_one,
|
|
87
|
+
join_source_tables_one_to_one,
|
|
88
|
+
)
|
|
89
|
+
from mostlyright.data_harness.sources.registry import (
|
|
90
|
+
AcquisitionContext,
|
|
91
|
+
AcquisitionOutput,
|
|
92
|
+
AdapterRegistry,
|
|
93
|
+
SourceAdapter,
|
|
94
|
+
)
|
|
95
|
+
from mostlyright.data_harness.sources.sports import (
|
|
96
|
+
GovernedSportsPackage,
|
|
97
|
+
SportsComparison,
|
|
98
|
+
compare_recorded_sports_sources,
|
|
99
|
+
create_governed_sports_package,
|
|
100
|
+
openligadb_adapter,
|
|
101
|
+
openligadb_descriptor,
|
|
102
|
+
openligadb_rights,
|
|
103
|
+
)
|
|
104
|
+
from mostlyright.data_harness.sources.stream import (
|
|
105
|
+
StreamBatch,
|
|
106
|
+
StreamBatchAdapter,
|
|
107
|
+
StreamGateway,
|
|
108
|
+
StreamState,
|
|
109
|
+
StreamWatermarkStore,
|
|
110
|
+
)
|
|
111
|
+
from mostlyright.data_harness.sources.stream_connector import (
|
|
112
|
+
KNOWN_STREAM_CONNECTORS,
|
|
113
|
+
STREAM_CONNECTOR_IDS,
|
|
114
|
+
StreamConnectorConfig,
|
|
115
|
+
stream_connector,
|
|
116
|
+
)
|
|
117
|
+
from mostlyright.data_harness.sources.stream_recorder import (
|
|
118
|
+
CaptureManifest,
|
|
119
|
+
RecordedStreamGateway,
|
|
120
|
+
read_capture_manifest,
|
|
121
|
+
seal_recorded_capture,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
__all__ = [
|
|
125
|
+
"KNOWN_STREAM_CONNECTORS",
|
|
126
|
+
"SOURCE_CADENCE_ALGORITHM_DIGEST",
|
|
127
|
+
"SOURCE_CADENCE_ALGORITHM_VERSION",
|
|
128
|
+
"SOURCE_CADENCE_INFERENCE_SCHEMA",
|
|
129
|
+
"SOURCE_CADENCE_OBSERVATION_SCHEMA",
|
|
130
|
+
"STREAM_CONNECTOR_IDS",
|
|
131
|
+
"AcquiredOneToOneJoinEvidence",
|
|
132
|
+
"AcquisitionContext",
|
|
133
|
+
"AcquisitionOutput",
|
|
134
|
+
"AcquisitionReceipt",
|
|
135
|
+
"AcquisitionReceiptV2",
|
|
136
|
+
"AcquisitionReceiptV3",
|
|
137
|
+
"AcquisitionRequest",
|
|
138
|
+
"AdapterDescriptor",
|
|
139
|
+
"AdapterGovernance",
|
|
140
|
+
"AdapterRegistry",
|
|
141
|
+
"CadenceContractError",
|
|
142
|
+
"CadenceInference",
|
|
143
|
+
"CaptureManifest",
|
|
144
|
+
"ClassificationFinding",
|
|
145
|
+
"ClassificationResult",
|
|
146
|
+
"CollectionMember",
|
|
147
|
+
"CollectionMemberEvidence",
|
|
148
|
+
"DeletionCoordinator",
|
|
149
|
+
"DeletionOutcome",
|
|
150
|
+
"DeletionTombstone",
|
|
151
|
+
"EmpiricalSourceObservation",
|
|
152
|
+
"EvidenceReference",
|
|
153
|
+
"FetchedMember",
|
|
154
|
+
"FitnessEvidence",
|
|
155
|
+
"FitnessReport",
|
|
156
|
+
"FitnessSignals",
|
|
157
|
+
"GovernedSportsPackage",
|
|
158
|
+
"LicenseObligation",
|
|
159
|
+
"LocalFileAdapter",
|
|
160
|
+
"ObservationPolicy",
|
|
161
|
+
"OneToOneJoinEvidence",
|
|
162
|
+
"PartitionDigest",
|
|
163
|
+
"PublicHttpsAdapter",
|
|
164
|
+
"PublicHttpsCollectionAdapter",
|
|
165
|
+
"RangeReaderHttpsAdapter",
|
|
166
|
+
"RecordedStreamGateway",
|
|
167
|
+
"RetentionDecision",
|
|
168
|
+
"RetentionPolicy",
|
|
169
|
+
"RightsEvidence",
|
|
170
|
+
"SnapshotReference",
|
|
171
|
+
"SourceAdapter",
|
|
172
|
+
"SourceContractError",
|
|
173
|
+
"SourceFrontier",
|
|
174
|
+
"SourceObservation",
|
|
175
|
+
"SportsComparison",
|
|
176
|
+
"StreamBatch",
|
|
177
|
+
"StreamBatchAdapter",
|
|
178
|
+
"StreamConnectorConfig",
|
|
179
|
+
"StreamGateway",
|
|
180
|
+
"StreamState",
|
|
181
|
+
"StreamWatermarkStore",
|
|
182
|
+
"build_fitness_report",
|
|
183
|
+
"classify_and_require_admissible",
|
|
184
|
+
"classify_before_persistence",
|
|
185
|
+
"collection_members",
|
|
186
|
+
"compare_recorded_sports_sources",
|
|
187
|
+
"create_governed_sports_package",
|
|
188
|
+
"evaluate_obligations",
|
|
189
|
+
"infer_source_cadence",
|
|
190
|
+
"join_acquired_sources_one_to_one",
|
|
191
|
+
"join_source_tables_one_to_one",
|
|
192
|
+
"load_sealed_tombstone",
|
|
193
|
+
"openligadb_adapter",
|
|
194
|
+
"openligadb_descriptor",
|
|
195
|
+
"openligadb_rights",
|
|
196
|
+
"parse_adapter_descriptor",
|
|
197
|
+
"parse_cadence_inference",
|
|
198
|
+
"parse_empirical_source_observation",
|
|
199
|
+
"project_availability",
|
|
200
|
+
"read_capture_manifest",
|
|
201
|
+
"require_admissible",
|
|
202
|
+
"require_source_available",
|
|
203
|
+
"retention_decision",
|
|
204
|
+
"seal_recorded_capture",
|
|
205
|
+
"select_one_source",
|
|
206
|
+
"source_cadence_algorithm_spec",
|
|
207
|
+
"stream_connector",
|
|
208
|
+
"validate_observation_history",
|
|
209
|
+
]
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"""Adapter steps shared by every source adapter in this package.
|
|
2
|
+
|
|
3
|
+
The file, HTTPS, external-provider, and stream adapters all authorize the candidate use, derive
|
|
4
|
+
sandbox parse limits, require the coordinator-pinned sandbox policy, and build the receipt and
|
|
5
|
+
observation the same way. Those four steps live here so no adapter can drift from them.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import TYPE_CHECKING
|
|
13
|
+
|
|
14
|
+
from mostlyright.data_harness.acquisition.http import ProbeTransport
|
|
15
|
+
from mostlyright.data_harness.acquisition.parsing import ParseLimits
|
|
16
|
+
from mostlyright.data_harness.canonical import sha256_bytes
|
|
17
|
+
from mostlyright.data_harness.sources.contracts import (
|
|
18
|
+
AcquisitionReceipt,
|
|
19
|
+
AcquisitionRequest,
|
|
20
|
+
AdapterDescriptor,
|
|
21
|
+
SnapshotReference,
|
|
22
|
+
SourceContractError,
|
|
23
|
+
SourceObservation,
|
|
24
|
+
decode_options_digest,
|
|
25
|
+
evaluate_obligations,
|
|
26
|
+
)
|
|
27
|
+
from mostlyright.data_harness.sources.registry import (
|
|
28
|
+
AcquisitionContext,
|
|
29
|
+
AcquisitionOutput,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
from mostlyright.data_harness.sources.adapters import AdapterGovernance
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass(frozen=True)
|
|
37
|
+
class DecodeRecord:
|
|
38
|
+
"""What a Reader reports back to the adapter that ran it.
|
|
39
|
+
|
|
40
|
+
Local to ``sources/`` rather than imported from ``readers``, so the evidence layer
|
|
41
|
+
stays independent of the Toolbox implementation and the seam can be exercised with a
|
|
42
|
+
stub. It carries the digest of the fetched bytes rather than the bytes themselves:
|
|
43
|
+
the sealed bytes are already in the adapter's hand and a second copy of the input
|
|
44
|
+
would only be a second thing that could go stale.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
fetched_content_sha256: str
|
|
48
|
+
family_id: str
|
|
49
|
+
family_version: str
|
|
50
|
+
decode_options_digest: str
|
|
51
|
+
flags: tuple[str, ...] = ()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _require_decode_matches_pin(
|
|
55
|
+
request: AcquisitionRequest,
|
|
56
|
+
decode: DecodeRecord | None,
|
|
57
|
+
) -> None:
|
|
58
|
+
"""Refuse an acquisition whose decode contradicts what the request entitled.
|
|
59
|
+
|
|
60
|
+
The adapter-side twin of ``recipe._validate_reader_pin_binding``, and deliberately not
|
|
61
|
+
a replacement for it. This one fires earlier and nearer the decode, which is where
|
|
62
|
+
the diagnosis is cheapest; the coordinator's own check stays as an independent second
|
|
63
|
+
gate reading the sealed receipt. A bug then has to defeat both.
|
|
64
|
+
|
|
65
|
+
It fires in the same three directions the coordinator check covers: the request
|
|
66
|
+
entitles a decoder and none ran, a decoder ran that the request entitled none, and
|
|
67
|
+
both are stated but disagree.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
pin = request.reader_pin
|
|
71
|
+
if pin is None and decode is None:
|
|
72
|
+
return
|
|
73
|
+
if pin is None:
|
|
74
|
+
raise SourceContractError(
|
|
75
|
+
"DECODE_PIN_MISMATCH",
|
|
76
|
+
"receipt.family_id",
|
|
77
|
+
"a decode was recorded for a request that entitles no Reader family",
|
|
78
|
+
)
|
|
79
|
+
if decode is None:
|
|
80
|
+
raise SourceContractError(
|
|
81
|
+
"DECODE_PIN_MISMATCH",
|
|
82
|
+
"request.reader_pin",
|
|
83
|
+
"the request entitles a Reader family that this acquisition did not run",
|
|
84
|
+
)
|
|
85
|
+
if (decode.family_id, decode.family_version) != (pin["family_id"], pin["family_version"]):
|
|
86
|
+
raise SourceContractError(
|
|
87
|
+
"DECODE_PIN_MISMATCH",
|
|
88
|
+
"receipt.family_id",
|
|
89
|
+
"the decode names a Reader family the request did not entitle",
|
|
90
|
+
)
|
|
91
|
+
if decode.decode_options_digest != decode_options_digest(pin["decode_options"]):
|
|
92
|
+
raise SourceContractError(
|
|
93
|
+
"DECODE_PIN_MISMATCH",
|
|
94
|
+
"receipt.decode_options_digest",
|
|
95
|
+
"the decode ran with settings other than the ones the request entitled",
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _output(
|
|
100
|
+
*,
|
|
101
|
+
request: AcquisitionRequest,
|
|
102
|
+
descriptor: AdapterDescriptor,
|
|
103
|
+
governance: AdapterGovernance,
|
|
104
|
+
snapshot_path: Path,
|
|
105
|
+
content: bytes,
|
|
106
|
+
data_format: str,
|
|
107
|
+
media_type: str,
|
|
108
|
+
source_uri: str,
|
|
109
|
+
final_uri: str,
|
|
110
|
+
classification: str,
|
|
111
|
+
transport_evidence_digest: str,
|
|
112
|
+
parsed_schema_digest: str,
|
|
113
|
+
next_watermark: str | None = None,
|
|
114
|
+
decode: DecodeRecord | None = None,
|
|
115
|
+
probe_transport: ProbeTransport | None = None,
|
|
116
|
+
parsed_row_count: int | None = None,
|
|
117
|
+
parsed_row_digest: str | None = None,
|
|
118
|
+
) -> AcquisitionOutput:
|
|
119
|
+
_require_decode_matches_pin(request, decode)
|
|
120
|
+
observation = SourceObservation(
|
|
121
|
+
source_id=request.source_id,
|
|
122
|
+
observed_at=governance.observation.observed_at,
|
|
123
|
+
event_time_field=governance.observation.event_time_field,
|
|
124
|
+
available_at_field=governance.observation.available_at_field,
|
|
125
|
+
historical_start=governance.observation.historical_start,
|
|
126
|
+
historical_end=governance.observation.historical_end,
|
|
127
|
+
live_status=governance.observation.live_status,
|
|
128
|
+
publication_delay_seconds=governance.observation.publication_delay_seconds,
|
|
129
|
+
update_frequency_seconds=governance.observation.update_frequency_seconds,
|
|
130
|
+
response_status=governance.observation.response_status,
|
|
131
|
+
evidence=governance.observation.evidence,
|
|
132
|
+
)
|
|
133
|
+
digest = sha256_bytes(content)
|
|
134
|
+
receipt = AcquisitionReceipt(
|
|
135
|
+
receipt_id=f"receipt.{request.digest[:24]}",
|
|
136
|
+
request_digest=request.digest,
|
|
137
|
+
source_id=request.source_id,
|
|
138
|
+
adapter=descriptor,
|
|
139
|
+
query_digest=request.query_digest,
|
|
140
|
+
snapshot=SnapshotReference(
|
|
141
|
+
content_sha256=digest,
|
|
142
|
+
size_bytes=len(content),
|
|
143
|
+
media_type=media_type,
|
|
144
|
+
data_format=data_format,
|
|
145
|
+
storage_name=snapshot_path.name,
|
|
146
|
+
),
|
|
147
|
+
# The two hashes coincide for a direct fetch and diverge for a Reader-decoded
|
|
148
|
+
# acquisition: the fetched bytes are what arrived, the sealed bytes are what the
|
|
149
|
+
# Reader normalized them into. That is the middle link of the three-link identity
|
|
150
|
+
# chain ``AcquisitionReceipt`` describes, and keeping both is what gives a
|
|
151
|
+
# normalized artifact a way back to the bytes that produced it. On the direct
|
|
152
|
+
# path the snapshot digest is reused rather than the content hashed twice.
|
|
153
|
+
fetched_content_sha256=digest if decode is None else decode.fetched_content_sha256,
|
|
154
|
+
family_id=None if decode is None else decode.family_id,
|
|
155
|
+
family_version=None if decode is None else decode.family_version,
|
|
156
|
+
decode_options_digest=None if decode is None else decode.decode_options_digest,
|
|
157
|
+
decode_flags=() if decode is None else decode.flags,
|
|
158
|
+
source_uri=source_uri,
|
|
159
|
+
final_uri=final_uri,
|
|
160
|
+
event_time_field=governance.observation.event_time_field,
|
|
161
|
+
observed_at=governance.observation.observed_at,
|
|
162
|
+
available_at=governance.observation.available_at,
|
|
163
|
+
ingested_at=request.requested_at,
|
|
164
|
+
classification=classification,
|
|
165
|
+
rights_digest=governance.rights.digest,
|
|
166
|
+
retention_digest=governance.retention.digest,
|
|
167
|
+
observation_digest=observation.digest,
|
|
168
|
+
transport_evidence_digest=transport_evidence_digest,
|
|
169
|
+
)
|
|
170
|
+
return AcquisitionOutput(
|
|
171
|
+
receipt=receipt,
|
|
172
|
+
observation=observation,
|
|
173
|
+
parsed_schema_digest=parsed_schema_digest,
|
|
174
|
+
snapshot_path=snapshot_path,
|
|
175
|
+
next_watermark=next_watermark,
|
|
176
|
+
probe_transport=probe_transport,
|
|
177
|
+
parsed_row_count=parsed_row_count,
|
|
178
|
+
parsed_row_digest=parsed_row_digest,
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def _authorize_candidate(request: AcquisitionRequest, governance: AdapterGovernance) -> None:
|
|
183
|
+
evaluate_obligations(
|
|
184
|
+
rights=governance.rights,
|
|
185
|
+
lifecycle="candidate",
|
|
186
|
+
intended_use=request.intended_use,
|
|
187
|
+
attached_artifact_digests=governance.attached_license_artifact_digests,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _parse_limits(context: AcquisitionContext) -> ParseLimits:
|
|
192
|
+
return ParseLimits(
|
|
193
|
+
max_input_bytes=context.max_source_bytes,
|
|
194
|
+
max_uncompressed_bytes=min(max(context.max_source_bytes, 1) * 100, 1 << 36),
|
|
195
|
+
max_rows=context.max_rows,
|
|
196
|
+
max_columns=context.max_columns,
|
|
197
|
+
max_total_cells=min(context.max_rows * context.max_columns, 100_000_000),
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _require_sandbox_binding(policy_digest: str, context: AcquisitionContext) -> None:
|
|
202
|
+
if context.crawler_sandbox_attestation_digest is None:
|
|
203
|
+
raise SourceContractError(
|
|
204
|
+
"SANDBOX_ATTESTATION_REQUIRED",
|
|
205
|
+
"context.crawler_sandbox_attestation_digest",
|
|
206
|
+
"acquisition requires the coordinator-pinned crawler policy digest",
|
|
207
|
+
)
|
|
208
|
+
if policy_digest != context.crawler_sandbox_attestation_digest:
|
|
209
|
+
raise SourceContractError(
|
|
210
|
+
"SANDBOX_ATTESTATION_MISMATCH",
|
|
211
|
+
"sandbox.policy_digest",
|
|
212
|
+
"sandbox result does not match the coordinator-pinned policy",
|
|
213
|
+
)
|