castor-extractor 0.24.49__tar.gz → 0.24.54__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.

Potentially problematic release.


This version of castor-extractor might be problematic. Click here for more details.

Files changed (439) hide show
  1. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/CHANGELOG.md +20 -0
  2. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/PKG-INFO +21 -1
  3. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/formatter.py +29 -3
  4. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/client/client.py +7 -1
  5. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/client/client_test.py +36 -4
  6. castor_extractor-0.24.54/castor_extractor/visualization/sigma/client/authentication.py +68 -0
  7. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/client/client.py +1 -21
  8. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/client.py +26 -26
  9. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/queries/query.sql +4 -4
  10. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/queries/schema.sql +3 -3
  11. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/queries/table.sql +6 -6
  12. castor_extractor-0.24.54/castor_extractor/warehouse/sqlserver/queries/user.sql +4 -0
  13. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/queries/view_ddl.sql +3 -3
  14. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/query.py +10 -6
  15. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/pyproject.toml +1 -1
  16. castor_extractor-0.24.49/castor_extractor/warehouse/sqlserver/queries/user.sql +0 -4
  17. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/Dockerfile +0 -0
  18. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/DockerfileUsage.md +0 -0
  19. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/LICENCE +0 -0
  20. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/README.md +0 -0
  21. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/__init__.py +0 -0
  22. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/__init__.py +0 -0
  23. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_bigquery.py +0 -0
  24. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_confluence.py +0 -0
  25. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_databricks.py +0 -0
  26. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_domo.py +0 -0
  27. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_looker.py +0 -0
  28. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_looker_studio.py +0 -0
  29. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_metabase_api.py +0 -0
  30. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_metabase_db.py +0 -0
  31. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_mode.py +0 -0
  32. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_mysql.py +0 -0
  33. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_notion.py +0 -0
  34. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_postgres.py +0 -0
  35. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_powerbi.py +0 -0
  36. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_qlik.py +0 -0
  37. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_redshift.py +0 -0
  38. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_salesforce.py +0 -0
  39. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_salesforce_reporting.py +0 -0
  40. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_sigma.py +0 -0
  41. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_snowflake.py +0 -0
  42. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_sqlserver.py +0 -0
  43. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_strategy.py +0 -0
  44. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_tableau.py +0 -0
  45. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/extract_thoughtspot.py +0 -0
  46. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/file_check.py +0 -0
  47. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/commands/upload.py +0 -0
  48. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/__init__.py +0 -0
  49. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/column.py +0 -0
  50. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/column_test.py +0 -0
  51. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/constants.py +0 -0
  52. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/enums.py +0 -0
  53. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/file.py +0 -0
  54. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/file_test.py +0 -0
  55. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/file_test_users.csv +0 -0
  56. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
  57. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/templates/__init__.py +0 -0
  58. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
  59. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/__init__.py +0 -0
  60. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/__init__.py +0 -0
  61. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/assets.py +0 -0
  62. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/client/__init__.py +0 -0
  63. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/client/client.py +0 -0
  64. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/client/client_test.py +0 -0
  65. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/client/credentials.py +0 -0
  66. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/client/endpoints.py +0 -0
  67. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/client/pagination.py +0 -0
  68. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/extract.py +0 -0
  69. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/utils.py +0 -0
  70. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/confluence/utils_test.py +0 -0
  71. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/notion/__init__.py +0 -0
  72. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/notion/assets.py +0 -0
  73. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/notion/client/__init__.py +0 -0
  74. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/notion/client/client.py +0 -0
  75. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/notion/client/client_test.py +0 -0
  76. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/notion/client/constants.py +0 -0
  77. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/notion/client/credentials.py +0 -0
  78. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/notion/client/endpoints.py +0 -0
  79. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/notion/client/pagination.py +0 -0
  80. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/knowledge/notion/extract.py +0 -0
  81. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/logger.py +0 -0
  82. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/quality/__init__.py +0 -0
  83. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/quality/soda/__init__.py +0 -0
  84. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/quality/soda/assets.py +0 -0
  85. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/quality/soda/client/__init__.py +0 -0
  86. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/quality/soda/client/client.py +0 -0
  87. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/quality/soda/client/credentials.py +0 -0
  88. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/quality/soda/client/endpoints.py +0 -0
  89. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/quality/soda/client/pagination.py +0 -0
  90. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/__init__.py +0 -0
  91. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/coalesce/__init__.py +0 -0
  92. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/coalesce/assets.py +0 -0
  93. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/coalesce/client/__init__.py +0 -0
  94. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/coalesce/client/client.py +0 -0
  95. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/coalesce/client/credentials.py +0 -0
  96. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/coalesce/client/endpoint.py +0 -0
  97. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/coalesce/client/pagination.py +0 -0
  98. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/dbt/__init__.py +0 -0
  99. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/dbt/assets.py +0 -0
  100. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/dbt/client.py +0 -0
  101. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/dbt/client_test.py +0 -0
  102. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/transformation/dbt/credentials.py +0 -0
  103. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/types.py +0 -0
  104. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/uploader/__init__.py +0 -0
  105. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/uploader/constant.py +0 -0
  106. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/uploader/enums.py +0 -0
  107. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/uploader/env.py +0 -0
  108. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/uploader/env_test.py +0 -0
  109. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/uploader/settings.py +0 -0
  110. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/uploader/upload.py +0 -0
  111. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/uploader/upload_test.py +0 -0
  112. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/uploader/utils.py +0 -0
  113. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/__init__.py +0 -0
  114. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/argument_parser.py +0 -0
  115. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/argument_parser_test.py +0 -0
  116. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/batch.py +0 -0
  117. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/batch_test.py +0 -0
  118. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/__init__.py +0 -0
  119. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/abstract.py +0 -0
  120. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/__init__.py +0 -0
  121. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/auth.py +0 -0
  122. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/auth_test.py +0 -0
  123. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/client.py +0 -0
  124. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/client_test.py +0 -0
  125. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/pagination.py +0 -0
  126. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/pagination_test.py +0 -0
  127. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/safe_request.py +0 -0
  128. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/safe_request_test.py +0 -0
  129. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/utils.py +0 -0
  130. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/api/utils_test.py +0 -0
  131. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/postgres.py +0 -0
  132. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/query.py +0 -0
  133. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/uri.py +0 -0
  134. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/client/uri_test.py +0 -0
  135. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/collection.py +0 -0
  136. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/collection_test.py +0 -0
  137. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/constants.py +0 -0
  138. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/deprecate.py +0 -0
  139. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/env.py +0 -0
  140. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/files.py +0 -0
  141. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/files_test.py +0 -0
  142. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/formatter_test.csv +0 -0
  143. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/formatter_test.json +0 -0
  144. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/formatter_test.py +0 -0
  145. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/json_stream_write.py +0 -0
  146. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/load.py +0 -0
  147. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/object.py +0 -0
  148. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/object_test.py +0 -0
  149. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/pager/__init__.py +0 -0
  150. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/pager/pager.py +0 -0
  151. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/pager/pager_on_id.py +0 -0
  152. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/pager/pager_on_id_test.py +0 -0
  153. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/pager/pager_test.py +0 -0
  154. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/retry.py +0 -0
  155. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/retry_test.py +0 -0
  156. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/safe.py +0 -0
  157. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/safe_test.py +0 -0
  158. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/salesforce/__init__.py +0 -0
  159. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/salesforce/client.py +0 -0
  160. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/salesforce/client_test.py +0 -0
  161. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/salesforce/constants.py +0 -0
  162. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/salesforce/credentials.py +0 -0
  163. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/salesforce/credentials_test.py +0 -0
  164. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/salesforce/pagination.py +0 -0
  165. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/store.py +0 -0
  166. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/string.py +0 -0
  167. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/string_test.py +0 -0
  168. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/time.py +0 -0
  169. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/time_test.py +0 -0
  170. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/type.py +0 -0
  171. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/url.py +0 -0
  172. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/url_test.py +0 -0
  173. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/validation.py +0 -0
  174. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/validation_test.py +0 -0
  175. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/utils/write.py +0 -0
  176. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/__init__.py +0 -0
  177. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/domo/__init__.py +0 -0
  178. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/domo/assets.py +0 -0
  179. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/domo/client/__init__.py +0 -0
  180. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/domo/client/client.py +0 -0
  181. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/domo/client/credentials.py +0 -0
  182. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/domo/client/endpoints.py +0 -0
  183. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/domo/client/pagination.py +0 -0
  184. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/domo/client/pagination_test.py +0 -0
  185. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/domo/extract.py +0 -0
  186. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/__init__.py +0 -0
  187. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/api/__init__.py +0 -0
  188. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/api/client.py +0 -0
  189. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/api/client_test.py +0 -0
  190. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/api/constants.py +0 -0
  191. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/api/credentials.py +0 -0
  192. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/api/extraction_parameters.py +0 -0
  193. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/api/sdk.py +0 -0
  194. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
  195. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/api/utils.py +0 -0
  196. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/assets.py +0 -0
  197. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/constant.py +0 -0
  198. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/constants.py +0 -0
  199. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/extract.py +0 -0
  200. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/fields.py +0 -0
  201. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/fields_test.py +0 -0
  202. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker/multithreading.py +0 -0
  203. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/__init__.py +0 -0
  204. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/assets.py +0 -0
  205. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/client/__init__.py +0 -0
  206. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/client/admin_sdk_client.py +0 -0
  207. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/client/client.py +0 -0
  208. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/client/credentials.py +0 -0
  209. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/client/endpoints.py +0 -0
  210. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/client/enums.py +0 -0
  211. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/client/looker_studio_api_client.py +0 -0
  212. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/client/pagination.py +0 -0
  213. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/client/queries/query.sql +0 -0
  214. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/extract.py +0 -0
  215. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/looker_studio/extract_test.py +0 -0
  216. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/__init__.py +0 -0
  217. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/assets.py +0 -0
  218. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
  219. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
  220. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/api/client.py +0 -0
  221. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/api/client_test.py +0 -0
  222. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
  223. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
  224. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/client.py +0 -0
  225. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/credentials.py +0 -0
  226. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
  227. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
  228. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
  229. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
  230. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
  231. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
  232. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
  233. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
  234. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
  235. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
  236. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
  237. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/client/shared.py +0 -0
  238. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/errors.py +0 -0
  239. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/extract.py +0 -0
  240. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/metabase/types.py +0 -0
  241. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/mode/__init__.py +0 -0
  242. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/mode/assets.py +0 -0
  243. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/mode/client/__init__.py +0 -0
  244. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/mode/client/client.py +0 -0
  245. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/mode/client/client_test.json +0 -0
  246. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/mode/client/client_test.py +0 -0
  247. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/mode/client/constants.py +0 -0
  248. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/mode/client/credentials.py +0 -0
  249. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/mode/errors.py +0 -0
  250. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/mode/extract.py +0 -0
  251. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/__init__.py +0 -0
  252. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/assets.py +0 -0
  253. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/client/__init__.py +0 -0
  254. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/client/authentication.py +0 -0
  255. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/client/constants.py +0 -0
  256. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/client/credentials.py +0 -0
  257. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/client/credentials_test.py +0 -0
  258. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/client/endpoints.py +0 -0
  259. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/client/pagination.py +0 -0
  260. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/powerbi/extract.py +0 -0
  261. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/__init__.py +0 -0
  262. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/assets.py +0 -0
  263. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
  264. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/constants.py +0 -0
  265. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
  266. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/engine/client.py +0 -0
  267. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/engine/constants.py +0 -0
  268. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/engine/credentials.py +0 -0
  269. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/engine/error.py +0 -0
  270. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/engine/error_test.py +0 -0
  271. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +0 -0
  272. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
  273. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/engine/websocket.py +0 -0
  274. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/master.py +0 -0
  275. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/rest.py +0 -0
  276. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/client/rest_test.py +0 -0
  277. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/qlik/extract.py +0 -0
  278. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/salesforce_reporting/__init__.py +0 -0
  279. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/salesforce_reporting/assets.py +0 -0
  280. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/salesforce_reporting/client/__init__.py +0 -0
  281. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/salesforce_reporting/client/rest.py +0 -0
  282. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/salesforce_reporting/client/soql.py +0 -0
  283. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/salesforce_reporting/extract.py +0 -0
  284. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/__init__.py +0 -0
  285. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/assets.py +0 -0
  286. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
  287. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/client/client_test.py +0 -0
  288. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
  289. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/client/endpoints.py +0 -0
  290. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/client/pagination.py +0 -0
  291. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/client/sources_transformer.py +0 -0
  292. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/client/sources_transformer_test.py +0 -0
  293. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/sigma/extract.py +0 -0
  294. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/strategy/__init__.py +0 -0
  295. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/strategy/assets.py +0 -0
  296. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/strategy/client/__init__.py +0 -0
  297. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/strategy/client/client.py +0 -0
  298. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/strategy/client/credentials.py +0 -0
  299. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/strategy/client/properties.py +0 -0
  300. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/strategy/extract.py +0 -0
  301. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/__init__.py +0 -0
  302. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/assets.py +0 -0
  303. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/client/__init__.py +0 -0
  304. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/client/client.py +0 -0
  305. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/client/client_metadata_api.py +0 -0
  306. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/client/client_metadata_api_test.py +0 -0
  307. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/client/client_rest_api.py +0 -0
  308. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/client/client_tsc.py +0 -0
  309. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/client/credentials.py +0 -0
  310. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/client/errors.py +0 -0
  311. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/client/gql_queries.py +0 -0
  312. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/client/rest_fields.py +0 -0
  313. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/constants.py +0 -0
  314. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/tableau/extract.py +0 -0
  315. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/thoughtspot/__init__.py +0 -0
  316. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/thoughtspot/assets.py +0 -0
  317. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/thoughtspot/client/__init__.py +0 -0
  318. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/thoughtspot/client/client.py +0 -0
  319. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/thoughtspot/client/credentials.py +0 -0
  320. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/thoughtspot/client/endpoints.py +0 -0
  321. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/thoughtspot/client/pagination.py +0 -0
  322. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/visualization/thoughtspot/extract.py +0 -0
  323. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/__init__.py +0 -0
  324. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/abstract/__init__.py +0 -0
  325. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/abstract/asset.py +0 -0
  326. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/abstract/asset_test.py +0 -0
  327. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/abstract/extract.py +0 -0
  328. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/abstract/query.py +0 -0
  329. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/abstract/time_filter.py +0 -0
  330. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
  331. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
  332. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/client.py +0 -0
  333. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
  334. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/credentials.py +0 -0
  335. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/extract.py +0 -0
  336. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
  337. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
  338. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
  339. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
  340. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
  341. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
  342. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
  343. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
  344. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
  345. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
  346. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/query.py +0 -0
  347. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/bigquery/types.py +0 -0
  348. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/__init__.py +0 -0
  349. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/api_client.py +0 -0
  350. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/api_client_test.py +0 -0
  351. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/client.py +0 -0
  352. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/client_test.py +0 -0
  353. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/credentials.py +0 -0
  354. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/endpoints.py +0 -0
  355. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/enums.py +0 -0
  356. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/extract.py +0 -0
  357. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/format.py +0 -0
  358. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/format_test.py +0 -0
  359. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/pagination.py +0 -0
  360. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/queries/column_lineage.sql +0 -0
  361. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/queries/table_lineage.sql +0 -0
  362. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/sql_client.py +0 -0
  363. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/types.py +0 -0
  364. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/utils.py +0 -0
  365. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/databricks/utils_test.py +0 -0
  366. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/__init__.py +0 -0
  367. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/client.py +0 -0
  368. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/client_test.py +0 -0
  369. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/extract.py +0 -0
  370. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/queries/.sqlfluff +0 -0
  371. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/queries/column.sql +0 -0
  372. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/queries/database.sql +0 -0
  373. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/queries/query.sql +0 -0
  374. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/queries/schema.sql +0 -0
  375. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/queries/table.sql +0 -0
  376. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/queries/user.sql +0 -0
  377. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/queries/view_ddl.sql +0 -0
  378. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/mysql/query.py +0 -0
  379. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/postgres/__init__.py +0 -0
  380. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/postgres/extract.py +0 -0
  381. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
  382. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
  383. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
  384. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
  385. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
  386. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
  387. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
  388. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/postgres/query.py +0 -0
  389. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/__init__.py +0 -0
  390. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/client.py +0 -0
  391. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/client_test.py +0 -0
  392. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/extract.py +0 -0
  393. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/extract_test.py +0 -0
  394. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
  395. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
  396. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
  397. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
  398. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/query.sql +0 -0
  399. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/query_serverless.sql +0 -0
  400. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
  401. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
  402. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
  403. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
  404. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
  405. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/redshift/query.py +0 -0
  406. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/salesforce/__init__.py +0 -0
  407. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/salesforce/client.py +0 -0
  408. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/salesforce/constants.py +0 -0
  409. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/salesforce/extract.py +0 -0
  410. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/salesforce/format.py +0 -0
  411. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/salesforce/format_test.py +0 -0
  412. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/salesforce/pagination.py +0 -0
  413. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/salesforce/soql.py +0 -0
  414. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/__init__.py +0 -0
  415. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/client.py +0 -0
  416. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/client_test.py +0 -0
  417. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/credentials.py +0 -0
  418. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/credentials_test.py +0 -0
  419. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/extract.py +0 -0
  420. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
  421. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/column.sql +0 -0
  422. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +0 -0
  423. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/database.sql +0 -0
  424. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/function.sql +0 -0
  425. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -0
  426. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -0
  427. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/query.sql +0 -0
  428. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/role.sql +0 -0
  429. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/schema.sql +0 -0
  430. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/table.sql +0 -0
  431. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
  432. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +0 -0
  433. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/snowflake/query.py +0 -0
  434. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/__init__.py +0 -0
  435. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/extract.py +0 -0
  436. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/queries/.sqlfluff +0 -0
  437. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/queries/column.sql +0 -0
  438. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/sqlserver/queries/database.sql +0 -0
  439. {castor_extractor-0.24.49 → castor_extractor-0.24.54}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.24.54 - 2025-09-18
