classifyre-cli 0.4.66__tar.gz → 0.4.68__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 (255) hide show
  1. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/.turbo/turbo-build.log +1 -1
  2. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/PKG-INFO +3 -3
  3. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/README.md +2 -2
  4. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/package.json +1 -1
  5. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/pyproject.toml +1 -1
  6. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/main.py +3 -3
  7. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/rest.py +1 -0
  8. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/email/source.py +9 -1
  9. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mssql/source.py +1 -0
  10. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/oracle/source.py +1 -0
  11. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/tabular_base.py +17 -8
  12. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_email_source.py +1 -0
  13. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_outputs.py +39 -0
  14. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/uv.lock +78 -75
  15. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/.gitignore +0 -0
  16. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/.python-version +0 -0
  17. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/main.py +0 -0
  18. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/scripts/generate_models.py +0 -0
  19. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/__init__.py +0 -0
  20. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/config.py +0 -0
  21. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/__init__.py +0 -0
  22. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/base.py +0 -0
  23. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/broken_links/__init__.py +0 -0
  24. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/broken_links/detector.py +0 -0
  25. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/config.py +0 -0
  26. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/content/__init__.py +0 -0
  27. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/__init__.py +0 -0
  28. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/detector.py +0 -0
  29. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/extractor.py +0 -0
  30. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/__init__.py +0 -0
  31. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_base.py +0 -0
  32. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_factory.py +0 -0
  33. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_gliner2.py +0 -0
  34. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_image_classification.py +0 -0
  35. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_llm.py +0 -0
  36. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_object_detection.py +0 -0
  37. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_regex.py +0 -0
  38. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/runners/_text_classification.py +0 -0
  39. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/custom/trainer.py +0 -0
  40. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/dependencies.py +0 -0
  41. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/pii/__init__.py +0 -0
  42. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/pii/detector.py +0 -0
  43. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/secrets/__init__.py +0 -0
  44. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/secrets/detector.py +0 -0
  45. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/threat/__init__.py +0 -0
  46. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/threat/code_security_detector.py +0 -0
  47. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/detectors/threat/yara_detector.py +0 -0
  48. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/file_evaluation/__init__.py +0 -0
  49. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/file_evaluation/runner.py +0 -0
  50. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/models/generated_detectors.py +0 -0
  51. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/models/generated_input.py +0 -0
  52. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/models/generated_single_asset_scan_results.py +0 -0
  53. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/__init__.py +0 -0
  54. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/base.py +0 -0
  55. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/console.py +0 -0
  56. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/factory.py +0 -0
  57. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/outputs/file.py +0 -0
  58. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/__init__.py +0 -0
  59. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/content_provider.py +0 -0
  60. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/detector_pipeline.py +0 -0
  61. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/parsed_content_provider.py +0 -0
  62. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/text_artifact.py +0 -0
  63. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/pipeline/worker_pool.py +0 -0
  64. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/__init__.py +0 -0
  65. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/asset_metadata.py +0 -0
  66. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/atlassian_common.py +0 -0
  67. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/azure_blob_storage/__init__.py +0 -0
  68. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/azure_blob_storage/source.py +0 -0
  69. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/base.py +0 -0
  70. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/confluence/__init__.py +0 -0
  71. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/confluence/source.py +0 -0
  72. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/databricks/__init__.py +0 -0
  73. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/databricks/source.py +0 -0
  74. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/delta_lake/__init__.py +0 -0
  75. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/delta_lake/source.py +0 -0
  76. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/dependencies.py +0 -0
  77. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/elasticsearch/__init__.py +0 -0
  78. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/elasticsearch/source.py +0 -0
  79. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/email/__init__.py +0 -0
  80. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/google_cloud_storage/__init__.py +0 -0
  81. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/google_cloud_storage/source.py +0 -0
  82. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/google_workspace/__init__.py +0 -0
  83. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/google_workspace/source.py +0 -0
  84. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/hive/__init__.py +0 -0
  85. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/hive/source.py +0 -0
  86. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/iceberg/__init__.py +0 -0
  87. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/iceberg/source.py +0 -0
  88. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/jira/__init__.py +0 -0
  89. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/jira/source.py +0 -0
  90. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/kafka/__init__.py +0 -0
  91. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/kafka/source.py +0 -0
  92. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/lakehouse_base.py +0 -0
  93. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/local_folder/__init__.py +0 -0
  94. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/local_folder/source.py +0 -0
  95. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/meilisearch/__init__.py +0 -0
  96. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/meilisearch/source.py +0 -0
  97. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/microsoft_365/__init__.py +0 -0
  98. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/microsoft_365/source.py +0 -0
  99. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mongodb/__init__.py +0 -0
  100. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mongodb/source.py +0 -0
  101. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mssql/__init__.py +0 -0
  102. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mysql/__init__.py +0 -0
  103. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/mysql/source.py +0 -0
  104. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/neo4j/__init__.py +0 -0
  105. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/neo4j/source.py +0 -0
  106. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/notion/__init__.py +0 -0
  107. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/notion/client.py +0 -0
  108. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/notion/source.py +0 -0
  109. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/object_storage/base.py +0 -0
  110. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/opensearch/__init__.py +0 -0
  111. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/opensearch/source.py +0 -0
  112. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/oracle/__init__.py +0 -0
  113. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/postgresql/__init__.py +0 -0
  114. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/postgresql/source.py +0 -0
  115. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/powerbi/__init__.py +0 -0
  116. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/powerbi/source.py +0 -0
  117. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/recipe_normalizer.py +0 -0
  118. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/s3_client.py +0 -0
  119. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/s3_compatible_storage/README.md +0 -0
  120. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/s3_compatible_storage/__init__.py +0 -0
  121. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/s3_compatible_storage/source.py +0 -0
  122. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/sandbox/__init__.py +0 -0
  123. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/sandbox/source.py +0 -0
  124. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/search_engine_base.py +0 -0
  125. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/servicedesk/__init__.py +0 -0
  126. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/servicedesk/source.py +0 -0
  127. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/slack/__init__.py +0 -0
  128. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/slack/source.py +0 -0
  129. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/snowflake/__init__.py +0 -0
  130. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/snowflake/source.py +0 -0
  131. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/sqlite/__init__.py +0 -0
  132. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/sqlite/source.py +0 -0
  133. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/tableau/__init__.py +0 -0
  134. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/tableau/source.py +0 -0
  135. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/tabular_utils.py +0 -0
  136. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/wordpress/__init__.py +0 -0
  137. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/wordpress/source.py +0 -0
  138. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/youtube/__init__.py +0 -0
  139. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/sources/youtube/source.py +0 -0
  140. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/telemetry.py +0 -0
  141. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/__init__.py +0 -0
  142. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/archive_extraction.py +0 -0
  143. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/content_extraction.py +0 -0
  144. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/dependency_groups.py +0 -0
  145. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/embedded_images.py +0 -0
  146. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/file_metadata.py +0 -0
  147. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/file_parser.py +0 -0
  148. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/file_to_images.py +0 -0
  149. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/hashing.py +0 -0
  150. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/legacy_office.py +0 -0
  151. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/resources.py +0 -0
  152. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/transcription.py +0 -0
  153. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/uv_sync.py +0 -0
  154. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/validation.py +0 -0
  155. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/src/utils/video_processing.py +0 -0
  156. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/__init__.py +0 -0
  157. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/_lakehouse_fakes.py +0 -0
  158. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/conftest.py +0 -0
  159. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/__init__.py +0 -0
  160. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/broken_links/test_broken_links_detector.py +0 -0
  161. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/conftest.py +0 -0
  162. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/content/__init__.py +0 -0
  163. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/__init__.py +0 -0
  164. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/conftest.py +0 -0
  165. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_gliner2_classification.py +0 -0
  166. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_invoice_extraction.py +0 -0
  167. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_llm_runner.py +0 -0
  168. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_pipeline_integration.py +0 -0
  169. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_regex_runner.py +0 -0
  170. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_runner_hardening.py +0 -0
  171. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/custom/test_transformer_runners.py +0 -0
  172. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/__init__.py +0 -0
  173. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/conftest.py +0 -0
  174. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/sample_invoice.pdf +0 -0
  175. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/test_pii_chunking.py +0 -0
  176. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/test_pii_detector.py +0 -0
  177. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/test_pii_detector_extended.py +0 -0
  178. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/pii/test_pii_severity.py +0 -0
  179. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/secrets/__init__.py +0 -0
  180. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/secrets/test_secrets_detector.py +0 -0
  181. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/secrets/test_secrets_detector_extended.py +0 -0
  182. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_base_detector.py +0 -0
  183. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_custom_detector_examples_runtime.py +0 -0
  184. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_detector_catalog_commercial.py +0 -0
  185. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_detector_pipeline_types.py +0 -0
  186. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_detector_schema_examples.py +0 -0
  187. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_detector_types.py +0 -0
  188. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_phase2_detectors.py +0 -0
  189. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/test_registry.py +0 -0
  190. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/threat/__init__.py +0 -0
  191. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/threat/test_code_security_detector.py +0 -0
  192. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/detectors/threat/test_yara_detector.py +0 -0
  193. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/integration/test_wordpress_broken_links_detector.py +0 -0
  194. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/integration/test_wordpress_links_assets.py +0 -0
  195. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/pipeline/test_detector_outcomes.py +0 -0
  196. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/pipeline/test_detector_pipeline.py +0 -0
  197. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/pipeline/test_worker_pool.py +0 -0
  198. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_assets_metadata_catalog.py +0 -0
  199. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_azure_blob_storage_source.py +0 -0
  200. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_base_source_attachment.py +0 -0
  201. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_base_source_sampling.py +0 -0
  202. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_config.py +0 -0
  203. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_confluence_source.py +0 -0
  204. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_custom_extractor.py +0 -0
  205. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_databricks_source.py +0 -0
  206. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_delta_lake_source.py +0 -0
  207. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_dependency_groups.py +0 -0
  208. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_elasticsearch_source.py +0 -0
  209. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_file_evaluation_runner.py +0 -0
  210. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_google_cloud_storage_source.py +0 -0
  211. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_google_workspace_source.py +0 -0
  212. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_hashing.py +0 -0
  213. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_hive_source.py +0 -0
  214. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_iceberg_source.py +0 -0
  215. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_jira_source.py +0 -0
  216. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_kafka_source.py +0 -0
  217. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_local_folder_source.py +0 -0
  218. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_main.py +0 -0
  219. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_meilisearch_source.py +0 -0
  220. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_microsoft_365_source.py +0 -0
  221. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_mongodb_source.py +0 -0
  222. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_mssql_source.py +0 -0
  223. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_mysql_source.py +0 -0
  224. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_neo4j_source.py +0 -0
  225. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_notion_source.py +0 -0
  226. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_opensearch_source.py +0 -0
  227. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_oracle_source.py +0 -0
  228. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_postgresql_source.py +0 -0
  229. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_powerbi_source.py +0 -0
  230. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_recipe_normalizer.py +0 -0
  231. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_s3_compatible_storage_source.py +0 -0
  232. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_sampling_automatic.py +0 -0
  233. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_sandbox_source.py +0 -0
  234. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_servicedesk_source.py +0 -0
  235. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_slack_source.py +0 -0
  236. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_snowflake_source.py +0 -0
  237. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_source_dependency_groups.py +0 -0
  238. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_source_strategy_conformance.py +0 -0
  239. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_sqlite_source.py +0 -0
  240. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_tableau_source.py +0 -0
  241. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_tabular_automatic_sampling.py +0 -0
  242. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_tabular_utils.py +0 -0
  243. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_uv_sync.py +0 -0
  244. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_wordpress_source.py +0 -0
  245. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_youtube_source.py +0 -0
  246. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/test_youtube_source_integration.py +0 -0
  247. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_archive_extraction.py +0 -0
  248. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_content_extraction.py +0 -0
  249. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_embedded_images.py +0 -0
  250. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_file_metadata.py +0 -0
  251. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_file_parser.py +0 -0
  252. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_file_to_images.py +0 -0
  253. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_legacy_office.py +0 -0
  254. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_transcription.py +0 -0
  255. {classifyre_cli-0.4.66 → classifyre_cli-0.4.68}/tests/utils/test_video_processing.py +0 -0
