classifyre-cli 0.4.68__tar.gz → 0.4.69__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 (259) hide show
  1. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/.turbo/turbo-build.log +1 -1
  2. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/PKG-INFO +1 -1
  3. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/package.json +1 -1
  4. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/pyproject.toml +5 -1
  5. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/models/generated_input.py +261 -25
  6. classifyre_cli-0.4.69/src/sources/dropbox/__init__.py +3 -0
  7. classifyre_cli-0.4.69/src/sources/dropbox/source.py +677 -0
  8. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/elasticsearch/source.py +1 -0
  9. classifyre_cli-0.4.69/src/sources/kafka/rest.py +228 -0
  10. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/kafka/source.py +204 -44
  11. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/meilisearch/source.py +4 -1
  12. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/object_storage/base.py +10 -0
  13. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/opensearch/source.py +1 -0
  14. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/search_engine_base.py +91 -10
  15. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/dependency_groups.py +7 -0
  16. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_dependency_groups.py +8 -0
  17. classifyre_cli-0.4.69/tests/test_dropbox_source.py +942 -0
  18. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_elasticsearch_source.py +98 -8
  19. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_kafka_source.py +226 -6
  20. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_meilisearch_source.py +3 -0
  21. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_opensearch_source.py +43 -7
  22. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/uv.lock +35 -5
  23. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/.gitignore +0 -0
  24. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/.python-version +0 -0
  25. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/README.md +0 -0
  26. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/main.py +0 -0
  27. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/scripts/generate_models.py +0 -0
  28. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/__init__.py +0 -0
  29. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/config.py +0 -0
  30. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/__init__.py +0 -0
  31. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/base.py +0 -0
  32. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/broken_links/__init__.py +0 -0
  33. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/broken_links/detector.py +0 -0
  34. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/config.py +0 -0
  35. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/content/__init__.py +0 -0
  36. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/__init__.py +0 -0
  37. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/detector.py +0 -0
  38. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/extractor.py +0 -0
  39. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/runners/__init__.py +0 -0
  40. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/runners/_base.py +0 -0
  41. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/runners/_factory.py +0 -0
  42. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/runners/_gliner2.py +0 -0
  43. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/runners/_image_classification.py +0 -0
  44. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/runners/_llm.py +0 -0
  45. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/runners/_object_detection.py +0 -0
  46. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/runners/_regex.py +0 -0
  47. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/runners/_text_classification.py +0 -0
  48. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/custom/trainer.py +0 -0
  49. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/dependencies.py +0 -0
  50. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/pii/__init__.py +0 -0
  51. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/pii/detector.py +0 -0
  52. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/secrets/__init__.py +0 -0
  53. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/secrets/detector.py +0 -0
  54. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/threat/__init__.py +0 -0
  55. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/threat/code_security_detector.py +0 -0
  56. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/detectors/threat/yara_detector.py +0 -0
  57. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/file_evaluation/__init__.py +0 -0
  58. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/file_evaluation/runner.py +0 -0
  59. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/main.py +0 -0
  60. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/models/generated_detectors.py +0 -0
  61. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/models/generated_single_asset_scan_results.py +0 -0
  62. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/outputs/__init__.py +0 -0
  63. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/outputs/base.py +0 -0
  64. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/outputs/console.py +0 -0
  65. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/outputs/factory.py +0 -0
  66. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/outputs/file.py +0 -0
  67. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/outputs/rest.py +0 -0
  68. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/pipeline/__init__.py +0 -0
  69. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/pipeline/content_provider.py +0 -0
  70. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/pipeline/detector_pipeline.py +0 -0
  71. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/pipeline/parsed_content_provider.py +0 -0
  72. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/pipeline/text_artifact.py +0 -0
  73. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/pipeline/worker_pool.py +0 -0
  74. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/__init__.py +0 -0
  75. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/asset_metadata.py +0 -0
  76. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/atlassian_common.py +0 -0
  77. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/azure_blob_storage/__init__.py +0 -0
  78. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/azure_blob_storage/source.py +0 -0
  79. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/base.py +0 -0
  80. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/confluence/__init__.py +0 -0
  81. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/confluence/source.py +0 -0
  82. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/databricks/__init__.py +0 -0
  83. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/databricks/source.py +0 -0
  84. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/delta_lake/__init__.py +0 -0
  85. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/delta_lake/source.py +0 -0
  86. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/dependencies.py +0 -0
  87. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/elasticsearch/__init__.py +0 -0
  88. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/email/__init__.py +0 -0
  89. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/email/source.py +0 -0
  90. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/google_cloud_storage/__init__.py +0 -0
  91. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/google_cloud_storage/source.py +0 -0
  92. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/google_workspace/__init__.py +0 -0
  93. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/google_workspace/source.py +0 -0
  94. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/hive/__init__.py +0 -0
  95. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/hive/source.py +0 -0
  96. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/iceberg/__init__.py +0 -0
  97. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/iceberg/source.py +0 -0
  98. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/jira/__init__.py +0 -0
  99. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/jira/source.py +0 -0
  100. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/kafka/__init__.py +0 -0
  101. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/lakehouse_base.py +0 -0
  102. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/local_folder/__init__.py +0 -0
  103. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/local_folder/source.py +0 -0
  104. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/meilisearch/__init__.py +0 -0
  105. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/microsoft_365/__init__.py +0 -0
  106. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/microsoft_365/source.py +0 -0
  107. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/mongodb/__init__.py +0 -0
  108. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/mongodb/source.py +0 -0
  109. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/mssql/__init__.py +0 -0
  110. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/mssql/source.py +0 -0
  111. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/mysql/__init__.py +0 -0
  112. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/mysql/source.py +0 -0
  113. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/neo4j/__init__.py +0 -0
  114. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/neo4j/source.py +0 -0
  115. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/notion/__init__.py +0 -0
  116. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/notion/client.py +0 -0
  117. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/notion/source.py +0 -0
  118. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/opensearch/__init__.py +0 -0
  119. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/oracle/__init__.py +0 -0
  120. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/oracle/source.py +0 -0
  121. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/postgresql/__init__.py +0 -0
  122. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/postgresql/source.py +0 -0
  123. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/powerbi/__init__.py +0 -0
  124. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/powerbi/source.py +0 -0
  125. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/recipe_normalizer.py +0 -0
  126. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/s3_client.py +0 -0
  127. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/s3_compatible_storage/README.md +0 -0
  128. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/s3_compatible_storage/__init__.py +0 -0
  129. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/s3_compatible_storage/source.py +0 -0
  130. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/sandbox/__init__.py +0 -0
  131. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/sandbox/source.py +0 -0
  132. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/servicedesk/__init__.py +0 -0
  133. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/servicedesk/source.py +0 -0
  134. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/slack/__init__.py +0 -0
  135. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/slack/source.py +0 -0
  136. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/snowflake/__init__.py +0 -0
  137. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/snowflake/source.py +0 -0
  138. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/sqlite/__init__.py +0 -0
  139. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/sqlite/source.py +0 -0
  140. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/tableau/__init__.py +0 -0
  141. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/tableau/source.py +0 -0
  142. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/tabular_base.py +0 -0
  143. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/tabular_utils.py +0 -0
  144. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/wordpress/__init__.py +0 -0
  145. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/wordpress/source.py +0 -0
  146. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/youtube/__init__.py +0 -0
  147. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/sources/youtube/source.py +0 -0
  148. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/telemetry.py +0 -0
  149. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/__init__.py +0 -0
  150. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/archive_extraction.py +0 -0
  151. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/content_extraction.py +0 -0
  152. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/embedded_images.py +0 -0
  153. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/file_metadata.py +0 -0
  154. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/file_parser.py +0 -0
  155. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/file_to_images.py +0 -0
  156. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/hashing.py +0 -0
  157. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/legacy_office.py +0 -0
  158. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/resources.py +0 -0
  159. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/transcription.py +0 -0
  160. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/uv_sync.py +0 -0
  161. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/validation.py +0 -0
  162. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/src/utils/video_processing.py +0 -0
  163. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/__init__.py +0 -0
  164. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/_lakehouse_fakes.py +0 -0
  165. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/conftest.py +0 -0
  166. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/__init__.py +0 -0
  167. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/broken_links/test_broken_links_detector.py +0 -0
  168. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/conftest.py +0 -0
  169. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/content/__init__.py +0 -0
  170. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/custom/__init__.py +0 -0
  171. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/custom/conftest.py +0 -0
  172. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/custom/test_gliner2_classification.py +0 -0
  173. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/custom/test_invoice_extraction.py +0 -0
  174. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/custom/test_llm_runner.py +0 -0
  175. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/custom/test_pipeline_integration.py +0 -0
  176. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/custom/test_regex_runner.py +0 -0
  177. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/custom/test_runner_hardening.py +0 -0
  178. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/custom/test_transformer_runners.py +0 -0
  179. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/pii/__init__.py +0 -0
  180. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/pii/conftest.py +0 -0
  181. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/pii/sample_invoice.pdf +0 -0
  182. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/pii/test_pii_chunking.py +0 -0
  183. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/pii/test_pii_detector.py +0 -0
  184. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/pii/test_pii_detector_extended.py +0 -0
  185. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/pii/test_pii_severity.py +0 -0
  186. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/secrets/__init__.py +0 -0
  187. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/secrets/test_secrets_detector.py +0 -0
  188. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/secrets/test_secrets_detector_extended.py +0 -0
  189. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/test_base_detector.py +0 -0
  190. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/test_custom_detector_examples_runtime.py +0 -0
  191. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/test_detector_catalog_commercial.py +0 -0
  192. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/test_detector_pipeline_types.py +0 -0
  193. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/test_detector_schema_examples.py +0 -0
  194. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/test_detector_types.py +0 -0
  195. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/test_phase2_detectors.py +0 -0
  196. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/test_registry.py +0 -0
  197. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/threat/__init__.py +0 -0
  198. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/threat/test_code_security_detector.py +0 -0
  199. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/detectors/threat/test_yara_detector.py +0 -0
  200. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/integration/test_wordpress_broken_links_detector.py +0 -0
  201. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/integration/test_wordpress_links_assets.py +0 -0
  202. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/pipeline/test_detector_outcomes.py +0 -0
  203. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/pipeline/test_detector_pipeline.py +0 -0
  204. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/pipeline/test_worker_pool.py +0 -0
  205. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_assets_metadata_catalog.py +0 -0
  206. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_azure_blob_storage_source.py +0 -0
  207. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_base_source_attachment.py +0 -0
  208. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_base_source_sampling.py +0 -0
  209. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_config.py +0 -0
  210. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_confluence_source.py +0 -0
  211. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_custom_extractor.py +0 -0
  212. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_databricks_source.py +0 -0
  213. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_delta_lake_source.py +0 -0
  214. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_email_source.py +0 -0
  215. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_file_evaluation_runner.py +0 -0
  216. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_google_cloud_storage_source.py +0 -0
  217. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_google_workspace_source.py +0 -0
  218. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_hashing.py +0 -0
  219. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_hive_source.py +0 -0
  220. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_iceberg_source.py +0 -0
  221. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_jira_source.py +0 -0
  222. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_local_folder_source.py +0 -0
  223. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_main.py +0 -0
  224. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_microsoft_365_source.py +0 -0
  225. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_mongodb_source.py +0 -0
  226. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_mssql_source.py +0 -0
  227. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_mysql_source.py +0 -0
  228. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_neo4j_source.py +0 -0
  229. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_notion_source.py +0 -0
  230. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_oracle_source.py +0 -0
  231. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_outputs.py +0 -0
  232. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_postgresql_source.py +0 -0
  233. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_powerbi_source.py +0 -0
  234. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_recipe_normalizer.py +0 -0
  235. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_s3_compatible_storage_source.py +0 -0
  236. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_sampling_automatic.py +0 -0
  237. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_sandbox_source.py +0 -0
  238. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_servicedesk_source.py +0 -0
  239. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_slack_source.py +0 -0
  240. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_snowflake_source.py +0 -0
  241. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_source_dependency_groups.py +0 -0
  242. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_source_strategy_conformance.py +0 -0
  243. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_sqlite_source.py +0 -0
  244. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_tableau_source.py +0 -0
  245. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_tabular_automatic_sampling.py +0 -0
  246. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_tabular_utils.py +0 -0
  247. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_uv_sync.py +0 -0
  248. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_wordpress_source.py +0 -0
  249. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_youtube_source.py +0 -0
  250. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/test_youtube_source_integration.py +0 -0
  251. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/utils/test_archive_extraction.py +0 -0
  252. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/utils/test_content_extraction.py +0 -0
  253. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/utils/test_embedded_images.py +0 -0
  254. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/utils/test_file_metadata.py +0 -0
  255. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/utils/test_file_parser.py +0 -0
  256. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/utils/test_file_to_images.py +0 -0
  257. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/utils/test_legacy_office.py +0 -0
  258. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/utils/test_transcription.py +0 -0
  259. {classifyre_cli-0.4.68 → classifyre_cli-0.4.69}/tests/utils/test_video_processing.py +0 -0
