classifyre-cli 0.6.8__tar.gz → 0.6.9__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 (386) hide show
  1. classifyre_cli-0.6.9/.turbo/turbo-build.log +3 -0
  2. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/PKG-INFO +1 -1
  3. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/package.json +1 -1
  4. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/pyproject.toml +1 -1
  5. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/main.py +2 -0
  6. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/models/generated_input.py +177 -4
  7. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/sdk.py +91 -7
  8. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/outputs/rest.py +9 -0
  9. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/base.py +194 -29
  10. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/confluence/source.py +10 -2
  11. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/custom/runner.py +4 -0
  12. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/custom/source.py +6 -1
  13. classifyre_cli-0.6.9/src/sources/dremio/__init__.py +3 -0
  14. classifyre_cli-0.6.9/src/sources/dremio/client.py +466 -0
  15. classifyre_cli-0.6.9/src/sources/dremio/source.py +736 -0
  16. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/email/source.py +13 -5
  17. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/google_workspace/source.py +12 -2
  18. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/jira/source.py +9 -2
  19. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/kafka/rest.py +19 -3
  20. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/kafka/source.py +163 -50
  21. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/local_folder/source.py +78 -0
  22. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/microsoft_365/source.py +12 -3
  23. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/mongodb/source.py +111 -6
  24. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/notion/source.py +10 -2
  25. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/object_storage/base.py +21 -3
  26. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/oracle/source.py +29 -0
  27. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/powerbi/source.py +12 -14
  28. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/reddit/source.py +14 -3
  29. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/servicedesk/source.py +22 -3
  30. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/slack/source.py +146 -62
  31. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/tableau/source.py +12 -14
  32. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/tabular_base.py +156 -25
  33. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/tabular_utils.py +6 -0
  34. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/wordpress/source.py +108 -28
  35. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/youtube/source.py +8 -4
  36. classifyre_cli-0.6.9/src/utils/sampling_frontier.py +689 -0
  37. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/sql_lineage.py +50 -1
  38. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/urn.py +1 -0
  39. classifyre_cli-0.6.9/tests/test_automatic_new_first.py +474 -0
  40. classifyre_cli-0.6.9/tests/test_dremio_source.py +867 -0
  41. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_dropbox_source.py +9 -5
  42. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_google_workspace_source.py +36 -32
  43. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_hugging_face_source.py +19 -18
  44. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_kafka_source.py +130 -42
  45. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_microsoft_365_source.py +32 -21
  46. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_reddit_source.py +37 -14
  47. classifyre_cli-0.6.9/tests/test_sampling_automatic.py +272 -0
  48. classifyre_cli-0.6.9/tests/test_sampling_frontier.py +511 -0
  49. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_sandbox_source.py +34 -18
  50. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_slack_source.py +98 -34
  51. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_source_strategy_conformance.py +7 -5
  52. classifyre_cli-0.6.9/tests/test_tabular_automatic_sampling.py +262 -0
  53. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/uv.lock +115 -113
  54. classifyre_cli-0.6.8/.turbo/turbo-build.log +0 -3
  55. classifyre_cli-0.6.8/tests/test_sampling_automatic.py +0 -142
  56. classifyre_cli-0.6.8/tests/test_tabular_automatic_sampling.py +0 -187
  57. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/.gitignore +0 -0
  58. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/.python-version +0 -0
  59. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/README.md +0 -0
  60. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/main.py +0 -0
  61. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/scripts/generate_models.py +0 -0
  62. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/scripts/generate_runtime_packages.py +0 -0
  63. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/scripts/generate_sdk_completions.py +0 -0
  64. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/__init__.py +0 -0
  65. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/augmentation/__init__.py +0 -0
  66. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/augmentation/contract.py +0 -0
  67. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/augmentation/preview.py +0 -0
  68. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/augmentation/runner.py +0 -0
  69. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/augmentation/sdk.py +0 -0
  70. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/augmentation/session.py +0 -0
  71. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/config.py +0 -0
  72. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/__init__.py +0 -0
  73. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/base.py +0 -0
  74. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/broken_links/__init__.py +0 -0
  75. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/broken_links/detector.py +0 -0
  76. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/config.py +0 -0
  77. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/content/__init__.py +0 -0
  78. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/__init__.py +0 -0
  79. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/detector.py +0 -0
  80. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/extractor.py +0 -0
  81. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/__init__.py +0 -0
  82. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_base.py +0 -0
  83. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_custom_detector.py +0 -0
  84. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_factory.py +0 -0
  85. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_gliner2.py +0 -0
  86. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_image_classification.py +0 -0
  87. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_llm.py +0 -0
  88. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_object_detection.py +0 -0
  89. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_regex.py +0 -0
  90. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_tag.py +0 -0
  91. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/runners/_text_classification.py +0 -0
  92. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom/trainer.py +0 -0
  93. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom_detector/__init__.py +0 -0
  94. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom_detector/contract.py +0 -0
  95. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom_detector/files.py +0 -0
  96. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom_detector/preview.py +0 -0
  97. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom_detector/results.py +0 -0
  98. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom_detector/runner.py +0 -0
  99. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom_detector/sdk.py +0 -0
  100. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/custom_detector/session.py +0 -0
  101. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/dependencies.py +0 -0
  102. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/engine_version.py +0 -0
  103. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/errors.py +0 -0
  104. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/pii/__init__.py +0 -0
  105. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/pii/detector.py +0 -0
  106. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/secrets/__init__.py +0 -0
  107. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/secrets/detector.py +0 -0
  108. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/threat/__init__.py +0 -0
  109. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/threat/code_security_detector.py +0 -0
  110. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/detectors/threat/yara_detector.py +0 -0
  111. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/file_evaluation/__init__.py +0 -0
  112. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/file_evaluation/asset_fixture.py +0 -0
  113. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/file_evaluation/runner.py +0 -0
  114. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/graph/__init__.py +0 -0
  115. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/graph/edges.py +0 -0
  116. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/models/generated_detectors.py +0 -0
  117. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/models/generated_single_asset_scan_results.py +0 -0
  118. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/__init__.py +0 -0
  119. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/child.py +0 -0
  120. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/cli.py +0 -0
  121. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/cohort.py +0 -0
  122. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/contract.py +0 -0
  123. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/execute.py +0 -0
  124. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/files.py +0 -0
  125. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/groups.py +0 -0
  126. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/outputs.py +0 -0
  127. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/packages.py +0 -0
  128. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/protocol.py +0 -0
  129. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/redact.py +0 -0
  130. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/scaffold.py +0 -0
  131. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/notebook/serialize.py +0 -0
  132. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/outputs/__init__.py +0 -0
  133. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/outputs/base.py +0 -0
  134. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/outputs/console.py +0 -0
  135. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/outputs/factory.py +0 -0
  136. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/outputs/file.py +0 -0
  137. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/pipeline/__init__.py +0 -0
  138. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/pipeline/asset_payload_server.py +0 -0
  139. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/pipeline/content_provider.py +0 -0
  140. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/pipeline/detector_breaker.py +0 -0
  141. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/pipeline/detector_pipeline.py +0 -0
  142. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/pipeline/parsed_content_provider.py +0 -0
  143. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/pipeline/payload_window.py +0 -0
  144. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/pipeline/scan_cache.py +0 -0
  145. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/pipeline/text_artifact.py +0 -0
  146. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/pipeline/worker_pool.py +0 -0
  147. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/__init__.py +0 -0
  148. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/asset_metadata.py +0 -0
  149. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/atlassian_common.py +0 -0
  150. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/azure_blob_storage/__init__.py +0 -0
  151. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/azure_blob_storage/source.py +0 -0
  152. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/confluence/__init__.py +0 -0
  153. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/custom/__init__.py +0 -0
  154. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/custom/env.py +0 -0
  155. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/databricks/__init__.py +0 -0
  156. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/databricks/source.py +0 -0
  157. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/delta_lake/__init__.py +0 -0
  158. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/delta_lake/source.py +0 -0
  159. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/dependencies.py +0 -0
  160. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/dropbox/__init__.py +0 -0
  161. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/dropbox/auth.py +0 -0
  162. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/dropbox/source.py +0 -0
  163. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/elasticsearch/__init__.py +0 -0
  164. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/elasticsearch/source.py +0 -0
  165. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/email/__init__.py +0 -0
  166. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/git/__init__.py +0 -0
  167. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/git/source.py +0 -0
  168. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/google_cloud_storage/__init__.py +0 -0
  169. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/google_cloud_storage/source.py +0 -0
  170. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/google_workspace/__init__.py +0 -0
  171. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/hive/__init__.py +0 -0
  172. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/hive/source.py +0 -0
  173. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/hugging_face/__init__.py +0 -0
  174. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/hugging_face/source.py +0 -0
  175. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/iceberg/__init__.py +0 -0
  176. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/iceberg/source.py +0 -0
  177. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/jira/__init__.py +0 -0
  178. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/kafka/__init__.py +0 -0
  179. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/lakehouse_base.py +0 -0
  180. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/local_folder/__init__.py +0 -0
  181. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/meilisearch/__init__.py +0 -0
  182. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/meilisearch/source.py +0 -0
  183. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/microsoft_365/__init__.py +0 -0
  184. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/mongodb/__init__.py +0 -0
  185. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/mssql/__init__.py +0 -0
  186. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/mssql/source.py +0 -0
  187. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/mysql/__init__.py +0 -0
  188. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/mysql/source.py +0 -0
  189. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/neo4j/__init__.py +0 -0
  190. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/neo4j/source.py +0 -0
  191. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/notion/__init__.py +0 -0
  192. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/notion/client.py +0 -0
  193. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/opensearch/__init__.py +0 -0
  194. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/opensearch/source.py +0 -0
  195. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/oracle/__init__.py +0 -0
  196. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/postgresql/__init__.py +0 -0
  197. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/postgresql/source.py +0 -0
  198. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/powerbi/__init__.py +0 -0
  199. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/recipe_normalizer.py +0 -0
  200. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/reddit/__init__.py +0 -0
  201. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/s3_client.py +0 -0
  202. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/s3_compatible_storage/README.md +0 -0
  203. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/s3_compatible_storage/__init__.py +0 -0
  204. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/s3_compatible_storage/source.py +0 -0
  205. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/sandbox/__init__.py +0 -0
  206. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/sandbox/source.py +0 -0
  207. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/search_engine_base.py +0 -0
  208. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/servicedesk/__init__.py +0 -0
  209. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/slack/__init__.py +0 -0
  210. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/snowflake/__init__.py +0 -0
  211. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/snowflake/source.py +0 -0
  212. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/sqlite/__init__.py +0 -0
  213. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/sqlite/source.py +0 -0
  214. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/tableau/__init__.py +0 -0
  215. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/wordpress/__init__.py +0 -0
  216. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/sources/youtube/__init__.py +0 -0
  217. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/telemetry.py +0 -0
  218. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/__init__.py +0 -0
  219. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/archive_extraction.py +0 -0
  220. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/content_extraction.py +0 -0
  221. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/dependency_groups.py +0 -0
  222. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/embedded_files.py +0 -0
  223. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/external_video.py +0 -0
  224. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/file_metadata.py +0 -0
  225. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/file_parser.py +0 -0
  226. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/file_to_images.py +0 -0
  227. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/hashing.py +0 -0
  228. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/legacy_office.py +0 -0
  229. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/payload.py +0 -0
  230. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/range_reader.py +0 -0
  231. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/redaction.py +0 -0
  232. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/resources.py +0 -0
  233. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/sampling_cursor.py +0 -0
  234. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/source_files.py +0 -0
  235. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/torch_runtime.py +0 -0
  236. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/transcription.py +0 -0
  237. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/uv_sync.py +0 -0
  238. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/validation.py +0 -0
  239. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/src/utils/video_processing.py +0 -0
  240. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/__init__.py +0 -0
  241. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/_lakehouse_fakes.py +0 -0
  242. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/conftest.py +0 -0
  243. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/__init__.py +0 -0
  244. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/broken_links/test_broken_links_detector.py +0 -0
  245. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/conftest.py +0 -0
  246. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/content/__init__.py +0 -0
  247. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/custom/__init__.py +0 -0
  248. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/custom/conftest.py +0 -0
  249. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/custom/test_gliner2_classification.py +0 -0
  250. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/custom/test_invoice_extraction.py +0 -0
  251. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/custom/test_llm_runner.py +0 -0
  252. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/custom/test_pipeline_integration.py +0 -0
  253. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/custom/test_regex_runner.py +0 -0
  254. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/custom/test_runner_hardening.py +0 -0
  255. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/custom/test_transformer_runners.py +0 -0
  256. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/pii/__init__.py +0 -0
  257. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/pii/conftest.py +0 -0
  258. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/pii/sample_invoice.pdf +0 -0
  259. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/pii/test_pii_chunking.py +0 -0
  260. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/pii/test_pii_detector.py +0 -0
  261. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/pii/test_pii_detector_extended.py +0 -0
  262. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/pii/test_pii_regional_entities.py +0 -0
  263. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/pii/test_pii_severity.py +0 -0
  264. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/secrets/__init__.py +0 -0
  265. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/secrets/test_secrets_detector.py +0 -0
  266. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/secrets/test_secrets_detector_extended.py +0 -0
  267. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/test_base_detector.py +0 -0
  268. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/test_custom_detector_examples_runtime.py +0 -0
  269. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/test_custom_detector_session.py +0 -0
  270. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/test_detector_catalog_commercial.py +0 -0
  271. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/test_detector_pipeline_types.py +0 -0
  272. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/test_detector_schema_examples.py +0 -0
  273. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/test_detector_types.py +0 -0
  274. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/test_phase2_detectors.py +0 -0
  275. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/test_registry.py +0 -0
  276. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/test_tag_runner.py +0 -0
  277. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/threat/__init__.py +0 -0
  278. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/threat/test_code_security_detector.py +0 -0
  279. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/detectors/threat/test_yara_detector.py +0 -0
  280. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/integration/test_wordpress_broken_links_detector.py +0 -0
  281. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/integration/test_wordpress_links_assets.py +0 -0
  282. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/pipeline/test_detector_breaker.py +0 -0
  283. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/pipeline/test_detector_outcomes.py +0 -0
  284. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/pipeline/test_detector_pipeline.py +0 -0
  285. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/pipeline/test_worker_pool.py +0 -0
  286. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_arrow_ipc_payloads.py +0 -0
  287. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_assets_metadata_catalog.py +0 -0
  288. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_augmentation_contract.py +0 -0
  289. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_augmentation_edges.py +0 -0
  290. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_augmentation_patch.py +0 -0
  291. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_augmentation_scan_cache.py +0 -0
  292. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_augmentation_sdk.py +0 -0
  293. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_augmentation_session.py +0 -0
  294. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_augmentation_tags_end_to_end.py +0 -0
  295. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_azure_blob_storage_source.py +0 -0
  296. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_base_source_attachment.py +0 -0
  297. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_base_source_sampling.py +0 -0
  298. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_byte_valued_fields.py +0 -0
  299. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_config.py +0 -0
  300. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_confluence_source.py +0 -0
  301. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_custom_detector_end_to_end.py +0 -0
  302. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_custom_detector_evaluation.py +0 -0
  303. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_custom_detector_notebook.py +0 -0
  304. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_custom_detector_templates.py +0 -0
  305. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_custom_extractor.py +0 -0
  306. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_custom_source.py +0 -0
  307. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_custom_source_relationships.py +0 -0
  308. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_custom_source_tags_end_to_end.py +0 -0
  309. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_databricks_source.py +0 -0
  310. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_delta_lake_source.py +0 -0
  311. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_dependency_groups.py +0 -0
  312. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_detector_scope.py +0 -0
  313. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_dropbox_auth_command.py +0 -0
  314. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_elasticsearch_source.py +0 -0
  315. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_email_source.py +0 -0
  316. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_file_evaluation_runner.py +0 -0
  317. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_git_source.py +0 -0
  318. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_google_cloud_storage_source.py +0 -0
  319. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_graph_edges.py +0 -0
  320. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_hashing.py +0 -0
  321. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_hive_source.py +0 -0
  322. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_iceberg_source.py +0 -0
  323. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_jira_source.py +0 -0
  324. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_lineage_loss_reporting.py +0 -0
  325. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_local_folder_source.py +0 -0
  326. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_main.py +0 -0
  327. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_meilisearch_source.py +0 -0
  328. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_mongodb_source.py +0 -0
  329. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_mssql_source.py +0 -0
  330. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_mysql_source.py +0 -0
  331. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_neo4j_source.py +0 -0
  332. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_asset_entity.py +0 -0
  333. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_asset_extract.py +0 -0
  334. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_asset_tags.py +0 -0
  335. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_cohort.py +0 -0
  336. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_execute.py +0 -0
  337. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_files.py +0 -0
  338. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_groups.py +0 -0
  339. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_log_levels.py +0 -0
  340. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_packages.py +0 -0
  341. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_query_assets.py +0 -0
  342. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_sdk_exports.py +0 -0
  343. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_serialize.py +0 -0
  344. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notebook_templates.py +0 -0
  345. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_notion_source.py +0 -0
  346. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_object_storage_download_efficiency.py +0 -0
  347. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_opensearch_source.py +0 -0
  348. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_oracle_source.py +0 -0
  349. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_outputs.py +0 -0
  350. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_payload_window.py +0 -0
  351. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_payload_window_parquet.py +0 -0
  352. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_postgresql_source.py +0 -0
  353. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_powerbi_source.py +0 -0
  354. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_range_reading.py +0 -0
  355. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_recipe_normalizer.py +0 -0
  356. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_rest_backpressure.py +0 -0
  357. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_runtime_packages.py +0 -0
  358. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_s3_compatible_storage_source.py +0 -0
  359. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_sampling_cursor.py +0 -0
  360. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_scan_cache.py +0 -0
  361. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_sdk_completions.py +0 -0
  362. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_secret_redaction.py +0 -0
  363. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_semantic_declarations.py +0 -0
  364. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_servicedesk_source.py +0 -0
  365. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_snowflake_source.py +0 -0
  366. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_source_dependency_groups.py +0 -0
  367. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_sqlite_source.py +0 -0
  368. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_tableau_source.py +0 -0
  369. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_tabular_lineage.py +0 -0
  370. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_tabular_utils.py +0 -0
  371. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_torch_runtime.py +0 -0
  372. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_urn.py +0 -0
  373. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_uv_sync.py +0 -0
  374. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_wordpress_source.py +0 -0
  375. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_youtube_source.py +0 -0
  376. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/test_youtube_source_integration.py +0 -0
  377. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/utils/test_archive_extraction.py +0 -0
  378. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/utils/test_content_extraction.py +0 -0
  379. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/utils/test_embedded_files.py +0 -0
  380. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/utils/test_file_metadata.py +0 -0
  381. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/utils/test_file_parser.py +0 -0
  382. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/utils/test_file_to_images.py +0 -0
  383. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/utils/test_legacy_office.py +0 -0
  384. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/utils/test_payload.py +0 -0
  385. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/utils/test_transcription.py +0 -0
  386. {classifyre_cli-0.6.8 → classifyre_cli-0.6.9}/tests/utils/test_video_processing.py +0 -0
