classifyre-cli 0.4.58__tar.gz → 0.4.60__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.60/.turbo/turbo-build.log +3 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/PKG-INFO +1 -1
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/package.json +1 -1
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/pyproject.toml +1 -1
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/pipeline/worker_pool.py +16 -1
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/google_workspace/source.py +11 -17
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/youtube/source.py +1 -2
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/legacy_office.py +8 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/resources.py +11 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_google_workspace_source.py +2 -6
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_kafka_source.py +1 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/utils/test_video_processing.py +2 -6
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/uv.lock +2 -2
- classifyre_cli-0.4.58/.turbo/turbo-build.log +0 -3
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/.gitignore +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/.python-version +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/README.md +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/main.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/scripts/generate_models.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/config.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/base.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/broken_links/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/broken_links/detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/config.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/content/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/extractor.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/_base.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/_factory.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/_gliner2.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/_image_classification.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/_llm.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/_object_detection.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/_regex.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/_text_classification.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/trainer.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/dependencies.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/pii/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/pii/detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/secrets/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/secrets/detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/threat/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/threat/code_security_detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/threat/yara_detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/file_evaluation/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/file_evaluation/runner.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/main.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/models/generated_detectors.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/models/generated_input.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/models/generated_single_asset_scan_results.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/outputs/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/outputs/base.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/outputs/console.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/outputs/factory.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/outputs/file.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/outputs/rest.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/pipeline/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/pipeline/content_provider.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/pipeline/detector_pipeline.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/pipeline/parsed_content_provider.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/pipeline/text_artifact.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/asset_metadata.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/atlassian_common.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/azure_blob_storage/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/azure_blob_storage/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/base.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/confluence/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/confluence/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/databricks/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/databricks/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/delta_lake/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/delta_lake/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/dependencies.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/elasticsearch/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/elasticsearch/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/email/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/email/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/google_cloud_storage/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/google_cloud_storage/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/google_workspace/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/hive/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/hive/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/iceberg/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/iceberg/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/jira/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/jira/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/kafka/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/kafka/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/lakehouse_base.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/local_folder/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/local_folder/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/meilisearch/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/meilisearch/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/microsoft_365/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/microsoft_365/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/mongodb/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/mongodb/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/mssql/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/mssql/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/mysql/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/mysql/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/neo4j/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/neo4j/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/notion/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/notion/client.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/notion/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/object_storage/base.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/opensearch/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/opensearch/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/oracle/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/oracle/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/postgresql/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/postgresql/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/powerbi/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/powerbi/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/recipe_normalizer.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/s3_client.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/s3_compatible_storage/README.md +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/s3_compatible_storage/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/s3_compatible_storage/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/sandbox/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/sandbox/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/search_engine_base.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/servicedesk/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/servicedesk/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/slack/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/slack/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/snowflake/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/snowflake/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/sqlite/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/sqlite/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/tableau/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/tableau/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/tabular_base.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/tabular_utils.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/wordpress/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/wordpress/source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/youtube/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/telemetry.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/archive_extraction.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/content_extraction.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/dependency_groups.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/embedded_images.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/file_metadata.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/file_parser.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/file_to_images.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/hashing.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/transcription.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/uv_sync.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/validation.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/utils/video_processing.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/_lakehouse_fakes.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/conftest.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/broken_links/test_broken_links_detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/conftest.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/content/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/custom/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/custom/conftest.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/custom/test_gliner2_classification.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/custom/test_invoice_extraction.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/custom/test_llm_runner.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/custom/test_pipeline_integration.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/custom/test_regex_runner.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/custom/test_runner_hardening.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/custom/test_transformer_runners.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/pii/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/pii/conftest.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/pii/sample_invoice.pdf +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/pii/test_pii_chunking.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/pii/test_pii_detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/pii/test_pii_detector_extended.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/pii/test_pii_severity.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/secrets/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/secrets/test_secrets_detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/secrets/test_secrets_detector_extended.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/test_base_detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/test_custom_detector_examples_runtime.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/test_detector_catalog_commercial.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/test_detector_pipeline_types.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/test_detector_schema_examples.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/test_detector_types.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/test_phase2_detectors.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/test_registry.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/threat/__init__.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/threat/test_code_security_detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/detectors/threat/test_yara_detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/integration/test_wordpress_broken_links_detector.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/integration/test_wordpress_links_assets.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/pipeline/test_detector_outcomes.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/pipeline/test_detector_pipeline.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/pipeline/test_worker_pool.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_assets_metadata_catalog.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_azure_blob_storage_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_base_source_attachment.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_base_source_sampling.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_config.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_confluence_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_custom_extractor.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_databricks_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_delta_lake_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_dependency_groups.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_elasticsearch_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_email_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_file_evaluation_runner.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_google_cloud_storage_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_hashing.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_hive_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_iceberg_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_jira_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_local_folder_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_main.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_meilisearch_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_microsoft_365_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_mongodb_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_mssql_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_mysql_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_neo4j_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_notion_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_opensearch_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_oracle_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_outputs.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_postgresql_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_powerbi_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_recipe_normalizer.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_s3_compatible_storage_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_sampling_automatic.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_sandbox_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_servicedesk_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_slack_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_snowflake_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_source_dependency_groups.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_source_strategy_conformance.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_sqlite_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_tableau_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_tabular_automatic_sampling.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_tabular_utils.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_uv_sync.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_wordpress_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_youtube_source.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/test_youtube_source_integration.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/utils/test_archive_extraction.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/utils/test_content_extraction.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/utils/test_embedded_images.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/utils/test_file_metadata.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/utils/test_file_parser.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/utils/test_file_to_images.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/utils/test_legacy_office.py +0 -0
- {classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/tests/utils/test_transcription.py +0 -0
|
@@ -45,6 +45,13 @@ def _init_worker_threads(threads_per_worker: int) -> None:
|
|
|
45
45
|
threads = max(1, threads_per_worker)
|
|
46
46
|
for var in ("OMP_NUM_THREADS", "MKL_NUM_THREADS", "OPENBLAS_NUM_THREADS"):
|
|
47
47
|
os.environ.setdefault(var, str(threads))
|
|
48
|
+
# Detector work is background work: on a shared host (desktop) the pool
|
|
49
|
+
# must yield to the UI, so deprioritize workers where the OS allows it.
|
|
50
|
+
if hasattr(os, "nice"):
|
|
51
|
+
try:
|
|
52
|
+
os.nice(5)
|
|
53
|
+
except OSError:
|
|
54
|
+
pass
|
|
48
55
|
try:
|
|
49
56
|
import torch
|
|
50
57
|
|
|
@@ -227,7 +234,15 @@ class DetectorWorkerPool:
|
|
|
227
234
|
mp_start_method = "forkserver" if "forkserver" in available else "spawn"
|
|
228
235
|
|
|
229
236
|
ctx = multiprocessing.get_context(mp_start_method)
|
|
230
|
-
|
|
237
|
+
# CLASSIFYRE_WORKER_THREADS caps BLAS/torch threads per worker; the
|
|
238
|
+
# desktop app sets it so workers*threads stays below the core count
|
|
239
|
+
# instead of saturating the machine. Unset (K8s/dev) keeps the
|
|
240
|
+
# divide-the-cores behavior.
|
|
241
|
+
threads_env = os.environ.get("CLASSIFYRE_WORKER_THREADS", "")
|
|
242
|
+
if threads_env.isdigit() and int(threads_env) > 0:
|
|
243
|
+
threads_per_worker = min(int(threads_env), 16)
|
|
244
|
+
else:
|
|
245
|
+
threads_per_worker = max(1, get_effective_cpu_count() // effective_workers)
|
|
231
246
|
self._pool = ProcessPoolExecutor(
|
|
232
247
|
max_workers=effective_workers,
|
|
233
248
|
mp_context=ctx,
|
|
@@ -178,9 +178,7 @@ class GoogleWorkspaceSource(BaseSource):
|
|
|
178
178
|
|
|
179
179
|
if isinstance(required, GoogleWorkspaceRequiredServiceAccount):
|
|
180
180
|
if not isinstance(masked, GoogleWorkspaceMaskedServiceAccount):
|
|
181
|
-
raise ValueError(
|
|
182
|
-
"service_account auth requires masked.service_account_json"
|
|
183
|
-
)
|
|
181
|
+
raise ValueError("service_account auth requires masked.service_account_json")
|
|
184
182
|
elif isinstance(required, GoogleWorkspaceRequiredOAuth):
|
|
185
183
|
if not isinstance(masked, GoogleWorkspaceMaskedOAuth):
|
|
186
184
|
raise ValueError(
|
|
@@ -655,9 +653,7 @@ class GoogleWorkspaceSource(BaseSource):
|
|
|
655
653
|
mime_type = export_mime
|
|
656
654
|
exported_as = export_mime
|
|
657
655
|
elif ref.size and ref.size > self._max_object_bytes():
|
|
658
|
-
parse_error = (
|
|
659
|
-
f"File size {ref.size} exceeds limit {self._max_object_bytes()}"
|
|
660
|
-
)
|
|
656
|
+
parse_error = f"File size {ref.size} exceeds limit {self._max_object_bytes()}"
|
|
661
657
|
else:
|
|
662
658
|
service = self._get_service()
|
|
663
659
|
request = service.files().get_media(fileId=ref.file_id)
|
|
@@ -792,9 +788,7 @@ class GoogleWorkspaceSource(BaseSource):
|
|
|
792
788
|
drive_id=_MY_DRIVE_ID, display_name="My Drive", drive_type="my_drive"
|
|
793
789
|
)
|
|
794
790
|
else:
|
|
795
|
-
drive_ref = known_drives.get(drive_id) or self._resolve_shared_drive(
|
|
796
|
-
drive_id
|
|
797
|
-
)
|
|
791
|
+
drive_ref = known_drives.get(drive_id) or self._resolve_shared_drive(drive_id)
|
|
798
792
|
ensure_drive(drive_ref)
|
|
799
793
|
if len(batch) >= self.BATCH_SIZE:
|
|
800
794
|
yield batch
|
|
@@ -849,7 +843,9 @@ class GoogleWorkspaceSource(BaseSource):
|
|
|
849
843
|
|
|
850
844
|
logger.info(
|
|
851
845
|
"Processing %d/%d items from drive '%s'",
|
|
852
|
-
len(sampled),
|
|
846
|
+
len(sampled),
|
|
847
|
+
len(files),
|
|
848
|
+
drive_id,
|
|
853
849
|
)
|
|
854
850
|
|
|
855
851
|
for file_ref in sampled:
|
|
@@ -884,18 +880,14 @@ class GoogleWorkspaceSource(BaseSource):
|
|
|
884
880
|
and bool(required.delegated_subject)
|
|
885
881
|
)
|
|
886
882
|
if uses_identity:
|
|
887
|
-
data = service.about().get(fields="user").execute(
|
|
888
|
-
num_retries=self._max_retries()
|
|
889
|
-
)
|
|
883
|
+
data = service.about().get(fields="user").execute(num_retries=self._max_retries())
|
|
890
884
|
user = data.get("user", {})
|
|
891
885
|
result["status"] = "SUCCESS"
|
|
892
886
|
result["message"] = (
|
|
893
887
|
f"Connected to Google Drive API as {user.get('emailAddress', 'unknown')}"
|
|
894
888
|
)
|
|
895
889
|
else:
|
|
896
|
-
data = service.drives().list(pageSize=1).execute(
|
|
897
|
-
num_retries=self._max_retries()
|
|
898
|
-
)
|
|
890
|
+
data = service.drives().list(pageSize=1).execute(num_retries=self._max_retries())
|
|
899
891
|
drives = data.get("drives", [])
|
|
900
892
|
result["status"] = "SUCCESS"
|
|
901
893
|
if drives:
|
|
@@ -904,7 +896,9 @@ class GoogleWorkspaceSource(BaseSource):
|
|
|
904
896
|
f"{drives[0].get('name', 'unknown')}"
|
|
905
897
|
)
|
|
906
898
|
else:
|
|
907
|
-
result["message"] =
|
|
899
|
+
result["message"] = (
|
|
900
|
+
"Connected to Google Drive API. No shared drives accessible."
|
|
901
|
+
)
|
|
908
902
|
except Exception as exc:
|
|
909
903
|
result["status"] = "FAILURE"
|
|
910
904
|
result["message"] = f"Failed to connect to Google Drive API: {exc}"
|
|
@@ -339,8 +339,7 @@ class YouTubeSource(BaseSource):
|
|
|
339
339
|
# Requiring both codecs avoids yt-dlp's ffmpeg merge path. Visual OCR only
|
|
340
340
|
# needs readable text, while the audio track remains suitable for Whisper.
|
|
341
341
|
opts["format"] = (
|
|
342
|
-
"best[height<=480][acodec!=none][vcodec!=none]/"
|
|
343
|
-
"best[acodec!=none][vcodec!=none]"
|
|
342
|
+
"best[height<=480][acodec!=none][vcodec!=none]/best[acodec!=none][vcodec!=none]"
|
|
344
343
|
)
|
|
345
344
|
opts["noplaylist"] = True
|
|
346
345
|
opts["outtmpl"] = str(dest_dir / "%(id)s.%(ext)s")
|
|
@@ -106,9 +106,17 @@ def convert_legacy_office(
|
|
|
106
106
|
# profile's lock file, which otherwise makes concurrent (or
|
|
107
107
|
# crashed) soffice runs fail with "another instance is running".
|
|
108
108
|
profile_dir = temp_path / "profile"
|
|
109
|
+
# --headless alone still lets macOS surface the app (Dock icon /
|
|
110
|
+
# brief window flash) on some LibreOffice builds; the extra flags
|
|
111
|
+
# suppress the start center, first-run wizard, and lock checks so
|
|
112
|
+
# conversions stay invisible.
|
|
109
113
|
command = [
|
|
110
114
|
soffice,
|
|
111
115
|
"--headless",
|
|
116
|
+
"--invisible",
|
|
117
|
+
"--nologo",
|
|
118
|
+
"--nodefault",
|
|
119
|
+
"--nolockcheck",
|
|
112
120
|
"--norestore",
|
|
113
121
|
f"-env:UserInstallation={profile_dir.as_uri()}",
|
|
114
122
|
"--convert-to",
|
|
@@ -62,4 +62,15 @@ def get_effective_memory_mb() -> int:
|
|
|
62
62
|
except (FileNotFoundError, OSError, ValueError):
|
|
63
63
|
pass
|
|
64
64
|
|
|
65
|
+
# macOS (and other POSIX without /proc): total physical memory via sysconf.
|
|
66
|
+
# Without this the desktop app fell through to the 4096 MB guess, which
|
|
67
|
+
# oversized the pool on small laptops and undersized it on big ones.
|
|
68
|
+
try:
|
|
69
|
+
pages = os.sysconf("SC_PHYS_PAGES")
|
|
70
|
+
page_size = os.sysconf("SC_PAGE_SIZE")
|
|
71
|
+
if pages > 0 and page_size > 0:
|
|
72
|
+
return max(256, (pages * page_size) // (1024 * 1024))
|
|
73
|
+
except (AttributeError, ValueError, OSError):
|
|
74
|
+
pass
|
|
75
|
+
|
|
65
76
|
return 4096
|
|
@@ -144,9 +144,7 @@ class TestSampling:
|
|
|
144
144
|
import json
|
|
145
145
|
import os
|
|
146
146
|
|
|
147
|
-
encoded = base64.b64encode(
|
|
148
|
-
json.dumps(cursor_after_first).encode("utf-8")
|
|
149
|
-
).decode("utf-8")
|
|
147
|
+
encoded = base64.b64encode(json.dumps(cursor_after_first).encode("utf-8")).decode("utf-8")
|
|
150
148
|
os.environ["CLASSIFYRE_SAMPLING_CURSOR"] = encoded
|
|
151
149
|
try:
|
|
152
150
|
source2 = GoogleWorkspaceSource(recipe)
|
|
@@ -366,9 +364,7 @@ class TestEndToEndExtraction:
|
|
|
366
364
|
|
|
367
365
|
# drives().list() -> one shared drive
|
|
368
366
|
drives_list_result = {"drives": [{"id": "drive-1", "name": "Team Drive"}]}
|
|
369
|
-
mock_service.drives.return_value.list.return_value.execute.return_value =
|
|
370
|
-
drives_list_result
|
|
371
|
-
)
|
|
367
|
+
mock_service.drives.return_value.list.return_value.execute.return_value = drives_list_result
|
|
372
368
|
|
|
373
369
|
# files().list() -> root has one subfolder + nothing else, subfolder has
|
|
374
370
|
# one binary file and one Google Doc.
|
|
@@ -63,9 +63,7 @@ def test_changed_frame_ocr_is_timestamped_and_deduplicated(
|
|
|
63
63
|
ocr_results = iter(["Opening slide", "Architecture slide"])
|
|
64
64
|
monkeypatch.setattr(video_processing, "_ocr_text", lambda _frame: next(ocr_results))
|
|
65
65
|
|
|
66
|
-
segments = list(
|
|
67
|
-
video_processing.iter_video_ocr_segments(b"video", file_name="lecture.mp4")
|
|
68
|
-
)
|
|
66
|
+
segments = list(video_processing.iter_video_ocr_segments(b"video", file_name="lecture.mp4"))
|
|
69
67
|
|
|
70
68
|
assert segments == [
|
|
71
69
|
"[On-screen text 00:00:00]\nOpening slide",
|
|
@@ -122,9 +120,7 @@ def test_rapidocr_filters_low_confidence_lines(monkeypatch: pytest.MonkeyPatch)
|
|
|
122
120
|
assert video_processing._ocr_text(object()) == "clear text\nanother line"
|
|
123
121
|
|
|
124
122
|
|
|
125
|
-
def test_path_ocr_reuses_existing_video(
|
|
126
|
-
monkeypatch: pytest.MonkeyPatch, tmp_path: Path
|
|
127
|
-
) -> None:
|
|
123
|
+
def test_path_ocr_reuses_existing_video(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None:
|
|
128
124
|
video_path = tmp_path / "video.mp4"
|
|
129
125
|
video_path.write_bytes(b"video")
|
|
130
126
|
seen: list[Path] = []
|
|
@@ -830,7 +830,7 @@ wheels = [
|
|
|
830
830
|
|
|
831
831
|
[[package]]
|
|
832
832
|
name = "classifyre-cli"
|
|
833
|
-
version = "0.4.
|
|
833
|
+
version = "0.4.60"
|
|
834
834
|
source = { editable = "." }
|
|
835
835
|
dependencies = [
|
|
836
836
|
{ name = "beautifulsoup4" },
|
|
@@ -1347,7 +1347,7 @@ youtube = [
|
|
|
1347
1347
|
|
|
1348
1348
|
[[package]]
|
|
1349
1349
|
name = "classifyre-schemas"
|
|
1350
|
-
version = "0.4.
|
|
1350
|
+
version = "0.4.60"
|
|
1351
1351
|
source = { editable = "../../packages/schemas" }
|
|
1352
1352
|
dependencies = [
|
|
1353
1353
|
{ name = "fastjsonschema" },
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/_object_detection.py
RENAMED
|
File without changes
|
|
File without changes
|
{classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/custom/runners/_text_classification.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/detectors/threat/code_security_detector.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/models/generated_single_asset_scan_results.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/google_cloud_storage/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{classifyre_cli-0.4.58 → classifyre_cli-0.4.60}/src/sources/s3_compatible_storage/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|