classifyre-cli 0.4.50__tar.gz → 0.4.52__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 (241) hide show
  1. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/.turbo/turbo-build.log +1 -1
  2. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/PKG-INFO +1 -1
  3. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/package.json +1 -1
  4. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/pyproject.toml +9 -1
  5. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/models/generated_input.py +332 -0
  6. classifyre_cli-0.4.52/src/sources/google_workspace/source.py +969 -0
  7. classifyre_cli-0.4.52/src/sources/microsoft_365/source.py +1060 -0
  8. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/dependency_groups.py +2 -0
  9. classifyre_cli-0.4.52/tests/detectors/secrets/__init__.py +0 -0
  10. classifyre_cli-0.4.52/tests/detectors/threat/__init__.py +0 -0
  11. classifyre_cli-0.4.52/tests/test_google_workspace_source.py +462 -0
  12. classifyre_cli-0.4.52/tests/test_microsoft_365_source.py +512 -0
  13. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/uv.lock +241 -5
  14. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/.gitignore +0 -0
  15. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/.python-version +0 -0
  16. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/README.md +0 -0
  17. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/main.py +0 -0
  18. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/scripts/generate_models.py +0 -0
  19. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/__init__.py +0 -0
  20. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/config.py +0 -0
  21. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/__init__.py +0 -0
  22. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/base.py +0 -0
  23. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/broken_links/__init__.py +0 -0
  24. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/broken_links/detector.py +0 -0
  25. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/config.py +0 -0
  26. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/content/__init__.py +0 -0
  27. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/__init__.py +0 -0
  28. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/detector.py +0 -0
  29. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/extractor.py +0 -0
  30. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/runners/__init__.py +0 -0
  31. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/runners/_base.py +0 -0
  32. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/runners/_factory.py +0 -0
  33. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/runners/_feature_extraction.py +0 -0
  34. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/runners/_gliner2.py +0 -0
  35. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/runners/_image_classification.py +0 -0
  36. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/runners/_llm.py +0 -0
  37. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/runners/_object_detection.py +0 -0
  38. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/runners/_regex.py +0 -0
  39. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/runners/_text_classification.py +0 -0
  40. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/custom/trainer.py +0 -0
  41. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/dependencies.py +0 -0
  42. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/pii/__init__.py +0 -0
  43. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/pii/detector.py +0 -0
  44. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/secrets/__init__.py +0 -0
  45. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/secrets/detector.py +0 -0
  46. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/threat/__init__.py +0 -0
  47. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/threat/code_security_detector.py +0 -0
  48. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/detectors/threat/yara_detector.py +0 -0
  49. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/main.py +0 -0
  50. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/models/generated_detectors.py +0 -0
  51. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/models/generated_single_asset_scan_results.py +0 -0
  52. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/outputs/__init__.py +0 -0
  53. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/outputs/base.py +0 -0
  54. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/outputs/console.py +0 -0
  55. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/outputs/factory.py +0 -0
  56. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/outputs/file.py +0 -0
  57. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/outputs/rest.py +0 -0
  58. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/pipeline/__init__.py +0 -0
  59. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/pipeline/content_provider.py +0 -0
  60. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/pipeline/detector_pipeline.py +0 -0
  61. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/pipeline/parsed_content_provider.py +0 -0
  62. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/pipeline/worker_pool.py +0 -0
  63. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sandbox/__init__.py +0 -0
  64. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sandbox/runner.py +0 -0
  65. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/__init__.py +0 -0
  66. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/asset_metadata.py +0 -0
  67. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/atlassian_common.py +0 -0
  68. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/azure_blob_storage/__init__.py +0 -0
  69. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/azure_blob_storage/source.py +0 -0
  70. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/base.py +0 -0
  71. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/confluence/__init__.py +0 -0
  72. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/confluence/source.py +0 -0
  73. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/databricks/__init__.py +0 -0
  74. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/databricks/source.py +0 -0
  75. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/delta_lake/__init__.py +0 -0
  76. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/delta_lake/source.py +0 -0
  77. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/dependencies.py +0 -0
  78. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/elasticsearch/__init__.py +0 -0
  79. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/elasticsearch/source.py +0 -0
  80. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/email/__init__.py +0 -0
  81. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/email/source.py +0 -0
  82. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/google_cloud_storage/__init__.py +0 -0
  83. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/google_cloud_storage/source.py +0 -0
  84. {classifyre_cli-0.4.50/src/sources/neo4j → classifyre_cli-0.4.52/src/sources/google_workspace}/__init__.py +0 -0
  85. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/hive/__init__.py +0 -0
  86. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/hive/source.py +0 -0
  87. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/iceberg/__init__.py +0 -0
  88. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/iceberg/source.py +0 -0
  89. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/jira/__init__.py +0 -0
  90. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/jira/source.py +0 -0
  91. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/kafka/__init__.py +0 -0
  92. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/kafka/source.py +0 -0
  93. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/lakehouse_base.py +0 -0
  94. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/local_folder/__init__.py +0 -0
  95. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/local_folder/source.py +0 -0
  96. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/meilisearch/__init__.py +0 -0
  97. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/meilisearch/source.py +0 -0
  98. {classifyre_cli-0.4.50/src/sources/sqlite → classifyre_cli-0.4.52/src/sources/microsoft_365}/__init__.py +0 -0
  99. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/mongodb/__init__.py +0 -0
  100. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/mongodb/source.py +0 -0
  101. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/mssql/__init__.py +0 -0
  102. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/mssql/source.py +0 -0
  103. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/mysql/__init__.py +0 -0
  104. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/mysql/source.py +0 -0
  105. {classifyre_cli-0.4.50/tests → classifyre_cli-0.4.52/src/sources/neo4j}/__init__.py +0 -0
  106. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/neo4j/source.py +0 -0
  107. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/notion/__init__.py +0 -0
  108. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/notion/client.py +0 -0
  109. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/notion/source.py +0 -0
  110. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/object_storage/base.py +0 -0
  111. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/opensearch/__init__.py +0 -0
  112. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/opensearch/source.py +0 -0
  113. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/oracle/__init__.py +0 -0
  114. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/oracle/source.py +0 -0
  115. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/postgresql/__init__.py +0 -0
  116. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/postgresql/source.py +0 -0
  117. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/powerbi/__init__.py +0 -0
  118. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/powerbi/source.py +0 -0
  119. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/recipe_normalizer.py +0 -0
  120. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/s3_client.py +0 -0
  121. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/s3_compatible_storage/README.md +0 -0
  122. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/s3_compatible_storage/__init__.py +0 -0
  123. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/s3_compatible_storage/source.py +0 -0
  124. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/search_engine_base.py +0 -0
  125. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/servicedesk/__init__.py +0 -0
  126. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/servicedesk/source.py +0 -0
  127. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/slack/__init__.py +0 -0
  128. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/slack/source.py +0 -0
  129. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/snowflake/__init__.py +0 -0
  130. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/snowflake/source.py +0 -0
  131. {classifyre_cli-0.4.50/tests/detectors → classifyre_cli-0.4.52/src/sources/sqlite}/__init__.py +0 -0
  132. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/sqlite/source.py +0 -0
  133. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/tableau/__init__.py +0 -0
  134. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/tableau/source.py +0 -0
  135. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/tabular_base.py +0 -0
  136. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/tabular_utils.py +0 -0
  137. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/wordpress/__init__.py +0 -0
  138. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/wordpress/source.py +0 -0
  139. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/youtube/__init__.py +0 -0
  140. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/sources/youtube/source.py +0 -0
  141. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/telemetry.py +0 -0
  142. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/__init__.py +0 -0
  143. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/content_extraction.py +0 -0
  144. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/embedded_images.py +0 -0
  145. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/file_metadata.py +0 -0
  146. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/file_parser.py +0 -0
  147. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/file_to_images.py +0 -0
  148. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/hashing.py +0 -0
  149. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/resources.py +0 -0
  150. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/transcription.py +0 -0
  151. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/uv_sync.py +0 -0
  152. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/src/utils/validation.py +0 -0
  153. {classifyre_cli-0.4.50/tests/detectors/content → classifyre_cli-0.4.52/tests}/__init__.py +0 -0
  154. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/_lakehouse_fakes.py +0 -0
  155. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/conftest.py +0 -0
  156. {classifyre_cli-0.4.50/tests/detectors/custom → classifyre_cli-0.4.52/tests/detectors}/__init__.py +0 -0
  157. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/broken_links/test_broken_links_detector.py +0 -0
  158. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/conftest.py +0 -0
  159. {classifyre_cli-0.4.50/tests/detectors/pii → classifyre_cli-0.4.52/tests/detectors/content}/__init__.py +0 -0
  160. {classifyre_cli-0.4.50/tests/detectors/secrets → classifyre_cli-0.4.52/tests/detectors/custom}/__init__.py +0 -0
  161. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/custom/conftest.py +0 -0
  162. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/custom/test_invoice_extraction.py +0 -0
  163. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/custom/test_llm_runner.py +0 -0
  164. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/custom/test_pipeline_integration.py +0 -0
  165. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/custom/test_regex_runner.py +0 -0
  166. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/custom/test_runner_hardening.py +0 -0
  167. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/custom/test_transformer_runners.py +0 -0
  168. {classifyre_cli-0.4.50/tests/detectors/threat → classifyre_cli-0.4.52/tests/detectors/pii}/__init__.py +0 -0
  169. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/pii/conftest.py +0 -0
  170. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/pii/sample_invoice.pdf +0 -0
  171. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/pii/test_pii_detector.py +0 -0
  172. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/pii/test_pii_detector_extended.py +0 -0
  173. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/secrets/test_secrets_detector.py +0 -0
  174. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/secrets/test_secrets_detector_extended.py +0 -0
  175. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/test_base_detector.py +0 -0
  176. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/test_custom_detector_examples_runtime.py +0 -0
  177. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/test_detector_catalog_commercial.py +0 -0
  178. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/test_detector_pipeline_types.py +0 -0
  179. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/test_detector_schema_examples.py +0 -0
  180. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/test_detector_types.py +0 -0
  181. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/test_phase2_detectors.py +0 -0
  182. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/test_registry.py +0 -0
  183. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/threat/test_code_security_detector.py +0 -0
  184. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/detectors/threat/test_yara_detector.py +0 -0
  185. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/integration/test_wordpress_broken_links_detector.py +0 -0
  186. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/integration/test_wordpress_links_assets.py +0 -0
  187. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/pipeline/test_detector_pipeline.py +0 -0
  188. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/pipeline/test_worker_pool.py +0 -0
  189. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_assets_metadata_catalog.py +0 -0
  190. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_azure_blob_storage_source.py +0 -0
  191. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_base_source_attachment.py +0 -0
  192. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_base_source_sampling.py +0 -0
  193. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_config.py +0 -0
  194. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_confluence_source.py +0 -0
  195. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_custom_extractor.py +0 -0
  196. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_databricks_source.py +0 -0
  197. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_delta_lake_source.py +0 -0
  198. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_dependency_groups.py +0 -0
  199. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_elasticsearch_source.py +0 -0
  200. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_email_source.py +0 -0
  201. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_google_cloud_storage_source.py +0 -0
  202. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_hashing.py +0 -0
  203. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_hive_source.py +0 -0
  204. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_iceberg_source.py +0 -0
  205. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_jira_source.py +0 -0
  206. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_kafka_source.py +0 -0
  207. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_local_folder_source.py +0 -0
  208. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_meilisearch_source.py +0 -0
  209. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_mongodb_source.py +0 -0
  210. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_mssql_source.py +0 -0
  211. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_mysql_source.py +0 -0
  212. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_neo4j_source.py +0 -0
  213. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_notion_source.py +0 -0
  214. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_opensearch_source.py +0 -0
  215. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_oracle_source.py +0 -0
  216. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_outputs.py +0 -0
  217. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_postgresql_source.py +0 -0
  218. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_powerbi_source.py +0 -0
  219. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_recipe_normalizer.py +0 -0
  220. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_s3_compatible_storage_source.py +0 -0
  221. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_sampling_automatic.py +0 -0
  222. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_sandbox_runner.py +0 -0
  223. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_servicedesk_source.py +0 -0
  224. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_slack_source.py +0 -0
  225. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_snowflake_source.py +0 -0
  226. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_source_dependency_groups.py +0 -0
  227. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_source_strategy_conformance.py +0 -0
  228. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_sqlite_source.py +0 -0
  229. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_tableau_source.py +0 -0
  230. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_tabular_automatic_sampling.py +0 -0
  231. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_tabular_utils.py +0 -0
  232. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_uv_sync.py +0 -0
  233. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_wordpress_source.py +0 -0
  234. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_youtube_source.py +0 -0
  235. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/test_youtube_source_integration.py +0 -0
  236. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/utils/test_content_extraction.py +0 -0
  237. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/utils/test_embedded_images.py +0 -0
  238. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/utils/test_file_metadata.py +0 -0
  239. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/utils/test_file_parser.py +0 -0
  240. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/utils/test_file_to_images.py +0 -0
  241. {classifyre_cli-0.4.50 → classifyre_cli-0.4.52}/tests/utils/test_transcription.py +0 -0