@@ -1,3 +1,3 @@
1
1
  $ uv sync
2
- Resolved 300 packages in 215ms
2
+ Resolved 300 packages in 269ms
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.66
3
+ Version: 0.4.68
4
4
  Summary: Classifyre CLI — scan and classify unstructured data sources
5
5
  License: MIT
6
6
  Keywords: data,ingestion,metadata,pii,secrets,unstructured
@@ -84,7 +84,7 @@ Extract output options:
84
84
 
85
85
  - `--output-type rest|file|console`
86
86
  - `--output-batch-size <int>`
87
- - `--output-rest-url <url>`
87
+ - `--output-rest-url <url>` (complete API base, including the namespace path)
88
88
  - `--output-file-path <path>`
89
89
  - `--source-id <uuid>`
90
90
  - `--runner-id <uuid>`
@@ -131,7 +131,7 @@ uv run main.py extract ./wordpress-recipe.json \
131
131
  Notes:
132
132
 
133
133
  - `--runner-id` optional for manual runs. If omitted, CLI creates external runner automatically.
134
- - `--output-rest-url` is optional. If omitted, CLI uses `CLASSIFYRE_OUTPUT_REST_URL`, then `API_URL`, then `http://localhost:8000`.
134
+ - `--output-rest-url` is optional. If omitted, CLI uses `CLASSIFYRE_OUTPUT_REST_URL`, then `API_URL`, then `http://localhost:8000`. In a namespaced deployment, pass the complete base (for example `https://api.example/ns-id`); the CLI appends all asset, finding, runner, and source endpoints beneath it.
135
135
  - `--managed-runner` should be used only for API-orchestrated runs where runner already exists.
