classifyre-cli 0.4.93__tar.gz → 0.4.94__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.
Files changed (285) hide show
  1. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/.turbo/turbo-build.log +1 -1
  2. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/PKG-INFO +1 -1
  3. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/package.json +1 -1
  4. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/pyproject.toml +1 -1
  5. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/file_parser.py +30 -0
  6. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/utils/test_file_parser.py +20 -0
  7. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/uv.lock +8 -8
  8. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/.gitignore +0 -0
  9. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/.python-version +0 -0
  10. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/README.md +0 -0
  11. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/main.py +0 -0
  12. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/scripts/generate_models.py +0 -0
  13. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/__init__.py +0 -0
  14. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/config.py +0 -0
  15. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/__init__.py +0 -0
  16. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/base.py +0 -0
  17. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/broken_links/__init__.py +0 -0
  18. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/broken_links/detector.py +0 -0
  19. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/config.py +0 -0
  20. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/content/__init__.py +0 -0
  21. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/__init__.py +0 -0
  22. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/detector.py +0 -0
  23. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/extractor.py +0 -0
  24. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/runners/__init__.py +0 -0
  25. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/runners/_base.py +0 -0
  26. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/runners/_factory.py +0 -0
  27. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/runners/_gliner2.py +0 -0
  28. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/runners/_image_classification.py +0 -0
  29. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/runners/_llm.py +0 -0
  30. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/runners/_object_detection.py +0 -0
  31. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/runners/_regex.py +0 -0
  32. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/runners/_text_classification.py +0 -0
  33. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/custom/trainer.py +0 -0
  34. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/dependencies.py +0 -0
  35. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/engine_version.py +0 -0
  36. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/pii/__init__.py +0 -0
  37. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/pii/detector.py +0 -0
  38. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/secrets/__init__.py +0 -0
  39. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/secrets/detector.py +0 -0
  40. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/threat/__init__.py +0 -0
  41. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/threat/code_security_detector.py +0 -0
  42. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/detectors/threat/yara_detector.py +0 -0
  43. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/file_evaluation/__init__.py +0 -0
  44. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/file_evaluation/runner.py +0 -0
  45. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/main.py +0 -0
  46. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/models/generated_detectors.py +0 -0
  47. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/models/generated_input.py +0 -0
  48. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/models/generated_single_asset_scan_results.py +0 -0
  49. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/outputs/__init__.py +0 -0
  50. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/outputs/base.py +0 -0
  51. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/outputs/console.py +0 -0
  52. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/outputs/factory.py +0 -0
  53. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/outputs/file.py +0 -0
  54. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/outputs/rest.py +0 -0
  55. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/pipeline/__init__.py +0 -0
  56. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/pipeline/content_provider.py +0 -0
  57. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/pipeline/detector_pipeline.py +0 -0
  58. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/pipeline/parsed_content_provider.py +0 -0
  59. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/pipeline/payload_window.py +0 -0
  60. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/pipeline/scan_cache.py +0 -0
  61. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/pipeline/text_artifact.py +0 -0
  62. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/pipeline/worker_pool.py +0 -0
  63. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/__init__.py +0 -0
  64. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/asset_metadata.py +0 -0
  65. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/atlassian_common.py +0 -0
  66. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/azure_blob_storage/__init__.py +0 -0
  67. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/azure_blob_storage/source.py +0 -0
  68. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/base.py +0 -0
  69. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/confluence/__init__.py +0 -0
  70. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/confluence/source.py +0 -0
  71. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/databricks/__init__.py +0 -0
  72. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/databricks/source.py +0 -0
  73. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/delta_lake/__init__.py +0 -0
  74. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/delta_lake/source.py +0 -0
  75. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/dependencies.py +0 -0
  76. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/dropbox/__init__.py +0 -0
  77. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/dropbox/auth.py +0 -0
  78. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/dropbox/source.py +0 -0
  79. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/elasticsearch/__init__.py +0 -0
  80. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/elasticsearch/source.py +0 -0
  81. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/email/__init__.py +0 -0
  82. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/email/source.py +0 -0
  83. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/git/__init__.py +0 -0
  84. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/git/source.py +0 -0
  85. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/google_cloud_storage/__init__.py +0 -0
  86. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/google_cloud_storage/source.py +0 -0
  87. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/google_workspace/__init__.py +0 -0
  88. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/google_workspace/source.py +0 -0
  89. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/hive/__init__.py +0 -0
  90. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/hive/source.py +0 -0
  91. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/hugging_face/__init__.py +0 -0
  92. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/hugging_face/source.py +0 -0
  93. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/iceberg/__init__.py +0 -0
  94. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/iceberg/source.py +0 -0
  95. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/jira/__init__.py +0 -0
  96. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/jira/source.py +0 -0
  97. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/kafka/__init__.py +0 -0
  98. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/kafka/rest.py +0 -0
  99. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/kafka/source.py +0 -0
  100. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/lakehouse_base.py +0 -0
  101. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/local_folder/__init__.py +0 -0
  102. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/local_folder/source.py +0 -0
  103. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/meilisearch/__init__.py +0 -0
  104. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/meilisearch/source.py +0 -0
  105. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/microsoft_365/__init__.py +0 -0
  106. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/microsoft_365/source.py +0 -0
  107. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/mongodb/__init__.py +0 -0
  108. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/mongodb/source.py +0 -0
  109. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/mssql/__init__.py +0 -0
  110. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/mssql/source.py +0 -0
  111. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/mysql/__init__.py +0 -0
  112. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/mysql/source.py +0 -0
  113. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/neo4j/__init__.py +0 -0
  114. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/neo4j/source.py +0 -0
  115. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/notion/__init__.py +0 -0
  116. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/notion/client.py +0 -0
  117. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/notion/source.py +0 -0
  118. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/object_storage/base.py +0 -0
  119. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/opensearch/__init__.py +0 -0
  120. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/opensearch/source.py +0 -0
  121. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/oracle/__init__.py +0 -0
  122. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/oracle/source.py +0 -0
  123. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/postgresql/__init__.py +0 -0
  124. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/postgresql/source.py +0 -0
  125. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/powerbi/__init__.py +0 -0
  126. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/powerbi/source.py +0 -0
  127. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/recipe_normalizer.py +0 -0
  128. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/reddit/__init__.py +0 -0
  129. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/reddit/source.py +0 -0
  130. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/s3_client.py +0 -0
  131. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/s3_compatible_storage/README.md +0 -0
  132. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/s3_compatible_storage/__init__.py +0 -0
  133. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/s3_compatible_storage/source.py +0 -0
  134. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/sandbox/__init__.py +0 -0
  135. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/sandbox/source.py +0 -0
  136. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/search_engine_base.py +0 -0
  137. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/servicedesk/__init__.py +0 -0
  138. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/servicedesk/source.py +0 -0
  139. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/slack/__init__.py +0 -0
  140. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/slack/source.py +0 -0
  141. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/snowflake/__init__.py +0 -0
  142. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/snowflake/source.py +0 -0
  143. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/sqlite/__init__.py +0 -0
  144. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/sqlite/source.py +0 -0
  145. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/tableau/__init__.py +0 -0
  146. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/tableau/source.py +0 -0
  147. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/tabular_base.py +0 -0
  148. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/tabular_utils.py +0 -0
  149. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/wordpress/__init__.py +0 -0
  150. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/wordpress/source.py +0 -0
  151. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/youtube/__init__.py +0 -0
  152. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/sources/youtube/source.py +0 -0
  153. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/telemetry.py +0 -0
  154. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/__init__.py +0 -0
  155. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/archive_extraction.py +0 -0
  156. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/content_extraction.py +0 -0
  157. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/dependency_groups.py +0 -0
  158. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/embedded_files.py +0 -0
  159. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/external_video.py +0 -0
  160. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/file_metadata.py +0 -0
  161. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/file_to_images.py +0 -0
  162. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/hashing.py +0 -0
  163. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/legacy_office.py +0 -0
  164. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/payload.py +0 -0
  165. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/range_reader.py +0 -0
  166. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/resources.py +0 -0
  167. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/transcription.py +0 -0
  168. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/uv_sync.py +0 -0
  169. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/validation.py +0 -0
  170. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/src/utils/video_processing.py +0 -0
  171. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/__init__.py +0 -0
  172. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/_lakehouse_fakes.py +0 -0
  173. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/conftest.py +0 -0
  174. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/__init__.py +0 -0
  175. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/broken_links/test_broken_links_detector.py +0 -0
  176. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/conftest.py +0 -0
  177. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/content/__init__.py +0 -0
  178. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/custom/__init__.py +0 -0
  179. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/custom/conftest.py +0 -0
  180. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/custom/test_gliner2_classification.py +0 -0
  181. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/custom/test_invoice_extraction.py +0 -0
  182. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/custom/test_llm_runner.py +0 -0
  183. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/custom/test_pipeline_integration.py +0 -0
  184. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/custom/test_regex_runner.py +0 -0
  185. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/custom/test_runner_hardening.py +0 -0
  186. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/custom/test_transformer_runners.py +0 -0
  187. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/pii/__init__.py +0 -0
  188. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/pii/conftest.py +0 -0
  189. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/pii/sample_invoice.pdf +0 -0
  190. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/pii/test_pii_chunking.py +0 -0
  191. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/pii/test_pii_detector.py +0 -0
  192. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/pii/test_pii_detector_extended.py +0 -0
  193. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/pii/test_pii_regional_entities.py +0 -0
  194. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/pii/test_pii_severity.py +0 -0
  195. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/secrets/__init__.py +0 -0
  196. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/secrets/test_secrets_detector.py +0 -0
  197. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/secrets/test_secrets_detector_extended.py +0 -0
  198. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/test_base_detector.py +0 -0
  199. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/test_custom_detector_examples_runtime.py +0 -0
  200. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/test_detector_catalog_commercial.py +0 -0
  201. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/test_detector_pipeline_types.py +0 -0
  202. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/test_detector_schema_examples.py +0 -0
  203. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/test_detector_types.py +0 -0
  204. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/test_phase2_detectors.py +0 -0
  205. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/test_registry.py +0 -0
  206. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/threat/__init__.py +0 -0
  207. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/threat/test_code_security_detector.py +0 -0
  208. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/detectors/threat/test_yara_detector.py +0 -0
  209. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/integration/test_wordpress_broken_links_detector.py +0 -0
  210. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/integration/test_wordpress_links_assets.py +0 -0
  211. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/pipeline/test_detector_outcomes.py +0 -0
  212. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/pipeline/test_detector_pipeline.py +0 -0
  213. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/pipeline/test_worker_pool.py +0 -0
  214. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_arrow_ipc_payloads.py +0 -0
  215. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_assets_metadata_catalog.py +0 -0
  216. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_azure_blob_storage_source.py +0 -0
  217. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_base_source_attachment.py +0 -0
  218. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_base_source_sampling.py +0 -0
  219. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_byte_valued_fields.py +0 -0
  220. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_config.py +0 -0
  221. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_confluence_source.py +0 -0
  222. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_custom_extractor.py +0 -0
  223. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_databricks_source.py +0 -0
  224. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_delta_lake_source.py +0 -0
  225. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_dependency_groups.py +0 -0
  226. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_dropbox_auth_command.py +0 -0
  227. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_dropbox_source.py +0 -0
  228. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_elasticsearch_source.py +0 -0
  229. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_email_source.py +0 -0
  230. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_file_evaluation_runner.py +0 -0
  231. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_git_source.py +0 -0
  232. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_google_cloud_storage_source.py +0 -0
  233. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_google_workspace_source.py +0 -0
  234. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_hashing.py +0 -0
  235. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_hive_source.py +0 -0
  236. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_hugging_face_source.py +0 -0
  237. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_iceberg_source.py +0 -0
  238. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_jira_source.py +0 -0
  239. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_kafka_source.py +0 -0
  240. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_local_folder_source.py +0 -0
  241. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_main.py +0 -0
  242. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_meilisearch_source.py +0 -0
  243. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_microsoft_365_source.py +0 -0
  244. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_mongodb_source.py +0 -0
  245. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_mssql_source.py +0 -0
  246. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_mysql_source.py +0 -0
  247. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_neo4j_source.py +0 -0
  248. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_notion_source.py +0 -0
  249. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_object_storage_download_efficiency.py +0 -0
  250. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_opensearch_source.py +0 -0
  251. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_oracle_source.py +0 -0
  252. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_outputs.py +0 -0
  253. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_payload_window.py +0 -0
  254. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_payload_window_parquet.py +0 -0
  255. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_postgresql_source.py +0 -0
  256. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_powerbi_source.py +0 -0
  257. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_range_reading.py +0 -0
  258. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_recipe_normalizer.py +0 -0
  259. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_reddit_source.py +0 -0
  260. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_s3_compatible_storage_source.py +0 -0
  261. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_sampling_automatic.py +0 -0
  262. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_sandbox_source.py +0 -0
  263. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_scan_cache.py +0 -0
  264. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_servicedesk_source.py +0 -0
  265. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_slack_source.py +0 -0
  266. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_snowflake_source.py +0 -0
  267. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_source_dependency_groups.py +0 -0
  268. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_source_strategy_conformance.py +0 -0
  269. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_sqlite_source.py +0 -0
  270. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_tableau_source.py +0 -0
  271. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_tabular_automatic_sampling.py +0 -0
  272. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_tabular_utils.py +0 -0
  273. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_uv_sync.py +0 -0
  274. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_wordpress_source.py +0 -0
  275. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_youtube_source.py +0 -0
  276. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/test_youtube_source_integration.py +0 -0
  277. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/utils/test_archive_extraction.py +0 -0
  278. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/utils/test_content_extraction.py +0 -0
  279. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/utils/test_embedded_files.py +0 -0
  280. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/utils/test_file_metadata.py +0 -0
  281. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/utils/test_file_to_images.py +0 -0
  282. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/utils/test_legacy_office.py +0 -0
  283. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/utils/test_payload.py +0 -0
  284. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/utils/test_transcription.py +0 -0
  285. {classifyre_cli-0.4.93 → classifyre_cli-0.4.94}/tests/utils/test_video_processing.py +0 -0