@@ -1,3 +1,3 @@
1
1
  $ uv sync
2
- Resolved 300 packages in 269ms
2
+ Resolved 302 packages in 191ms
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.68
3
+ Version: 0.4.69
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.68",
3
+ "version": "0.4.69",
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.68"
3
+ version = "0.4.69"
4
4
  description = "Classifyre CLI — scan and classify unstructured data sources"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -227,6 +227,9 @@ google-workspace = [
227
227
  google-cloud-storage = [
228
228
  "google-cloud-storage>=3.10.1,<4.0.0",
229
229
  ]
230
+ dropbox = [
231
+ "dropbox>=12.2.1,<13.0.0",
232
+ ]
230
233
  email = [
231
234
  "imap-tools>=1.10.0,<2.0.0",
232
235
  ]
@@ -377,6 +380,7 @@ module = [
377
380
  "confluent_kafka.*",
378
381
  "boto3.*",
379
382
  "botocore.*",
383
+ "dropbox.*",
380
384
  ]
381
385
  ignore_missing_imports = true
382
386
 
@@ -54,6 +54,7 @@ class AssetType(StrEnum):
54
54
  LOCAL_FOLDER = 'LOCAL_FOLDER'
55
55
  MICROSOFT_365 = 'MICROSOFT_365'
56
56
  GOOGLE_WORKSPACE = 'GOOGLE_WORKSPACE'
57
+ DROPBOX = 'DROPBOX'
57
58
  SANDBOX = 'SANDBOX'
58
59
 
59
60
 
@@ -354,6 +355,7 @@ class Type(StrEnum):
354
355
  LOCAL_FOLDER = 'LOCAL_FOLDER'
355
356
  MICROSOFT_365 = 'MICROSOFT_365'
356
357
  GOOGLE_WORKSPACE = 'GOOGLE_WORKSPACE'
358
+ DROPBOX = 'DROPBOX'
357
359
  SANDBOX = 'SANDBOX'
358
360
 
359
361
 
@@ -3067,6 +3069,7 @@ class Type21(StrEnum):
3067
3069
  LOCAL_FOLDER = 'LOCAL_FOLDER'
3068
3070
  MICROSOFT_365 = 'MICROSOFT_365'
3069
3071
  GOOGLE_WORKSPACE = 'GOOGLE_WORKSPACE'
3072
+ DROPBOX = 'DROPBOX'
3070
3073
  SANDBOX = 'SANDBOX'
3071
3074
 
3072
3075
 
@@ -3333,7 +3336,7 @@ class NotionInput(CoreInput):
3333
3336
 
3334
3337
  class KafkaSecurityProtocol(StrEnum):
3335
3338
  """
3336
- Kafka client security protocol
3339
+ Kafka client security protocol. Leave unset to derive it from the authentication mode (SASL → SASL_SSL, Client Certificate → SSL, No Authentication → PLAINTEXT); set it only to override, e.g. SASL_PLAINTEXT for a SASL broker without TLS.
3337
3340
  """
3338
3341
 
3339
3342
  PLAINTEXT = 'PLAINTEXT'
@@ -3398,19 +3401,21 @@ class NoAuthentication(BaseModel):
3398
3401
  extra='forbid',
3399
3402
  )