136
136
 
137
137
  ### 4) REST output with explicit runner (managed/orchestrated style)
@@ -67,7 +67,7 @@ Extract output options:
67
67
 
68
68
  - `--output-type rest|file|console`
69
69
  - `--output-batch-size <int>`
70
- - `--output-rest-url <url>`
70
+ - `--output-rest-url <url>` (complete API base, including the namespace path)
71
71
  - `--output-file-path <path>`
72
72
  - `--source-id <uuid>`
73
73
  - `--runner-id <uuid>`
@@ -114,7 +114,7 @@ uv run main.py extract ./wordpress-recipe.json \
114
114
  Notes:
115
115
 
116
116
  - `--runner-id` optional for manual runs. If omitted, CLI creates external runner automatically.
117
- - `--output-rest-url` is optional. If omitted, CLI uses `CLASSIFYRE_OUTPUT_REST_URL`, then `API_URL`, then `http://localhost:8000`.
117
+ - `--output-rest-url` is optional. If omitted, CLI uses `CLASSIFYRE_OUTPUT_REST_URL`, then `API_URL`, then `http://localhost:8000`. In a namespaced deployment, pass the complete base (for example `https://api.example/ns-id`); the CLI appends all asset, finding, runner, and source endpoints beneath it.
118
118
  - `--managed-runner` should be used only for API-orchestrated runs where runner already exists.