@@ -0,0 +1,3 @@
1
+ $ uv sync
2
+ Resolved 325 packages in 114ms
3
+ Checked 51 packages in 6ms
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: classifyre-cli
3
- Version: 0.6.8
3
+ Version: 0.6.9
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.6.8",
3
+ "version": "0.6.9",
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.6.8"
3
+ version = "0.6.9"
4
4
  description = "Classifyre CLI — scan and classify unstructured data sources"
5
5
  readme = "README.md"
6
6
  # Upper bound is load-bearing: onnxruntime publishes no cp315 wheels (notably
@@ -909,6 +909,8 @@ async def run_command_async(args: argparse.Namespace, recipe: dict[str, Any]) ->
909
909
  # completion path — a timed-out run must not advance it.
910
910
  if hasattr(sink, "set_sampling_cursor"):
911
911
  sink.set_sampling_cursor(source.current_sampling_cursor())
912
+ if hasattr(sink, "set_sampling_fingerprint"):
913
+ sink.set_sampling_fingerprint(source.sampling_fingerprint())
912
914
 
913
915
  # A connector that covered a slice must say so before
914
916
  # finish(), which is what decides whether absence retires
@@ -35,6 +35,7 @@ class AssetType(StrEnum):
35
35
  HIVE = 'HIVE'
