classifyre-cli 0.4.66__tar.gz → 0.4.68__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.4.66 → classifyre_cli-0.4.68}/.turbo/turbo-build.log +1 -1
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/PKG-INFO +3 -3
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/README.md +2 -2
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/package.json +1 -1
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/pyproject.toml +1 -1
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/main.py +3 -3
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/rest.py +1 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/email/source.py +9 -1
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mssql/source.py +1 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/oracle/source.py +1 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/tabular_base.py +17 -8
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_email_source.py +1 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_outputs.py +39 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/uv.lock +78 -75
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/.gitignore +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/.python-version +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/main.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/scripts/generate_models.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/config.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/base.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/broken_links/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/broken_links/detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/config.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/content/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/extractor.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_base.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_factory.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_gliner2.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_image_classification.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_llm.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_object_detection.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_regex.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_text_classification.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/trainer.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/dependencies.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/pii/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/pii/detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/secrets/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/secrets/detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/threat/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/threat/code_security_detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/threat/yara_detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/file_evaluation/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/file_evaluation/runner.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/models/generated_detectors.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/models/generated_input.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/models/generated_single_asset_scan_results.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/base.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/console.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/factory.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/file.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/content_provider.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/detector_pipeline.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/parsed_content_provider.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/text_artifact.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/worker_pool.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/asset_metadata.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/atlassian_common.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/azure_blob_storage/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/azure_blob_storage/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/base.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/confluence/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/confluence/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/databricks/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/databricks/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/delta_lake/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/delta_lake/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/dependencies.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/elasticsearch/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/elasticsearch/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/email/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/google_cloud_storage/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/google_cloud_storage/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/google_workspace/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/google_workspace/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/hive/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/hive/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/iceberg/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/iceberg/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/jira/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/jira/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/kafka/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/kafka/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/lakehouse_base.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/local_folder/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/local_folder/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/meilisearch/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/meilisearch/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/microsoft_365/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/microsoft_365/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mongodb/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mongodb/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mssql/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mysql/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mysql/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/neo4j/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/neo4j/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/notion/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/notion/client.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/notion/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/object_storage/base.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/opensearch/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/opensearch/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/oracle/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/postgresql/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/postgresql/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/powerbi/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/powerbi/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/recipe_normalizer.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/s3_client.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/s3_compatible_storage/README.md +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/s3_compatible_storage/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/s3_compatible_storage/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/sandbox/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/sandbox/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/search_engine_base.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/servicedesk/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/servicedesk/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/slack/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/slack/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/snowflake/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/snowflake/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/sqlite/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/sqlite/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/tableau/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/tableau/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/tabular_utils.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/wordpress/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/wordpress/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/youtube/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/youtube/source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/telemetry.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/archive_extraction.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/content_extraction.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/dependency_groups.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/embedded_images.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/file_metadata.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/file_parser.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/file_to_images.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/hashing.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/legacy_office.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/resources.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/transcription.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/uv_sync.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/validation.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/video_processing.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/_lakehouse_fakes.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/conftest.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/broken_links/test_broken_links_detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/conftest.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/content/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/conftest.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_gliner2_classification.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_invoice_extraction.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_llm_runner.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_pipeline_integration.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_regex_runner.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_runner_hardening.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_transformer_runners.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/conftest.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/sample_invoice.pdf +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/test_pii_chunking.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/test_pii_detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/test_pii_detector_extended.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/test_pii_severity.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/secrets/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/secrets/test_secrets_detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/secrets/test_secrets_detector_extended.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_base_detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_custom_detector_examples_runtime.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_detector_catalog_commercial.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_detector_pipeline_types.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_detector_schema_examples.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_detector_types.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_phase2_detectors.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_registry.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/threat/__init__.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/threat/test_code_security_detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/threat/test_yara_detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/integration/test_wordpress_broken_links_detector.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/integration/test_wordpress_links_assets.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/pipeline/test_detector_outcomes.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/pipeline/test_detector_pipeline.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/pipeline/test_worker_pool.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_assets_metadata_catalog.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_azure_blob_storage_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_base_source_attachment.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_base_source_sampling.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_config.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_confluence_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_custom_extractor.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_databricks_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_delta_lake_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_dependency_groups.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_elasticsearch_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_file_evaluation_runner.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_google_cloud_storage_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_google_workspace_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_hashing.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_hive_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_iceberg_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_jira_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_kafka_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_local_folder_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_main.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_meilisearch_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_microsoft_365_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_mongodb_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_mssql_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_mysql_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_neo4j_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_notion_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_opensearch_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_oracle_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_postgresql_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_powerbi_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_recipe_normalizer.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_s3_compatible_storage_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_sampling_automatic.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_sandbox_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_servicedesk_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_slack_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_snowflake_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_source_dependency_groups.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_source_strategy_conformance.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_sqlite_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_tableau_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_tabular_automatic_sampling.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_tabular_utils.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_uv_sync.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_wordpress_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_youtube_source.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_youtube_source_integration.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_archive_extraction.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_content_extraction.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_embedded_images.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_file_metadata.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_file_parser.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_file_to_images.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_legacy_office.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_transcription.py +0 -0
- {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_video_processing.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: classifyre-cli
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.68
|
|
4
4
|
Summary: Classifyre CLI — scan and classify unstructured data sources
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: data,ingestion,metadata,pii,secrets,unstructured
|
|
@@ -84,7 +84,7 @@ Extract output options:
|
|
|
84
84
|
|
|
85
85
|
- `--output-type rest|file|console`
|
|
86
86
|
- `--output-batch-size <int>`
|
|
87
|
-
- `--output-rest-url <url>`
|
|
87
|
+
- `--output-rest-url <url>` (complete API base, including the namespace path)
|
|
88
88
|
- `--output-file-path <path>`
|
|
89
89
|
- `--source-id <uuid>`
|
|
90
90
|
- `--runner-id <uuid>`
|
|
@@ -131,7 +131,7 @@ uv run main.py extract ./wordpress-recipe.json \
|
|
|
131
131
|
Notes:
|
|
132
132
|
|
|
133
133
|
- `--runner-id` optional for manual runs. If omitted, CLI creates external runner automatically.
|
|
134
|
-
- `--output-rest-url` is optional. If omitted, CLI uses `CLASSIFYRE_OUTPUT_REST_URL`, then `API_URL`, then `http://localhost:8000`.
|
|
134
|
+
- `--output-rest-url` is optional. If omitted, CLI uses `CLASSIFYRE_OUTPUT_REST_URL`, then `API_URL`, then `http://localhost:8000`. In a namespaced deployment, pass the complete base (for example `https://api.example/ns-id`); the CLI appends all asset, finding, runner, and source endpoints beneath it.
|
|
135
135
|
- `--managed-runner` should be used only for API-orchestrated runs where runner already exists.
|
|
136
136
|
|
|
137
137
|
### 4) REST output with explicit runner (managed/orchestrated style)
|
|
@@ -67,7 +67,7 @@ Extract output options:
|
|
|
67
67
|
|
|
68
68
|
- `--output-type rest|file|console`
|
|
69
69
|
- `--output-batch-size <int>`
|
|
70
|
-
- `--output-rest-url <url>`
|
|
70
|
+
- `--output-rest-url <url>` (complete API base, including the namespace path)
|
|
71
71
|
- `--output-file-path <path>`
|
|
72
72
|
- `--source-id <uuid>`
|
|
73
73
|
- `--runner-id <uuid>`
|
|
@@ -114,7 +114,7 @@ uv run main.py extract ./wordpress-recipe.json \
|
|
|
114
114
|
Notes:
|
|
115
115
|
|
|
116
116
|
- `--runner-id` optional for manual runs. If omitted, CLI creates external runner automatically.
|
|
117
|
-
- `--output-rest-url` is optional. If omitted, CLI uses `CLASSIFYRE_OUTPUT_REST_URL`, then `API_URL`, then `http://localhost:8000`.
|
|
117
|
+
- `--output-rest-url` is optional. If omitted, CLI uses `CLASSIFYRE_OUTPUT_REST_URL`, then `API_URL`, then `http://localhost:8000`. In a namespaced deployment, pass the complete base (for example `https://api.example/ns-id`); the CLI appends all asset, finding, runner, and source endpoints beneath it.
|
|
118
118
|
- `--managed-runner` should be used only for API-orchestrated runs where runner already exists.
|
|
119
119
|
|
|
120
120
|
### 4) REST output with explicit runner (managed/orchestrated style)
|
|
@@ -400,7 +400,7 @@ async def run_command_async(args: argparse.Namespace, recipe: dict[str, Any]) ->
|
|
|
400
400
|
try:
|
|
401
401
|
error_msg = str(exc) or type(exc).__name__
|
|
402
402
|
await sink.update_asset_status(
|
|
403
|
-
asset_hash, "ERROR", error_msg
|
|
403
|
+
asset_hash, "ERROR", error_message=error_msg
|
|
404
404
|
)
|
|
405
405
|
except Exception:
|
|
406
406
|
pass
|
|
@@ -612,8 +612,8 @@ def main() -> None:
|
|
|
612
612
|
"--output-rest-url",
|
|
613
613
|
default=None,
|
|
614
614
|
help=(
|
|
615
|
-
"REST
|
|
616
|
-
"or http://localhost:8000)"
|
|
615
|
+
"Complete REST API base URL, including any namespace/path prefix "
|
|
616
|
+
"(defaults to CLASSIFYRE_OUTPUT_REST_URL, API_URL, or http://localhost:8000)"
|
|
617
617
|
),
|
|
618
618
|
)
|
|
619
619
|
parser.add_argument(
|
|
@@ -318,7 +318,14 @@ class EmailSource(BaseSource):
|
|
|
318
318
|
if self.include_attachments:
|
|
319
319
|
for idx, att in enumerate(msg.attachments or []):
|
|
320
320
|
asset = self._attachment_to_asset(
|
|
321
|
-
att,
|
|
321
|
+
att,
|
|
322
|
+
idx,
|
|
323
|
+
message_id=message_id,
|
|
324
|
+
email_hash=email_hash,
|
|
325
|
+
email_url=email_url,
|
|
326
|
+
folder=folder,
|
|
327
|
+
uid=msg.uid,
|
|
328
|
+
created=created,
|
|
322
329
|
)
|
|
323
330
|
attachment_assets.append(asset)
|
|
324
331
|
attachment_hashes.append(asset.hash)
|
|
@@ -376,6 +383,7 @@ class EmailSource(BaseSource):
|
|
|
376
383
|
self,
|
|
377
384
|
att: Any,
|
|
378
385
|
idx: int,
|
|
386
|
+
*,
|
|
379
387
|
message_id: str,
|
|
380
388
|
email_hash: str,
|
|
381
389
|
email_url: str,
|
|
@@ -9,6 +9,7 @@ excluded schemas, random function, etc.).
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
11
|
import asyncio
|
|
12
|
+
import functools
|
|
12
13
|
import logging
|
|
13
14
|
import threading
|
|
14
15
|
from abc import abstractmethod
|
|
@@ -536,6 +537,7 @@ class BaseTabularSource(BaseSource):
|
|
|
536
537
|
self,
|
|
537
538
|
conn: Any,
|
|
538
539
|
base_query: str,
|
|
540
|
+
*,
|
|
539
541
|
page_size: int,
|
|
540
542
|
pk_columns: list[str],
|
|
541
543
|
pk_order: str,
|
|
@@ -659,7 +661,12 @@ class BaseTabularSource(BaseSource):
|
|
|
659
661
|
last_pk_values = saved_pk if isinstance(saved_pk, list) and saved_pk else None
|
|
660
662
|
pk_order = ", ".join(self._quote_identifier(c) for c in pk_columns)
|
|
661
663
|
rows, column_names = self._fetch_page_keyset(
|
|
662
|
-
conn,
|
|
664
|
+
conn,
|
|
665
|
+
base_query,
|
|
666
|
+
page_size=rows_per_page,
|
|
667
|
+
pk_columns=pk_columns,
|
|
668
|
+
pk_order=pk_order,
|
|
669
|
+
last_pk_values=last_pk_values,
|
|
663
670
|
)
|
|
664
671
|
if not rows or len(rows) < rows_per_page:
|
|
665
672
|
next_state: dict[str, Any] | None = None # exhausted → wrap next run
|
|
@@ -919,13 +926,15 @@ class BaseTabularSource(BaseSource):
|
|
|
919
926
|
|
|
920
927
|
if use_keyset:
|
|
921
928
|
rows, column_names = await asyncio.to_thread(
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
+
functools.partial(
|
|
930
|
+
self._fetch_page_keyset,
|
|
931
|
+
conn,
|
|
932
|
+
query,
|
|
933
|
+
page_size=rows_per_page,
|
|
934
|
+
pk_columns=pk_columns,
|
|
935
|
+
pk_order=pk_order,
|
|
936
|
+
last_pk_values=last_pk_values,
|
|
937
|
+
)
|
|
929
938
|
)
|
|
930
939
|
else:
|
|
931
940
|
rows = await asyncio.to_thread(self._cursor_fetchmany, cursor, rows_per_page)
|
|
@@ -215,6 +215,45 @@ async def test_rest_output_managed_runner_flow(monkeypatch: pytest.MonkeyPatch)
|
|
|
215
215
|
assert "samplingCursor" not in fake_session.calls[1]["json"]
|
|
216
216
|
|
|
217
217
|
|
|
218
|
+
@pytest.mark.asyncio
|
|
219
|
+
async def test_rest_output_keeps_namespace_base_for_discovery_and_finding_batches(
|
|
220
|
+
monkeypatch: pytest.MonkeyPatch,
|
|
221
|
+
) -> None:
|
|
222
|
+
fake_session = _FakeSession(responses=[_FakeResponse({}), _FakeResponse({})])
|
|
223
|
+
monkeypatch.setattr("src.outputs.rest.requests.Session", lambda: fake_session)
|
|
224
|
+
|
|
225
|
+
context = OutputRuntimeContext(
|
|
226
|
+
source_id="source-1",
|
|
227
|
+
runner_id="runner-1",
|
|
228
|
+
managed_runner=True,
|
|
229
|
+
batch_size=20,
|
|
230
|
+
)
|
|
231
|
+
sink = RestOutputSink(
|
|
232
|
+
context,
|
|
233
|
+
base_url="http://api.internal/prefix/namespace-id/",
|
|
234
|
+
timeout_sec=30,
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
await sink.register_discovered_assets(["hash-1", "hash-2"])
|
|
238
|
+
await sink.emit_batch(
|
|
239
|
+
[
|
|
240
|
+
{
|
|
241
|
+
"hash": "hash-1",
|
|
242
|
+
"findings": [{"finding_type": "EMAIL", "matched_content": "a@b.test"}],
|
|
243
|
+
}
|
|
244
|
+
]
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
assert fake_session.calls[0]["url"] == (
|
|
248
|
+
"http://api.internal/prefix/namespace-id/runners/runner-1/assets/discover"
|
|
249
|
+
)
|
|
250
|
+
assert fake_session.calls[0]["json"]["assetHashes"] == ["hash-1", "hash-2"]
|
|
251
|
+
assert fake_session.calls[1]["url"] == (
|
|
252
|
+
"http://api.internal/prefix/namespace-id/sources/source-1/assets/bulk"
|
|
253
|
+
)
|
|
254
|
+
assert fake_session.calls[1]["json"]["assets"][0]["findings"][0]["finding_type"] == "EMAIL"
|
|
255
|
+
|
|
256
|
+
|
|
218
257
|
@pytest.mark.asyncio
|
|
219
258
|
async def test_rest_output_finalize_includes_sampling_cursor(
|
|
220
259
|
monkeypatch: pytest.MonkeyPatch,
|