119
119
 
120
120
  ### 4) REST output with explicit runner (managed/orchestrated style)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@classifyre/cli",
3
- "version": "0.4.66",
3
+ "version": "0.4.68",
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.66"
3
+ version = "0.4.68"
4
4
  description = "Classifyre CLI — scan and classify unstructured data sources"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -400,7 +400,7 @@ async def run_command_async(args: argparse.Namespace, recipe: dict[str, Any]) ->
400
400
  try:
401
401
  error_msg = str(exc) or type(exc).__name__
402
402
  await sink.update_asset_status(
403
- asset_hash, "ERROR", error_msg
403
+ asset_hash, "ERROR", error_message=error_msg
404
404
  )
405
405
  except Exception:
406
406
  pass
@@ -612,8 +612,8 @@ def main() -> None:
612
612
  "--output-rest-url",
613
613
  default=None,
614
614
  help=(
615
- "REST output base URL (defaults to CLASSIFYRE_OUTPUT_REST_URL, API_URL, "
616
- "or http://localhost:8000)"
615
+ "Complete REST API base URL, including any namespace/path prefix "
616
+ "(defaults to CLASSIFYRE_OUTPUT_REST_URL, API_URL, or http://localhost:8000)"
617
617
  ),
618
618
  )
619
619
  parser.add_argument(
@@ -334,6 +334,7 @@ class RestOutputSink:
334
334
  self,
335
335
  asset_hash: str,
336
336
  status: str,
337
+ *,
337
338
  error_message: str | None = None,
338
339
  findings_total: int | None = None,
339
340
  findings_by_severity: dict[str, int] | None = None,
@@ -318,7 +318,14 @@ class EmailSource(BaseSource):
318
318
  if self.include_attachments:
319
319
  for idx, att in enumerate(msg.attachments or []):
320
320
  asset = self._attachment_to_asset(
321
- att, idx, message_id, email_hash, email_url, folder, msg.uid, created
321
+ att,
322
+ idx,
323
+ message_id=message_id,
324
+ email_hash=email_hash,
325
+ email_url=email_url,
326
+ folder=folder,
327
+ uid=msg.uid,
328
+ created=created,
322
329
  )
323
330
  attachment_assets.append(asset)
324
331
  attachment_hashes.append(asset.hash)
@@ -376,6 +383,7 @@ class EmailSource(BaseSource):
376
383
  self,
377
384
  att: Any,
378
385
  idx: int,
386
+ *,
379
387
  message_id: str,
380
388
  email_hash: str,
381
389
  email_url: str,
@@ -209,6 +209,7 @@ class MSSQLSource(BaseTabularSource):
209
209
  self,
210
210
  conn: Any,
211
211
  base_query: str,
212
+ *,
212
213
  page_size: int,
213
214
  pk_columns: list[str],
214
215
  pk_order: str,
@@ -178,6 +178,7 @@ class OracleSource(BaseTabularSource):
178
178
  self,
179
179
  conn: Any,
180
180
  base_query: str,
181
+ *,
181
182
  page_size: int,
182
183
  pk_columns: list[str],
183
184
  pk_order: str,
@@ -9,6 +9,7 @@ excluded schemas, random function, etc.).
9
9
  from __future__ import annotations
