classifyre-cli 0.4.78__tar.gz → 0.4.79__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.78 → classifyre_cli-0.4.79}/.turbo/turbo-build.log +1 -1
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/PKG-INFO +1 -1
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/package.json +1 -1
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/pyproject.toml +1 -1
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/object_storage/base.py +19 -0
- classifyre_cli-0.4.79/tests/test_object_storage_download_efficiency.py +217 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/uv.lock +46 -46
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/.gitignore +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/.python-version +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/README.md +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/main.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/scripts/generate_models.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/config.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/base.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/broken_links/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/broken_links/detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/config.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/content/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/extractor.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/runners/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/runners/_base.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/runners/_factory.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/runners/_gliner2.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/runners/_image_classification.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/runners/_llm.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/runners/_object_detection.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/runners/_regex.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/runners/_text_classification.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/custom/trainer.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/dependencies.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/engine_version.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/pii/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/pii/detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/secrets/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/secrets/detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/threat/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/threat/code_security_detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/detectors/threat/yara_detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/file_evaluation/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/file_evaluation/runner.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/main.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/models/generated_detectors.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/models/generated_input.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/models/generated_single_asset_scan_results.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/outputs/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/outputs/base.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/outputs/console.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/outputs/factory.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/outputs/file.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/outputs/rest.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/pipeline/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/pipeline/content_provider.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/pipeline/detector_pipeline.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/pipeline/parsed_content_provider.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/pipeline/scan_cache.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/pipeline/text_artifact.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/pipeline/worker_pool.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/asset_metadata.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/atlassian_common.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/azure_blob_storage/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/azure_blob_storage/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/base.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/confluence/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/confluence/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/databricks/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/databricks/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/delta_lake/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/delta_lake/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/dependencies.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/dropbox/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/dropbox/auth.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/dropbox/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/elasticsearch/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/elasticsearch/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/email/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/email/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/google_cloud_storage/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/google_cloud_storage/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/google_workspace/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/google_workspace/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/hive/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/hive/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/hugging_face/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/hugging_face/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/iceberg/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/iceberg/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/jira/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/jira/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/kafka/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/kafka/rest.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/kafka/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/lakehouse_base.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/local_folder/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/local_folder/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/meilisearch/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/meilisearch/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/microsoft_365/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/microsoft_365/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/mongodb/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/mongodb/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/mssql/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/mssql/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/mysql/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/mysql/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/neo4j/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/neo4j/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/notion/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/notion/client.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/notion/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/opensearch/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/opensearch/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/oracle/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/oracle/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/postgresql/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/postgresql/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/powerbi/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/powerbi/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/recipe_normalizer.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/s3_client.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/s3_compatible_storage/README.md +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/s3_compatible_storage/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/s3_compatible_storage/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/sandbox/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/sandbox/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/search_engine_base.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/servicedesk/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/servicedesk/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/slack/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/slack/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/snowflake/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/snowflake/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/sqlite/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/sqlite/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/tableau/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/tableau/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/tabular_base.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/tabular_utils.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/wordpress/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/wordpress/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/youtube/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/sources/youtube/source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/telemetry.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/archive_extraction.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/content_extraction.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/dependency_groups.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/embedded_images.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/file_metadata.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/file_parser.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/file_to_images.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/hashing.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/legacy_office.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/resources.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/transcription.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/uv_sync.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/validation.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/src/utils/video_processing.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/_lakehouse_fakes.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/conftest.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/broken_links/test_broken_links_detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/conftest.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/content/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/custom/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/custom/conftest.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/custom/test_gliner2_classification.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/custom/test_invoice_extraction.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/custom/test_llm_runner.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/custom/test_pipeline_integration.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/custom/test_regex_runner.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/custom/test_runner_hardening.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/custom/test_transformer_runners.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/pii/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/pii/conftest.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/pii/sample_invoice.pdf +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/pii/test_pii_chunking.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/pii/test_pii_detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/pii/test_pii_detector_extended.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/pii/test_pii_regional_entities.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/pii/test_pii_severity.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/secrets/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/secrets/test_secrets_detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/secrets/test_secrets_detector_extended.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/test_base_detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/test_custom_detector_examples_runtime.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/test_detector_catalog_commercial.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/test_detector_pipeline_types.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/test_detector_schema_examples.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/test_detector_types.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/test_phase2_detectors.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/test_registry.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/threat/__init__.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/threat/test_code_security_detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/detectors/threat/test_yara_detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/integration/test_wordpress_broken_links_detector.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/integration/test_wordpress_links_assets.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/pipeline/test_detector_outcomes.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/pipeline/test_detector_pipeline.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/pipeline/test_worker_pool.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_assets_metadata_catalog.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_azure_blob_storage_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_base_source_attachment.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_base_source_sampling.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_config.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_confluence_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_custom_extractor.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_databricks_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_delta_lake_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_dependency_groups.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_dropbox_auth_command.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_dropbox_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_elasticsearch_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_email_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_file_evaluation_runner.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_google_cloud_storage_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_google_workspace_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_hashing.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_hive_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_hugging_face_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_iceberg_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_jira_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_kafka_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_local_folder_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_main.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_meilisearch_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_microsoft_365_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_mongodb_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_mssql_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_mysql_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_neo4j_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_notion_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_opensearch_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_oracle_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_outputs.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_postgresql_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_powerbi_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_recipe_normalizer.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_s3_compatible_storage_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_sampling_automatic.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_sandbox_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_scan_cache.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_servicedesk_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_slack_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_snowflake_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_source_dependency_groups.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_source_strategy_conformance.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_sqlite_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_tableau_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_tabular_automatic_sampling.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_tabular_utils.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_uv_sync.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_wordpress_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_youtube_source.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/test_youtube_source_integration.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/utils/test_archive_extraction.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/utils/test_content_extraction.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/utils/test_embedded_images.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/utils/test_file_metadata.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/utils/test_file_parser.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/utils/test_file_to_images.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/utils/test_legacy_office.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/utils/test_transcription.py +0 -0
- {classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/tests/utils/test_video_processing.py +0 -0
|
@@ -824,6 +824,25 @@ class ObjectStorageSourceBase(BaseSource, ABC):
|
|
|
824
824
|
raw_bytes = member_path.read_bytes()
|
|
825
825
|
mime = self._mime_cache.get(asset_id, "")
|
|
826
826
|
|
|
827
|
+
if raw_bytes is None:
|
|
828
|
+
# Normal phase-2 path: discovery ran with discovery_only=True, so no
|
|
829
|
+
# bytes were ever cached. Fetch them once here.
|
|
830
|
+
#
|
|
831
|
+
# Falling through to fetch_content() instead would download the
|
|
832
|
+
# object via _build_snapshot() and then discard it (the snapshot
|
|
833
|
+
# carries no text for object storage), leaving the caller's
|
|
834
|
+
# fetch_content_bytes() fallback to download the very same object a
|
|
835
|
+
# second time — 2x egress on every object-storage scan.
|
|
836
|
+
#
|
|
837
|
+
# These bytes stay a local of this generator, so they are released
|
|
838
|
+
# when it finishes whether or not the asset is evicted (the caller
|
|
839
|
+
# skips eviction on error). Caching them here instead would leak one
|
|
840
|
+
# object per failed asset, which a memory-capped scan pod cannot
|
|
841
|
+
# afford.
|
|
842
|
+
fetched = await self.fetch_content_bytes(asset_id)
|
|
843
|
+
if fetched is not None:
|
|
844
|
+
raw_bytes, mime = fetched
|
|
845
|
+
|
|
827
846
|
logger.info(
|
|
828
847
|
"fetch_content_pages(%s): raw_bytes=%s mime=%s processed=%s",
|
|
829
848
|
asset_id,
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"""Object-storage sources must read each object's bytes exactly once per scan.
|
|
2
|
+
|
|
3
|
+
These are family-wide guards, parametrized over every concrete
|
|
4
|
+
``ObjectStorageSourceBase`` connector, because the behaviour under test lives in
|
|
5
|
+
the shared base: a regression in one place silently doubles egress and memory for
|
|
6
|
+
S3, Azure, GCS, Dropbox, Google Workspace, Microsoft 365 and Hugging Face at once.
|
|
7
|
+
|
|
8
|
+
The scan shape mirrors ``main.py``: phase 1 discovers with
|
|
9
|
+
``set_discovery_only(True)`` (metadata only), then phase 2 processes each asset
|
|
10
|
+
through ``ParsedContentProvider`` under a concurrency semaphore.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
from datetime import UTC, datetime
|
|
17
|
+
|
|
18
|
+
import pytest
|
|
19
|
+
|
|
20
|
+
from src.pipeline.parsed_content_provider import ParsedContentProvider
|
|
21
|
+
from src.sources.dropbox.source import DropboxObjectRef, DropboxSource
|
|
22
|
+
from src.sources.hugging_face.source import HuggingFaceObjectRef, HuggingFaceSource
|
|
23
|
+
from src.sources.object_storage.base import ObjectRef
|
|
24
|
+
from src.sources.s3_compatible_storage.source import S3CompatibleStorageSource
|
|
25
|
+
|
|
26
|
+
CSV_BYTES = b"name,email\nAda,ada@example.com\nGrace,grace@example.com\n"
|
|
27
|
+
MODIFIED = datetime(2026, 6, 1, tzinfo=UTC)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _hugging_face(file_count: int):
|
|
31
|
+
source = HuggingFaceSource(
|
|
32
|
+
{
|
|
33
|
+
"type": "HUGGING_FACE",
|
|
34
|
+
"required": {"repo_id": "acme/corpus", "repo_type": "dataset"},
|
|
35
|
+
"masked": {"token": "hf_test-token"},
|
|
36
|
+
"optional": {},
|
|
37
|
+
"sampling": {"strategy": "ALL"},
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
source._cached_revision = "a" * 40
|
|
41
|
+
refs = [
|
|
42
|
+
HuggingFaceObjectRef(
|
|
43
|
+
key=f"data/f{index:03d}.csv",
|
|
44
|
+
size=len(CSV_BYTES),
|
|
45
|
+
last_modified=MODIFIED,
|
|
46
|
+
etag=f"sha-{index}",
|
|
47
|
+
blob_id=f"oid-{index}",
|
|
48
|
+
)
|
|
49
|
+
for index in range(file_count)
|
|
50
|
+
]
|
|
51
|
+
return source, refs
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _dropbox(file_count: int):
|
|
55
|
+
source = DropboxSource(
|
|
56
|
+
{
|
|
57
|
+
"type": "DROPBOX",
|
|
58
|
+
"required": {"auth_method": "access_token"},
|
|
59
|
+
"masked": {"access_token": "sl.token"},
|
|
60
|
+
"optional": {},
|
|
61
|
+
"sampling": {"strategy": "ALL"},
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
refs = [
|
|
65
|
+
DropboxObjectRef(
|
|
66
|
+
key=f"/data/f{index:03d}.csv",
|
|
67
|
+
size=len(CSV_BYTES),
|
|
68
|
+
last_modified=MODIFIED,
|
|
69
|
+
etag=f"hash-{index}",
|
|
70
|
+
file_id=f"id:{index}",
|
|
71
|
+
)
|
|
72
|
+
for index in range(file_count)
|
|
73
|
+
]
|
|
74
|
+
return source, refs
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _s3(file_count: int):
|
|
78
|
+
source = S3CompatibleStorageSource(
|
|
79
|
+
{
|
|
80
|
+
"type": "S3_COMPATIBLE_STORAGE",
|
|
81
|
+
"required": {"bucket": "corpus"},
|
|
82
|
+
"masked": {"aws_access_key_id": "key", "aws_secret_access_key": "secret"},
|
|
83
|
+
"optional": {},
|
|
84
|
+
"sampling": {"strategy": "ALL"},
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
refs = [
|
|
88
|
+
ObjectRef(
|
|
89
|
+
key=f"data/f{index:03d}.csv",
|
|
90
|
+
size=len(CSV_BYTES),
|
|
91
|
+
last_modified=MODIFIED,
|
|
92
|
+
etag=f"etag-{index}",
|
|
93
|
+
)
|
|
94
|
+
for index in range(file_count)
|
|
95
|
+
]
|
|
96
|
+
return source, refs
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
SOURCE_FACTORIES = {
|
|
100
|
+
"hugging_face": _hugging_face,
|
|
101
|
+
"dropbox": _dropbox,
|
|
102
|
+
"s3_compatible_storage": _s3,
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _instrument(source, refs, monkeypatch, *, fail_on: set[str] | None = None):
|
|
107
|
+
"""Wire the source to in-memory objects and count byte reads."""
|
|
108
|
+
downloads: list[str] = []
|
|
109
|
+
|
|
110
|
+
def _download(ref):
|
|
111
|
+
downloads.append(ref.key)
|
|
112
|
+
if fail_on and ref.key in fail_on:
|
|
113
|
+
raise RuntimeError("object unavailable")
|
|
114
|
+
return CSV_BYTES, "text/csv"
|
|
115
|
+
|
|
116
|
+
monkeypatch.setattr(source, "_list_objects", lambda: iter(refs))
|
|
117
|
+
monkeypatch.setattr(source, "_download_object", _download)
|
|
118
|
+
monkeypatch.setattr(source, "_ensure_file_processing_dependencies", lambda: None)
|
|
119
|
+
return downloads
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
async def _run_scan(source, stub_assets, *, max_concurrent: int, evict: bool = True):
|
|
123
|
+
"""Phase 2 as main.py runs it: bounded concurrency, evict after each asset."""
|
|
124
|
+
provider = ParsedContentProvider(source)
|
|
125
|
+
semaphore = asyncio.Semaphore(max_concurrent)
|
|
126
|
+
pages_by_asset: dict[str, list[str]] = {}
|
|
127
|
+
|
|
128
|
+
async def _process(asset):
|
|
129
|
+
async with semaphore:
|
|
130
|
+
try:
|
|
131
|
+
pages_by_asset[asset.hash] = [
|
|
132
|
+
page async for page in provider.fetch_text_pages(asset.hash)
|
|
133
|
+
]
|
|
134
|
+
finally:
|
|
135
|
+
if evict:
|
|
136
|
+
source.evict_asset_cache(asset.hash)
|
|
137
|
+
|
|
138
|
+
await asyncio.gather(*(_process(asset) for asset in stub_assets), return_exceptions=True)
|
|
139
|
+
return pages_by_asset
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
async def _discover(source):
|
|
143
|
+
source.set_discovery_only(True)
|
|
144
|
+
stubs = [asset async for batch in source.extract_raw() for asset in batch]
|
|
145
|
+
source.set_discovery_only(False)
|
|
146
|
+
return stubs
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
@pytest.mark.parametrize("source_name", sorted(SOURCE_FACTORIES))
|
|
150
|
+
@pytest.mark.asyncio
|
|
151
|
+
async def test_discovery_phase_downloads_nothing(source_name, monkeypatch):
|
|
152
|
+
"""Phase 1 builds the asset inventory from listing metadata alone.
|
|
153
|
+
|
|
154
|
+
Downloading here would mean a 10,000-object bucket fetches 10,000 objects
|
|
155
|
+
before a single detector runs.
|
|
156
|
+
"""
|
|
157
|
+
source, refs = SOURCE_FACTORIES[source_name](25)
|
|
158
|
+
downloads = _instrument(source, refs, monkeypatch)
|
|
159
|
+
|
|
160
|
+
stubs = await _discover(source)
|
|
161
|
+
|
|
162
|
+
assert len(stubs) == 25
|
|
163
|
+
assert downloads == []
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
@pytest.mark.parametrize("source_name", sorted(SOURCE_FACTORIES))
|
|
167
|
+
@pytest.mark.asyncio
|
|
168
|
+
async def test_each_object_is_downloaded_exactly_once(source_name, monkeypatch):
|
|
169
|
+
"""Regression: fetch_content_pages() used to fall through to fetch_content(),
|
|
170
|
+
which downloaded the object and discarded it, so the provider's
|
|
171
|
+
fetch_content_bytes() fallback fetched the same object a second time."""
|
|
172
|
+
source, refs = SOURCE_FACTORIES[source_name](20)
|
|
173
|
+
downloads = _instrument(source, refs, monkeypatch)
|
|
174
|
+
|
|
175
|
+
stubs = await _discover(source)
|
|
176
|
+
pages_by_asset = await _run_scan(source, stubs, max_concurrent=5)
|
|
177
|
+
|
|
178
|
+
assert len(downloads) == 20, f"expected 1 download per object, got {len(downloads)} for 20"
|
|
179
|
+
assert sorted(downloads) == sorted(ref.key for ref in refs)
|
|
180
|
+
# The single download must still produce detector-ready text.
|
|
181
|
+
assert all(
|
|
182
|
+
any("ada@example.com" in page for page in pages) for pages in pages_by_asset.values()
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
@pytest.mark.parametrize("source_name", sorted(SOURCE_FACTORIES))
|
|
187
|
+
@pytest.mark.asyncio
|
|
188
|
+
async def test_processed_objects_do_not_accumulate_in_memory(source_name, monkeypatch):
|
|
189
|
+
"""Object bytes must not stay resident after an asset is processed.
|
|
190
|
+
|
|
191
|
+
A scan pod runs under a hard memory limit, so retaining even one capped
|
|
192
|
+
object per processed asset is enough to OOM a large bucket.
|
|
193
|
+
"""
|
|
194
|
+
source, refs = SOURCE_FACTORIES[source_name](30)
|
|
195
|
+
_instrument(source, refs, monkeypatch)
|
|
196
|
+
|
|
197
|
+
stubs = await _discover(source)
|
|
198
|
+
await _run_scan(source, stubs, max_concurrent=5)
|
|
199
|
+
|
|
200
|
+
assert source._bytes_cache == {}
|
|
201
|
+
assert source._content_cache == {}
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
@pytest.mark.parametrize("source_name", sorted(SOURCE_FACTORIES))
|
|
205
|
+
@pytest.mark.asyncio
|
|
206
|
+
async def test_failed_objects_leak_no_bytes(source_name, monkeypatch):
|
|
207
|
+
"""main.py skips evict_asset_cache() when an asset raises, so the byte-fetch
|
|
208
|
+
path must not be what keeps those bytes alive."""
|
|
209
|
+
source, refs = SOURCE_FACTORIES[source_name](10)
|
|
210
|
+
failing = {refs[index].key for index in (1, 4, 7)}
|
|
211
|
+
_instrument(source, refs, monkeypatch, fail_on=failing)
|
|
212
|
+
|
|
213
|
+
stubs = await _discover(source)
|
|
214
|
+
# evict=False models the error path, where main.py never evicts.
|
|
215
|
+
await _run_scan(source, stubs, max_concurrent=5, evict=False)
|
|
216
|
+
|
|
217
|
+
assert source._bytes_cache == {}
|
|
@@ -539,30 +539,30 @@ wheels = [
|
|
|
539
539
|
|
|
540
540
|
[[package]]
|
|
541
541
|
name = "boto3"
|
|
542
|
-
version = "1.43.
|
|
542
|
+
version = "1.43.61"
|
|
543
543
|
source = { registry = "https://pypi.org/simple" }
|
|
544
544
|
dependencies = [
|
|
545
545
|
{ name = "botocore" },
|
|
546
546
|
{ name = "jmespath" },
|
|
547
547
|
{ name = "s3transfer" },
|
|
548
548
|
]
|
|
549
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
549
|
+
sdist = { url = "https://files.pythonhosted.org/packages/fc/70/64c16a00866976fac63f0b672bba5303060bc29814c20200f2012f650574/boto3-1.43.61.tar.gz", hash = "sha256:a818a2ed37ff555c8c710f9c308a5407ef325c43f4162d7f5ce961e20440ca18", size = 112671, upload-time = "2026-07-31T04:17:12.624Z" }
|
|
550
550
|
wheels = [
|
|
551
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
551
|
+
{ url = "https://files.pythonhosted.org/packages/64/b6/414bc692bd4d8e1f22336024026de31d7f2bfd2ba67b794c77e2181fa76a/boto3-1.43.61-py3-none-any.whl", hash = "sha256:67f1544ef97caddd6d0ebd613010981e3990ac843bc010cc202a88b489b182a0", size = 140023, upload-time = "2026-07-31T04:17:10.542Z" },
|
|
552
552
|
]
|
|
553
553
|
|
|
554
554
|
[[package]]
|
|
555
555
|
name = "botocore"
|
|
556
|
-
version = "1.43.
|
|
556
|
+
version = "1.43.61"
|
|
557
557
|
source = { registry = "https://pypi.org/simple" }
|
|
558
558
|
dependencies = [
|
|
559
559
|
{ name = "jmespath" },
|
|
560
560
|
{ name = "python-dateutil" },
|
|
561
561
|
{ name = "urllib3" },
|
|
562
562
|
]
|
|
563
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
563
|
+
sdist = { url = "https://files.pythonhosted.org/packages/37/9d/be2fdd9f9723734d019d9f3f9f1e8dfe5fb55ab26909c963652cfbdf1761/botocore-1.43.61.tar.gz", hash = "sha256:23a9e8578b08bfb83953d32a08b304bb2cb7a7e2607a44b212c1a39862c2024e", size = 15798287, upload-time = "2026-07-31T04:17:01.494Z" }
|
|
564
564
|
wheels = [
|
|
565
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
565
|
+
{ url = "https://files.pythonhosted.org/packages/0c/90/a95b9c70a26d95ac6875e356986a82639f3c11b39b750502bd10be4926a2/botocore-1.43.61-py3-none-any.whl", hash = "sha256:167c8626661561958a8b5d2066e478113c5789a79e6fbc711b249f2c3d5bca5f", size = 15485538, upload-time = "2026-07-31T04:16:57.579Z" },
|
|
566
566
|
]
|
|
567
567
|
|
|
568
568
|
[[package]]
|
|
@@ -830,7 +830,7 @@ wheels = [
|
|
|
830
830
|
|
|
831
831
|
[[package]]
|
|
832
832
|
name = "classifyre-cli"
|
|
833
|
-
version = "0.4.
|
|
833
|
+
version = "0.4.79"
|
|
834
834
|
source = { editable = "." }
|
|
835
835
|
dependencies = [
|
|
836
836
|
{ name = "beautifulsoup4" },
|
|
@@ -1359,7 +1359,7 @@ youtube = [
|
|
|
1359
1359
|
|
|
1360
1360
|
[[package]]
|
|
1361
1361
|
name = "classifyre-schemas"
|
|
1362
|
-
version = "0.4.
|
|
1362
|
+
version = "0.4.79"
|
|
1363
1363
|
source = { editable = "../../packages/schemas" }
|
|
1364
1364
|
dependencies = [
|
|
1365
1365
|
{ name = "fastjsonschema" },
|
|
@@ -2510,7 +2510,7 @@ http2 = [
|
|
|
2510
2510
|
|
|
2511
2511
|
[[package]]
|
|
2512
2512
|
name = "huggingface-hub"
|
|
2513
|
-
version = "1.
|
|
2513
|
+
version = "1.26.0"
|
|
2514
2514
|
source = { registry = "https://pypi.org/simple" }
|
|
2515
2515
|
dependencies = [
|
|
2516
2516
|
{ name = "click" },
|
|
@@ -2523,9 +2523,9 @@ dependencies = [
|
|
|
2523
2523
|
{ name = "tqdm" },
|
|
2524
2524
|
{ name = "typing-extensions" },
|
|
2525
2525
|
]
|
|
2526
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
2526
|
+
sdist = { url = "https://files.pythonhosted.org/packages/82/db/3582597f8be0d34bd6881365a26d390854f12893eabdd62dd36de9df5a47/huggingface_hub-1.26.0.tar.gz", hash = "sha256:c8cd4e2df1ba9402f77fce9b509ec1d52debb502551789473f34016acc14e361", size = 936665, upload-time = "2026-07-30T14:12:04.156Z" }
|
|
2527
2527
|
wheels = [
|
|
2528
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2528
|
+
{ url = "https://files.pythonhosted.org/packages/97/bb/63a644c75b545f3ff394b822e9bd1c4a9586489c618b77a4d8a44a33a23b/huggingface_hub-1.26.0-py3-none-any.whl", hash = "sha256:e8cca670caa5d8dfa7e45bf45e86b466698198cd8150c021bcdb4a86b9252364", size = 780357, upload-time = "2026-07-30T14:12:01.998Z" },
|
|
2529
2529
|
]
|
|
2530
2530
|
|
|
2531
2531
|
[[package]]
|
|
@@ -2874,7 +2874,7 @@ wheels = [
|
|
|
2874
2874
|
|
|
2875
2875
|
[[package]]
|
|
2876
2876
|
name = "litellm"
|
|
2877
|
-
version = "1.94.
|
|
2877
|
+
version = "1.94.1"
|
|
2878
2878
|
source = { registry = "https://pypi.org/simple" }
|
|
2879
2879
|
dependencies = [
|
|
2880
2880
|
{ name = "aiohttp" },
|
|
@@ -2890,17 +2890,17 @@ dependencies = [
|
|
|
2890
2890
|
{ name = "tiktoken" },
|
|
2891
2891
|
{ name = "tokenizers" },
|
|
2892
2892
|
]
|
|
2893
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
2893
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a1/d6/6995fbc8cc4a22c9a1346981dd62348cf563e9285e17587703ad235f1fc0/litellm-1.94.1.tar.gz", hash = "sha256:e9effe4c1e9206740b4bb4c98142ea1f71bae57e49df007cd25ef24b0ce4563f", size = 16264730, upload-time = "2026-07-30T23:14:22.682Z" }
|
|
2894
2894
|
wheels = [
|
|
2895
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2896
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2897
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2898
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2899
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2900
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2901
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2902
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2903
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2895
|
+
{ url = "https://files.pythonhosted.org/packages/31/42/77f98b30e99327971a9c27d1f1f2a92a9578b068d4833f42fda8ae9278fa/litellm-1.94.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:af37356cf5b325a2887c40ff772b39e1e0865b988297c544b29123ffb13fd1b9", size = 20681910, upload-time = "2026-07-30T23:13:51.535Z" },
|
|
2896
|
+
{ url = "https://files.pythonhosted.org/packages/03/3c/f75a840c3a1b6466e138f5833e1623fcbf32a63bae8a56efc31a4265f8b6/litellm-1.94.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:66bc95498af3ab687ce7570704cb274bcf1d78049afa87a9f5f64db45b72847d", size = 20664250, upload-time = "2026-07-30T23:13:55.007Z" },
|
|
2897
|
+
{ url = "https://files.pythonhosted.org/packages/89/cd/ab61853dc3699a96997dd731bd005f2c511235f695cb32c11209d55201c6/litellm-1.94.1-cp312-cp312-win_amd64.whl", hash = "sha256:44e55a55270dee8bb85e063940c368d32040e6db66765c55db4b884fc002d4ef", size = 20268551, upload-time = "2026-07-30T23:13:58.222Z" },
|
|
2898
|
+
{ url = "https://files.pythonhosted.org/packages/33/c0/c00d40bc9a62c397601e23dd7be1905f52f5981413e78fef1184116a1036/litellm-1.94.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:cfef0468bda9c1ba8f554bebc2966f08436f1ead98017e7ed2d7663ece77f1c2", size = 20682610, upload-time = "2026-07-30T23:14:01.361Z" },
|
|
2899
|
+
{ url = "https://files.pythonhosted.org/packages/4e/51/6923345e9584e6855cbc182af99efcd4de5d5aea75330dfcb53eaa2e3131/litellm-1.94.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b0bc4a2373e54f2bd4c13f8ef9fda3839bfb2e1173fb4bcea3150b07d4c59bc", size = 20665189, upload-time = "2026-07-30T23:14:04.562Z" },
|
|
2900
|
+
{ url = "https://files.pythonhosted.org/packages/28/b6/bc53595152faad2275fcbd4106a9d9bfe6133b704b2be3b4fdae31090598/litellm-1.94.1-cp313-cp313-win_amd64.whl", hash = "sha256:d14e5812b5f36af2ab45461ee0c925251bc07daf65c33b8f2ce3fd3ec1235eae", size = 20266790, upload-time = "2026-07-30T23:14:08.139Z" },
|
|
2901
|
+
{ url = "https://files.pythonhosted.org/packages/61/3c/e141bf70dd1d93b234ef52e7ae18b1e77c7fe4b83dc262984dbd000fd8b9/litellm-1.94.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:c5c9247d9fea8fe7cda851f7b15db560ee547a8325a0af86048967edf3ccfa15", size = 20681030, upload-time = "2026-07-30T23:14:12.575Z" },
|
|
2902
|
+
{ url = "https://files.pythonhosted.org/packages/25/85/36265d4a7ad51636b0e18aded355ef5a2b1e4a38368f0e1068393ed13ddb/litellm-1.94.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:a6f5274876f20dd5c9e53ba3da502e94f5b3c681c5027a0398231d0caae4aacd", size = 20671012, upload-time = "2026-07-30T23:14:16.235Z" },
|
|
2903
|
+
{ url = "https://files.pythonhosted.org/packages/c1/9d/533802021f7654deced4ed05d2b73e6206170d6a0ae5000993aa4955e246/litellm-1.94.1-cp314-cp314-win_amd64.whl", hash = "sha256:ffa9a6cd9b6205d60b02ffc0b7f077a03693d835b06d2a34bfeaabb4f073c08a", size = 20269681, upload-time = "2026-07-30T23:14:19.5Z" },
|
|
2904
2904
|
]
|
|
2905
2905
|
|
|
2906
2906
|
[[package]]
|
|
@@ -3789,7 +3789,7 @@ wheels = [
|
|
|
3789
3789
|
|
|
3790
3790
|
[[package]]
|
|
3791
3791
|
name = "openai"
|
|
3792
|
-
version = "2.
|
|
3792
|
+
version = "2.51.0"
|
|
3793
3793
|
source = { registry = "https://pypi.org/simple" }
|
|
3794
3794
|
dependencies = [
|
|
3795
3795
|
{ name = "anyio" },
|
|
@@ -3801,9 +3801,9 @@ dependencies = [
|
|
|
3801
3801
|
{ name = "tqdm" },
|
|
3802
3802
|
{ name = "typing-extensions" },
|
|
3803
3803
|
]
|
|
3804
|
-
sdist = { url = "https://files.pythonhosted.org/packages/d8/
|
|
3804
|
+
sdist = { url = "https://files.pythonhosted.org/packages/75/d8/06fda9685e47d9a8fc177ef57f8af75207938fad49a45ce23bfa7b6a2a5c/openai-2.51.0.tar.gz", hash = "sha256:4d61287c42eba54086d09346e709cbf7f8cec51822efce9cc399450b9385fba5", size = 1083410, upload-time = "2026-07-30T17:43:26.507Z" }
|
|
3805
3805
|
wheels = [
|
|
3806
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
3806
|
+
{ url = "https://files.pythonhosted.org/packages/57/6f/c49e21245ad4865e886f6885e95e998bc024335b392c202bd571639e9d50/openai-2.51.0-py3-none-any.whl", hash = "sha256:91db13ce59a670fddc820a6983989650095e43e3acac09288bceb69356a8904e", size = 1652344, upload-time = "2026-07-30T17:43:24.225Z" },
|
|
3807
3807
|
]
|
|
3808
3808
|
|
|
3809
3809
|
[[package]]
|
|
@@ -5597,27 +5597,27 @@ wheels = [
|
|
|
5597
5597
|
|
|
5598
5598
|
[[package]]
|
|
5599
5599
|
name = "ruff"
|
|
5600
|
-
version = "0.16.
|
|
5601
|
-
source = { registry = "https://pypi.org/simple" }
|
|
5602
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
5603
|
-
wheels = [
|
|
5604
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5605
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5606
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5607
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5608
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5609
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5610
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5611
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5612
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5613
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5614
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5615
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5616
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5617
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5618
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5619
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
5620
|
-
{ url = "https://files.pythonhosted.org/packages/cb/
|
|
5600
|
+
version = "0.16.1"
|
|
5601
|
+
source = { registry = "https://pypi.org/simple" }
|
|
5602
|
+
sdist = { url = "https://files.pythonhosted.org/packages/70/25/7113f6d5498888c5fb7db34081cba7d5971c4cb1bfb26819966eee68f003/ruff-0.16.1.tar.gz", hash = "sha256:fedad7c801dabd3fb9741d76aca39246e6ddd9ca446a015875207bf19f1e6bc7", size = 4877500, upload-time = "2026-07-30T19:37:01.379Z" }
|
|
5603
|
+
wheels = [
|
|
5604
|
+
{ url = "https://files.pythonhosted.org/packages/1b/bd/694da69368e0973de65df2ddc73ab18d43c469d5963d9b150911de6bc513/ruff-0.16.1-py3-none-linux_armv6l.whl", hash = "sha256:58edb313b88f0c5460a26adf5f39a37a3be789494a15e3e411e35fa78b89f9a0", size = 10839126, upload-time = "2026-07-30T19:36:13.697Z" },
|
|
5605
|
+
{ url = "https://files.pythonhosted.org/packages/3f/f0/b626e5d5bd0dd9576263658ef12885e2288afd1029a48e26ffed65ec1ac1/ruff-0.16.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fde5a99e2f97479af66edd6622c6d5a2a7592c77cf4153d9e4428f5eeb55b60c", size = 11070253, upload-time = "2026-07-30T19:36:17.14Z" },
|
|
5606
|
+
{ url = "https://files.pythonhosted.org/packages/83/63/f40acfb6b35b88623e71684942b552c3edd96035f5d98f313815f7b277de/ruff-0.16.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e0d4c20532fca4f7fa609369161d968dd28f65d83dabbd61d8e9c7edbf7001f6", size = 10561425, upload-time = "2026-07-30T19:36:20.04Z" },
|
|
5607
|
+
{ url = "https://files.pythonhosted.org/packages/aa/dd/14ec0e9c2b4d315547dd38765004b4863e354e1b52cb308272215d9f6f6d/ruff-0.16.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30affbcedf59ad5703d9c91f82266e02b47739f797e1a7b6e158e5526a6dae38", size = 10948879, upload-time = "2026-07-30T19:36:22.476Z" },
|
|
5608
|
+
{ url = "https://files.pythonhosted.org/packages/33/e9/9d870cbae575030fdef595f04b4b97573c525b5497cce4f4498cf2f85446/ruff-0.16.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24e9c631573cbca9d20f1283f8f479b2afa4a8503504822bd71a293889f16743", size = 10643691, upload-time = "2026-07-30T19:36:24.914Z" },
|
|
5609
|
+
{ url = "https://files.pythonhosted.org/packages/c4/09/12743d544e2173f53ecd27217c65f90d2bc0f8424a66a60339e56bbc0457/ruff-0.16.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b41bdd48fb420987a9b5212e4957c26ad4abce401fa9ea9d4d85843727945f4f", size = 11435354, upload-time = "2026-07-30T19:36:28.447Z" },
|
|
5610
|
+
{ url = "https://files.pythonhosted.org/packages/7f/89/a1652b2daee52083c9554a6333b678a8b01d0400f976827bb87857f9449a/ruff-0.16.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b0d1e1393b7648079e13669de1c1f4fde06d4583e84d8fd5c1551e0a77a2aa75", size = 12259033, upload-time = "2026-07-30T19:36:31.326Z" },
|
|
5611
|
+
{ url = "https://files.pythonhosted.org/packages/16/96/ecdcb8c54ee7b123b487f807eb014e6e019155a0b81dfb669acd52f28ce3/ruff-0.16.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07bf434b1c95f4e093be4532068ef4fcf00924eb2ade8796075980902d6fd54a", size = 11667981, upload-time = "2026-07-30T19:36:34.394Z" },
|
|
5612
|
+
{ url = "https://files.pythonhosted.org/packages/cd/90/c52e12e0d862e9572f2a33aa227409143520abe53111e9a6babbac7b4af8/ruff-0.16.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39897739f112253ee4fdd2e8aa9a4f9ded99fb2be367d5f31dfa4ded6025584c", size = 11468183, upload-time = "2026-07-30T19:36:37.339Z" },
|
|
5613
|
+
{ url = "https://files.pythonhosted.org/packages/2c/6b/4ffb7ad1d83eb16cf8cbb3c8815d3f11c88460fd162d4b372a2059be1c2a/ruff-0.16.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:82ae3c0c0d74daf17b968a10b7b3bb3ef297ab7de0c1f749646b25e690ccb150", size = 11470071, upload-time = "2026-07-30T19:36:39.91Z" },
|
|
5614
|
+
{ url = "https://files.pythonhosted.org/packages/9c/72/32ae7db4c0b5e32ab611787caa19d1546800676d79f7483b7100a3561bf4/ruff-0.16.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4d5f2ed10f8242d83fc08d521301089364e3375375705356f20c0e31606ef3ef", size = 10919503, upload-time = "2026-07-30T19:36:42.65Z" },
|
|
5615
|
+
{ url = "https://files.pythonhosted.org/packages/f7/ca/3d901ba6ad6fc38da39c3448fc6c59ac945679293a17c3ceb6d6c1cba13e/ruff-0.16.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a4665b309891f83f3e3c25447935f1213e9abbd4b5640af7a1f2def9f8d413c1", size = 10649861, upload-time = "2026-07-30T19:36:45.18Z" },
|
|
5616
|
+
{ url = "https://files.pythonhosted.org/packages/92/79/894ef1ced26552d5f8c9cf6d85b0687840e1128c55aeab7b9c2d54a0d880/ruff-0.16.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26e9ca5c9bc3971f20d3cf18a957f52ffd6a5f6564ff15c4912a144dcac22494", size = 11148137, upload-time = "2026-07-30T19:36:47.936Z" },
|
|
5617
|
+
{ url = "https://files.pythonhosted.org/packages/2d/69/3609a09fa1cb46cc28b762363e440a354204e5dff01bd0c8d7437874d6b9/ruff-0.16.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:67e1e1e3fa4f0c82f0e36d4cd61e661f6e7a6196cb1aa92fe0828fa7b8f257cd", size = 11559211, upload-time = "2026-07-30T19:36:50.448Z" },
|
|
5618
|
+
{ url = "https://files.pythonhosted.org/packages/fc/8a/fb22af2fd78a736e241fabf67e30ce1799a64244026377a49e133af90762/ruff-0.16.1-py3-none-win32.whl", hash = "sha256:d31765e131295b8445caf301e3e8a85b34d1b9b211b4109b7ba457888b051806", size = 10838258, upload-time = "2026-07-30T19:36:53.298Z" },
|
|
5619
|
+
{ url = "https://files.pythonhosted.org/packages/d4/35/e57fd9fb5d423961df087a00b12d42c0a830288dc2f3b45ecca299158b4f/ruff-0.16.1-py3-none-win_amd64.whl", hash = "sha256:09b05e8b90c2cb06ad63464350e7a45e8e44a2dfe52072ebfba6666ca8d3f596", size = 11961111, upload-time = "2026-07-30T19:36:56.107Z" },
|
|
5620
|
+
{ url = "https://files.pythonhosted.org/packages/cb/46/240ea004bf6dc4feb40e9832f2205a476a47dd5b8a3f8211a5fc5f95e20e/ruff-0.16.1-py3-none-win_arm64.whl", hash = "sha256:dbaadaac38c70239f056d306b7476f246b0bf000fa6b3876402acbf5b227eaf8", size = 11309414, upload-time = "2026-07-30T19:36:58.79Z" },
|
|
5621
5621
|
]
|
|
5622
5622
|
|
|
5623
5623
|
[[package]]
|
|
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.78 → classifyre_cli-0.4.79}/src/detectors/custom/runners/_object_detection.py
RENAMED
|
File without changes
|
|
File without changes
|
{classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/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
|
|
File without changes
|
{classifyre_cli-0.4.78 → classifyre_cli-0.4.79}/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.78 → classifyre_cli-0.4.79}/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
|