classifyre-cli 0.4.93__tar.gz → 0.4.95__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.93 → classifyre_cli-0.4.95}/.turbo/turbo-build.log +1 -1
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/PKG-INFO +1 -1
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/package.json +1 -1
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/pyproject.toml +1 -1
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/file_parser.py +30 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/utils/test_file_parser.py +20 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/uv.lock +171 -120
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/.gitignore +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/.python-version +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/README.md +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/main.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/scripts/generate_models.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/config.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/base.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/broken_links/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/broken_links/detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/config.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/content/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/extractor.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/runners/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/runners/_base.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/runners/_factory.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/runners/_gliner2.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/runners/_image_classification.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/runners/_llm.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/runners/_object_detection.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/runners/_regex.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/runners/_text_classification.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/custom/trainer.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/dependencies.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/engine_version.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/pii/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/pii/detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/secrets/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/secrets/detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/threat/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/threat/code_security_detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/detectors/threat/yara_detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/file_evaluation/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/file_evaluation/runner.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/main.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/models/generated_detectors.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/models/generated_input.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/models/generated_single_asset_scan_results.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/outputs/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/outputs/base.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/outputs/console.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/outputs/factory.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/outputs/file.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/outputs/rest.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/pipeline/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/pipeline/content_provider.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/pipeline/detector_pipeline.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/pipeline/parsed_content_provider.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/pipeline/payload_window.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/pipeline/scan_cache.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/pipeline/text_artifact.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/pipeline/worker_pool.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/asset_metadata.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/atlassian_common.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/azure_blob_storage/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/azure_blob_storage/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/base.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/confluence/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/confluence/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/databricks/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/databricks/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/delta_lake/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/delta_lake/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/dependencies.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/dropbox/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/dropbox/auth.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/dropbox/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/elasticsearch/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/elasticsearch/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/email/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/email/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/git/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/git/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/google_cloud_storage/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/google_cloud_storage/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/google_workspace/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/google_workspace/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/hive/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/hive/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/hugging_face/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/hugging_face/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/iceberg/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/iceberg/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/jira/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/jira/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/kafka/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/kafka/rest.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/kafka/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/lakehouse_base.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/local_folder/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/local_folder/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/meilisearch/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/meilisearch/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/microsoft_365/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/microsoft_365/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/mongodb/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/mongodb/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/mssql/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/mssql/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/mysql/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/mysql/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/neo4j/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/neo4j/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/notion/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/notion/client.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/notion/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/object_storage/base.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/opensearch/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/opensearch/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/oracle/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/oracle/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/postgresql/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/postgresql/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/powerbi/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/powerbi/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/recipe_normalizer.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/reddit/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/reddit/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/s3_client.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/s3_compatible_storage/README.md +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/s3_compatible_storage/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/s3_compatible_storage/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/sandbox/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/sandbox/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/search_engine_base.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/servicedesk/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/servicedesk/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/slack/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/slack/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/snowflake/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/snowflake/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/sqlite/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/sqlite/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/tableau/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/tableau/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/tabular_base.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/tabular_utils.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/wordpress/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/wordpress/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/youtube/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/sources/youtube/source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/telemetry.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/archive_extraction.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/content_extraction.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/dependency_groups.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/embedded_files.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/external_video.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/file_metadata.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/file_to_images.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/hashing.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/legacy_office.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/payload.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/range_reader.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/resources.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/transcription.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/uv_sync.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/validation.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/src/utils/video_processing.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/_lakehouse_fakes.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/conftest.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/broken_links/test_broken_links_detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/conftest.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/content/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/custom/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/custom/conftest.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/custom/test_gliner2_classification.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/custom/test_invoice_extraction.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/custom/test_llm_runner.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/custom/test_pipeline_integration.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/custom/test_regex_runner.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/custom/test_runner_hardening.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/custom/test_transformer_runners.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/pii/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/pii/conftest.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/pii/sample_invoice.pdf +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/pii/test_pii_chunking.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/pii/test_pii_detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/pii/test_pii_detector_extended.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/pii/test_pii_regional_entities.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/pii/test_pii_severity.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/secrets/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/secrets/test_secrets_detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/secrets/test_secrets_detector_extended.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/test_base_detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/test_custom_detector_examples_runtime.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/test_detector_catalog_commercial.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/test_detector_pipeline_types.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/test_detector_schema_examples.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/test_detector_types.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/test_phase2_detectors.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/test_registry.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/threat/__init__.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/threat/test_code_security_detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/detectors/threat/test_yara_detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/integration/test_wordpress_broken_links_detector.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/integration/test_wordpress_links_assets.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/pipeline/test_detector_outcomes.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/pipeline/test_detector_pipeline.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/pipeline/test_worker_pool.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_arrow_ipc_payloads.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_assets_metadata_catalog.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_azure_blob_storage_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_base_source_attachment.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_base_source_sampling.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_byte_valued_fields.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_config.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_confluence_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_custom_extractor.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_databricks_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_delta_lake_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_dependency_groups.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_dropbox_auth_command.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_dropbox_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_elasticsearch_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_email_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_file_evaluation_runner.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_git_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_google_cloud_storage_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_google_workspace_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_hashing.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_hive_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_hugging_face_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_iceberg_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_jira_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_kafka_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_local_folder_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_main.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_meilisearch_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_microsoft_365_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_mongodb_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_mssql_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_mysql_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_neo4j_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_notion_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_object_storage_download_efficiency.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_opensearch_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_oracle_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_outputs.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_payload_window.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_payload_window_parquet.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_postgresql_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_powerbi_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_range_reading.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_recipe_normalizer.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_reddit_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_s3_compatible_storage_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_sampling_automatic.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_sandbox_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_scan_cache.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_servicedesk_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_slack_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_snowflake_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_source_dependency_groups.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_source_strategy_conformance.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_sqlite_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_tableau_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_tabular_automatic_sampling.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_tabular_utils.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_uv_sync.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_wordpress_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_youtube_source.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/test_youtube_source_integration.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/utils/test_archive_extraction.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/utils/test_content_extraction.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/utils/test_embedded_files.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/utils/test_file_metadata.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/utils/test_file_to_images.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/utils/test_legacy_office.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/utils/test_payload.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/utils/test_transcription.py +0 -0
- {classifyre_cli-0.4.93 → classifyre_cli-0.4.95}/tests/utils/test_video_processing.py +0 -0
|
@@ -732,6 +732,28 @@ def _refine_zip_mime(source: BinarySource) -> str:
|
|
|
732
732
|
return "application/zip"
|
|
733
733
|
|
|
734
734
|
|
|
735
|
+
def _null_bytes_look_interleaved(sample: bytes, unit: int) -> bool:
|
|
736
|
+
"""
|
|
737
|
+
Whether the null bytes sit where a fixed-width encoding would put them.
|
|
738
|
+
|
|
739
|
+
This is the structural signal that separates real UTF-16/32 from binary
|
|
740
|
+
that merely happens to contain a null. Text in a fixed-width encoding pads
|
|
741
|
+
every character to `unit` bytes, so for any script whose code points fit in
|
|
742
|
+
the low byte the padding lands at the SAME offset within every unit, and it
|
|
743
|
+
is common: roughly half the bytes for UTF-16 Latin text, three quarters for
|
|
744
|
+
UTF-32. Binary with an incidental null shows neither property.
|
|
745
|
+
"""
|
|
746
|
+
if len(sample) < unit * 2:
|
|
747
|
+
return False
|
|
748
|
+
nulls = sample.count(0)
|
|
749
|
+
# Well under what padding produces, so the nulls are incidental.
|
|
750
|
+
if nulls * unit < len(sample) * 0.5:
|
|
751
|
+
return False
|
|
752
|
+
offsets = {i % unit for i, byte in enumerate(sample) if byte == 0}
|
|
753
|
+
# Padding occupies fixed positions; scattered nulls are not padding.
|
|
754
|
+
return len(offsets) < unit
|
|
755
|
+
|
|
756
|
+
|
|
735
757
|
def _is_null_byte_unicode_text(file_bytes: bytes) -> bool:
|
|
736
758
|
"""UTF-16/32 text interleaves null bytes with every character — still text."""
|
|
737
759
|
# \xff\xfe prefixes both UTF-16 LE and UTF-32 LE BOMs.
|
|
@@ -752,6 +774,14 @@ def _is_null_byte_unicode_text(file_bytes: bytes) -> bool:
|
|
|
752
774
|
decoded = sample.decode(encoding)
|
|
753
775
|
if not decoded:
|
|
754
776
|
return False
|
|
777
|
+
# Printability alone is not enough either, and this is where short
|
|
778
|
+
# binary payloads got through: chardet calls b"\x00\x01\x02\x03binary"
|
|
779
|
+
# utf-16-le with 0.95 confidence, it decodes to CJK code points, and
|
|
780
|
+
# every one of those is `isprintable()`. So the payload was reported as
|
|
781
|
+
# text/plain and the parser tried to read it as text. Require the nulls
|
|
782
|
+
# to sit where an encoding's padding would actually put them.
|
|
783
|
+
if not _null_bytes_look_interleaved(sample, unit):
|
|
784
|
+
return False
|
|
755
785
|
printable = sum(1 for ch in decoded if ch.isprintable() or ch.isspace())
|
|
756
786
|
return printable / len(decoded) >= 0.9
|
|
757
787
|
except Exception:
|
|
@@ -80,6 +80,26 @@ class TestDetectMimeType:
|
|
|
80
80
|
result = detect_mime_type(b"")
|
|
81
81
|
assert result == "application/octet-stream"
|
|
82
82
|
|
|
83
|
+
def test_utf16_text_with_bom_is_text(self) -> None:
|
|
84
|
+
payload = "hello world this is plain utf16 text".encode("utf-16")
|
|
85
|
+
assert detect_mime_type(payload) == "text/plain"
|
|
86
|
+
|
|
87
|
+
def test_utf16_text_without_bom_is_text(self) -> None:
|
|
88
|
+
# No BOM, so this reaches the heuristic rather than the prefix check.
|
|
89
|
+
payload = "hello world this is plain utf16 text".encode("utf-16-le")
|
|
90
|
+
assert detect_mime_type(payload) == "text/plain"
|
|
91
|
+
|
|
92
|
+
def test_binary_is_not_mistaken_for_utf16(self) -> None:
|
|
93
|
+
# chardet calls this utf-16-le with 0.95 confidence and it decodes to
|
|
94
|
+
# CJK code points, every one of which is `isprintable()` — so a
|
|
95
|
+
# printability check alone accepted it as text. Real UTF-16 pads every
|
|
96
|
+
# character to a fixed width, putting its nulls at a consistent offset
|
|
97
|
+
# and in quantity; incidental nulls in binary do neither.
|
|
98
|
+
assert detect_mime_type(b"\x00\x01\x02\x03binary") == "application/octet-stream"
|
|
99
|
+
assert detect_mime_type(b"\x00\x01\x02\x03\x04\x05\x06\x07more binary") == (
|
|
100
|
+
"application/octet-stream"
|
|
101
|
+
)
|
|
102
|
+
|
|
83
103
|
|
|
84
104
|
# ---------------------------------------------------------------------------
|
|
85
105
|
# extract_text
|