36
36
  DATABRICKS = 'DATABRICKS'
37
37
  SNOWFLAKE = 'SNOWFLAKE'
38
+ DREMIO = 'DREMIO'
38
39
  MONGODB = 'MONGODB'
39
40
  NEO4J = 'NEO4J'
40
41
  POWERBI = 'POWERBI'
@@ -101,7 +102,7 @@ class SlackChannelType(StrEnum):
101
102
 
102
103
  class SamplingStrategy(StrEnum):
103
104
  """
104
- Sampling strategy. AUTOMATIC (recommended default) incrementally ingests a new slice of not-yet-seen data on every run, remembering its position between runs and wrapping around to re-scan from the start once everything has been covered — eventually ingesting everything at a bounded cost per run. RANDOM samples items randomly. LATEST prioritises the most recently modified/created items. ALL scans every item with no limit.
105
+ Sampling strategy. AUTOMATIC (recommended default) reads a bounded slice on every run and remembers where it has been: whatever is new since the last run comes first, the rest of the slice continues backwards through older data, and once everything has been covered only new data is read. Changing the source's settings or one of its detectors starts the sweep over. A table or collection with no increasing key cannot tell new rows from old, so it is paged from the start and wraps around instead. RANDOM samples items randomly. LATEST prioritises the most recently modified/created items. ALL scans every item with no limit.
105
106
  """