@@ -1,3 +1,3 @@
1
1
  $ uv sync
2
- Resolved 276 packages in 178ms
2
+ Resolved 293 packages in 218ms
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.50
3
+ Version: 0.4.52
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.50",
3
+ "version": "0.4.52",
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.50"
3
+ version = "0.4.52"
4
4
  description = "Classifyre CLI — scan and classify unstructured data sources"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -197,6 +197,14 @@ azure-blob-storage = [
197
197
  "azure-storage-blob>=12.29.0,<13.0.0",
198
198
  "azure-identity>=1.25.3,<2.0.0",
199
199
  ]
200
+ microsoft-graph = [
201
+ "msgraph-sdk>=1.0.0,<2.0.0",
202
+ "azure-identity>=1.25.3,<2.0.0",
203
+ ]
204
+ google-workspace = [
205
+ "google-api-python-client>=2.150,<3.0",
206
+ "google-auth>=2.40,<3.0",
207
+ ]
200
208
  google-cloud-storage = [
201
209
  "google-cloud-storage>=3.10.1,<4.0.0",
202
210
  ]
@@ -52,6 +52,8 @@ class AssetType(StrEnum):
52
52
  OPENSEARCH = 'OPENSEARCH'
53
53
  MEILISEARCH = 'MEILISEARCH'