10
10
 
11
11
  import asyncio
12
+ import functools
12
13
  import logging
13
14
  import threading
14
15
  from abc import abstractmethod
@@ -536,6 +537,7 @@ class BaseTabularSource(BaseSource):
536
537
  self,
537
538
  conn: Any,
538
539
  base_query: str,
540
+ *,
539
541
  page_size: int,
540
542
  pk_columns: list[str],
541
543
  pk_order: str,
@@ -659,7 +661,12 @@ class BaseTabularSource(BaseSource):
659
661
  last_pk_values = saved_pk if isinstance(saved_pk, list) and saved_pk else None
660
662
  pk_order = ", ".join(self._quote_identifier(c) for c in pk_columns)
661
663
  rows, column_names = self._fetch_page_keyset(
662
- conn, base_query, rows_per_page, pk_columns, pk_order, last_pk_values
664
+ conn,
665
+ base_query,
666
+ page_size=rows_per_page,
667
+ pk_columns=pk_columns,
668
+ pk_order=pk_order,
669
+ last_pk_values=last_pk_values,
663
670
  )
664
671
  if not rows or len(rows) < rows_per_page:
665
672
  next_state: dict[str, Any] | None = None # exhausted → wrap next run
@@ -919,13 +926,15 @@ class BaseTabularSource(BaseSource):
919
926
 