106
107
 
107
108
  AUTOMATIC = 'AUTOMATIC'
@@ -368,6 +369,7 @@ class Type(StrEnum):
368
369
  HIVE = 'HIVE'
369
370
  DATABRICKS = 'DATABRICKS'
370
371
  SNOWFLAKE = 'SNOWFLAKE'
372
+ DREMIO = 'DREMIO'
371
373
  MONGODB = 'MONGODB'
372
374
  NEO4J = 'NEO4J'
373
375
  POWERBI = 'POWERBI'
@@ -2152,6 +2154,150 @@ class SnowflakeOptional(BaseModel):
2152
2154
  extraction: SnowflakeOptionalExtraction | None = None
2153
2155
 
2154
2156
 
2157
+ class DremioCloudRegion(StrEnum):
2158
+ """
2159
+ Dremio Cloud control plane the project lives in
2160
+ """
2161
+
2162
+ US = 'US'
2163
+ EU = 'EU'
2164
+
2165
+
2166
+ class DremioRequiredSoftware(BaseModel):
2167
+ """
2168
+ A Dremio you run yourself (Dremio Software, Enterprise or Community Edition).
2169
+ """
2170
+
2171
+ model_config = ConfigDict(
2172
+ extra='forbid',
2173
+ )
2174
+ url: AnyUrl = Field(
2175
+ ...,
2176
+ description='Address you open Dremio at, including the port (for example, https://dremio.example.com:9047)',
2177
+ )
2178
+
2179
+
2180
+ class DremioRequiredCloud(BaseModel):
2181
+ """
2182
+ A project in Dremio's hosted service. Signs in with a personal access token.
2183
+ """
2184
+
2185
+ model_config = ConfigDict(
2186
+ extra='forbid',
2187
+ )
2188
+ project_id: str = Field(
2189
+ ...,
2190
+ description='Dremio Cloud project ID (Project Settings > General Information)',
2191
+ )
2192
+ region: DremioCloudRegion
2193
+
2194
+
2195
+ class DremioMaskedPassword(BaseModel):
2196
+ """
2197
+ Self-hosted Dremio only.
2198
+ """
2199
+
2200
+ model_config = ConfigDict(
2201
+ extra='forbid',
2202
+ )
2203
+ username: str = Field(..., description='Dremio login username')
2204
+ password: str = Field(..., description='Dremio login password')
2205
+
2206
+
2207
+ class DremioMaskedToken(BaseModel):
2208
+ """
2209
+ Works for Dremio Cloud and for self-hosted Enterprise Edition.
2210
+ """
2211
+
2212
+ model_config = ConfigDict(
2213
+ extra='forbid',
2214
+ )
2215
+ token: str = Field(
2216
+ ...,
2217
+ description='Dremio personal access token (Account Settings > Personal Access Tokens)',
2218
+ )
2219
+
2220
+
2221
+ class DremioOptionalConnection(BaseModel):
2222
+ """
2223
+ Dremio API and query tuning options.
2224
+ """
2225
+
2226
+ model_config = ConfigDict(
2227
+ extra='forbid',
2228
+ )
2229
+ verify_ssl: bool | None = Field(
2230
+ True,
2231
+ description="Verify the Dremio server's TLS certificate. Turn off only for a self-hosted Dremio with a self-signed certificate.",
2232
+ )
2233
+ timeout_seconds: int | None = Field(
2234
+ 30, description='HTTP timeout for a single Dremio API call', ge=5, le=300
2235
+ )
2236
+ query_timeout_seconds: int | None = Field(
2237
+ 300,
2238
+ description='Maximum time to wait for one sampling query to finish before it is cancelled',
2239
+ ge=10,
2240
+ le=3600,
2241
+ )
2242
+
2243
+
2244
+ class DremioOptionalScope(BaseModel):
2245
+ """
2246
+ Which Dremio sources, spaces, folders, and datasets to scan.
2247
+ """
2248
+
2249
+ model_config = ConfigDict(
2250
+ extra='forbid',
2251
+ )
2252
+ include_paths: list[str] | None = Field(
2253
+ None,
2254
+ description='Optional allowlist of sources, spaces, folders, or datasets, written as dot-separated paths (for example, Marketing or Samples."samples.dremio.com"). Everything beneath a listed path is scanned. Wrap a name that itself contains a dot in double quotes.',
2255
+ )
2256
+ exclude_paths: list[str] | None = Field(
2257
+ [],
2258
+ description='Sources, spaces, folders, or datasets to skip, written the same way as include_paths. Exclusions win over inclusions.',
2259
+ )
2260
+ include_tables: bool | None = Field(
2261
+ True, description='Include tables (physical datasets) in extraction'
2262
+ )
2263
+ include_views: bool | None = Field(
2264
+ True, description='Include views (virtual datasets) in extraction'
2265
+ )
2266
+ include_home_spaces: bool | None = Field(
2267
+ False, description='Include personal home spaces (@username) in extraction'
2268
+ )
2269
+ table_limit: int | None = Field(
2270
+ None, description='Optional cap on number of table/view assets extracted', ge=1
2271
+ )
2272
+
2273
+
2274
+ class DremioOptionalExtraction(BaseModel):
2275
+ """
2276
+ Lineage extraction controls for Dremio.
2277
+ """
2278
+
2279
+ model_config = ConfigDict(
2280
+ extra='forbid',
2281
+ )
2282
+ include_view_lineage: bool | None = Field(
2283
+ True,
2284
+ description="Link each view to the tables and views it reads from. Uses Dremio's own lineage graph where the edition provides it, and the view's SQL otherwise.",
2285
+ )
2286
+ include_source_lineage: bool | None = Field(
2287
+ True,
2288
+ description="Link tables that Dremio reads from an external database (PostgreSQL, MySQL, SQL Server, Oracle, Snowflake) to that database's own table, so lineage continues across systems. Needs permission to view the Dremio source's settings.",
2289
+ )
2290
+
2291
+
2292
+ class DremioOptional(BaseModel):
2293
+ model_config = ConfigDict(
2294
+ extra='forbid',
2295
+ )
2296
+ connection: DremioOptionalConnection | None = None
2297
+ scope: DremioOptionalScope | None = None
2298
+ extraction: DremioOptionalExtraction | None = None
2299
+
2300
+
2155
2301
  class MongoDBDeployment(StrEnum):