54
54
  LOCAL_FOLDER = 'LOCAL_FOLDER'
55
+ MICROSOFT_365 = 'MICROSOFT_365'
56
+ GOOGLE_WORKSPACE = 'GOOGLE_WORKSPACE'
55
57
 
56
58
 
57
59
  class DetectorType(StrEnum):
@@ -357,6 +359,8 @@ class Type(StrEnum):
357
359
  OPENSEARCH = 'OPENSEARCH'
358
360
  MEILISEARCH = 'MEILISEARCH'
359
361
  LOCAL_FOLDER = 'LOCAL_FOLDER'
362
+ MICROSOFT_365 = 'MICROSOFT_365'
363
+ GOOGLE_WORKSPACE = 'GOOGLE_WORKSPACE'
360
364
 
361
365
 
362
366
  class YouTubeRequired(BaseModel):
@@ -2947,6 +2951,8 @@ class Type20(StrEnum):
2947
2951
  OPENSEARCH = 'OPENSEARCH'
2948
2952
  MEILISEARCH = 'MEILISEARCH'
2949
2953
  LOCAL_FOLDER = 'LOCAL_FOLDER'
2954
+ MICROSOFT_365 = 'MICROSOFT_365'
2955
+ GOOGLE_WORKSPACE = 'GOOGLE_WORKSPACE'
2950
2956
 
