castor-extractor 0.24.43__tar.gz → 0.24.49__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 (438) hide show
  1. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/CHANGELOG.md +24 -0
  2. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/PKG-INFO +25 -1
  3. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_sqlserver.py +8 -0
  4. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_tableau.py +6 -0
  5. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/coalesce/client/client.py +1 -9
  6. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/client/client.py +1 -0
  7. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/client/pagination.py +1 -1
  8. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/client/client.py +9 -2
  9. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/extract.py +2 -0
  10. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/abstract/asset.py +5 -0
  11. castor_extractor-0.24.49/castor_extractor/warehouse/sqlserver/client.py +159 -0
  12. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/sqlserver/extract.py +8 -1
  13. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/sqlserver/queries/column.sql +8 -8
  14. castor_extractor-0.24.49/castor_extractor/warehouse/sqlserver/queries/query.sql +25 -0
  15. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/sqlserver/queries/schema.sql +4 -4
  16. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/sqlserver/queries/table.sql +9 -9
  17. castor_extractor-0.24.49/castor_extractor/warehouse/sqlserver/queries/view_ddl.sql +13 -0
  18. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/pyproject.toml +1 -1
  19. castor_extractor-0.24.43/castor_extractor/warehouse/sqlserver/client.py +0 -68
  20. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/Dockerfile +0 -0
  21. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/DockerfileUsage.md +0 -0
  22. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/LICENCE +0 -0
  23. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/README.md +0 -0
  24. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/__init__.py +0 -0
  25. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/__init__.py +0 -0
  26. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_bigquery.py +0 -0
  27. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_confluence.py +0 -0
  28. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_databricks.py +0 -0
  29. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_domo.py +0 -0
  30. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_looker.py +0 -0
  31. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_looker_studio.py +0 -0
  32. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_metabase_api.py +0 -0
  33. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_metabase_db.py +0 -0
  34. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_mode.py +0 -0
  35. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_mysql.py +0 -0
  36. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_notion.py +0 -0
  37. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_postgres.py +0 -0
  38. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_powerbi.py +0 -0
  39. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_qlik.py +0 -0
  40. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_redshift.py +0 -0
  41. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_salesforce.py +0 -0
  42. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_salesforce_reporting.py +0 -0
  43. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_sigma.py +0 -0
  44. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_snowflake.py +0 -0
  45. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_strategy.py +0 -0
  46. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/extract_thoughtspot.py +0 -0
  47. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/file_check.py +0 -0
  48. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/commands/upload.py +0 -0
  49. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/__init__.py +0 -0
  50. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/column.py +0 -0
  51. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/column_test.py +0 -0
  52. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/constants.py +0 -0
  53. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/enums.py +0 -0
  54. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/file.py +0 -0
  55. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/file_test.py +0 -0
  56. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/file_test_users.csv +0 -0
  57. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
  58. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/templates/__init__.py +0 -0
  59. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
  60. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/__init__.py +0 -0
  61. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/__init__.py +0 -0
  62. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/assets.py +0 -0
  63. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/client/__init__.py +0 -0
  64. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/client/client.py +0 -0
  65. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/client/client_test.py +0 -0
  66. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/client/credentials.py +0 -0
  67. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/client/endpoints.py +0 -0
  68. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/client/pagination.py +0 -0
  69. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/extract.py +0 -0
  70. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/utils.py +0 -0
  71. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/confluence/utils_test.py +0 -0
  72. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/notion/__init__.py +0 -0
  73. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/notion/assets.py +0 -0
  74. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/notion/client/__init__.py +0 -0
  75. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/notion/client/client.py +0 -0
  76. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/notion/client/client_test.py +0 -0
  77. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/notion/client/constants.py +0 -0
  78. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/notion/client/credentials.py +0 -0
  79. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/notion/client/endpoints.py +0 -0
  80. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/notion/client/pagination.py +0 -0
  81. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/knowledge/notion/extract.py +0 -0
  82. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/logger.py +0 -0
  83. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/quality/__init__.py +0 -0
  84. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/quality/soda/__init__.py +0 -0
  85. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/quality/soda/assets.py +0 -0
  86. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/quality/soda/client/__init__.py +0 -0
  87. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/quality/soda/client/client.py +0 -0
  88. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/quality/soda/client/credentials.py +0 -0
  89. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/quality/soda/client/endpoints.py +0 -0
  90. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/quality/soda/client/pagination.py +0 -0
  91. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/__init__.py +0 -0
  92. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/coalesce/__init__.py +0 -0
  93. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/coalesce/assets.py +0 -0
  94. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/coalesce/client/__init__.py +0 -0
  95. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/coalesce/client/credentials.py +0 -0
  96. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/coalesce/client/endpoint.py +0 -0
  97. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/coalesce/client/pagination.py +0 -0
  98. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/dbt/__init__.py +0 -0
  99. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/dbt/assets.py +0 -0
  100. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/dbt/client.py +0 -0
  101. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/dbt/client_test.py +0 -0
  102. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/transformation/dbt/credentials.py +0 -0
  103. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/types.py +0 -0
  104. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/uploader/__init__.py +0 -0
  105. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/uploader/constant.py +0 -0
  106. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/uploader/enums.py +0 -0
  107. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/uploader/env.py +0 -0
  108. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/uploader/env_test.py +0 -0
  109. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/uploader/settings.py +0 -0
  110. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/uploader/upload.py +0 -0
  111. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/uploader/upload_test.py +0 -0
  112. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/uploader/utils.py +0 -0
  113. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/__init__.py +0 -0
  114. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/argument_parser.py +0 -0
  115. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/argument_parser_test.py +0 -0
  116. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/batch.py +0 -0
  117. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/batch_test.py +0 -0
  118. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/__init__.py +0 -0
  119. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/abstract.py +0 -0
  120. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/__init__.py +0 -0
  121. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/auth.py +0 -0
  122. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/auth_test.py +0 -0
  123. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/client.py +0 -0
  124. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/client_test.py +0 -0
  125. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/pagination.py +0 -0
  126. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/pagination_test.py +0 -0
  127. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/safe_request.py +0 -0
  128. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/safe_request_test.py +0 -0
  129. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/utils.py +0 -0
  130. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/api/utils_test.py +0 -0
  131. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/postgres.py +0 -0
  132. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/query.py +0 -0
  133. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/uri.py +0 -0
  134. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/client/uri_test.py +0 -0
  135. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/collection.py +0 -0
  136. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/collection_test.py +0 -0
  137. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/constants.py +0 -0
  138. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/deprecate.py +0 -0
  139. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/env.py +0 -0
  140. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/files.py +0 -0
  141. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/files_test.py +0 -0
  142. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/formatter.py +0 -0
  143. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/formatter_test.csv +0 -0
  144. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/formatter_test.json +0 -0
  145. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/formatter_test.py +0 -0
  146. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/json_stream_write.py +0 -0
  147. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/load.py +0 -0
  148. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/object.py +0 -0
  149. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/object_test.py +0 -0
  150. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/pager/__init__.py +0 -0
  151. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/pager/pager.py +0 -0
  152. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/pager/pager_on_id.py +0 -0
  153. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/pager/pager_on_id_test.py +0 -0
  154. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/pager/pager_test.py +0 -0
  155. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/retry.py +0 -0
  156. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/retry_test.py +0 -0
  157. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/safe.py +0 -0
  158. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/safe_test.py +0 -0
  159. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/salesforce/__init__.py +0 -0
  160. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/salesforce/client.py +0 -0
  161. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/salesforce/client_test.py +0 -0
  162. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/salesforce/constants.py +0 -0
  163. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/salesforce/credentials.py +0 -0
  164. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/salesforce/credentials_test.py +0 -0
  165. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/salesforce/pagination.py +0 -0
  166. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/store.py +0 -0
  167. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/string.py +0 -0
  168. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/string_test.py +0 -0
  169. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/time.py +0 -0
  170. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/time_test.py +0 -0
  171. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/type.py +0 -0
  172. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/url.py +0 -0
  173. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/url_test.py +0 -0
  174. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/validation.py +0 -0
  175. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/validation_test.py +0 -0
  176. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/utils/write.py +0 -0
  177. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/__init__.py +0 -0
  178. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/domo/__init__.py +0 -0
  179. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/domo/assets.py +0 -0
  180. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/domo/client/__init__.py +0 -0
  181. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/domo/client/client.py +0 -0
  182. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/domo/client/credentials.py +0 -0
  183. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/domo/client/endpoints.py +0 -0
  184. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/domo/client/pagination.py +0 -0
  185. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/domo/client/pagination_test.py +0 -0
  186. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/domo/extract.py +0 -0
  187. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/__init__.py +0 -0
  188. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/api/__init__.py +0 -0
  189. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/api/client.py +0 -0
  190. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/api/client_test.py +0 -0
  191. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/api/constants.py +0 -0
  192. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/api/credentials.py +0 -0
  193. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/api/extraction_parameters.py +0 -0
  194. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/api/sdk.py +0 -0
  195. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
  196. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/api/utils.py +0 -0
  197. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/assets.py +0 -0
  198. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/constant.py +0 -0
  199. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/constants.py +0 -0
  200. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/extract.py +0 -0
  201. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/fields.py +0 -0
  202. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/fields_test.py +0 -0
  203. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker/multithreading.py +0 -0
  204. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/__init__.py +0 -0
  205. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/assets.py +0 -0
  206. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/client/__init__.py +0 -0
  207. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/client/admin_sdk_client.py +0 -0
  208. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/client/client.py +0 -0
  209. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/client/credentials.py +0 -0
  210. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/client/endpoints.py +0 -0
  211. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/client/enums.py +0 -0
  212. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/client/looker_studio_api_client.py +0 -0
  213. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/client/pagination.py +0 -0
  214. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/client/queries/query.sql +0 -0
  215. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/extract.py +0 -0
  216. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/looker_studio/extract_test.py +0 -0
  217. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/__init__.py +0 -0
  218. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/assets.py +0 -0
  219. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
  220. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
  221. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/api/client.py +0 -0
  222. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/api/client_test.py +0 -0
  223. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
  224. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
  225. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/client.py +0 -0
  226. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/credentials.py +0 -0
  227. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
  228. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
  229. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
  230. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
  231. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
  232. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
  233. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
  234. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
  235. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
  236. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
  237. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
  238. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/client/shared.py +0 -0
  239. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/errors.py +0 -0
  240. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/extract.py +0 -0
  241. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/metabase/types.py +0 -0
  242. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/mode/__init__.py +0 -0
  243. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/mode/assets.py +0 -0
  244. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/mode/client/__init__.py +0 -0
  245. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/mode/client/client.py +0 -0
  246. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/mode/client/client_test.json +0 -0
  247. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/mode/client/client_test.py +0 -0
  248. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/mode/client/constants.py +0 -0
  249. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/mode/client/credentials.py +0 -0
  250. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/mode/errors.py +0 -0
  251. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/mode/extract.py +0 -0
  252. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/__init__.py +0 -0
  253. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/assets.py +0 -0
  254. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/client/__init__.py +0 -0
  255. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/client/authentication.py +0 -0
  256. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/client/client.py +0 -0
  257. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/client/client_test.py +0 -0
  258. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/client/constants.py +0 -0
  259. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/client/credentials.py +0 -0
  260. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/client/credentials_test.py +0 -0
  261. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/client/endpoints.py +0 -0
  262. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/client/pagination.py +0 -0
  263. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/powerbi/extract.py +0 -0
  264. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/__init__.py +0 -0
  265. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/assets.py +0 -0
  266. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
  267. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/constants.py +0 -0
  268. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
  269. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/engine/client.py +0 -0
  270. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/engine/constants.py +0 -0
  271. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/engine/credentials.py +0 -0
  272. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/engine/error.py +0 -0
  273. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/engine/error_test.py +0 -0
  274. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +0 -0
  275. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
  276. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/engine/websocket.py +0 -0
  277. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/master.py +0 -0
  278. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/rest.py +0 -0
  279. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/client/rest_test.py +0 -0
  280. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/qlik/extract.py +0 -0
  281. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/salesforce_reporting/__init__.py +0 -0
  282. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/salesforce_reporting/assets.py +0 -0
  283. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/salesforce_reporting/client/__init__.py +0 -0
  284. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/salesforce_reporting/client/rest.py +0 -0
  285. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/salesforce_reporting/client/soql.py +0 -0
  286. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/salesforce_reporting/extract.py +0 -0
  287. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/__init__.py +0 -0
  288. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/assets.py +0 -0
  289. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
  290. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/client/client_test.py +0 -0
  291. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
  292. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/client/endpoints.py +0 -0
  293. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/client/sources_transformer.py +0 -0
  294. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/client/sources_transformer_test.py +0 -0
  295. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/sigma/extract.py +0 -0
  296. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/strategy/__init__.py +0 -0
  297. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/strategy/assets.py +0 -0
  298. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/strategy/client/__init__.py +0 -0
  299. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/strategy/client/client.py +0 -0
  300. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/strategy/client/credentials.py +0 -0
  301. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/strategy/client/properties.py +0 -0
  302. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/strategy/extract.py +0 -0
  303. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/__init__.py +0 -0
  304. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/assets.py +0 -0
  305. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/client/__init__.py +0 -0
  306. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/client/client_metadata_api.py +0 -0
  307. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/client/client_metadata_api_test.py +0 -0
  308. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/client/client_rest_api.py +0 -0
  309. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/client/client_tsc.py +0 -0
  310. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/client/credentials.py +0 -0
  311. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/client/errors.py +0 -0
  312. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/client/gql_queries.py +0 -0
  313. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/client/rest_fields.py +0 -0
  314. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/tableau/constants.py +0 -0
  315. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/thoughtspot/__init__.py +0 -0
  316. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/thoughtspot/assets.py +0 -0
  317. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/thoughtspot/client/__init__.py +0 -0
  318. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/thoughtspot/client/client.py +0 -0
  319. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/thoughtspot/client/credentials.py +0 -0
  320. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/thoughtspot/client/endpoints.py +0 -0
  321. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/thoughtspot/client/pagination.py +0 -0
  322. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/visualization/thoughtspot/extract.py +0 -0
  323. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/__init__.py +0 -0
  324. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/abstract/__init__.py +0 -0
  325. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/abstract/asset_test.py +0 -0
  326. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/abstract/extract.py +0 -0
  327. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/abstract/query.py +0 -0
  328. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/abstract/time_filter.py +0 -0
  329. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
  330. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
  331. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/client.py +0 -0
  332. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
  333. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/credentials.py +0 -0
  334. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/extract.py +0 -0
  335. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
  336. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
  337. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
  338. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
  339. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
  340. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
  341. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
  342. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
  343. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
  344. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
  345. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/query.py +0 -0
  346. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/bigquery/types.py +0 -0
  347. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/__init__.py +0 -0
  348. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/api_client.py +0 -0
  349. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/api_client_test.py +0 -0
  350. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/client.py +0 -0
  351. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/client_test.py +0 -0
  352. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/credentials.py +0 -0
  353. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/endpoints.py +0 -0
  354. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/enums.py +0 -0
  355. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/extract.py +0 -0
  356. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/format.py +0 -0
  357. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/format_test.py +0 -0
  358. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/pagination.py +0 -0
  359. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/queries/column_lineage.sql +0 -0
  360. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/queries/table_lineage.sql +0 -0
  361. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/sql_client.py +0 -0
  362. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/types.py +0 -0
  363. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/utils.py +0 -0
  364. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/databricks/utils_test.py +0 -0
  365. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/__init__.py +0 -0
  366. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/client.py +0 -0
  367. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/client_test.py +0 -0
  368. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/extract.py +0 -0
  369. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/queries/.sqlfluff +0 -0
  370. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/queries/column.sql +0 -0
  371. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/queries/database.sql +0 -0
  372. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/queries/query.sql +0 -0
  373. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/queries/schema.sql +0 -0
  374. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/queries/table.sql +0 -0
  375. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/queries/user.sql +0 -0
  376. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/queries/view_ddl.sql +0 -0
  377. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/mysql/query.py +0 -0
  378. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/postgres/__init__.py +0 -0
  379. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/postgres/extract.py +0 -0
  380. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
  381. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
  382. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
  383. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
  384. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
  385. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
  386. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
  387. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/postgres/query.py +0 -0
  388. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/__init__.py +0 -0
  389. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/client.py +0 -0
  390. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/client_test.py +0 -0
  391. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/extract.py +0 -0
  392. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/extract_test.py +0 -0
  393. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
  394. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
  395. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
  396. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
  397. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/query.sql +0 -0
  398. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/query_serverless.sql +0 -0
  399. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
  400. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
  401. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
  402. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
  403. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
  404. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/redshift/query.py +0 -0
  405. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/salesforce/__init__.py +0 -0
  406. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/salesforce/client.py +0 -0
  407. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/salesforce/constants.py +0 -0
  408. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/salesforce/extract.py +0 -0
  409. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/salesforce/format.py +0 -0
  410. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/salesforce/format_test.py +0 -0
  411. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/salesforce/pagination.py +0 -0
  412. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/salesforce/soql.py +0 -0
  413. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/__init__.py +0 -0
  414. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/client.py +0 -0
  415. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/client_test.py +0 -0
  416. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/credentials.py +0 -0
  417. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/credentials_test.py +0 -0
  418. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/extract.py +0 -0
  419. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
  420. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/column.sql +0 -0
  421. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +0 -0
  422. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/database.sql +0 -0
  423. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/function.sql +0 -0
  424. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -0
  425. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -0
  426. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/query.sql +0 -0
  427. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/role.sql +0 -0
  428. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/schema.sql +0 -0
  429. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/table.sql +0 -0
  430. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
  431. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +0 -0
  432. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/snowflake/query.py +0 -0
  433. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/sqlserver/__init__.py +0 -0
  434. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/sqlserver/queries/.sqlfluff +0 -0
  435. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/sqlserver/queries/database.sql +0 -0
  436. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/sqlserver/queries/user.sql +0 -0
  437. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/sqlserver/query.py +0 -0
  438. {castor_extractor-0.24.43 → castor_extractor-0.24.49}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.24.49 - 2025-09-12
