classifyre-cli 0.6.7__tar.gz → 0.6.9__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.
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/.turbo/turbo-build.log +1 -1
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/PKG-INFO +1 -1
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/package.json +1 -1
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/pyproject.toml +1 -1
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/main.py +2 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/models/generated_input.py +177 -4
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/sdk.py +91 -7
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/outputs/rest.py +9 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/base.py +194 -29
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/confluence/source.py +10 -2
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/custom/runner.py +4 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/custom/source.py +6 -1
- classifyre_cli-0.6.9/src/sources/dremio/__init__.py +3 -0
- classifyre_cli-0.6.9/src/sources/dremio/client.py +466 -0
- classifyre_cli-0.6.9/src/sources/dremio/source.py +736 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/email/source.py +13 -5
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/google_workspace/source.py +12 -2
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/jira/source.py +9 -2
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/kafka/rest.py +19 -3
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/kafka/source.py +163 -50
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/local_folder/source.py +78 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/microsoft_365/source.py +12 -3
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/mongodb/source.py +111 -6
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/notion/source.py +10 -2
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/object_storage/base.py +21 -3
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/oracle/source.py +29 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/powerbi/source.py +12 -14
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/reddit/source.py +14 -3
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/servicedesk/source.py +22 -3
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/slack/source.py +146 -62
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/tableau/source.py +12 -14
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/tabular_base.py +156 -25
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/tabular_utils.py +6 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/wordpress/source.py +108 -28
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/youtube/source.py +8 -4
- classifyre_cli-0.6.9/src/utils/sampling_frontier.py +689 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/sql_lineage.py +50 -1
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/urn.py +1 -0
- classifyre_cli-0.6.9/tests/test_automatic_new_first.py +474 -0
- classifyre_cli-0.6.9/tests/test_dremio_source.py +867 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_dropbox_source.py +9 -5
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_google_workspace_source.py +36 -32
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_hugging_face_source.py +19 -18
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_kafka_source.py +130 -42
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_microsoft_365_source.py +32 -21
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_reddit_source.py +37 -14
- classifyre_cli-0.6.9/tests/test_sampling_automatic.py +272 -0
- classifyre_cli-0.6.9/tests/test_sampling_frontier.py +511 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_sandbox_source.py +34 -18
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_slack_source.py +98 -34
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_source_strategy_conformance.py +7 -5
- classifyre_cli-0.6.9/tests/test_tabular_automatic_sampling.py +262 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/uv.lock +209 -202
- classifyre_cli-0.6.7/tests/test_sampling_automatic.py +0 -142
- classifyre_cli-0.6.7/tests/test_tabular_automatic_sampling.py +0 -187
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/.gitignore +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/.python-version +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/README.md +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/main.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/scripts/generate_models.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/scripts/generate_runtime_packages.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/scripts/generate_sdk_completions.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/augmentation/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/augmentation/contract.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/augmentation/preview.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/augmentation/runner.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/augmentation/sdk.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/augmentation/session.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/config.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/base.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/broken_links/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/broken_links/detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/config.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/content/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/extractor.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_base.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_custom_detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_factory.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_gliner2.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_image_classification.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_llm.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_object_detection.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_regex.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_tag.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_text_classification.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom/trainer.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom_detector/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom_detector/contract.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom_detector/files.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom_detector/preview.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom_detector/results.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom_detector/runner.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom_detector/sdk.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/custom_detector/session.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/dependencies.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/engine_version.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/errors.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/pii/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/pii/detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/secrets/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/secrets/detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/threat/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/threat/code_security_detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/detectors/threat/yara_detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/file_evaluation/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/file_evaluation/asset_fixture.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/file_evaluation/runner.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/graph/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/graph/edges.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/models/generated_detectors.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/models/generated_single_asset_scan_results.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/child.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/cli.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/cohort.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/contract.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/execute.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/files.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/groups.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/outputs.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/packages.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/protocol.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/redact.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/scaffold.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/notebook/serialize.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/outputs/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/outputs/base.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/outputs/console.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/outputs/factory.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/outputs/file.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/pipeline/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/pipeline/asset_payload_server.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/pipeline/content_provider.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/pipeline/detector_breaker.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/pipeline/detector_pipeline.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/pipeline/parsed_content_provider.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/pipeline/payload_window.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/pipeline/scan_cache.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/pipeline/text_artifact.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/pipeline/worker_pool.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/asset_metadata.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/atlassian_common.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/azure_blob_storage/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/azure_blob_storage/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/confluence/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/custom/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/custom/env.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/databricks/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/databricks/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/delta_lake/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/delta_lake/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/dependencies.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/dropbox/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/dropbox/auth.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/dropbox/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/elasticsearch/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/elasticsearch/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/email/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/git/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/git/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/google_cloud_storage/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/google_cloud_storage/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/google_workspace/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/hive/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/hive/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/hugging_face/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/hugging_face/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/iceberg/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/iceberg/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/jira/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/kafka/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/lakehouse_base.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/local_folder/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/meilisearch/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/meilisearch/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/microsoft_365/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/mongodb/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/mssql/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/mssql/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/mysql/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/mysql/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/neo4j/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/neo4j/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/notion/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/notion/client.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/opensearch/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/opensearch/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/oracle/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/postgresql/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/postgresql/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/powerbi/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/recipe_normalizer.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/reddit/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/s3_client.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/s3_compatible_storage/README.md +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/s3_compatible_storage/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/s3_compatible_storage/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/sandbox/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/sandbox/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/search_engine_base.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/servicedesk/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/slack/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/snowflake/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/snowflake/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/sqlite/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/sqlite/source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/tableau/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/wordpress/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/sources/youtube/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/telemetry.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/archive_extraction.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/content_extraction.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/dependency_groups.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/embedded_files.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/external_video.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/file_metadata.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/file_parser.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/file_to_images.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/hashing.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/legacy_office.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/payload.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/range_reader.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/redaction.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/resources.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/sampling_cursor.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/source_files.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/torch_runtime.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/transcription.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/uv_sync.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/validation.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/src/utils/video_processing.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/_lakehouse_fakes.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/conftest.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/broken_links/test_broken_links_detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/conftest.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/content/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/custom/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/custom/conftest.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/custom/test_gliner2_classification.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/custom/test_invoice_extraction.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/custom/test_llm_runner.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/custom/test_pipeline_integration.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/custom/test_regex_runner.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/custom/test_runner_hardening.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/custom/test_transformer_runners.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/pii/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/pii/conftest.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/pii/sample_invoice.pdf +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/pii/test_pii_chunking.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/pii/test_pii_detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/pii/test_pii_detector_extended.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/pii/test_pii_regional_entities.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/pii/test_pii_severity.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/secrets/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/secrets/test_secrets_detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/secrets/test_secrets_detector_extended.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/test_base_detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/test_custom_detector_examples_runtime.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/test_custom_detector_session.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/test_detector_catalog_commercial.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/test_detector_pipeline_types.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/test_detector_schema_examples.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/test_detector_types.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/test_phase2_detectors.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/test_registry.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/test_tag_runner.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/threat/__init__.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/threat/test_code_security_detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/detectors/threat/test_yara_detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/integration/test_wordpress_broken_links_detector.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/integration/test_wordpress_links_assets.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/pipeline/test_detector_breaker.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/pipeline/test_detector_outcomes.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/pipeline/test_detector_pipeline.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/pipeline/test_worker_pool.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_arrow_ipc_payloads.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_assets_metadata_catalog.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_augmentation_contract.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_augmentation_edges.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_augmentation_patch.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_augmentation_scan_cache.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_augmentation_sdk.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_augmentation_session.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_augmentation_tags_end_to_end.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_azure_blob_storage_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_base_source_attachment.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_base_source_sampling.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_byte_valued_fields.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_config.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_confluence_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_custom_detector_end_to_end.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_custom_detector_evaluation.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_custom_detector_notebook.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_custom_detector_templates.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_custom_extractor.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_custom_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_custom_source_relationships.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_custom_source_tags_end_to_end.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_databricks_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_delta_lake_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_dependency_groups.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_detector_scope.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_dropbox_auth_command.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_elasticsearch_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_email_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_file_evaluation_runner.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_git_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_google_cloud_storage_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_graph_edges.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_hashing.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_hive_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_iceberg_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_jira_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_lineage_loss_reporting.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_local_folder_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_main.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_meilisearch_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_mongodb_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_mssql_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_mysql_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_neo4j_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_asset_entity.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_asset_extract.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_asset_tags.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_cohort.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_execute.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_files.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_groups.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_log_levels.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_packages.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_query_assets.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_sdk_exports.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_serialize.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notebook_templates.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_notion_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_object_storage_download_efficiency.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_opensearch_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_oracle_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_outputs.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_payload_window.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_payload_window_parquet.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_postgresql_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_powerbi_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_range_reading.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_recipe_normalizer.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_rest_backpressure.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_runtime_packages.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_s3_compatible_storage_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_sampling_cursor.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_scan_cache.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_sdk_completions.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_secret_redaction.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_semantic_declarations.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_servicedesk_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_snowflake_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_source_dependency_groups.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_sqlite_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_tableau_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_tabular_lineage.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_tabular_utils.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_torch_runtime.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_urn.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_uv_sync.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_wordpress_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_youtube_source.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/test_youtube_source_integration.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/utils/test_archive_extraction.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/utils/test_content_extraction.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/utils/test_embedded_files.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/utils/test_file_metadata.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/utils/test_file_parser.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/utils/test_file_to_images.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/utils/test_legacy_office.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/utils/test_payload.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/utils/test_transcription.py +0 -0
- {classifyre_cli-0.6.7 → classifyre_cli-0.6.9}/tests/utils/test_video_processing.py +0 -0
|
@@ -909,6 +909,8 @@ async def run_command_async(args: argparse.Namespace, recipe: dict[str, Any]) ->
|
|
|
909
909
|
# completion path — a timed-out run must not advance it.
|
|
910
910
|
if hasattr(sink, "set_sampling_cursor"):
|
|
911
911
|
sink.set_sampling_cursor(source.current_sampling_cursor())
|
|
912
|
+
if hasattr(sink, "set_sampling_fingerprint"):
|
|
913
|
+
sink.set_sampling_fingerprint(source.sampling_fingerprint())
|
|
912
914
|
|
|
913
915
|
# A connector that covered a slice must say so before
|
|
914
916
|
# finish(), which is what decides whether absence retires
|
|
@@ -35,6 +35,7 @@ class AssetType(StrEnum):
|
|
|
35
35
|
HIVE = 'HIVE'
|
|
36
36
|
DATABRICKS = 'DATABRICKS'
|
|
37
37
|
SNOWFLAKE = 'SNOWFLAKE'
|
|
38
|
+
DREMIO = 'DREMIO'
|
|
38
39
|
MONGODB = 'MONGODB'
|
|
39
40
|
NEO4J = 'NEO4J'
|
|
40
41
|
POWERBI = 'POWERBI'
|
|
@@ -101,7 +102,7 @@ class SlackChannelType(StrEnum):
|
|
|
101
102
|
|
|
102
103
|
class SamplingStrategy(StrEnum):
|
|
103
104
|
"""
|
|
104
|
-
Sampling strategy. AUTOMATIC (recommended default)
|
|
105
|
+
Sampling strategy. AUTOMATIC (recommended default) reads a bounded slice on every run and remembers where it has been: whatever is new since the last run comes first, the rest of the slice continues backwards through older data, and once everything has been covered only new data is read. Changing the source's settings or one of its detectors starts the sweep over. A table or collection with no increasing key cannot tell new rows from old, so it is paged from the start and wraps around instead. RANDOM samples items randomly. LATEST prioritises the most recently modified/created items. ALL scans every item with no limit.
|
|
105
106
|
"""
|
|
106
107
|
|
|
107
108
|
AUTOMATIC = 'AUTOMATIC'
|
|
@@ -368,6 +369,7 @@ class Type(StrEnum):
|
|
|
368
369
|
HIVE = 'HIVE'
|
|
369
370
|
DATABRICKS = 'DATABRICKS'
|
|
370
371
|
SNOWFLAKE = 'SNOWFLAKE'
|
|
372
|
+
DREMIO = 'DREMIO'
|
|
371
373
|
MONGODB = 'MONGODB'
|
|
372
374
|
NEO4J = 'NEO4J'
|
|
373
375
|
POWERBI = 'POWERBI'
|
|
@@ -2152,6 +2154,150 @@ class SnowflakeOptional(BaseModel):
|
|
|
2152
2154
|
extraction: SnowflakeOptionalExtraction | None = None
|
|
2153
2155
|
|
|
2154
2156
|
|
|
2157
|
+
class DremioCloudRegion(StrEnum):
|
|
2158
|
+
"""
|
|
2159
|
+
Dremio Cloud control plane the project lives in
|
|
2160
|
+
"""
|
|
2161
|
+
|
|
2162
|
+
US = 'US'
|
|
2163
|
+
EU = 'EU'
|
|
2164
|
+
|
|
2165
|
+
|
|
2166
|
+
class DremioRequiredSoftware(BaseModel):
|
|
2167
|
+
"""
|
|
2168
|
+
A Dremio you run yourself (Dremio Software, Enterprise or Community Edition).
|
|
2169
|
+
"""
|
|
2170
|
+
|
|
2171
|
+
model_config = ConfigDict(
|
|
2172
|
+
extra='forbid',
|
|
2173
|
+
)
|
|
2174
|
+
url: AnyUrl = Field(
|
|
2175
|
+
...,
|
|
2176
|
+
description='Address you open Dremio at, including the port (for example, https://dremio.example.com:9047)',
|
|
2177
|
+
)
|
|
2178
|
+
|
|
2179
|
+
|
|
2180
|
+
class DremioRequiredCloud(BaseModel):
|
|
2181
|
+
"""
|
|
2182
|
+
A project in Dremio's hosted service. Signs in with a personal access token.
|
|
2183
|
+
"""
|
|
2184
|
+
|
|
2185
|
+
model_config = ConfigDict(
|
|
2186
|
+
extra='forbid',
|
|
2187
|
+
)
|
|
2188
|
+
project_id: str = Field(
|
|
2189
|
+
...,
|
|
2190
|
+
description='Dremio Cloud project ID (Project Settings > General Information)',
|
|
2191
|
+
)
|
|
2192
|
+
region: DremioCloudRegion
|
|
2193
|
+
|
|
2194
|
+
|
|
2195
|
+
class DremioMaskedPassword(BaseModel):
|
|
2196
|
+
"""
|
|
2197
|
+
Self-hosted Dremio only.
|
|
2198
|
+
"""
|
|
2199
|
+
|
|
2200
|
+
model_config = ConfigDict(
|
|
2201
|
+
extra='forbid',
|
|
2202
|
+
)
|
|
2203
|
+
username: str = Field(..., description='Dremio login username')
|
|
2204
|
+
password: str = Field(..., description='Dremio login password')
|
|
2205
|
+
|
|
2206
|
+
|
|
2207
|
+
class DremioMaskedToken(BaseModel):
|
|
2208
|
+
"""
|
|
2209
|
+
Works for Dremio Cloud and for self-hosted Enterprise Edition.
|
|
2210
|
+
"""
|
|
2211
|
+
|
|
2212
|
+
model_config = ConfigDict(
|
|
2213
|
+
extra='forbid',
|
|
2214
|
+
)
|
|
2215
|
+
token: str = Field(
|
|
2216
|
+
...,
|
|
2217
|
+
description='Dremio personal access token (Account Settings > Personal Access Tokens)',
|
|
2218
|
+
)
|
|
2219
|
+
|
|
2220
|
+
|
|
2221
|
+
class DremioOptionalConnection(BaseModel):
|
|
2222
|
+
"""
|
|
2223
|
+
Dremio API and query tuning options.
|
|
2224
|
+
"""
|
|
2225
|
+
|
|
2226
|
+
model_config = ConfigDict(
|
|
2227
|
+
extra='forbid',
|
|
2228
|
+
)
|
|
2229
|
+
verify_ssl: bool | None = Field(
|
|
2230
|
+
True,
|
|
2231
|
+
description="Verify the Dremio server's TLS certificate. Turn off only for a self-hosted Dremio with a self-signed certificate.",
|
|
2232
|
+
)
|
|
2233
|
+
timeout_seconds: int | None = Field(
|
|
2234
|
+
30, description='HTTP timeout for a single Dremio API call', ge=5, le=300
|
|
2235
|
+
)
|
|
2236
|
+
query_timeout_seconds: int | None = Field(
|
|
2237
|
+
300,
|
|
2238
|
+
description='Maximum time to wait for one sampling query to finish before it is cancelled',
|
|
2239
|
+
ge=10,
|
|
2240
|
+
le=3600,
|
|
2241
|
+
)
|
|
2242
|
+
|
|
2243
|
+
|
|
2244
|
+
class DremioOptionalScope(BaseModel):
|
|
2245
|
+
"""
|
|
2246
|
+
Which Dremio sources, spaces, folders, and datasets to scan.
|
|
2247
|
+
"""
|
|
2248
|
+
|
|
2249
|
+
model_config = ConfigDict(
|
|
2250
|
+
extra='forbid',
|
|
2251
|
+
)
|
|
2252
|
+
include_paths: list[str] | None = Field(
|
|
2253
|
+
None,
|
|
2254
|
+
description='Optional allowlist of sources, spaces, folders, or datasets, written as dot-separated paths (for example, Marketing or Samples."samples.dremio.com"). Everything beneath a listed path is scanned. Wrap a name that itself contains a dot in double quotes.',
|
|
2255
|
+
)
|
|
2256
|
+
exclude_paths: list[str] | None = Field(
|
|
2257
|
+
[],
|
|
2258
|
+
description='Sources, spaces, folders, or datasets to skip, written the same way as include_paths. Exclusions win over inclusions.',
|
|
2259
|
+
)
|
|
2260
|
+
include_tables: bool | None = Field(
|
|
2261
|
+
True, description='Include tables (physical datasets) in extraction'
|
|
2262
|
+
)
|
|
2263
|
+
include_views: bool | None = Field(
|
|
2264
|
+
True, description='Include views (virtual datasets) in extraction'
|
|
2265
|
+
)
|
|
2266
|
+
include_home_spaces: bool | None = Field(
|
|
2267
|
+
False, description='Include personal home spaces (@username) in extraction'
|
|
2268
|
+
)
|
|
2269
|
+
table_limit: int | None = Field(
|
|
2270
|
+
None, description='Optional cap on number of table/view assets extracted', ge=1
|
|
2271
|
+
)
|
|
2272
|
+
|
|
2273
|
+
|
|
2274
|
+
class DremioOptionalExtraction(BaseModel):
|
|
2275
|
+
"""
|
|
2276
|
+
Lineage extraction controls for Dremio.
|
|
2277
|
+
"""
|
|
2278
|
+
|
|
2279
|
+
model_config = ConfigDict(
|
|
2280
|
+
extra='forbid',
|
|
2281
|
+
)
|
|
2282
|
+
include_view_lineage: bool | None = Field(
|
|
2283
|
+
True,
|
|
2284
|
+
description="Link each view to the tables and views it reads from. Uses Dremio's own lineage graph where the edition provides it, and the view's SQL otherwise.",
|
|
2285
|
+
)
|
|
2286
|
+
include_source_lineage: bool | None = Field(
|
|
2287
|
+
True,
|
|
2288
|
+
description="Link tables that Dremio reads from an external database (PostgreSQL, MySQL, SQL Server, Oracle, Snowflake) to that database's own table, so lineage continues across systems. Needs permission to view the Dremio source's settings.",
|
|
2289
|
+
)
|
|
2290
|
+
|
|
2291
|
+
|
|
2292
|
+
class DremioOptional(BaseModel):
|
|
2293
|
+
model_config = ConfigDict(
|
|
2294
|
+
extra='forbid',
|
|
2295
|
+
)
|
|
2296
|
+
connection: DremioOptionalConnection | None = None
|
|
2297
|
+
scope: DremioOptionalScope | None = None
|
|
2298
|
+
extraction: DremioOptionalExtraction | None = None
|
|
2299
|
+
|
|
2300
|
+
|
|
2155
2301
|
class MongoDBDeployment(StrEnum):
|
|
2156
2302
|
"""
|
|
2157
2303
|
MongoDB deployment mode
|
|
@@ -2703,7 +2849,7 @@ class ConfluenceOptionalConnection(BaseModel):
|
|
|
2703
2849
|
)
|
|
2704
2850
|
|
|
2705
2851
|
|
|
2706
|
-
class
|
|
2852
|
+
class Type22(StrEnum):
|
|
2707
2853
|
"""
|
|
2708
2854
|
Filter spaces by space type
|
|
2709
2855
|
"""
|
|
@@ -2740,7 +2886,7 @@ class ConfluenceOptionalScopeSpaces(BaseModel):
|
|
|
2740
2886
|
keys: list[str] | None = Field(
|
|
2741
2887
|
None, description='Filter spaces by keys (up to 250)', max_length=250
|
|
2742
2888
|
)
|
|
2743
|
-
type:
|
|
2889
|
+
type: Type22 | None = Field(None, description='Filter spaces by space type')
|
|
2744
2890
|
status: Status | None = Field(None, description='Filter spaces by status')
|
|
2745
2891
|
labels: list[str] | None = Field(
|
|
2746
2892
|
None,
|
|
@@ -3006,7 +3152,7 @@ class ServiceDeskOptional(BaseModel):
|
|
|
3006
3152
|
content: ServiceDeskOptionalContent | None = None
|
|
3007
3153
|
|
|
3008
3154
|
|
|
3009
|
-
class
|
|
3155
|
+
class Type23(StrEnum):
|
|
3010
3156
|
"""
|
|
3011
3157
|
Type of the asset or source
|
|
3012
3158
|
"""
|
|
@@ -3023,6 +3169,7 @@ class Type22(StrEnum):
|
|
|
3023
3169
|
HIVE = 'HIVE'
|
|
3024
3170
|
DATABRICKS = 'DATABRICKS'
|
|
3025
3171
|
SNOWFLAKE = 'SNOWFLAKE'
|
|
3172
|
+
DREMIO = 'DREMIO'
|
|
3026
3173
|
MONGODB = 'MONGODB'
|
|
3027
3174
|
NEO4J = 'NEO4J'
|
|
3028
3175
|
POWERBI = 'POWERBI'
|
|
@@ -5183,6 +5330,30 @@ class SnowflakeInput(CoreInput):
|
|
|
5183
5330
|
augmentation: AugmentationConfig | None = None
|
|
5184
5331
|
|
|
5185
5332
|
|
|
5333
|
+
class DremioInput(CoreInput):
|
|
5334
|
+
type: Literal['DREMIO'] = Field(..., description='Type of the asset or source')
|
|
5335
|
+
required: DremioRequiredSoftware | DremioRequiredCloud = Field(
|
|
5336
|
+
..., title='DremioRequired'
|
|
5337
|
+
)
|
|
5338
|
+
masked: DremioMaskedToken | DremioMaskedPassword = Field(..., title='DremioMasked')
|
|
5339
|
+
optional: DremioOptional | None = None
|
|
5340
|
+
detectors: list[Detector] | None = Field(
|
|
5341
|
+
None, description='Detectors to run on ingested content'
|
|
5342
|
+
)
|
|
5343
|
+
custom_detectors: list[CustomDetectorSelection] | None = Field(
|
|
5344
|
+
None,
|
|
5345
|
+
description='Reusable custom detector IDs selected from the custom detector catalog.',
|
|
5346
|
+
)
|
|
5347
|
+
sampling: SamplingConfig
|
|
5348
|
+
scan_cache: ScanCacheConfig | None = None
|
|
5349
|
+
resources: ResourceOverrides | None = None
|
|
5350
|
+
cleanup_removed_detector_findings: bool | None = Field(
|
|
5351
|
+
True,
|
|
5352
|
+
description='When enabled (default), findings produced by detectors that are no longer configured on this source (removed or disabled) are automatically resolved at the start of the next run, keeping the findings list in step with the current detector set.',
|
|
5353
|
+
)
|
|
5354
|
+
augmentation: AugmentationConfig | None = None
|
|
5355
|
+
|
|
5356
|
+
|
|
5186
5357
|
class MongoDBInput(CoreInput):
|
|
5187
5358
|
type: Literal['MONGODB'] = Field(..., description='Type of the asset or source')
|
|
5188
5359
|
required: MongoDBRequiredAtlas | MongoDBRequiredOnPrem = Field(
|
|
@@ -5848,6 +6019,7 @@ class SourceInput(
|
|
|
5848
6019
|
| HiveInput
|
|
5849
6020
|
| DatabricksInput
|
|
5850
6021
|
| SnowflakeInput
|
|
6022
|
+
| DremioInput
|
|
5851
6023
|
| MongoDBInput
|
|
5852
6024
|
| Neo4jInput
|
|
5853
6025
|
| PowerBIInput
|
|
@@ -5889,6 +6061,7 @@ class SourceInput(
|
|
|
5889
6061
|
| HiveInput
|
|
5890
6062
|
| DatabricksInput
|
|
5891
6063
|
| SnowflakeInput
|
|
6064
|
+
| DremioInput
|
|
5892
6065
|
| MongoDBInput
|
|
5893
6066
|
| Neo4jInput
|
|
5894
6067
|
| PowerBIInput
|
|
@@ -48,6 +48,7 @@ from ..graph.edges import (
|
|
|
48
48
|
uses,
|
|
49
49
|
)
|
|
50
50
|
from ..utils.sampling_cursor import check_cursor_fits
|
|
51
|
+
from ..utils.sampling_frontier import ListFrontier
|
|
51
52
|
from ..utils.urn import Urn
|
|
52
53
|
from .cohort import CohortItem, normalize_bands, select_cohort
|
|
53
54
|
from .files import DEFAULT_PAGE_SIZE, ParsedContent, pages, parse
|
|
@@ -511,6 +512,7 @@ class Context:
|
|
|
511
512
|
should_abort: Callable[[], bool] | None = None,
|
|
512
513
|
query_assets: Callable[[dict[str, Any]], Any] | None = None,
|
|
513
514
|
cohort_weights: Mapping[str, Mapping[str, float]] | None = None,
|
|
515
|
+
config_changed: bool = False,
|
|
514
516
|
) -> None:
|
|
515
517
|
self._variables = dict(variables or {})
|
|
516
518
|
self._secrets = dict(secrets or {})
|
|
@@ -535,6 +537,8 @@ class Context:
|
|
|
535
537
|
}
|
|
536
538
|
self._cohort_state: dict[str, Any] = {}
|
|
537
539
|
self._cohort_stats: dict[str, Any] = {}
|
|
540
|
+
self._config_changed = bool(config_changed)
|
|
541
|
+
self._frontier_state: dict[str, Any] = {}
|
|
538
542
|
|
|
539
543
|
# -- configuration -------------------------------------------------------
|
|
540
544
|
|
|
@@ -710,17 +714,97 @@ class Context:
|
|
|
710
714
|
check_cursor_fits(cursor)
|
|
711
715
|
self._next_cursor = dict(cursor)
|
|
712
716
|
|
|
717
|
+
@property
|
|
718
|
+
def config_changed(self) -> bool:
|
|
719
|
+
"""True on the first run after this source's settings changed.
|
|
720
|
+
|
|
721
|
+
"Settings" is anything in the source's configuration -- scope,
|
|
722
|
+
sampling, variables, the notebook itself, which detectors are on --
|
|
723
|
+
and the definition of any custom detector it uses. Rotating a secret
|
|
724
|
+
does not count.
|
|
725
|
+
|
|
726
|
+
A built-in source starts its sweep over when that happens. A notebook
|
|
727
|
+
owns its own cursor, so nothing is taken from it; it is told instead,
|
|
728
|
+
and decides::
|
|
729
|
+
|
|
730
|
+
cursor = {} if ctx.config_changed else ctx.cursor
|
|
731
|
+
|
|
732
|
+
The flag stays set until a run finishes, so a run that fails before
|
|
733
|
+
acting on it does not lose it. ``ctx.newest_first()`` acts on it for
|
|
734
|
+
you.
|
|
735
|
+
"""
|
|
736
|
+
return self._config_changed
|
|
737
|
+
|
|
738
|
+
def newest_first(
|
|
739
|
+
self,
|
|
740
|
+
items: Iterable[Any],
|
|
741
|
+
*,
|
|
742
|
+
order: Callable[[Any], tuple[Any, str]],
|
|
743
|
+
name: str = "items",
|
|
744
|
+
limit: int | None = None,
|
|
745
|
+
) -> list[Any]:
|
|
746
|
+
"""This run's slice of a listing: what is new first, then the backfill.
|
|
747
|
+
|
|
748
|
+
::
|
|
749
|
+
|
|
750
|
+
def extract():
|
|
751
|
+
for doc in ctx.newest_first(
|
|
752
|
+
api.list_documents(),
|
|
753
|
+
order=lambda doc: (doc["updated_at"], doc["id"]),
|
|
754
|
+
):
|
|
755
|
+
yield Asset(id=doc["id"], ...)
|
|
756
|
+
|
|
757
|
+
Pass the whole listing, in any order. ``order`` maps an item to
|
|
758
|
+
``(rank, id)``: ``rank`` is what makes an item newer -- a timestamp, an
|
|
759
|
+
increasing number -- and must be an int, float or string of one
|
|
760
|
+
consistent type that only changes when the item does; ``id`` is unique
|
|
761
|
+
to the item. Each run gets ``limit`` items (``rows_per_page`` by
|
|
762
|
+
default): everything newer than what earlier runs read comes first,
|
|
763
|
+
the rest continues backwards from where the last run stopped, and once
|
|
764
|
+
the whole listing has been read only new items are returned.
|
|
765
|
+
|
|
766
|
+
The position is kept in the cursor beside whatever you store there,
|
|
767
|
+
one per ``name``, and starts over when ``ctx.config_changed``. Calling
|
|
768
|
+
it declares this run's coverage partial.
|
|
769
|
+
"""
|
|
770
|
+
stored = self._cursor.get("frontier")
|
|
771
|
+
previous = stored.get(str(name)) if isinstance(stored, dict) else None
|
|
772
|
+
frontier = ListFrontier(None if self._config_changed else previous)
|
|
773
|
+
window = frontier.window(
|
|
774
|
+
((*order(item), item) for item in items),
|
|
775
|
+
int(limit) if limit else self.page_size,
|
|
776
|
+
)
|
|
777
|
+
state = frontier.to_state()
|
|
778
|
+
if state is not None:
|
|
779
|
+
self._frontier_state[str(name)] = state
|
|
780
|
+
if not self._partial_coverage:
|
|
781
|
+
self.set_partial_coverage(
|
|
782
|
+
f"the notebook reads a window ({name}) of a larger listing each run"
|
|
783
|
+
)
|
|
784
|
+
return window
|
|
785
|
+
|
|
713
786
|
@property
|
|
714
787
|
def next_cursor(self) -> dict[str, Any] | None:
|
|
715
|
-
if not self._cohort_state:
|
|
788
|
+
if not self._cohort_state and not self._frontier_state:
|
|
716
789
|
return None if self._next_cursor is None else dict(self._next_cursor)
|
|
717
|
-
# A cohort's position is kept in the same cursor,
|
|
718
|
-
# notebook stores -- or, when it stores nothing
|
|
719
|
-
# the previous run left, which would otherwise
|
|
790
|
+
# A cohort's or a frontier's position is kept in the same cursor,
|
|
791
|
+
# beside whatever the notebook stores -- or, when it stores nothing
|
|
792
|
+
# this run, beside what the previous run left, which would otherwise
|
|
793
|
+
# be dropped.
|
|
720
794
|
base = self._next_cursor if self._next_cursor is not None else self._cursor
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
795
|
+
merged = dict(base)
|
|
796
|
+
for section, state in (
|
|
797
|
+
("cohort", self._cohort_state),
|
|
798
|
+
("frontier", self._frontier_state),
|
|
799
|
+
):
|
|
800
|
+
if not state:
|
|
801
|
+
continue
|
|
802
|
+
stored = base.get(section)
|
|
803
|
+
previous: dict[str, Any] = stored if isinstance(stored, dict) else {}
|
|
804
|
+
if section == "frontier" and self._config_changed:
|
|
805
|
+
previous = {}
|
|
806
|
+
merged[section] = {**previous, **state}
|
|
807
|
+
return merged
|
|
724
808
|
|
|
725
809
|
@property
|
|
726
810
|
def cohort_stats(self) -> dict[str, Any]:
|
|
@@ -186,6 +186,9 @@ class FinalizeIngestRunRequest(BaseModel):
|
|
|
186
186
|
# AUTOMATIC sampling cursor to persist on the source for the next run.
|
|
187
187
|
# Omitted (None) for other strategies so the stored cursor is left untouched.
|
|
188
188
|
sampling_cursor: dict[str, Any] | None = Field(None, serialization_alias="samplingCursor")
|
|
189
|
+
# The settings fingerprint the run was started with, echoed back so the API
|
|
190
|
+
# can record that those settings have now been scanned under.
|
|
191
|
+
sampling_fingerprint: str | None = Field(None, serialization_alias="samplingFingerprint")
|
|
189
192
|
# What the scan cache saved, so the run can report it.
|
|
190
193
|
assets_skipped_cached: int | None = Field(None, serialization_alias="assetsSkippedCached")
|
|
191
194
|
detector_runs_skipped: int | None = Field(None, serialization_alias="detectorRunsSkipped")
|
|
@@ -248,6 +251,7 @@ class RestOutputSink:
|
|
|
248
251
|
self._runner_id = context.runner_id
|
|
249
252
|
self._seen_hashes: set[str] = set()
|
|
250
253
|
self._sampling_cursor: dict[str, Any] | None = None
|
|
254
|
+
self._sampling_fingerprint: str | None = None
|
|
251
255
|
self._scan_cache_savings: tuple[int, int] | None = None
|
|
252
256
|
self._partial_coverage: bool = False
|
|
253
257
|
self._partial_coverage_reason: str = ""
|
|
@@ -258,6 +262,10 @@ class RestOutputSink:
|
|
|
258
262
|
"""Record the AUTOMATIC sampling cursor to persist on finalize."""
|
|
259
263
|
self._sampling_cursor = cursor
|
|
260
264
|
|
|
265
|
+
def set_sampling_fingerprint(self, fingerprint: str | None) -> None:
|
|
266
|
+
"""Record the settings fingerprint this run was started with."""
|
|
267
|
+
self._sampling_fingerprint = fingerprint
|
|
268
|
+
|
|
261
269
|
def set_partial_coverage(self, reason: str = "") -> None:
|
|
262
270
|
"""Mark this run as having covered only part of the source."""
|
|
263
271
|
self._partial_coverage = True
|
|
@@ -364,6 +372,7 @@ class RestOutputSink:
|
|
|
364
372
|
runner_id=runner_id,
|
|
365
373
|
seen_hashes=sorted(self._seen_hashes),
|
|
366
374
|
sampling_cursor=self._sampling_cursor,
|
|
375
|
+
sampling_fingerprint=self._sampling_fingerprint,
|
|
367
376
|
assets_skipped_cached=savings[0] if savings else None,
|
|
368
377
|
detector_runs_skipped=savings[1] if savings else None,
|
|
369
378
|
# Sent even when zero: "this run emitted edges and lost none" is a
|