@@ -1,3 +1,3 @@
1
1
  $ uv sync
2
- Resolved 307 packages in 240ms
2
+ Resolved 307 packages in 262ms
3
3
  Checked 51 packages in 1ms
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: classifyre-cli
3
- Version: 0.4.93
3
+ Version: 0.4.94
4
4
  Summary: Classifyre CLI — scan and classify unstructured data sources
5
5
  License: MIT
6
6
  Keywords: data,ingestion,metadata,pii,secrets,unstructured
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@classifyre/cli",
3
- "version": "0.4.93",
3
+ "version": "0.4.94",
4
4
  "private": true,
5
5
  "scripts": {
6
6
  "build": "uv sync",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "classifyre-cli"
3
- version = "0.4.93"
3
+ version = "0.4.94"
4
4
  description = "Classifyre CLI — scan and classify unstructured data sources"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -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
@@ -830,7 +830,7 @@ wheels = [
830
830
 
831
831
  [[package]]
832
832
  name = "classifyre-cli"
833
- version = "0.4.93"
833
+ version = "0.4.94"
834
834
  source = { editable = "." }
835
835
  dependencies = [
836
836
  { name = "beautifulsoup4" },
@@ -1369,7 +1369,7 @@ youtube = [
1369
1369
 
1370
1370
  [[package]]
1371
1371
  name = "classifyre-schemas"
1372
- version = "0.4.93"
1372
+ version = "0.4.94"
1373
1373
  source = { editable = "../../packages/schemas" }
1374
1374
  dependencies = [
1375
1375
  { name = "fastjsonschema" },
@@ -2520,7 +2520,7 @@ http2 = [
2520
2520
 
2521
2521
  [[package]]
2522
2522
  name = "huggingface-hub"
2523
- version = "1.26.0"
2523
+ version = "1.26.1"
2524
2524
  source = { registry = "https://pypi.org/simple" }
2525
2525
  dependencies = [
2526
2526
  { name = "click" },
@@ -2533,9 +2533,9 @@ dependencies = [
2533
2533
  { name = "tqdm" },
2534
2534
  { name = "typing-extensions" },
2535
2535
  ]
2536
- 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" }
2536
+ sdist = { url = "https://files.pythonhosted.org/packages/89/64/bfe23dab749cb2342e1e13b61c9e684ce46b4d189c7d433cd26f76f52baf/huggingface_hub-1.26.1.tar.gz", hash = "sha256:7c28860777594ac679233f571552d0e46df34ed4e4239e844190fad3ca05e4cd", size = 936700, upload-time = "2026-08-06T09:42:24.859Z" }
2537
2537
  wheels = [
2538
- { 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" },
2538
+ { url = "https://files.pythonhosted.org/packages/b4/a7/b519cd01e57b685c5f3e9db02cb1bd7aaade35fb6554e0d36bee6d6aae28/huggingface_hub-1.26.1-py3-none-any.whl", hash = "sha256:d8676e4ec96c1e481a22a93232bd86d73bbac643fb767399aefaeaa503890fb0", size = 780754, upload-time = "2026-08-06T09:42:22.497Z" },
2539
2539
  ]
2540
2540
 
2541
2541
  [[package]]
@@ -2558,11 +2558,11 @@ wheels = [
2558
2558
 
2559
2559
  [[package]]
2560
2560
  name = "imap-tools"
2561
- version = "1.14.0"
2561
+ version = "1.15.0"
2562
2562
  source = { registry = "https://pypi.org/simple" }
2563
- sdist = { url = "https://files.pythonhosted.org/packages/41/66/d52b6c7740aa81678404a9039668ab2b4887f46055290f232229a2d5b612/imap_tools-1.14.0.tar.gz", hash = "sha256:d730a35763c09ca02be45b93c8d5d638d9f098876c95841c7ce4d337ede403da", size = 48268, upload-time = "2026-07-24T06:23:43.804Z" }
2563
+ sdist = { url = "https://files.pythonhosted.org/packages/59/4e/acf9a7d59932548bc749fe0f5ae852e6da00b640303ed72786f697944b69/imap_tools-1.15.0.tar.gz", hash = "sha256:a90f948549ab000d96caf17c90e63b114f8788ba4a0d3f9274a96c0e108c3805", size = 48497, upload-time = "2026-08-06T10:25:26.567Z" }
2564
2564
  wheels = [
2565
- { url = "https://files.pythonhosted.org/packages/02/eb/8567f7542aaee43575002915a959e8891d2d9f3642d1bc5d32410d871bb5/imap_tools-1.14.0-py3-none-any.whl", hash = "sha256:eab3506e701eba44269bc04760b8b29a96c93b173553057180fe40a084d65426", size = 36410, upload-time = "2026-07-24T06:23:41.945Z" },
2565
+ { url = "https://files.pythonhosted.org/packages/50/eb/a4ad6ec962af2806c3484adb1869c24a04d8ef8c2034f2dd2b0f48459b0a/imap_tools-1.15.0-py3-none-any.whl", hash = "sha256:7bb0003c8bf124b80968c7bef786e4577d8365e9afb6551dc15b13161b688bdc", size = 36512, upload-time = "2026-08-06T10:25:24.377Z" },
2566
2566
  ]
2567
2567
 
2568
2568
  [[package]]
File without changes