4
+
5
+ * Tableau: add option to bypass ssl certificate verification
6
+
7
+ ## 0.24.48 - 2025-09-09
8
+
9
+ * SqlServer: handle hyphens in database name
10
+
11
+ ## 0.24.47 - 2025-09-08
12
+
13
+ * SqlServer: extract SQL queries and lineage
14
+
15
+ ## 0.24.46 - 2025-09-03
16
+
17
+ * Sigma: Added `HTTPStatus.FORBIDDEN` to the list of ignored errors
18
+
19
+ ## 0.24.45 - 2025-08-27
20
+
21
+ * Sigma: Increasing pagination limit for Sigma extraction
22
+
23
+ ## 0.24.44 - 2025-08-22
24
+
25
+ * Coalesce: do not skip nodes raising a 500 Server Error
26
+
3
27
  ## 0.24.43 - 2025-08-20
4
28
 
5
29
  * SQLServer:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: castor-extractor
3
- Version: 0.24.43
3
+ Version: 0.24.49
4
4
  Summary: Extract your metadata assets.
5
5
  Home-page: https://www.castordoc.com/
6
6
  License: EULA
@@ -215,6 +215,30 @@ For any questions or bug report, contact us at [support@coalesce.io](mailto:supp
215
215
 
216
216
  # Changelog
217
217
 
218
+ ## 0.24.49 - 2025-09-12
219
+
220
+ * Tableau: add option to bypass ssl certificate verification
221
+
222
+ ## 0.24.48 - 2025-09-09
223
+
224
+ * SqlServer: handle hyphens in database name
225
+
226
+ ## 0.24.47 - 2025-09-08
227
+
228
+ * SqlServer: extract SQL queries and lineage
229
+
230
+ ## 0.24.46 - 2025-09-03
231
+
232
+ * Sigma: Added `HTTPStatus.FORBIDDEN` to the list of ignored errors
233
+
234
+ ## 0.24.45 - 2025-08-27
235
+
236
+ * Sigma: Increasing pagination limit for Sigma extraction
237
+
238
+ ## 0.24.44 - 2025-08-22
239
+
240
+ * Coalesce: do not skip nodes raising a 500 Server Error
241
+
218
242
  ## 0.24.43 - 2025-08-20
219
243
 
220
244
  * SQLServer:
@@ -15,6 +15,14 @@ def main():
15
15
  parser.add_argument("-u", "--user", help="MSSQL User")
16
16
  parser.add_argument("-p", "--password", help="MSSQL Password")
17
17
 
18
+ parser.add_argument(
19
+ "-s",
20
+ "--skip-queries",
21
+ dest="skip_queries",
22
+ action="store_true",
23
+ help="Skip the extraction of SQL queries",
24
+ )
25
+
18
26
  parser.add_argument("-o", "--output", help="Directory to write to")
19
27
 
20
28
  parser.add_argument(
@@ -55,6 +55,12 @@ def main():
55
55
  dest="ignore_errors",
56
56
  help="Allow partial extraction of Fields and Columns: skip batch in case of Timeout errors",
57
57
  )
58
+ parser.add_argument(
59
+ "--ignore-ssl",
60
+ action="store_true",
61
+ dest="ignore_ssl",
62
+ help="Disable SSL verification",
63
+ )
58
64
 
59
65
  parser.add_argument("-o", "--output", help="Directory to write to")
60
66
 
@@ -3,8 +3,6 @@ from functools import partial
3
3
  from http import HTTPStatus
4
4
  from typing import Callable, Optional
5
5
 
6
- from pydantic import ValidationError
7
-
8
6
  from ....utils import (
9
7
  APIClient,
10
8
  BearerAuth,
@@ -123,13 +121,7 @@ class CoalesceClient(APIClient):
123
121
  for index, env in enumerate(environments):
124
122
  env_id = env["id"]
125
123
  logger.info(f"Fetching nodes for env #{env_id} - {index}/{total}")
126
- try:
127
- nodes.extend(self._fetch_env_nodes(env_id))
128
- except ValidationError as e:
129
- # 500 Server Error: Internal Server Error on Coalesce API
130
- logger.warning(
131
- f"Skipping nodes for {env_id} due to the following Error: {e}"
132
- )
124
+ nodes.extend(self._fetch_env_nodes(env_id))
133
125
  logger.info(f"{len(nodes)} nodes extracted so far")
134
126
  return nodes
135
127
 
@@ -53,6 +53,7 @@ _IGNORED_ERROR_CODES = (
53
53
  HTTPStatus.INTERNAL_SERVER_ERROR,
54
54
  HTTPStatus.CONFLICT,
55
55
  HTTPStatus.NOT_FOUND,
56
+ HTTPStatus.FORBIDDEN,
56
57
  )
57
58
  SIGMA_SAFE_MODE = RequestSafeMode(
58
59
  max_errors=_VOLUME_IGNORED,
@@ -5,7 +5,7 @@ from pydantic.alias_generators import to_camel
5
5
 
6
6
  from ....utils import PaginationModel
7
7
 
8
- SIGMA_API_LIMIT = 200 # default number of records per page
8
+ SIGMA_API_LIMIT = 1_000 # default number of records per page
9
9
  SIGMA_QUERIES_PAGINATION_LIMIT = 50
10
10
 
11
11
 
@@ -102,8 +102,10 @@ def _merge_workbooks(
102
102
  def _server(
103
103
  server_url: str,
104
104
  timeout_sec: int,
105
+ ignore_ssl: bool = False,
105
106
  ) -> TSC.Server:
106
- options = {"verify": True, "timeout": timeout_sec}
107
+ verify = not ignore_ssl
108
+ options = {"verify": verify, "timeout": timeout_sec}
107
109
  server = TSC.Server(server_url, use_server_version=True)
108
110
  server.add_http_options(options)
109
111
  return server
@@ -126,9 +128,14 @@ class TableauClient:
126
128
  with_pulse: bool = False,
127
129
  override_page_size: Optional[int] = None,
128
130
  ignore_errors: bool = False,
131
+ ignore_ssl: bool = False,
129
132
  ):
130
133
  self._credentials = credentials
131
- self._server = _server(credentials.server_url, timeout_sec)
134
+ self._server = _server(
135
+ server_url=credentials.server_url,
136
+ timeout_sec=timeout_sec,
137
+ ignore_ssl=ignore_ssl,
138
+ )
132
139
  self._with_columns = with_columns
133
140
  self._with_fields = with_fields
134
141
  self._with_pulse = with_pulse
@@ -37,6 +37,7 @@ def extract_all(**kwargs) -> None:
37
37
  with_pulse = kwargs.get("with_pulse") or False
38
38
  page_size = kwargs.get("page_size")
39
39
  ignore_errors = kwargs.get("ignore_errors") or False
40
+ ignore_ssl = kwargs.get("ignore_ssl") or False
40
41
  timestamp = current_timestamp()
41
42
 
42
43
  credentials = TableauCredentials(**kwargs)
@@ -47,6 +48,7 @@ def extract_all(**kwargs) -> None:
47
48
  with_pulse=with_pulse,
48
49
  override_page_size=page_size,
49
50
  ignore_errors=ignore_errors,
51
+ ignore_ssl=ignore_ssl,
50
52
  )
51
53
  client.login()
52
54
 
@@ -64,6 +64,11 @@ FUNCTIONS_ASSETS = (WarehouseAsset.FUNCTION,)
64
64
  QUERIES_ASSETS = (WarehouseAsset.QUERY,)
65
65
  VIEWS_ASSETS = (WarehouseAsset.VIEW_DDL,)
66
66
 
67
+ QUERIES_ASSET_GROUPS = (
68
+ WarehouseAssetGroup.QUERY,
69
+ WarehouseAssetGroup.VIEW_DDL,
70
+ )
71
+
67
72
  EXTERNAL_LINEAGE_ASSETS = (
68
73
  WarehouseAsset.EXTERNAL_COLUMN_LINEAGE,
69
74
  WarehouseAsset.EXTERNAL_TABLE_LINEAGE,
@@ -0,0 +1,159 @@
1
+ import logging
2
+ from collections.abc import Iterator
3
+
4
+ from sqlalchemy import text
5
+
6
+ from ...utils import ExtractionQuery, SqlalchemyClient, uri_encode
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+ SERVER_URI = "{user}:{password}@{host}:{port}/{database}"
11
+ MSSQL_URI = f"mssql+pymssql://{SERVER_URI}"
12
+ DEFAULT_PORT = 1433
13
+
14
+ _KEYS = ("user", "password", "host", "port", "database")
15
+
16
+ _SYSTEM_DATABASES = ("master", "model", "msdb", "tempdb", "DBAdmin")
17
+
18
+
19
+ def _check_key(credentials: dict) -> None:
20
+ for key in _KEYS:
21
+ if key not in credentials:
22
+ raise KeyError(f"Missing {key} in credentials")
23
+
24
+
25
+ class MSSQLClient(SqlalchemyClient):
26
+ """Microsoft Server SQL client"""
27
+
28
+ @staticmethod
29
+ def name() -> str:
30
+ return "MSSQL"
31
+
32
+ def _engine_options(self, credentials: dict) -> dict:
33
+ return {}
34
+
35
+ def _build_uri(self, credentials: dict) -> str:
36
+ _check_key(credentials)
37
+ uri = MSSQL_URI.format(
38
+ user=credentials["user"],
39
+ password=uri_encode(credentials["password"]),
40
+ host=credentials["host"],
41
+ port=credentials.get("port") or DEFAULT_PORT,
42
+ database=credentials["database"],
43
+ )
44
+ return uri
45
+
46
+ def execute(self, query: ExtractionQuery) -> Iterator[dict]:
47
+ """
48
+ Re-implements the SQLAlchemyClient execute function to ensure we consume
49
+ the cursor before calling connection.close() as it wipes out the data
50
+ otherwise
51
+ """
52
+ connection = self.connect()
53
+ try:
54
+ proxy = connection.execute(text(query.statement), query.params)
55
+ results = list(self._process_result(proxy))
56
+ yield from results
57
+ finally:
58
+ self.close()
59
+
60
+ def get_databases(self) -> list[str]:
61
+ result = self.execute(
62
+ ExtractionQuery("SELECT name FROM sys.databases", {})
63
+ )
64
+ return [
65
+ row["name"]
66
+ for row in result
67
+ if row["name"] not in _SYSTEM_DATABASES
68
+ ]
69
+
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
+ def _has_access(self, name: str, object_type: str, permission: str) -> bool:
77
+ query_text = f"""
78
+ SELECT
79
+ HAS_PERMS_BY_NAME('{name}', '{object_type}', '{permission}')
80
+ AS has_permission
81
+ """
82
+ query = ExtractionQuery(query_text, dict())
83
+ result = next(self.execute(query))
84
+ return result["has_permission"] == 1
85
+
86
+ def _has_table_read_access(self, table_name: str) -> bool:
87
+ """
88
+ Check whether we have READ access to the given table
89
+ """
90
+ return self._has_access(
91
+ name=table_name,
92
+ object_type="OBJECT",
93
+ permission="SELECT",
94
+ )
95
+
96
+ def _has_view_database_state(self) -> bool:
97
+ """
98
+ Check whether we have VIEW DATABASE STATE permissions, which
99
+ is necessary to fetch data from the Query Store
100
+ """
101
+ return self._has_access(
102
+ name=self._current_database(),
103
+ object_type="DATABASE",
104
+ permission="VIEW DATABASE STATE",
105
+ )
106
+
107
+ def _has_query_store(self) -> bool:
108
+ """
109
+ Checks whether the Query Store is activated on this instance.
110
+ This is required to extract the SQL queries history.
111
+ https://learn.microsoft.com/en-us/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-ver17"""
112
+ sql = """
113
+ SELECT
114
+ desired_state
115
+ FROM
116
+ sys.database_query_store_options
117
+ """
118
+ query = ExtractionQuery(sql, {})
119
+ # 2 = READ_WRITE, which means the Query Store is activated
120
+ return next(self.execute(query))["desired_state"] == 2
121
+
122
+ def has_queries_permissions(self) -> bool:
123
+ """
124
+ Verify that we habe the required permissions to extract
125
+ query history and view object definitions (DDL).
126
+
127
+ This check ensures:
128
+ - Query Store is enabled on the database.
129
+ - We have the VIEW DATABASE STATE permissions
130
+ - We have read access to the relevant system tables.
131
+ """
132
+
133
+ tables = (
134
+ # SQL queries
135
+ "sys.query_store_plan",
136
+ "sys.query_store_query",
137
+ "sys.query_store_query_text",
138
+ "sys.query_store_runtime_stats",
139
+ # views DDL
140
+ "sys.schemas",
141
+ "sys.sql_modules",
142
+ "sys.views",
143
+ )
144
+
145
+ has_permissions = True
146
+ for table in tables:
147
+ if not self._has_table_read_access(table):
148
+ logger.info(f"Missing READ permissions for table {table}")
149
+ has_permissions = False
150
+
151
+ if not self._has_view_database_state():
152
+ logger.info("Missing permissions: VIEW DATABASE STATE")
153
+ has_permissions = False
154
+
155
+ if not self._has_query_store():
156
+ logger.info("Missing permissions: Query Store is not activated")
157
+ has_permissions = False
158
+
159
+ return has_permissions
@@ -4,6 +4,8 @@ from ...utils import LocalStorage, filter_items, from_env, write_summary
4
4
  from ..abstract import (
5
5
  CATALOG_ASSETS,
6
6
  EXTERNAL_LINEAGE_ASSETS,
7
+ QUERIES_ASSETS,
8
+ VIEWS_ASSETS,
7
9
  SQLExtractionProcessor,
8
10
  SupportedAssets,
9
11
  WarehouseAsset,
@@ -19,8 +21,10 @@ logger = logging.getLogger(__name__)
19
21
 
20
22
  MSSQL_ASSETS: SupportedAssets = {
21
23
  WarehouseAssetGroup.CATALOG: CATALOG_ASSETS,
22
- WarehouseAssetGroup.ROLE: (WarehouseAsset.USER,),
23
24
  WarehouseAssetGroup.EXTERNAL_LINEAGE: EXTERNAL_LINEAGE_ASSETS,
25
+ WarehouseAssetGroup.QUERY: QUERIES_ASSETS,
26
+ WarehouseAssetGroup.ROLE: (WarehouseAsset.USER,),
27
+ WarehouseAssetGroup.VIEW_DDL: VIEWS_ASSETS,
24
28
  }
25
29
 
26
30
 
@@ -71,7 +75,10 @@ def extract_all(**kwargs) -> None:
71
75
  storage=storage,
72
76
  )
73
77
 
78
+ skip_queries = kwargs.get("skip_queries") or False
74
79
  for group in extractable_asset_groups(MSSQL_ASSETS):
80
+ if group == WarehouseAssetGroup.QUERY and skip_queries:
81
+ continue
75
82
  for asset in group:
76
83
  logger.info(f"Extracting `{asset.value.upper()}` ...")
77
84
  location = extractor.extract(asset, skip_existing)
@@ -11,7 +11,7 @@ WITH extended_tables AS (
11
11
  table_owner_id = principal_id,
12
12
  schema_id
13
13
  FROM
14
- {database}.sys.tables
14
+ [{database}].sys.tables
15
15
 
16
16
  UNION
17
17
 
@@ -21,7 +21,7 @@ WITH extended_tables AS (
21
21
  table_owner_id = principal_id,
22
22
  schema_id
23
23
  FROM
24
- {database}.sys.views
24
+ [{database}].sys.views
25
25
 
26
26
  UNION
27
27
 
@@ -31,7 +31,7 @@ WITH extended_tables AS (
31
31
  table_owner_id = principal_id,
32
32
  schema_id
33
33
  FROM
34
- {database}.sys.external_tables
34
+ [{database}].sys.external_tables
35
35
  ),
36
36
  /*
37
37
  `sys.columns` contains, among others:
@@ -54,11 +54,11 @@ column_ids AS (
54
54
  schema_name = ss.name,
55
55
  schema_id = ss.schema_id,
56
56
  comment = CONVERT(varchar(1024), ep.value)
57
- FROM {database}.sys.columns AS sc
57
+ FROM [{database}].sys.columns AS sc
58
58
  LEFT JOIN extended_tables AS et ON sc.object_id = et.table_id
59
- LEFT JOIN {database}.sys.schemas AS ss ON et.schema_id = ss.schema_id
60
- LEFT JOIN {database}.sys.databases AS sd ON sd.name = '{database}'
61
- LEFT JOIN {database}.sys.extended_properties AS ep
59
+ LEFT JOIN [{database}].sys.schemas AS ss ON et.schema_id = ss.schema_id
60
+ LEFT JOIN [{database}].sys.databases AS sd ON sd.name = '{database}'
61
+ LEFT JOIN [{database}].sys.extended_properties AS ep
62
62
  ON
63
63
  sc.object_id = ep.major_id
64
64
  AND sc.column_id = ep.minor_id
@@ -87,7 +87,7 @@ columns AS (
87
87
  i.comment,
88
88
  column_id = CONCAT(i.table_id, '.', c.column_name)
89
89
  FROM
90
- {database}.INFORMATION_SCHEMA.COLUMNS AS c
90
+ [{database}].INFORMATION_SCHEMA.COLUMNS AS c
91
91
  LEFT JOIN column_ids AS i
92
92
  ON
93
93
  (
@@ -0,0 +1,25 @@
1
+ SELECT
2
+ q.query_id,
3
+ qt.query_sql_text as query_text,
4
+ rs.count_executions,
5
+ rs.last_duration as duration,
6
+ rs.last_execution_time as start_time,
7
+ 'unknown-user' as user_name,
8
+ 'unknown-user' as user_id,
9
+ DATEADD(SECOND, last_duration / 1000000,
10
+ DATEADD(MICROSECOND, last_duration % 1000000, rs.last_execution_time)
11
+ ) AS end_time
12
+ FROM
13
+ sys.query_store_runtime_stats AS rs
14
+ INNER JOIN
15
+ sys.query_store_plan p
16
+ ON rs.plan_id = p.plan_id
17
+ INNER JOIN
18
+ sys.query_store_query q
19
+ ON p.query_id = q.query_id
20
+ INNER JOIN
21
+ sys.query_store_query_text qt
22
+ ON q.query_text_id = qt.query_text_id
23
+ WHERE
24
+ CAST(rs.last_execution_time AS DATE) = :day
25
+ AND DATEPART(HOUR, rs.last_execution_time) BETWEEN :hour_min AND :hour_max
@@ -8,7 +8,7 @@ WITH ids AS (
8
8
  SELECT DISTINCT
9
9
  table_catalog,
10
10
  table_schema
11
- FROM {database}.INFORMATION_SCHEMA.TABLES
11
+ FROM [{database}].INFORMATION_SCHEMA.TABLES
12
12
  )
13
13
 
14
14
  SELECT
@@ -18,10 +18,10 @@ SELECT
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
20
  schema_owner_id = u.uid
21
- FROM {database}.sys.schemas AS s
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
24
+ LEFT JOIN [{database}].sys.sysusers AS u
25
25
  ON s.principal_id = u.uid
26
- LEFT JOIN {database}.sys.databases AS d
26
+ LEFT JOIN [{database}].sys.databases AS d
27
27
  ON i.table_catalog COLLATE DATABASE_DEFAULT = d.name COLLATE DATABASE_DEFAULT
@@ -11,7 +11,7 @@ WITH extended_tables AS (
11
11
  table_owner_id = principal_id,
12
12
  schema_id
13
13
  FROM
14
- {database}.sys.tables
14
+ [{database}].sys.tables
15
15
 
16
16
  UNION
17
17
 
@@ -21,7 +21,7 @@ WITH extended_tables AS (
21
21
  table_owner_id = principal_id,
22
22
  schema_id
23
23
  FROM
24
- {database}.sys.views
24
+ [{database}].sys.views
25
25
 
26
26
  UNION
27
27
 
@@ -31,14 +31,14 @@ WITH extended_tables AS (
31
31
  table_owner_id = principal_id,
32
32
  schema_id
33
33
  FROM
34
- {database}.sys.external_tables
34
+ [{database}].sys.external_tables
35
35
  ),
36
36
  -- Get the row count per table
37
37
  partitions AS (
38
38
  SELECT
39
39
  object_id,
40
40
  row_count = SUM(rows)
41
- FROM {database}.sys.partitions
41
+ FROM [{database}].sys.partitions
42
42
  GROUP BY object_id
43
43
  ),
44
44
  -- Append row count to table properties
@@ -70,11 +70,11 @@ table_ids AS (
70
70
  row_count,
71
71
  comment = CONVERT(varchar(1024), ep.value)
72
72
  FROM extended_tables_with_row_count AS et
73
- LEFT JOIN {database}.sys.schemas AS ss
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
75
+ LEFT JOIN [{database}].sys.sysusers AS u
76
76
  ON et.table_owner_id = u.uid
77
- LEFT JOIN {database}.sys.extended_properties AS ep
77
+ LEFT JOIN [{database}].sys.extended_properties AS ep
78
78
  ON (
79
79
  et.table_id = ep.major_id
80
80
  AND ep.minor_id = 0
@@ -90,8 +90,8 @@ meta AS (
90
90
  t.table_name,
91
91
  t.table_type
92
92
  FROM
93
- {database}.INFORMATION_SCHEMA.TABLES AS t
94
- LEFT JOIN {database}.sys.databases AS db
93
+ [{database}].INFORMATION_SCHEMA.TABLES AS t
94
+ LEFT JOIN [{database}].sys.databases AS db
95
95
  ON t.table_catalog COLLATE DATABASE_DEFAULT = db.name COLLATE DATABASE_DEFAULT
96
96
  )
97
97
 
@@ -0,0 +1,13 @@
1
+ SELECT
2
+ v.name AS view_name,
3
+ m.definition AS view_definition,
4
+ s.name AS schema_name,
5
+ DB_NAME() AS database_name
6
+ FROM
7
+ sys.views v
8
+ INNER JOIN
9
+ sys.schemas s
10
+ ON v.schema_id = s.schema_id
11
+ INNER JOIN
12
+ sys.sql_modules m
13
+ ON v.object_id = m.object_id
@@ -3,7 +3,7 @@ requires = ["setuptools>=61.2"]
3
3
 
4
4
  [tool.poetry]
5
5
  name = "castor-extractor"
6
- version = "0.24.43"
6
+ version = "0.24.49"
7
7
  description = "Extract your metadata assets."
8
8
  authors = ["Castor <support@castordoc.com>"]
9
9
  license = "EULA"
@@ -1,68 +0,0 @@
1
- import logging
2
- from collections.abc import Iterator
3
-
4
- from sqlalchemy import text
5
-
6
- from ...utils import ExtractionQuery, SqlalchemyClient, uri_encode
7
-
8
- logger = logging.getLogger(__name__)
9
-
10
- SERVER_URI = "{user}:{password}@{host}:{port}/{database}"
11
- MSSQL_URI = f"mssql+pymssql://{SERVER_URI}"
12
- DEFAULT_PORT = 1433
13
-
14
- _KEYS = ("user", "password", "host", "port", "database")
15
-
16
- _SYSTEM_DATABASES = ("master", "model", "msdb", "tempdb", "DBAdmin")
17
-
18
-
19
- def _check_key(credentials: dict) -> None:
20
- for key in _KEYS:
21
- if key not in credentials:
22
- raise KeyError(f"Missing {key} in credentials")
23
-
24
-
25
- class MSSQLClient(SqlalchemyClient):
26
- """Microsoft Server SQL client"""
27
-
28
- @staticmethod
29
- def name() -> str:
30
- return "MSSQL"
31
-
32
- def _engine_options(self, credentials: dict) -> dict:
33
- return {}
34
-
35
- def _build_uri(self, credentials: dict) -> str:
36
- _check_key(credentials)
37
- uri = MSSQL_URI.format(
38
- user=credentials["user"],
39
- password=uri_encode(credentials["password"]),
40
- host=credentials["host"],
41
- port=credentials.get("port") or DEFAULT_PORT,
42
- database=credentials["database"],
43
- )
44
- return uri
45
-
46
- def execute(self, query: ExtractionQuery) -> Iterator[dict]:
47
- """
48
- Re-implements the SQLAlchemyClient execute function to ensure we consume
49
- the cursor before calling connection.close() as it wipes out the data
50
- otherwise
51
- """
52
- connection = self.connect()
53
- try:
54
- proxy = connection.execute(text(query.statement), query.params)
55
- results = list(self._process_result(proxy))
56
- yield from results
57
- finally:
58
- self.close()
59
-
60
- def get_databases(self) -> list[str]:
61
- result = self.execute(
62
- ExtractionQuery("SELECT name FROM sys.databases", {})
63
- )
64
- return [
65
- row["name"]
66
- for row in result
67
- if row["name"] not in _SYSTEM_DATABASES
68
- ]