2951
2957
 
2952
2958
  class ConfluenceInput(CoreInput):
@@ -3687,6 +3693,328 @@ class IcebergOptionalScope(BaseModel):
3687
3693
  )
3688
3694
 
3689
3695
 
3696
+ class Microsoft365Ecosystem(StrEnum):
3697
+ """
3698
+ Microsoft 365 ecosystem to scan
3699
+ """
3700
+
3701
+ sharepoint_sites = 'sharepoint_sites'
3702
+ onedrive = 'onedrive'
3703
+ teams_files = 'teams_files'
3704
+
3705
+
3706
+ class Microsoft365RequiredClientSecret(BaseModel):
3707
+ model_config = ConfigDict(
3708
+ extra='forbid',
3709
+ )
3710
+ auth_mode: Literal['CLIENT_SECRET']
3711
+ tenant_id: str = Field(..., description='Azure AD tenant ID (directory ID)')
3712
+ client_id: str = Field(..., description='Azure AD application (client) ID')
3713
+
3714
+
3715
+ class Microsoft365RequiredCertificate(BaseModel):
3716
+ model_config = ConfigDict(
3717
+ extra='forbid',
3718
+ )
3719
+ auth_mode: Literal['CERTIFICATE']
3720
+ tenant_id: str = Field(..., description='Azure AD tenant ID (directory ID)')
3721
+ client_id: str = Field(..., description='Azure AD application (client) ID')
3722
+
3723
+
3724
+ class Microsoft365RequiredManagedIdentity(BaseModel):
3725
+ model_config = ConfigDict(
3726
+ extra='forbid',
3727
+ )
3728
+ auth_mode: Literal['MANAGED_IDENTITY']
3729
+ client_id: str | None = Field(
3730
+ None,
3731
+ description='User-assigned managed identity client ID (omit for system-assigned)',
3732
+ )
3733
+
3734
+
3735
+ class Microsoft365MaskedClientSecret(BaseModel):
3736
+ model_config = ConfigDict(
3737
+ extra='forbid',
3738
+ )
3739
+ client_secret: str = Field(..., description='Azure AD application client secret')
3740
+
3741
+
3742
+ class Microsoft365MaskedCertificate(BaseModel):
3743
+ model_config = ConfigDict(
3744
+ extra='forbid',
3745
+ )
3746
+ certificate_pem: str = Field(
3747
+ ..., description='PEM-encoded certificate (private key + cert chain)'
3748
+ )
3749
+ certificate_password: str | None = Field(
3750
+ None, description='Passphrase for encrypted PEM private key (optional)'
3751
+ )
3752
+
3753
+
3754
+ class Microsoft365MaskedManagedIdentity(BaseModel):
3755
+ model_config = ConfigDict(
3756
+ extra='forbid',
3757
+ )
3758
+
3759
+
3760
+ class Microsoft365OptionalScope(BaseModel):
3761
+ """
3762
+ Ecosystem selection and content filtering.
3763
+ """
3764
+
3765
+ model_config = ConfigDict(
3766
+ extra='forbid',
3767
+ )
3768
+ ecosystems: list[Microsoft365Ecosystem] | None = Field(
3769
+ ['sharepoint_sites'],
3770
+ description='Microsoft 365 ecosystems to scan (select one or more)',
3771
+ )
3772
+ site_filter: list[str] | None = Field(
3773
+ None,
3774
+ description='SharePoint site hostnames or paths to include (empty = all accessible)',
3775
+ )
3776
+ drive_filter: list[str] | None = Field(
3777
+ None, description='Drive names or IDs to include (empty = all)'
3778
+ )
3779
+ path_prefix: str | None = Field(
3780
+ None,
3781
+ description='Only scan items under this folder path (e.g. /Documents/Legal)',
3782
+ )
3783
+ include_extensions: list[str] | None = Field(
3784
+ None, description='Only include files with these extensions (e.g. .pdf, .docx)'
3785
+ )
3786
+ exclude_extensions: list[str] | None = Field(
3787
+ None, description='Skip files with these extensions'
3788
+ )
3789
+ max_object_bytes: int | None = Field(
3790
+ 104857600,
3791
+ description='Skip files larger than this many bytes (default 100 MB)',
3792
+ ge=0,
3793
+ )
3794
+
3795
+
3796
+ class Microsoft365OptionalConnection(BaseModel):
3797
+ """
3798
+ Network and throttle controls for Graph API requests.
3799
+ """
3800
+
3801
+ model_config = ConfigDict(
3802
+ extra='forbid',
3803
+ )
3804
+ request_timeout_seconds: int | None = Field(
3805
+ 30, description='Socket timeout for Graph API operations', ge=5, le=300
3806
+ )
3807
+ max_retries: int | None = Field(
3808
+ 3,
3809
+ description='Maximum retries on transient errors and 429 throttling',
3810
+ ge=0,
3811
+ le=10,
3812
+ )
3813
+ rate_limit_delay_seconds: float | None = Field(
3814
+ 1.0,
3815
+ description='Base delay between requests when throttled (exponential backoff applied)',
3816
+ ge=0.0,
3817
+ )
3818
+ page_size: int | None = Field(
3819
+ 200, description='Items per page for Graph API list requests', ge=1, le=999
3820
+ )
3821
+
3822
+
3823
+ class Microsoft365OptionalExtraction(BaseModel):
3824
+ """
3825
+ Controls which structural assets to emit beyond files.
3826
+ """
3827
+
3828
+ model_config = ConfigDict(
3829
+ extra='forbid',
3830
+ )
3831
+ include_permissions: bool | None = Field(
3832
+ False,
3833
+ description='Include file/site permission metadata (requires Sites.FullControl.All)',
3834
+ )
3835
+ include_site_metadata: bool | None = Field(
3836
+ True, description='Emit site-level assets with metadata'
3837
+ )
3838
+ include_drive_metadata: bool | None = Field(
3839
+ True, description='Emit drive-level assets with metadata'
3840
+ )
3841
+
3842
+
3843
+ class Microsoft365Optional(BaseModel):
3844
+ model_config = ConfigDict(
3845
+ extra='forbid',
3846
+ )
3847
+ scope: Microsoft365OptionalScope | None = None
3848
+ connection: Microsoft365OptionalConnection | None = None
3849
+ extraction: Microsoft365OptionalExtraction | None = None
3850
+
3851
+
3852
+ class Microsoft365Input(CoreInput):
3853
+ type: Literal['MICROSOFT_365'] | None = Field(
3854
+ None, description='Type of the asset or source'
3855
+ )
3856
+ required: (
3857
+ Microsoft365RequiredClientSecret
3858
+ | Microsoft365RequiredCertificate
3859
+ | Microsoft365RequiredManagedIdentity
3860
+ ) = Field(..., title='Microsoft365Required')
3861
+ masked: (
3862
+ Microsoft365MaskedClientSecret
3863
+ | Microsoft365MaskedCertificate
3864
+ | Microsoft365MaskedManagedIdentity
3865
+ ) = Field(..., title='Microsoft365Masked')
3866
+ optional: Microsoft365Optional | None = None
3867
+ detectors: list[Detector] | None = Field(
3868
+ None, description='Detectors to run on ingested content'
3869
+ )
3870
+ custom_detectors: list[CustomDetectorSelection] | None = Field(
3871
+ None,
3872
+ description='Reusable custom detector IDs selected from the custom detector catalog.',
3873
+ )
3874
+ sampling: SamplingConfig
3875
+ resources: ResourceOverrides | None = None
3876
+
3877
+
3878
+ class GoogleWorkspaceRequiredServiceAccount(BaseModel):
3879
+ model_config = ConfigDict(
3880
+ extra='forbid',
3881
+ )
3882
+ auth_method: Literal['service_account']
3883
+ delegated_subject: str | None = Field(
3884
+ None,
3885
+ description='User email to impersonate via domain-wide delegation (optional)',
3886
+ )
3887
+
3888
+
3889
+ class GoogleWorkspaceRequiredOAuth(BaseModel):
3890
+ model_config = ConfigDict(
3891
+ extra='forbid',
3892
+ )
3893
+ auth_method: Literal['oauth']
3894
+ client_id: str = Field(..., description='OAuth 2.0 client ID')
3895
+
3896
+
3897
+ class GoogleWorkspaceMaskedServiceAccount(BaseModel):
3898
+ model_config = ConfigDict(
3899
+ extra='forbid',
3900
+ )
3901
+ service_account_json: str = Field(
3902
+ ..., description='Full JSON key for the Google service account'
3903
+ )
3904
+
3905
+
3906
+ class GoogleWorkspaceMaskedOAuth(BaseModel):
3907
+ model_config = ConfigDict(
3908
+ extra='forbid',
3909
+ )
3910
+ client_secret: str = Field(..., description='OAuth 2.0 client secret')
3911
+ refresh_token: str = Field(..., description='OAuth 2.0 refresh token')
3912
+
3913
+
3914
+ class GoogleWorkspaceOptionalScope(BaseModel):
3915
+ """
3916
+ Drive/folder selection and content filtering.
3917
+ """
3918
+
3919
+ model_config = ConfigDict(
3920
+ extra='forbid',
3921
+ )
3922
+ drive_ids: list[str] | None = Field(
3923
+ None,
3924
+ description='Shared drive IDs to scan (empty = all accessible shared drives)',
3925
+ )
3926
+ folder_ids: list[str] | None = Field(
3927
+ None, description='Only scan these folder IDs recursively (empty = full drives)'
3928
+ )
3929
+ include_my_drive: bool | None = Field(
3930
+ True, description="Include the authenticated/delegated user's My Drive"
3931
+ )
3932
+ include_shared_drives: bool | None = Field(
3933
+ True, description='Include shared drives'
3934
+ )
3935
+ include_file_extensions: list[str] | None = Field(
3936
+ None, description='Only include files with these extensions (e.g. .pdf, .docx)'
3937
+ )
3938
+ exclude_file_extensions: list[str] | None = Field(
3939
+ None, description='Skip files with these extensions'
3940
+ )
3941
+ include_permissions: bool | None = Field(
3942
+ False, description='Include file sharing permission metadata'
3943
+ )
3944
+
3945
+
3946
+ class GoogleWorkspaceOptionalConnection(BaseModel):
3947
+ """
3948
+ Network and pagination controls for Drive API requests.
3949
+ """
3950
+
3951
+ model_config = ConfigDict(
3952
+ extra='forbid',
3953
+ )
3954
+ page_size: int | None = Field(
3955
+ 1000, description='Items per page for Drive API list requests', ge=1, le=1000
3956
+ )
3957
+ max_object_bytes: int | None = Field(
3958
+ 104857600,
3959
+ description='Skip files larger than this many bytes (default 100 MB)',
3960
+ ge=0,
3961
+ )
3962
+ max_retries: int | None = Field(
3963
+ 5, description='Maximum retries on transient errors', ge=0, le=10
3964
+ )
3965
+ timeout_seconds: int | None = Field(
3966
+ 30, description='Socket timeout for Drive API operations', ge=5, le=300
3967
+ )
3968
+
3969
+
3970
+ class GoogleWorkspaceOptionalExtraction(BaseModel):
3971
+ """
3972
+ Controls which structural assets to emit and how Google-native files are handled.
3973
+ """
3974
+
3975
+ model_config = ConfigDict(
3976
+ extra='forbid',
3977
+ )
3978
+ include_drive_metadata: bool | None = Field(
3979
+ True, description='Emit drive-level assets with metadata'
3980
+ )
3981
+ export_google_formats: bool | None = Field(
3982
+ True,
3983
+ description='Export Google-native files (Docs/Sheets/Slides) to Office formats for content extraction',
3984
+ )
3985
+
3986
+
3987
+ class GoogleWorkspaceOptional(BaseModel):
3988
+ model_config = ConfigDict(
3989
+ extra='forbid',
3990
+ )
3991
+ scope: GoogleWorkspaceOptionalScope | None = None
3992
+ connection: GoogleWorkspaceOptionalConnection | None = None
3993
+ extraction: GoogleWorkspaceOptionalExtraction | None = None
3994
+
3995
+
3996
+ class GoogleWorkspaceInput(CoreInput):
3997
+ type: Literal['GOOGLE_WORKSPACE'] | None = Field(
3998
+ None, description='Type of the asset or source'
3999
+ )
4000
+ required: GoogleWorkspaceRequiredServiceAccount | GoogleWorkspaceRequiredOAuth = (
4001
+ Field(..., title='GoogleWorkspaceRequired')
4002
+ )
4003
+ masked: GoogleWorkspaceMaskedServiceAccount | GoogleWorkspaceMaskedOAuth = Field(
4004
+ ..., title='GoogleWorkspaceMasked'
4005
+ )
4006
+ optional: GoogleWorkspaceOptional | None = None
4007
+ detectors: list[Detector] | None = Field(
4008
+ None, description='Detectors to run on ingested content'
4009
+ )
4010
+ custom_detectors: list[CustomDetectorSelection] | None = Field(
4011
+ None,
4012
+ description='Reusable custom detector IDs selected from the custom detector catalog.',
4013
+ )
4014
+ sampling: SamplingConfig
4015
+ resources: ResourceOverrides | None = None
4016
+
4017
+
3690
4018
  class YouTubeInput(CoreInput):
3691
4019
  type: Literal['YOUTUBE'] | None = Field(
3692
4020
  None, description='Type of the asset or source'
@@ -3789,6 +4117,8 @@ class SourceInput(
3789
4117
  | ElasticsearchInput
3790
4118
  | OpenSearchInput
3791
4119
  | MeilisearchInput
4120
+ | Microsoft365Input
4121
+ | GoogleWorkspaceInput
3792
4122
  ]
3793
4123
  ):
3794
4124
  root: (
@@ -3822,6 +4152,8 @@ class SourceInput(
3822
4152
  | ElasticsearchInput
3823
4153
  | OpenSearchInput
3824
4154
  | MeilisearchInput
4155
+ | Microsoft365Input
4156
+ | GoogleWorkspaceInput
3825
4157
  ) = Field(
3826
4158
  ...,
3827
4159
  description='Merged configuration schema with all source types and common definitions',