2156
2302
  """
2157
2303
  MongoDB deployment mode
@@ -2703,7 +2849,7 @@ class ConfluenceOptionalConnection(BaseModel):
2703
2849
  )
2704
2850
 
2705
2851
 
2706
- class Type21(StrEnum):
2852
+ class Type22(StrEnum):
2707
2853
  """
2708
2854
  Filter spaces by space type
2709
2855
  """
@@ -2740,7 +2886,7 @@ class ConfluenceOptionalScopeSpaces(BaseModel):
2740
2886
  keys: list[str] | None = Field(
2741
2887
  None, description='Filter spaces by keys (up to 250)', max_length=250
2742
2888
  )
2743
- type: Type21 | None = Field(None, description='Filter spaces by space type')
2889
+ type: Type22 | None = Field(None, description='Filter spaces by space type')
2744
2890
  status: Status | None = Field(None, description='Filter spaces by status')
2745
2891
  labels: list[str] | None = Field(
2746
2892
  None,
@@ -3006,7 +3152,7 @@ class ServiceDeskOptional(BaseModel):
3006
3152
  content: ServiceDeskOptionalContent | None = None
3007
3153
 
3008
3154
 
3009
- class Type22(StrEnum):
3155
+ class Type23(StrEnum):
3010
3156
  """