4
+
5
+ * SqlServer: fix typo in the extraction query of schemas
6
+
7
+ ## 0.24.53 - 2025-09-18
8
+
9
+ * Fix CSV field size to support running on Windows
10
+
11
+ ## 0.24.52 - 2025-09-18
12
+
13
+ * SqlServer : improve extraction of users and technical owners
14
+
15
+ ## 0.24.51 - 2025-09-17
16
+
17
+ * PowerBI : don't store sensitive data in activity events
18
+
19
+ ## 0.24.50 - 2025-09-15
20
+
21
+ * SqlServer: support multiple databases in queries
22
+
3
23
  ## 0.24.49 - 2025-09-12
4
24
 
5
25
  * Tableau: add option to bypass ssl certificate verification
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: castor-extractor
3
- Version: 0.24.49
3
+ Version: 0.24.54
4
4
  Summary: Extract your metadata assets.
5
5
  Home-page: https://www.castordoc.com/
6
6
  License: EULA
@@ -215,6 +215,26 @@ For any questions or bug report, contact us at [support@coalesce.io](mailto:supp
215
215
 
216
216
  # Changelog
217
217
 
218
+ ## 0.24.54 - 2025-09-18
219
+
220
+ * SqlServer: fix typo in the extraction query of schemas
221
+
222
+ ## 0.24.53 - 2025-09-18
223
+
224
+ * Fix CSV field size to support running on Windows
225
+
226
+ ## 0.24.52 - 2025-09-18
227
+
228
+ * SqlServer : improve extraction of users and technical owners
229
+
230
+ ## 0.24.51 - 2025-09-17
231
+
232
+ * PowerBI : don't store sensitive data in activity events
233
+
234
+ ## 0.24.50 - 2025-09-15
235
+
236
+ * SqlServer: support multiple databases in queries
237
+
218
238
  ## 0.24.49 - 2025-09-12
219
239
 
220
240
  * Tableau: add option to bypass ssl certificate verification
@@ -1,6 +1,7 @@
1
1
  """convert files to csv"""
2
2
 
3
3
  import csv
4
+ import ctypes
4
5
  import json
5
6
  import logging
6
7
  import re
@@ -21,6 +22,8 @@ CSV_OPTIONS: CsvOptions = {
21
22
  "quotechar": '"',
22
23
  }
23
24
 
25
+ CSV_FIELD_SIZE_MB = 100
26
+
24
27
  ScalarValue = Union[int, float, None, str]
25
28
 
26
29
  logger = logging.getLogger(__name__)
@@ -132,6 +135,31 @@ class Formatter(ABC):
132
135
  pass
133
136
 
134
137
 
138
+ def _set_csv_field_size_limit(target_limit_mb: int) -> None:
139
+ """
140
+ Safely set the maximum CSV field size limit across platforms.
141
+
142
+ This function wraps `csv.field_size_limit()` to avoid `OverflowError` on
143
+ Windows, where the maximum C long is only 32 bits (2^31 - 1). On Linux and
144
+ macOS, the C long is typically 64 bits, allowing much larger values.
145
+
146
+ The requested limit is specified in megabytes and converted to bytes.
147
+
148
+ It is then clamped to the maximum value supported by:
149
+ - the current platform's C long
150
+ - Python's `sys.maxsize`
151
+ - the requested target limit
152
+ """
153
+ target_limit_bytes = target_limit_mb * 1024**2
154
+
155
+ # max value of C long for the current platform
156
+ platform_c_long = (1 << (8 * ctypes.sizeof(ctypes.c_long) - 1)) - 1
157
+
158
+ limit_bytes = min(target_limit_bytes, sys.maxsize, platform_c_long)
159
+
160
+ csv.field_size_limit(limit_bytes)
161
+
162
+
135
163
  class CsvFormatter(Formatter):
136
164
  """
137
165
  Serialize/Deserialize CSV
@@ -141,9 +169,7 @@ class CsvFormatter(Formatter):
141
169
  return "csv"
142
170
 
143
171
  # increase the size limit (some fields are very large)
144
- # Limit to 100 MB. Value must be smaller than the C long maximum value.
145
- size_limit = min(sys.maxsize, 100 * 1024**3)
146
- csv.field_size_limit(size_limit)
172
+ _set_csv_field_size_limit(target_limit_mb=CSV_FIELD_SIZE_MB)
147
173
 
148
174
  @staticmethod
149
175
  def serialize(buffer: IO[str], data: Iterable[dict]) -> bool:
@@ -33,6 +33,8 @@ POWERBI_SCAN_TIMEOUT_S = 60
33
33
  MAX_RETRY_PAGES = 1
34
34
  RETRY_PAGES_TIMEOUT_MS = 35 * 1000 # 35 seconds
35
35
 
36
+ KEYS_TO_HIDE = ("ClientIP", "UserAgent")
37
+
36
38
  logger = logging.getLogger(__name__)
37
39
 
38
40
 
@@ -61,7 +63,11 @@ class PowerbiClient(APIClient):
61
63
  self._get,
62
64
  endpoint=self.endpoint_factory.activity_events(day),
63
65
  )
64
- yield from fetch_all_pages(request, PowerBiPagination)
66
+ for event in fetch_all_pages(request, PowerBiPagination):
67
+ for key in KEYS_TO_HIDE:
68
+ if key in event:
69
+ del event[key]
70
+ yield event
65
71
 
66
72
  def _datasets(self) -> Iterator[dict]:
67
73
  """
@@ -142,17 +142,44 @@ def test__activity_events(power_bi_client):
142
142
  day = date.today()
143
143
  mocked_get_results = [
144
144
  {
145
- Keys.ACTIVITY_EVENT_ENTITIES: ["foo", "bar"],
145
+ Keys.ACTIVITY_EVENT_ENTITIES: [
146
+ {
147
+ "id": "foo",
148
+ "name": "Foo",
149
+ "ClientIP": "1.1.1.1",
150
+ "UserAgent": "Mozilla/5.0",
151
+ },
152
+ {
153
+ "id": "bar",
154
+ "name": "Bar",
155
+ "ClientIP": "1.1.1.2",
156
+ "UserAgent": "Mozilla/5.0",
157
+ },
158
+ ],
146
159
  Keys.LAST_RESULT_SET: False,
147
160
  Keys.CONTINUATION_URI: "https://next-call-1",
148
161
  },
149
162
  {
150
- Keys.ACTIVITY_EVENT_ENTITIES: ["baz"],
163
+ Keys.ACTIVITY_EVENT_ENTITIES: [
164
+ {
165
+ "id": "baz",
166
+ "name": "Baz",
167
+ "ClientIP": "1.1.1.3",
168
+ "UserAgent": "Mozilla/5.0",
169
+ }
170
+ ],
151
171
  Keys.LAST_RESULT_SET: False,
152
172
  Keys.CONTINUATION_URI: "https://next-call-2",
153
173
  },
154
174
  {
155
- Keys.ACTIVITY_EVENT_ENTITIES: ["biz"],
175
+ Keys.ACTIVITY_EVENT_ENTITIES: [
176
+ {
177
+ "id": "biz",
178
+ "name": "Biz",
179
+ "ClientIP": "1.1.1.4",
180
+ "UserAgent": "Mozilla/5.0",
181
+ }
182
+ ],
156
183
  Keys.LAST_RESULT_SET: True,
157
184
  Keys.CONTINUATION_URI: None,
158
185
  },
@@ -162,7 +189,12 @@ def test__activity_events(power_bi_client):
162
189
  mocked_get.side_effect = mocked_get_results
163
190
 
164
191
  result = list(power_bi_client._activity_events(day=day))
165
- assert result == ["foo", "bar", "baz", "biz"]
192
+ assert result == [
193
+ {"id": "foo", "name": "Foo"},
194
+ {"id": "bar", "name": "Bar"},
195
+ {"id": "baz", "name": "Baz"},
196
+ {"id": "biz", "name": "Biz"},
197
+ ]
166
198
 
167
199
  expected_calls = [
168
200
  call(endpoint=ENDPOINT_FACTORY.activity_events(day=day)),
@@ -0,0 +1,68 @@
1
+ import logging
2
+ import threading
3
+ import time
4
+ from typing import Optional
5
+
6
+ import requests
7
+
8
+ from ....utils import (
9
+ BearerAuth,
10
+ build_url,
11
+ handle_response,
12
+ )
13
+ from .endpoints import (
14
+ SigmaEndpointFactory,
15
+ )
16
+
17
+ logger = logging.getLogger(__name__)
18
+
19
+
20
+ _AUTH_TIMEOUT_S = 60
21
+ _REFRESH_BUFFER_S = 300
22
+
23
+
24
+ class SigmaBearerAuth(BearerAuth):
25
+ def __init__(self, host: str, token_payload: dict[str, str]):
26
+ auth_endpoint = SigmaEndpointFactory.authentication()
27
+ self.authentication_url = build_url(host, auth_endpoint)
28
+ self.token_payload = token_payload
29
+ self._token_expires_at: Optional[float] = None
30
+ self._token_lock = threading.Lock()
31
+
32
+ def fetch_token(self) -> str:
33
+ """Returns the token and sets its expiration time."""
34
+ token_api_path = self.authentication_url
35
+ token_response = requests.post(
36
+ token_api_path, data=self.token_payload, timeout=_AUTH_TIMEOUT_S
37
+ )
38
+ response_data = handle_response(token_response)
39
+ expires_in_seconds = int(response_data["expires_in"])
40
+ self._token_expires_at = time.time() + expires_in_seconds
41
+ return response_data["access_token"]
42
+
43
+ def _is_token_expired_or_expiring_soon(self) -> bool:
44
+ """
45
+ Returns True if the token is expired or will expire soon (within buffer time)
46
+ """
47
+ if self._token_expires_at is None:
48
+ return False
49
+
50
+ return time.time() >= (self._token_expires_at - _REFRESH_BUFFER_S)
51
+
52
+ def _needs_refresh(self, force_refresh: bool = False) -> bool:
53
+ """Returns True if the token needs to be refreshed."""
54
+ is_expired = self._is_token_expired_or_expiring_soon()
55
+ return not self._token or force_refresh or is_expired
56
+
57
+ def _fetch_token(self, force_refresh: bool = False) -> Optional[str]:
58
+ """Returns the API token, refreshing it if needed (thread-safe)."""
59
+ if not self._needs_refresh(force_refresh):
60
+ return f"Bearer {self._token}"
61
+
62
+ with self._token_lock:
63
+ if not self._needs_refresh(force_refresh):
64
+ return f"Bearer {self._token}"
65
+
66
+ logger.info("Refreshing authentication token...")
67
+ self._token = self.fetch_token()
68
+ return f"Bearer {self._token}"
@@ -5,19 +5,16 @@ from functools import partial
5
5
  from http import HTTPStatus
6
6
  from typing import Callable, Iterable, Optional
7
7
 
8
- import requests
9
8
  from pydantic import BaseModel
10
9
 
11
10
  from ....utils import (
12
11
  APIClient,
13
- BearerAuth,
14
12
  RequestSafeMode,
15
- build_url,
16
13
  fetch_all_pages,
17
- handle_response,
18
14
  retry,
19
15
  )
20
16
  from ..assets import SigmaAsset
17
+ from .authentication import SigmaBearerAuth
21
18
  from .credentials import SigmaCredentials
22
19
  from .endpoints import SigmaEndpointFactory
23
20
  from .pagination import (
@@ -39,7 +36,6 @@ _DATA_ELEMENTS: tuple[str, ...] = (
39
36
  "viz",
40
37
  )
41
38
 
42
- _AUTH_TIMEOUT_S = 60
43
39
  _SIGMA_TIMEOUT_S = 300
44
40
 
45
41
  _SIGMA_HEADERS = {
@@ -85,20 +81,6 @@ class Lineage(BaseModel):
85
81
  context: LineageContext
86
82
 
87
83
 
88
- class SigmaBearerAuth(BearerAuth):
89
- def __init__(self, host: str, token_payload: dict[str, str]):
90
- auth_endpoint = SigmaEndpointFactory.authentication()
91
- self.authentication_url = build_url(host, auth_endpoint)
92
- self.token_payload = token_payload
93
-
94
- def fetch_token(self):
95
- token_api_path = self.authentication_url
96
- token_response = requests.post(
97
- token_api_path, data=self.token_payload, timeout=_AUTH_TIMEOUT_S
98
- )
99
- return handle_response(token_response)["access_token"]
100
-
101
-
102
84
  class SigmaClient(APIClient):
103
85
  def __init__(
104
86
  self,
@@ -240,8 +222,6 @@ class SigmaClient(APIClient):
240
222
 
241
223
  lineage_context = self._lineage_context(elements)
242
224
 
243
- self._auth.refresh_token()
244
-
245
225
  with ThreadPoolExecutor(max_workers=_THREADS_LINEAGE) as executor:
246
226
  results = executor.map(self._get_lineage, lineage_context)
247
227
 
@@ -7,13 +7,20 @@ from ...utils import ExtractionQuery, SqlalchemyClient, uri_encode
7
7
 
8
8
  logger = logging.getLogger(__name__)
9
9
 
10
- SERVER_URI = "{user}:{password}@{host}:{port}/{database}"
10
+ SERVER_URI = "{user}:{password}@{host}:{port}"
11
11
  MSSQL_URI = f"mssql+pymssql://{SERVER_URI}"
12
12
  DEFAULT_PORT = 1433
13
13
 
14
- _KEYS = ("user", "password", "host", "port", "database")
14
+ _KEYS = ("user", "password", "host", "port")
15
15
 
16
- _SYSTEM_DATABASES = ("master", "model", "msdb", "tempdb", "DBAdmin")
16
+ _SYSTEM_DATABASES = (
17
+ "DBAdmin",
18
+ "dbaTools",
19
+ "master",
20
+ "model",
21
+ "msdb",
22
+ "tempdb",
23
+ )
17
24
 
18
25
 
19
26
  def _check_key(credentials: dict) -> None:
@@ -39,7 +46,6 @@ class MSSQLClient(SqlalchemyClient):
39
46
  password=uri_encode(credentials["password"]),
40
47
  host=credentials["host"],
41
48
  port=credentials.get("port") or DEFAULT_PORT,
42
- database=credentials["database"],
43
49
  )
44
50
  return uri
45
51
 
@@ -67,12 +73,6 @@ class MSSQLClient(SqlalchemyClient):
67
73
  if row["name"] not in _SYSTEM_DATABASES
68
74
  ]
69
75
 
70
- def _current_database(self) -> str:
71
- result = self.execute(
72
- ExtractionQuery("SELECT DB_NAME() AS database_name", {})
73
- )
74
- return next(result)["database_name"]
75
-
76
76
  def _has_access(self, name: str, object_type: str, permission: str) -> bool:
77
77
  query_text = f"""
78
78
  SELECT
@@ -83,45 +83,45 @@ class MSSQLClient(SqlalchemyClient):
83
83
  result = next(self.execute(query))
84
84
  return result["has_permission"] == 1
85
85
 
86
- def _has_table_read_access(self, table_name: str) -> bool:
86
+ def _has_table_read_access(self, database: str, table_name: str) -> bool:
87
87
  """
88
88
  Check whether we have READ access to the given table
89
89
  """
90
90
  return self._has_access(
91
- name=table_name,
91
+ name=f"[{database}].{table_name}",
92
92
  object_type="OBJECT",
93
93
  permission="SELECT",
94
94
  )
95
95
 
96
- def _has_view_database_state(self) -> bool:
96
+ def _has_view_database_state(self, database: str) -> bool:
97
97
  """
98
98
  Check whether we have VIEW DATABASE STATE permissions, which
99
99
  is necessary to fetch data from the Query Store
100
100
  """
101
101
  return self._has_access(
102
- name=self._current_database(),
102
+ name=database,
103
103
  object_type="DATABASE",
104
104
  permission="VIEW DATABASE STATE",
105
105
  )
106
106
 
107
- def _has_query_store(self) -> bool:
107
+ def _has_query_store(self, database: str) -> bool:
108
108
  """
109
- Checks whether the Query Store is activated on this instance.
109
+ Checks whether the Query Store is activated on this database.
110
110
  This is required to extract the SQL queries history.
111
111
  https://learn.microsoft.com/en-us/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-ver17"""
112
- sql = """
112
+ sql = f"""
113
113
  SELECT
114
114
  desired_state
115
115
  FROM
116
- sys.database_query_store_options
116
+ [{database}].sys.database_query_store_options
117
117
  """
118
118
  query = ExtractionQuery(sql, {})
119
119
  # 2 = READ_WRITE, which means the Query Store is activated
120
120
  return next(self.execute(query))["desired_state"] == 2
121
121
 
122
- def has_queries_permissions(self) -> bool:
122
+ def has_queries_permissions(self, database: str) -> bool:
123
123
  """
124
- Verify that we habe the required permissions to extract
124
+ Verify that we have the required permissions to extract
125
125
  query history and view object definitions (DDL).
126
126
 
127
127
  This check ensures:
@@ -144,16 +144,16 @@ class MSSQLClient(SqlalchemyClient):
144
144
 
145
145
  has_permissions = True
146
146
  for table in tables:
147
- if not self._has_table_read_access(table):
148
- logger.info(f"Missing READ permissions for table {table}")
147
+ if not self._has_table_read_access(database, table):
148
+ logger.info(f"Missing READ permission on {database}.{table}")
149
149
  has_permissions = False
150
150
 
151
- if not self._has_view_database_state():
152
- logger.info("Missing permissions: VIEW DATABASE STATE")
151
+ if not self._has_view_database_state(database):
152
+ logger.info(f"Missing VIEW DATABASE STATE in database {database}")
153
153
  has_permissions = False
154
154
 
155
- if not self._has_query_store():
156
- logger.info("Missing permissions: Query Store is not activated")
155
+ if not self._has_query_store(database):
156
+ logger.info(f"Query Store is not activated in database {database}")
157
157
  has_permissions = False
158
158
 
159
159
  return has_permissions
@@ -10,15 +10,15 @@ SELECT
10
10
  DATEADD(MICROSECOND, last_duration % 1000000, rs.last_execution_time)
11
11
  ) AS end_time
12
12
  FROM
13
- sys.query_store_runtime_stats AS rs
13
+ [{database}].sys.query_store_runtime_stats AS rs
14
14
  INNER JOIN
15
- sys.query_store_plan p
15
+ [{database}].sys.query_store_plan p
16
16
  ON rs.plan_id = p.plan_id
17
17
  INNER JOIN
18
- sys.query_store_query q
18
+ [{database}].sys.query_store_query q
19
19
  ON p.query_id = q.query_id
20
20
  INNER JOIN
21
- sys.query_store_query_text qt
21
+ [{database}].sys.query_store_query_text qt
22
22
  ON q.query_text_id = qt.query_text_id
23
23
  WHERE
24
24
  CAST(rs.last_execution_time AS DATE) = :day
@@ -17,11 +17,11 @@ SELECT
17
17
  schema_name = s.name,
18
18
  schema_id = CAST(d.database_id AS VARCHAR(10)) + '_' + CAST(s.schema_id AS VARCHAR(10)),
19
19
  schema_owner = u.name,
20
- schema_owner_id = u.uid
20
+ schema_owner_id = u.name
21
21
  FROM [{database}].sys.schemas AS s
22
22
  INNER JOIN ids AS i
23
23
  ON s.name = i.table_schema
24
- LEFT JOIN [{database}].sys.sysusers AS u
25
- ON s.principal_id = u.uid
24
+ LEFT JOIN [{database}].sys.database_principals AS u
25
+ ON s.principal_id = u.principal_id
26
26
  LEFT JOIN [{database}].sys.databases AS d
27
27
  ON i.table_catalog COLLATE DATABASE_DEFAULT = d.name COLLATE DATABASE_DEFAULT
@@ -8,7 +8,7 @@ WITH extended_tables AS (
8
8
  SELECT
9
9
  table_id = object_id,
10
10
  table_name = name,
11
- table_owner_id = principal_id,
11
+ principal_id,
12
12
  schema_id
13
13
  FROM
14
14
  [{database}].sys.tables
@@ -18,7 +18,7 @@ WITH extended_tables AS (
18
18
  SELECT
19
19
  table_id = object_id,
20
20
  table_name = name,
21
- table_owner_id = principal_id,
21
+ principal_id,
22
22
  schema_id
23
23
  FROM
24
24
  [{database}].sys.views
@@ -28,7 +28,7 @@ WITH extended_tables AS (
28
28
  SELECT
29
29
  table_id = object_id,
30
30
  table_name = name,
31
- table_owner_id = principal_id,
31
+ principal_id,
32
32
  schema_id
33
33
  FROM
34
34
  [{database}].sys.external_tables
@@ -65,15 +65,15 @@ table_ids AS (
65
65
  table_name,
66
66
  schema_name = ss.name,
67
67
  schema_id = ss.schema_id,
68
- table_owner_id,
68
+ table_owner_id = u.name,
69
69
  table_owner = u.name,
70
70
  row_count,
71
71
  comment = CONVERT(varchar(1024), ep.value)
72
72
  FROM extended_tables_with_row_count AS et
73
73
  LEFT JOIN [{database}].sys.schemas AS ss
74
74
  ON et.schema_id = ss.schema_id
75
- LEFT JOIN [{database}].sys.sysusers AS u
76
- ON et.table_owner_id = u.uid
75
+ LEFT JOIN [{database}].sys.database_principals AS u
76
+ ON et.principal_id = u.principal_id
77
77
  LEFT JOIN [{database}].sys.extended_properties AS ep
78
78
  ON (
79
79
  et.table_id = ep.major_id
@@ -0,0 +1,4 @@
1
+ SELECT
2
+ user_name = u.name,
3
+ user_id = u.name
4
+ FROM [{database}].sys.database_principals AS u
@@ -4,10 +4,10 @@ SELECT
4
4
  s.name AS schema_name,
5
5
  DB_NAME() AS database_name
6
6
  FROM
7
- sys.views v
7
+ [{database}].sys.views v
8
8
  INNER JOIN
9
- sys.schemas s
9
+ [{database}].sys.schemas s
10
10
  ON v.schema_id = s.schema_id
11
11
  INNER JOIN
12
- sys.sql_modules m
12
+ [{database}].sys.sql_modules m
13
13
  ON v.object_id = m.object_id
@@ -16,10 +16,8 @@ _NO_DATABASE_ERROR_MSG = (
16
16
  "If you are using the db_allow/db_block options, please make sure to use the correct case."
17
17
  )
18
18
 
19
- _DATABASE_REQUIRED = (
20
- WarehouseAsset.SCHEMA,
21
- WarehouseAsset.TABLE,
22
- WarehouseAsset.COLUMN,
19
+ _SQLSERVER_DUPLICATED_ASSETS: tuple[WarehouseAsset, ...] = (
20
+ WarehouseAsset.USER,
23
21
  )
24
22
 
25
23
 
@@ -33,7 +31,10 @@ class MSSQLQueryBuilder(AbstractQueryBuilder):
33
31
  databases: list[str],
34
32
  time_filter: Optional[TimeFilter] = None,
35
33
  ):
36
- super().__init__(time_filter=time_filter)
34
+ super().__init__(
35
+ time_filter=time_filter,
36
+ duplicated=_SQLSERVER_DUPLICATED_ASSETS,
37
+ )
37
38
  if not databases:
38
39
  raise ValueError(_NO_DATABASE_ERROR_MSG)
39
40
  self._databases = databases
@@ -48,7 +49,10 @@ class MSSQLQueryBuilder(AbstractQueryBuilder):
48
49
  def build(self, asset: WarehouseAsset) -> list[ExtractionQuery]:
49
50
  query = self.build_default(asset)
50
51
 
51
- if asset not in _DATABASE_REQUIRED:
52
+ if asset == WarehouseAsset.DATABASE:
53
+ # database.sql does not include a {database} placeholder.
54
+ # Indeed, databases are extracted at the server level
55
+ # (not scoped to a specific database).
52
56
  return [query]
53
57
 
54
58
  logger.info(
@@ -3,7 +3,7 @@ requires = ["setuptools>=61.2"]
3
3
 
4
4
  [tool.poetry]
5
5
  name = "castor-extractor"
6
- version = "0.24.49"
6
+ version = "0.24.54"
7
7
  description = "Extract your metadata assets."
8
8
  authors = ["Castor <support@castordoc.com>"]
9
9
  license = "EULA"
@@ -1,4 +0,0 @@
1
- SELECT
2
- user_name = u.name,
3
- user_id = u.principal_id
4
- FROM sys.database_principals AS u