920
927
  if use_keyset:
921
928
  rows, column_names = await asyncio.to_thread(
922
- self._fetch_page_keyset,
923
- conn,
924
- query,
925
- rows_per_page,
926
- pk_columns,
927
- pk_order,
928
- last_pk_values,
929
+ functools.partial(
930
+ self._fetch_page_keyset,
931
+ conn,
932
+ query,
933
+ page_size=rows_per_page,
934
+ pk_columns=pk_columns,
935
+ pk_order=pk_order,
936
+ last_pk_values=last_pk_values,
937
+ )
929
938
  )
930
939
  else:
931
940
  rows = await asyncio.to_thread(self._cursor_fetchmany, cursor, rows_per_page)
@@ -29,6 +29,7 @@ class FakeMsg:
29
29
  uid,
30
30
  subject,
31
31
  from_,
32
+ *,
32
33
  to=(),
33
34
  cc=(),
34
35
  date=None,
@@ -215,6 +215,45 @@ async def test_rest_output_managed_runner_flow(monkeypatch: pytest.MonkeyPatch)
215
215
  assert "samplingCursor" not in fake_session.calls[1]["json"]
216
216
 
217
217
 
218
+ @pytest.mark.asyncio
219
+ async def test_rest_output_keeps_namespace_base_for_discovery_and_finding_batches(
220
+ monkeypatch: pytest.MonkeyPatch,
221
+ ) -> None:
222
+ fake_session = _FakeSession(responses=[_FakeResponse({}), _FakeResponse({})])
223
+ monkeypatch.setattr("src.outputs.rest.requests.Session", lambda: fake_session)
224
+
225
+ context = OutputRuntimeContext(
226
+ source_id="source-1",
227
+ runner_id="runner-1",
228
+ managed_runner=True,
229
+ batch_size=20,
230
+ )
231
+ sink = RestOutputSink(
232
+ context,
233
+ base_url="http://api.internal/prefix/namespace-id/",
234
+ timeout_sec=30,
235
+ )
236
+
237
+ await sink.register_discovered_assets(["hash-1", "hash-2"])
238
+ await sink.emit_batch(
239
+ [
240
+ {
241
+ "hash": "hash-1",
242
+ "findings": [{"finding_type": "EMAIL", "matched_content": "a@b.test"}],
243
+ }
244
+ ]
245
+ )
246
+
247
+ assert fake_session.calls[0]["url"] == (
248
+ "http://api.internal/prefix/namespace-id/runners/runner-1/assets/discover"
249
+ )
250
+ assert fake_session.calls[0]["json"]["assetHashes"] == ["hash-1", "hash-2"]
251
+ assert fake_session.calls[1]["url"] == (
252
+ "http://api.internal/prefix/namespace-id/sources/source-1/assets/bulk"
253
+ )
254
+ assert fake_session.calls[1]["json"]["assets"][0]["findings"][0]["finding_type"] == "EMAIL"
255
+
256
+
218
257
  @pytest.mark.asyncio
219
258
  async def test_rest_output_finalize_includes_sampling_cursor(
220
259
  monkeypatch: pytest.MonkeyPatch,