3400
3403
  auth_mode: Literal['NONE']
3401
- bootstrap_servers: str = Field(
3402
- ..., description='Comma-separated Kafka bootstrap servers (host:port)'
3404
+ host: str = Field(
3405
+ ..., description='Kafka broker host name or IP (e.g. kafka.example.com)'
3403
3406
  )
3407
+ port: int = Field(..., description='Kafka broker port', ge=1, le=65535)
3404
3408
 
3405
3409
 
3406
- class SASL(BaseModel):
3410
+ class SASLUsernamePassword(BaseModel):
3407
3411
  model_config = ConfigDict(
3408
3412
  extra='forbid',
3409
3413
  )
3410
3414
  auth_mode: Literal['SASL']
3411
- bootstrap_servers: str = Field(
3412
- ..., description='Comma-separated Kafka bootstrap servers (host:port)'
3415
+ host: str = Field(
3416
+ ..., description='Kafka broker host name or IP (e.g. kafka.example.com)'
3413
3417
  )
3418
+ port: int = Field(..., description='Kafka broker port', ge=1, le=65535)
3414
3419
 
3415
3420
 
3416
3421
  class ClientCertificateMTLS(BaseModel):
@@ -3418,9 +3423,26 @@ class ClientCertificateMTLS(BaseModel):
3418
3423
  extra='forbid',
3419
3424
  )
3420
3425
  auth_mode: Literal['CLIENT_CERT']
3421
- bootstrap_servers: str = Field(
3422
- ..., description='Comma-separated Kafka bootstrap servers (host:port)'
3426
+ host: str = Field(
3427
+ ..., description='Kafka broker host name or IP (e.g. kafka.example.com)'
3423
3428
  )
3429
+ port: int = Field(..., description='Kafka broker port', ge=1, le=65535)
3430
+
3431
+
3432
+ class KafkaRESTProxyUsernamePassword(BaseModel):
3433
+ """
3434
+ Connect over the Kafka REST Proxy HTTP API (Confluent REST Proxy, Karapace) instead of the native broker protocol.
3435
+ """
3436
+
3437
+ model_config = ConfigDict(
3438
+ extra='forbid',
3439
+ )
3440
+ auth_mode: Literal['REST']
3441
+ host: str = Field(
3442
+ ...,
3443
+ description='Kafka REST proxy host name or IP (e.g. kafka-rest.example.com)',
3444
+ )
3445
+ port: int = Field(..., description='Kafka REST proxy port', ge=1, le=65535)
3424
3446
 
3425
3447
 
3426
3448
  class NoAuthentication1(BaseModel):
@@ -3429,9 +3451,9 @@ class NoAuthentication1(BaseModel):
3429
3451
  )
3430
3452
 
3431
3453
 
3432
- class SASL1(BaseModel):
3454
+ class SASLUsernamePassword1(BaseModel):
3433
3455
  """
3434
- SASL username/password credentials.
3456
+ SASL credentials. Set the SASL mechanism under connection options (PLAIN by default).
3435
3457
  """
3436
3458
 
3437
3459
  model_config = ConfigDict(
@@ -3439,24 +3461,42 @@ class SASL1(BaseModel):
3439
3461
  )
3440
3462
  sasl_username: str = Field(..., description='SASL username')
3441
3463
  sasl_password: str = Field(..., description='SASL password')
3464
+ ssl_ca: str | None = Field(
3465
+ None,
3466
+ description="PEM-encoded CA certificate used to verify the broker's TLS certificate. Required for private or self-signed CAs; leave empty to trust the system CA bundle.",
3467
+ )
3442
3468
 
3443
3469
 
3444
3470
  class ClientCertificateMTLS1(BaseModel):
3445
3471
  """
3446
- mTLS client certificate credentials.
3472
+ mTLS credentials: the client certificate and its private key, plus the CA certificate when the broker uses a private CA.
3447
3473
  """
3448
3474
 
3449
3475
  model_config = ConfigDict(
3450
3476
  extra='forbid',
3451
3477
  )
3452
- ssl_certfile: str = Field(
3453
- ..., description='PEM-encoded client certificate (access cert)'
3454
- )
3478
+ ssl_certfile: str = Field(..., description='PEM-encoded client access certificate')
3455
3479
  ssl_keyfile: str = Field(
3456
- ..., description='PEM-encoded client private key (access key)'
3480
+ ..., description='PEM-encoded client access key (private key)'
3481
+ )
3482
+ ssl_ca: str | None = Field(
3483
+ None,
3484
+ description="PEM-encoded CA certificate used to verify the broker's TLS certificate. Required for private or self-signed CAs; leave empty to trust the system CA bundle.",
3457
3485
  )
3458
3486
 
3459
3487
 
3488
+ class KafkaRESTProxyUsernamePassword1(BaseModel):
3489
+ """
3490
+ HTTP basic auth credentials for the REST proxy.
3491
+ """
3492
+
3493
+ model_config = ConfigDict(
3494
+ extra='forbid',
3495
+ )
3496
+ username: str = Field(..., description='REST proxy username')
3497
+ password: str = Field(..., description='REST proxy password')
3498
+
3499
+
3460
3500
  class KafkaOptionalConnection(BaseModel):
3461
3501
  """
3462
3502
  Kafka client connection and security options.
@@ -3465,11 +3505,11 @@ class KafkaOptionalConnection(BaseModel):
3465
3505
  model_config = ConfigDict(
3466
3506
  extra='forbid',
3467
3507
  )
3468
- security_protocol: KafkaSecurityProtocol | None = 'PLAINTEXT'
3508
+ security_protocol: KafkaSecurityProtocol | None = None
3469
3509
  sasl_mechanism: KafkaSaslMechanism | None = 'PLAIN'
3470
- ssl_ca: str | None = Field(
3471
- None,
3472
- description="PEM-encoded CA certificate for TLS verification (optional for client-certificate auth; validates the broker's certificate)",
3510
+ rest_use_tls: bool | None = Field(
3511
+ True,
3512
+ description='REST proxy only: call the proxy over HTTPS. Turn off for a plain-HTTP proxy (e.g. a local Karapace).',
3473
3513
  )
3474
3514
  request_timeout_ms: int | None = Field(
3475
3515
  30000, description='Client request timeout in milliseconds', ge=1000
@@ -3508,12 +3548,19 @@ class KafkaInput(CoreInput):
3508
3548
  type: Literal['KAFKA'] | None = Field(
3509
3549
  None, description='Type of the asset or source'
3510
3550
  )
3511
- required: NoAuthentication | SASL | ClientCertificateMTLS = Field(
3512
- ..., title='KafkaRequired'
3513
- )
3514
- masked: NoAuthentication1 | SASL1 | ClientCertificateMTLS1 | None = Field(
3515
- None, title='KafkaMasked'
3516
- )
3551
+ required: (
3552
+ NoAuthentication
3553
+ | SASLUsernamePassword
3554
+ | ClientCertificateMTLS
3555
+ | KafkaRESTProxyUsernamePassword
3556
+ ) = Field(..., title='KafkaRequired')
3557
+ masked: (
3558
+ NoAuthentication1
3559
+ | SASLUsernamePassword1
3560
+ | ClientCertificateMTLS1
3561
+ | KafkaRESTProxyUsernamePassword1
3562
+ | None
3563
+ ) = Field(None, title='KafkaMasked')
3517
3564
  optional: KafkaOptional | None = None
3518
3565
  detectors: list[Detector] | None = Field(
3519
3566
  None, description='Detectors to run on ingested content'
@@ -4174,6 +4221,193 @@ class GoogleWorkspaceInput(CoreInput):
4174
4221
  )
4175
4222
 
4176
4223
 
4224
+ class DropboxRequiredAccessToken(BaseModel):
4225
+ """
4226
+ Access token issued from the Dropbox App Console. Simplest to set up; short-lived tokens expire after 4 hours.
4227
+ """
4228
+
4229
+ model_config = ConfigDict(
4230
+ extra='forbid',
4231
+ )
4232
+ auth_method: Literal['access_token']
4233
+
4234
+
4235
+ class DropboxRequiredOAuth(BaseModel):
4236
+ """
4237
+ OAuth 2.0 app credentials with a refresh token. Recommended for unattended scans — the client mints a fresh access token on every run.
4238
+ """
4239
+
4240
+ model_config = ConfigDict(
4241
+ extra='forbid',
4242
+ )
4243
+ auth_method: Literal['oauth']
4244
+ app_key: str = Field(
4245
+ ...,
4246
+ description='Dropbox app key (client ID) of the OAuth app that issued the refresh token',
4247
+ )
4248
+
4249
+
4250
+ class DropboxMaskedAccessToken(BaseModel):
4251
+ model_config = ConfigDict(
4252
+ extra='forbid',
4253
+ )
4254
+ access_token: str = Field(
4255
+ ..., description='Dropbox OAuth 2.0 access token (sl.… for short-lived tokens)'
4256
+ )
4257
+
4258
+
4259
+ class DropboxMaskedOAuth(BaseModel):
4260
+ model_config = ConfigDict(
4261
+ extra='forbid',
4262
+ )
4263
+ app_secret: str = Field(
4264
+ ...,
4265
+ description='Dropbox app secret of the OAuth app that issued the refresh token',
4266
+ )
4267
+ refresh_token: str = Field(
4268
+ ...,
4269
+ description='Dropbox OAuth 2.0 refresh token (obtained with token_access_type=offline)',
4270
+ )
4271
+
4272
+
4273
+ class DropboxOptionalScope(BaseModel):
4274
+ """
4275
+ Folder selection and content filtering.
4276
+ """
4277
+
4278
+ model_config = ConfigDict(
4279
+ extra='forbid',
4280
+ )
4281
+ folder_path: str | None = Field(
4282
+ None,
4283
+ description='Folder to scan, for example /Finance/Exports. Leave empty to scan the whole account root.',
4284
+ )
4285
+ recursive: bool | None = Field(
4286
+ True, description='Descend into subfolders of the selected folder'
4287
+ )
4288
+ include_extensions: list[str] | None = Field(
4289
+ None,
4290
+ description='Optional extension allowlist (for example, .pdf, .csv, .docx)',
4291
+ )
4292
+ exclude_extensions: list[str] | None = Field(
4293
+ None, description='Optional extension denylist'
4294
+ )
4295
+ include_mounted_folders: bool | None = Field(
4296
+ True, description='Include shared folders mounted into the account'
4297
+ )
4298
+ include_empty_objects: bool | None = Field(
4299
+ False, description='Include zero-byte files in extraction results'
4300
+ )
4301
+ include_object_metadata: bool | None = Field(
4302
+ True,
4303
+ description='Attach Dropbox metadata (content hash, size, revision, timestamps) to asset checksums',
4304
+ )
4305
+ include_content_preview: bool | None = Field(
4306
+ True,
4307
+ description='Download file bytes to infer MIME and extract detector-ready text previews',
4308
+ )
4309
+ export_non_downloadable: bool | None = Field(
4310
+ True,
4311
+ description='Export files that have no direct download (Dropbox Paper docs) to Markdown so their text can be scanned',
4312
+ )
4313
+
4314
+
4315
+ class DropboxOptionalConnection(BaseModel):
4316
+ """
4317
+ Network and pagination controls for Dropbox API requests.
4318
+ """
4319
+
4320
+ model_config = ConfigDict(
4321
+ extra='forbid',
4322
+ )
4323
+ max_entries_per_page: int | None = Field(
4324
+ 500, description='Maximum entries requested per list_folder call', ge=1, le=2000
4325
+ )
4326
+ max_object_bytes: int | None = Field(
4327
+ 5242880,
4328
+ description='Maximum bytes downloaded per file for MIME detection and text extraction',
4329
+ ge=1024,
4330
+ le=52428800,
4331
+ )
4332
+ request_timeout_seconds: float | None = Field(
4333
+ 60,
4334
+ description='Network timeout in seconds for list/download operations',
4335
+ ge=1.0,
4336
+ le=300.0,
4337
+ )
4338
+ max_retries: int | None = Field(
4339
+ 4,
4340
+ description='Maximum retries on transient Dropbox errors (5xx and rate limits)',
4341
+ ge=0,
4342
+ le=10,
4343
+ )
4344
+
4345
+
4346
+ class DropboxOptionalTeam(BaseModel):
4347
+ """
4348
+ Dropbox Business team scanning. The credential shape is the same as for an individual account, but the Dropbox app must be created with a team access type ('Team member file access' plus 'Team information'). Leave disabled for individual accounts.
4349
+ """
4350
+
4351
+ model_config = ConfigDict(
4352
+ extra='forbid',
4353
+ )
4354
+ enabled: bool | None = Field(
4355
+ False,
4356
+ description='Scan the whole Dropbox Business team instead of a single account',
4357
+ )
4358
+ member_emails: list[str] | None = Field(
4359
+ None, description='Only scan these team members (empty = every active member)'
4360
+ )
4361
+ include_member_folders: bool | None = Field(
4362
+ True, description="Scan each selected member's own Dropbox folder"
4363
+ )
4364
+ include_team_space: bool | None = Field(
4365
+ True, description='Scan the shared team folders in the team space'
4366
+ )
4367
+ include_suspended_members: bool | None = Field(
4368
+ False, description='Also scan members whose account is suspended'
4369
+ )
4370
+ as_admin: bool | None = Field(
4371
+ False,
4372
+ description="Traverse team-owned folders with a team administrator's privileges instead of acting as each member. Reaches content a member cannot list themselves and does not mark files as viewed by them. Requires at least one team admin on the team.",
4373
+ )
4374
+
4375
+
4376
+ class DropboxOptional(BaseModel):
4377
+ model_config = ConfigDict(
4378
+ extra='forbid',
4379
+ )
4380
+ scope: DropboxOptionalScope | None = None
4381
+ team: DropboxOptionalTeam | None = None
4382
+ connection: DropboxOptionalConnection | None = None
4383
+
4384
+
4385
+ class DropboxInput(CoreInput):
4386
+ type: Literal['DROPBOX'] | None = Field(
4387
+ None, description='Type of the asset or source'
4388
+ )
4389
+ required: DropboxRequiredAccessToken | DropboxRequiredOAuth = Field(
4390
+ ..., title='DropboxRequired'
4391
+ )
4392
+ masked: DropboxMaskedAccessToken | DropboxMaskedOAuth = Field(
4393
+ ..., title='DropboxMasked'
4394
+ )
4395
+ optional: DropboxOptional | None = None
4396
+ detectors: list[Detector] | None = Field(
4397
+ None, description='Detectors to run on ingested content'
4398
+ )
4399
+ custom_detectors: list[CustomDetectorSelection] | None = Field(
4400
+ None,
4401
+ description='Reusable custom detector IDs selected from the custom detector catalog.',
4402
+ )
4403
+ sampling: SamplingConfig
4404
+ resources: ResourceOverrides | None = None
4405
+ cleanup_removed_detector_findings: bool | None = Field(
4406
+ True,
4407
+ description='When enabled (default), findings produced by detectors that are no longer configured on this source (removed or disabled) are automatically resolved at the start of the next run, keeping the findings list in step with the current detector set.',
4408
+ )
4409
+
4410
+
4177
4411
  class YouTubeInput(CoreInput):
4178
4412
  type: Literal['YOUTUBE'] | None = Field(
4179
4413
  None, description='Type of the asset or source'
@@ -4291,6 +4525,7 @@ class SourceInput(
4291
4525
  | MeilisearchInput
4292
4526
  | Microsoft365Input
4293
4527
  | GoogleWorkspaceInput
4528
+ | DropboxInput
4294
4529
  ]
4295
4530
  ):
4296
4531
  root: (
@@ -4327,6 +4562,7 @@ class SourceInput(
4327
4562
  | MeilisearchInput
4328
4563
  | Microsoft365Input
4329
4564
  | GoogleWorkspaceInput
4565
+ | DropboxInput
4330
4566
  ) = Field(
4331
4567
  ...,
4332
4568
  description='Merged configuration schema with all source types and common definitions',
@@ -0,0 +1,3 @@
1
+ from .source import DropboxSource
2
+
3
+ __all__ = ["DropboxSource"]