3011
3157
  Type of the asset or source
3012
3158
  """
@@ -3023,6 +3169,7 @@ class Type22(StrEnum):
3023
3169
  HIVE = 'HIVE'
3024
3170
  DATABRICKS = 'DATABRICKS'
3025
3171
  SNOWFLAKE = 'SNOWFLAKE'
3172
+ DREMIO = 'DREMIO'
3026
3173
  MONGODB = 'MONGODB'
3027
3174
  NEO4J = 'NEO4J'
3028
3175
  POWERBI = 'POWERBI'
@@ -5183,6 +5330,30 @@ class SnowflakeInput(CoreInput):
5183
5330
  augmentation: AugmentationConfig | None = None
5184
5331
 
5185
5332
 
5333
+ class DremioInput(CoreInput):
5334
+ type: Literal['DREMIO'] = Field(..., description='Type of the asset or source')
5335
+ required: DremioRequiredSoftware | DremioRequiredCloud = Field(
5336
+ ..., title='DremioRequired'
5337
+ )
5338
+ masked: DremioMaskedToken | DremioMaskedPassword = Field(..., title='DremioMasked')
5339
+ optional: DremioOptional | None = None
5340
+ detectors: list[Detector] | None = Field(
5341
+ None, description='Detectors to run on ingested content'
5342
+ )
5343
+ custom_detectors: list[CustomDetectorSelection] | None = Field(
5344
+ None,
5345
+ description='Reusable custom detector IDs selected from the custom detector catalog.',
5346
+ )
5347
+ sampling: SamplingConfig
5348
+ scan_cache: ScanCacheConfig | None = None
5349
+ resources: ResourceOverrides | None = None
5350
+ cleanup_removed_detector_findings: bool | None = Field(
5351
+ True,
5352
+ 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.',
5353
+ )
5354
+ augmentation: AugmentationConfig | None = None
5355
+
5356
+
5186
5357
  class MongoDBInput(CoreInput):
5187
5358
  type: Literal['MONGODB'] = Field(..., description='Type of the asset or source')
5188
5359
  required: MongoDBRequiredAtlas | MongoDBRequiredOnPrem = Field(
@@ -5848,6 +6019,7 @@ class SourceInput(
5848
6019
  | HiveInput
5849
6020
  | DatabricksInput
5850
6021
  | SnowflakeInput
6022
+ | DremioInput
5851
6023
  | MongoDBInput
5852
6024
  | Neo4jInput
5853
6025
  | PowerBIInput
@@ -5889,6 +6061,7 @@ class SourceInput(
5889
6061
  | HiveInput
5890
6062
  | DatabricksInput
5891
6063
  | SnowflakeInput
6064
+ | DremioInput
5892
6065
  | MongoDBInput
5893
6066
  | Neo4jInput
5894
6067
  | PowerBIInput
@@ -48,6 +48,7 @@ from ..graph.edges import (
48
48
  uses,
49
49
  )
50
50
  from ..utils.sampling_cursor import check_cursor_fits
51
+ from ..utils.sampling_frontier import ListFrontier
51
52
  from ..utils.urn import Urn
52
53
  from .cohort import CohortItem, normalize_bands, select_cohort
53
54
  from .files import DEFAULT_PAGE_SIZE, ParsedContent, pages, parse
@@ -511,6 +512,7 @@ class Context:
511
512
  should_abort: Callable[[], bool] | None = None,
512
513
  query_assets: Callable[[dict[str, Any]], Any] | None = None,
513
514
  cohort_weights: Mapping[str, Mapping[str, float]] | None = None,
515
+ config_changed: bool = False,
514
516
  ) -> None:
515
517
  self._variables = dict(variables or {})
516
518
  self._secrets = dict(secrets or {})
@@ -535,6 +537,8 @@ class Context:
535
537
  }
536
538
  self._cohort_state: dict[str, Any] = {}
537
539
  self._cohort_stats: dict[str, Any] = {}
540
+ self._config_changed = bool(config_changed)
541
+ self._frontier_state: dict[str, Any] = {}
538
542
 
539
543
  # -- configuration -------------------------------------------------------
540
544
 
@@ -710,17 +714,97 @@ class Context:
710
714
  check_cursor_fits(cursor)
711
715
  self._next_cursor = dict(cursor)
712
716
 
717
+ @property
718
+ def config_changed(self) -> bool:
719
+ """True on the first run after this source's settings changed.
720
+
721
+ "Settings" is anything in the source's configuration -- scope,
722
+ sampling, variables, the notebook itself, which detectors are on --
723
+ and the definition of any custom detector it uses. Rotating a secret
724
+ does not count.
725
+
726
+ A built-in source starts its sweep over when that happens. A notebook
727
+ owns its own cursor, so nothing is taken from it; it is told instead,
728
+ and decides::
729
+
730
+ cursor = {} if ctx.config_changed else ctx.cursor
731
+
732
+ The flag stays set until a run finishes, so a run that fails before
733
+ acting on it does not lose it. ``ctx.newest_first()`` acts on it for
734
+ you.
735
+ """
736
+ return self._config_changed
737
+
738
+ def newest_first(
739
+ self,
740
+ items: Iterable[Any],
741
+ *,
742
+ order: Callable[[Any], tuple[Any, str]],
743
+ name: str = "items",
744
+ limit: int | None = None,
745
+ ) -> list[Any]:
746
+ """This run's slice of a listing: what is new first, then the backfill.
747
+
748
+ ::
749
+
750
+ def extract():
751
+ for doc in ctx.newest_first(
752
+ api.list_documents(),
753
+ order=lambda doc: (doc["updated_at"], doc["id"]),
754
+ ):
755
+ yield Asset(id=doc["id"], ...)
756
+
757
+ Pass the whole listing, in any order. ``order`` maps an item to
758
+ ``(rank, id)``: ``rank`` is what makes an item newer -- a timestamp, an
759
+ increasing number -- and must be an int, float or string of one
760
+ consistent type that only changes when the item does; ``id`` is unique
761
+ to the item. Each run gets ``limit`` items (``rows_per_page`` by
762
+ default): everything newer than what earlier runs read comes first,
763
+ the rest continues backwards from where the last run stopped, and once
764
+ the whole listing has been read only new items are returned.
765
+
766
+ The position is kept in the cursor beside whatever you store there,
767
+ one per ``name``, and starts over when ``ctx.config_changed``. Calling
768
+ it declares this run's coverage partial.
769
+ """
770
+ stored = self._cursor.get("frontier")
771
+ previous = stored.get(str(name)) if isinstance(stored, dict) else None
772
+ frontier = ListFrontier(None if self._config_changed else previous)
773
+ window = frontier.window(
774
+ ((*order(item), item) for item in items),
775
+ int(limit) if limit else self.page_size,
776
+ )
777
+ state = frontier.to_state()
778
+ if state is not None:
779
+ self._frontier_state[str(name)] = state
780
+ if not self._partial_coverage:
781
+ self.set_partial_coverage(
782
+ f"the notebook reads a window ({name}) of a larger listing each run"
783
+ )
784
+ return window
785
+
713
786
  @property
714
787
  def next_cursor(self) -> dict[str, Any] | None:
715
- if not self._cohort_state:
788
+ if not self._cohort_state and not self._frontier_state:
716
789
  return None if self._next_cursor is None else dict(self._next_cursor)
717
- # A cohort's position is kept in the same cursor, beside whatever the
718
- # notebook stores -- or, when it stores nothing this run, beside what
719
- # the previous run left, which would otherwise be dropped.
790
+ # A cohort's or a frontier's position is kept in the same cursor,
791
+ # beside whatever the notebook stores -- or, when it stores nothing
792
+ # this run, beside what the previous run left, which would otherwise
793
+ # be dropped.
720
794
  base = self._next_cursor if self._next_cursor is not None else self._cursor
721
- stored = base.get("cohort")
722
- previous: dict[str, Any] = stored if isinstance(stored, dict) else {}
723
- return {**base, "cohort": {**previous, **self._cohort_state}}
795
+ merged = dict(base)
796
+ for section, state in (
797
+ ("cohort", self._cohort_state),
798
+ ("frontier", self._frontier_state),
799
+ ):
800
+ if not state:
801
+ continue
802
+ stored = base.get(section)
803
+ previous: dict[str, Any] = stored if isinstance(stored, dict) else {}
804
+ if section == "frontier" and self._config_changed:
805
+ previous = {}
806
+ merged[section] = {**previous, **state}
807
+ return merged
724
808
 
725
809
  @property
726
810
  def cohort_stats(self) -> dict[str, Any]:
@@ -186,6 +186,9 @@ class FinalizeIngestRunRequest(BaseModel):
186
186
  # AUTOMATIC sampling cursor to persist on the source for the next run.
187
187
  # Omitted (None) for other strategies so the stored cursor is left untouched.
188
188
  sampling_cursor: dict[str, Any] | None = Field(None, serialization_alias="samplingCursor")
189
+ # The settings fingerprint the run was started with, echoed back so the API
190
+ # can record that those settings have now been scanned under.
191
+ sampling_fingerprint: str | None = Field(None, serialization_alias="samplingFingerprint")
189
192
  # What the scan cache saved, so the run can report it.
190
193
  assets_skipped_cached: int | None = Field(None, serialization_alias="assetsSkippedCached")
191
194
  detector_runs_skipped: int | None = Field(None, serialization_alias="detectorRunsSkipped")
@@ -248,6 +251,7 @@ class RestOutputSink:
248
251
  self._runner_id = context.runner_id
249
252
  self._seen_hashes: set[str] = set()
250
253
  self._sampling_cursor: dict[str, Any] | None = None
254
+ self._sampling_fingerprint: str | None = None
251
255
  self._scan_cache_savings: tuple[int, int] | None = None
252
256
  self._partial_coverage: bool = False
253
257
  self._partial_coverage_reason: str = ""
@@ -258,6 +262,10 @@ class RestOutputSink:
258
262
  """Record the AUTOMATIC sampling cursor to persist on finalize."""
259
263
  self._sampling_cursor = cursor
260
264
 
265
+ def set_sampling_fingerprint(self, fingerprint: str | None) -> None:
266
+ """Record the settings fingerprint this run was started with."""
267
+ self._sampling_fingerprint = fingerprint
268
+
261
269
  def set_partial_coverage(self, reason: str = "") -> None:
262
270
  """Mark this run as having covered only part of the source."""
263
271
  self._partial_coverage = True
@@ -364,6 +372,7 @@ class RestOutputSink:
364
372
  runner_id=runner_id,
365
373
  seen_hashes=sorted(self._seen_hashes),
366
374
  sampling_cursor=self._sampling_cursor,
375
+ sampling_fingerprint=self._sampling_fingerprint,
367
376
  assets_skipped_cached=savings[0] if savings else None,
368
377
  detector_runs_skipped=savings[1] if savings else None,
369
378
  # Sent even when zero: "this run emitted edges and lost none" is a