castor-extractor 0.24.32__tar.gz → 0.24.34__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 (435) hide show
  1. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/CHANGELOG.md +10 -2
  2. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/PKG-INFO +11 -3
  3. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_sqlserver.py +12 -0
  4. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_tableau.py +15 -0
  5. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/__init__.py +7 -1
  6. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/collection.py +26 -0
  7. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/collection_test.py +31 -1
  8. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/client/queries/query.sql +1 -0
  9. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/client/client.py +9 -1
  10. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/client/client_metadata_api.py +49 -11
  11. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/extract.py +4 -0
  12. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/sqlserver/client.py +15 -0
  13. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/sqlserver/extract.py +8 -2
  14. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/sqlserver/queries/column.sql +10 -10
  15. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/sqlserver/queries/database.sql +1 -1
  16. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/sqlserver/queries/schema.sql +5 -6
  17. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/sqlserver/queries/table.sql +12 -14
  18. castor_extractor-0.24.34/castor_extractor/warehouse/sqlserver/query.py +53 -0
  19. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/pyproject.toml +1 -1
  20. castor_extractor-0.24.32/castor_extractor/warehouse/sqlserver/query.py +0 -24
  21. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/Dockerfile +0 -0
  22. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/DockerfileUsage.md +0 -0
  23. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/LICENCE +0 -0
  24. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/README.md +0 -0
  25. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/__init__.py +0 -0
  26. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/__init__.py +0 -0
  27. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_bigquery.py +0 -0
  28. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_confluence.py +0 -0
  29. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_databricks.py +0 -0
  30. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_domo.py +0 -0
  31. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_looker.py +0 -0
  32. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_looker_studio.py +0 -0
  33. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_metabase_api.py +0 -0
  34. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_metabase_db.py +0 -0
  35. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_mode.py +0 -0
  36. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_mysql.py +0 -0
  37. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_notion.py +0 -0
  38. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_postgres.py +0 -0
  39. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_powerbi.py +0 -0
  40. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_qlik.py +0 -0
  41. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_redshift.py +0 -0
  42. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_salesforce.py +0 -0
  43. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_salesforce_reporting.py +0 -0
  44. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_sigma.py +0 -0
  45. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_snowflake.py +0 -0
  46. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_strategy.py +0 -0
  47. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/extract_thoughtspot.py +0 -0
  48. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/file_check.py +0 -0
  49. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/commands/upload.py +0 -0
  50. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/__init__.py +0 -0
  51. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/column.py +0 -0
  52. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/column_test.py +0 -0
  53. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/constants.py +0 -0
  54. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/enums.py +0 -0
  55. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/file.py +0 -0
  56. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/file_test.py +0 -0
  57. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/file_test_users.csv +0 -0
  58. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
  59. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/templates/__init__.py +0 -0
  60. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
  61. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/__init__.py +0 -0
  62. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/__init__.py +0 -0
  63. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/assets.py +0 -0
  64. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/client/__init__.py +0 -0
  65. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/client/client.py +0 -0
  66. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/client/client_test.py +0 -0
  67. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/client/credentials.py +0 -0
  68. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/client/endpoints.py +0 -0
  69. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/client/pagination.py +0 -0
  70. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/extract.py +0 -0
  71. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/utils.py +0 -0
  72. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/confluence/utils_test.py +0 -0
  73. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/notion/__init__.py +0 -0
  74. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/notion/assets.py +0 -0
  75. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/notion/client/__init__.py +0 -0
  76. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/notion/client/client.py +0 -0
  77. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/notion/client/client_test.py +0 -0
  78. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/notion/client/constants.py +0 -0
  79. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/notion/client/credentials.py +0 -0
  80. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/notion/client/endpoints.py +0 -0
  81. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/notion/client/pagination.py +0 -0
  82. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/knowledge/notion/extract.py +0 -0
  83. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/logger.py +0 -0
  84. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/quality/__init__.py +0 -0
  85. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/quality/soda/__init__.py +0 -0
  86. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/quality/soda/assets.py +0 -0
  87. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/quality/soda/client/__init__.py +0 -0
  88. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/quality/soda/client/client.py +0 -0
  89. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/quality/soda/client/credentials.py +0 -0
  90. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/quality/soda/client/endpoints.py +0 -0
  91. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/quality/soda/client/pagination.py +0 -0
  92. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/__init__.py +0 -0
  93. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/coalesce/__init__.py +0 -0
  94. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/coalesce/assets.py +0 -0
  95. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/coalesce/client/__init__.py +0 -0
  96. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/coalesce/client/client.py +0 -0
  97. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/coalesce/client/credentials.py +0 -0
  98. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/coalesce/client/endpoint.py +0 -0
  99. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/coalesce/client/type.py +0 -0
  100. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/coalesce/client/utils.py +0 -0
  101. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/coalesce/client/utils_test.py +0 -0
  102. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/dbt/__init__.py +0 -0
  103. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/dbt/assets.py +0 -0
  104. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/dbt/client.py +0 -0
  105. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/dbt/client_test.py +0 -0
  106. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/transformation/dbt/credentials.py +0 -0
  107. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/types.py +0 -0
  108. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/uploader/__init__.py +0 -0
  109. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/uploader/constant.py +0 -0
  110. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/uploader/env.py +0 -0
  111. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/uploader/env_test.py +0 -0
  112. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/uploader/settings.py +0 -0
  113. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/uploader/upload.py +0 -0
  114. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/uploader/upload_test.py +0 -0
  115. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/uploader/utils.py +0 -0
  116. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/argument_parser.py +0 -0
  117. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/argument_parser_test.py +0 -0
  118. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/batch.py +0 -0
  119. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/batch_test.py +0 -0
  120. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/__init__.py +0 -0
  121. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/abstract.py +0 -0
  122. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/__init__.py +0 -0
  123. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/auth.py +0 -0
  124. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/auth_test.py +0 -0
  125. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/client.py +0 -0
  126. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/client_test.py +0 -0
  127. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/pagination.py +0 -0
  128. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/pagination_test.py +0 -0
  129. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/safe_request.py +0 -0
  130. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/safe_request_test.py +0 -0
  131. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/utils.py +0 -0
  132. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/api/utils_test.py +0 -0
  133. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/postgres.py +0 -0
  134. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/query.py +0 -0
  135. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/uri.py +0 -0
  136. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/client/uri_test.py +0 -0
  137. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/constants.py +0 -0
  138. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/deprecate.py +0 -0
  139. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/env.py +0 -0
  140. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/files.py +0 -0
  141. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/files_test.py +0 -0
  142. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/formatter.py +0 -0
  143. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/formatter_test.csv +0 -0
  144. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/formatter_test.json +0 -0
  145. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/formatter_test.py +0 -0
  146. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/json_stream_write.py +0 -0
  147. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/load.py +0 -0
  148. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/object.py +0 -0
  149. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/object_test.py +0 -0
  150. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/pager/__init__.py +0 -0
  151. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/pager/pager.py +0 -0
  152. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/pager/pager_on_id.py +0 -0
  153. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/pager/pager_on_id_test.py +0 -0
  154. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/pager/pager_test.py +0 -0
  155. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/retry.py +0 -0
  156. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/retry_test.py +0 -0
  157. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/safe.py +0 -0
  158. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/safe_test.py +0 -0
  159. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/salesforce/__init__.py +0 -0
  160. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/salesforce/client.py +0 -0
  161. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/salesforce/client_test.py +0 -0
  162. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/salesforce/constants.py +0 -0
  163. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/salesforce/credentials.py +0 -0
  164. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/salesforce/credentials_test.py +0 -0
  165. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/salesforce/pagination.py +0 -0
  166. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/store.py +0 -0
  167. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/string.py +0 -0
  168. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/string_test.py +0 -0
  169. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/time.py +0 -0
  170. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/time_test.py +0 -0
  171. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/type.py +0 -0
  172. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/url.py +0 -0
  173. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/url_test.py +0 -0
  174. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/validation.py +0 -0
  175. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/validation_test.py +0 -0
  176. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/utils/write.py +0 -0
  177. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/__init__.py +0 -0
  178. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/domo/__init__.py +0 -0
  179. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/domo/assets.py +0 -0
  180. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/domo/client/__init__.py +0 -0
  181. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/domo/client/client.py +0 -0
  182. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/domo/client/credentials.py +0 -0
  183. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/domo/client/endpoints.py +0 -0
  184. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/domo/client/pagination.py +0 -0
  185. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/domo/client/pagination_test.py +0 -0
  186. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/domo/extract.py +0 -0
  187. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/__init__.py +0 -0
  188. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/api/__init__.py +0 -0
  189. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/api/client.py +0 -0
  190. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/api/client_test.py +0 -0
  191. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/api/constants.py +0 -0
  192. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/api/credentials.py +0 -0
  193. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/api/extraction_parameters.py +0 -0
  194. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/api/sdk.py +0 -0
  195. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
  196. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/api/utils.py +0 -0
  197. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/assets.py +0 -0
  198. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/constant.py +0 -0
  199. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/constants.py +0 -0
  200. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/extract.py +0 -0
  201. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/fields.py +0 -0
  202. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/fields_test.py +0 -0
  203. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker/multithreading.py +0 -0
  204. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/__init__.py +0 -0
  205. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/assets.py +0 -0
  206. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/client/__init__.py +0 -0
  207. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/client/admin_sdk_client.py +0 -0
  208. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/client/client.py +0 -0
  209. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/client/credentials.py +0 -0
  210. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/client/endpoints.py +0 -0
  211. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/client/enums.py +0 -0
  212. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/client/looker_studio_api_client.py +0 -0
  213. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/client/pagination.py +0 -0
  214. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/extract.py +0 -0
  215. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/looker_studio/extract_test.py +0 -0
  216. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/__init__.py +0 -0
  217. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/assets.py +0 -0
  218. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
  219. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
  220. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/api/client.py +0 -0
  221. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/api/client_test.py +0 -0
  222. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
  223. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
  224. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/client.py +0 -0
  225. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/credentials.py +0 -0
  226. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
  227. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
  228. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
  229. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
  230. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
  231. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
  232. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
  233. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
  234. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
  235. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
  236. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
  237. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/client/shared.py +0 -0
  238. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/errors.py +0 -0
  239. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/extract.py +0 -0
  240. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/metabase/types.py +0 -0
  241. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/mode/__init__.py +0 -0
  242. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/mode/assets.py +0 -0
  243. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/mode/client/__init__.py +0 -0
  244. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/mode/client/client.py +0 -0
  245. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/mode/client/client_test.json +0 -0
  246. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/mode/client/client_test.py +0 -0
  247. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/mode/client/constants.py +0 -0
  248. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/mode/client/credentials.py +0 -0
  249. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/mode/errors.py +0 -0
  250. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/mode/extract.py +0 -0
  251. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/__init__.py +0 -0
  252. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/assets.py +0 -0
  253. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/client/__init__.py +0 -0
  254. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/client/authentication.py +0 -0
  255. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/client/client.py +0 -0
  256. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/client/client_test.py +0 -0
  257. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/client/constants.py +0 -0
  258. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/client/credentials.py +0 -0
  259. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/client/credentials_test.py +0 -0
  260. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/client/endpoints.py +0 -0
  261. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/client/pagination.py +0 -0
  262. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/powerbi/extract.py +0 -0
  263. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/__init__.py +0 -0
  264. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/assets.py +0 -0
  265. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
  266. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/constants.py +0 -0
  267. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
  268. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/engine/client.py +0 -0
  269. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/engine/constants.py +0 -0
  270. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/engine/credentials.py +0 -0
  271. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/engine/error.py +0 -0
  272. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/engine/error_test.py +0 -0
  273. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +0 -0
  274. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
  275. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/engine/websocket.py +0 -0
  276. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/master.py +0 -0
  277. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/rest.py +0 -0
  278. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/client/rest_test.py +0 -0
  279. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/qlik/extract.py +0 -0
  280. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/salesforce_reporting/__init__.py +0 -0
  281. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/salesforce_reporting/assets.py +0 -0
  282. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/salesforce_reporting/client/__init__.py +0 -0
  283. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/salesforce_reporting/client/rest.py +0 -0
  284. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/salesforce_reporting/client/soql.py +0 -0
  285. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/salesforce_reporting/extract.py +0 -0
  286. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/sigma/__init__.py +0 -0
  287. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/sigma/assets.py +0 -0
  288. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
  289. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/sigma/client/client.py +0 -0
  290. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/sigma/client/client_test.py +0 -0
  291. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
  292. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/sigma/client/endpoints.py +0 -0
  293. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/sigma/client/pagination.py +0 -0
  294. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/sigma/extract.py +0 -0
  295. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/strategy/__init__.py +0 -0
  296. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/strategy/assets.py +0 -0
  297. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/strategy/client/__init__.py +0 -0
  298. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/strategy/client/client.py +0 -0
  299. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/strategy/client/credentials.py +0 -0
  300. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/strategy/client/properties.py +0 -0
  301. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/strategy/extract.py +0 -0
  302. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/__init__.py +0 -0
  303. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/assets.py +0 -0
  304. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/client/__init__.py +0 -0
  305. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/client/client_metadata_api_test.py +0 -0
  306. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/client/client_rest_api.py +0 -0
  307. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/client/client_tsc.py +0 -0
  308. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/client/credentials.py +0 -0
  309. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/client/errors.py +0 -0
  310. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/client/gql_queries.py +0 -0
  311. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/client/rest_fields.py +0 -0
  312. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/tableau/constants.py +0 -0
  313. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/thoughtspot/__init__.py +0 -0
  314. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/thoughtspot/assets.py +0 -0
  315. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/thoughtspot/client/__init__.py +0 -0
  316. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/thoughtspot/client/client.py +0 -0
  317. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/thoughtspot/client/credentials.py +0 -0
  318. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/thoughtspot/client/endpoints.py +0 -0
  319. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/thoughtspot/client/pagination.py +0 -0
  320. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/visualization/thoughtspot/extract.py +0 -0
  321. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/__init__.py +0 -0
  322. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/abstract/__init__.py +0 -0
  323. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/abstract/asset.py +0 -0
  324. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/abstract/asset_test.py +0 -0
  325. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/abstract/extract.py +0 -0
  326. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/abstract/query.py +0 -0
  327. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/abstract/time_filter.py +0 -0
  328. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
  329. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
  330. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/client.py +0 -0
  331. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
  332. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/credentials.py +0 -0
  333. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/extract.py +0 -0
  334. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
  335. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
  336. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
  337. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
  338. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
  339. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
  340. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
  341. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
  342. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
  343. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
  344. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/query.py +0 -0
  345. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/bigquery/types.py +0 -0
  346. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/__init__.py +0 -0
  347. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/api_client.py +0 -0
  348. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/api_client_test.py +0 -0
  349. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/client.py +0 -0
  350. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/client_test.py +0 -0
  351. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/credentials.py +0 -0
  352. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/endpoints.py +0 -0
  353. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/enums.py +0 -0
  354. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/extract.py +0 -0
  355. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/format.py +0 -0
  356. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/format_test.py +0 -0
  357. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/lineage.py +0 -0
  358. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/lineage_test.py +0 -0
  359. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/pagination.py +0 -0
  360. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/sql_client.py +0 -0
  361. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/types.py +0 -0
  362. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/utils.py +0 -0
  363. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/databricks/utils_test.py +0 -0
  364. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/__init__.py +0 -0
  365. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/client.py +0 -0
  366. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/client_test.py +0 -0
  367. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/extract.py +0 -0
  368. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/queries/.sqlfluff +0 -0
  369. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/queries/column.sql +0 -0
  370. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/queries/database.sql +0 -0
  371. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/queries/query.sql +0 -0
  372. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/queries/schema.sql +0 -0
  373. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/queries/table.sql +0 -0
  374. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/queries/user.sql +0 -0
  375. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/queries/view_ddl.sql +0 -0
  376. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/mysql/query.py +0 -0
  377. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/postgres/__init__.py +0 -0
  378. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/postgres/extract.py +0 -0
  379. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
  380. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
  381. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
  382. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
  383. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
  384. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
  385. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
  386. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/postgres/query.py +0 -0
  387. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/__init__.py +0 -0
  388. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/client.py +0 -0
  389. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/client_test.py +0 -0
  390. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/extract.py +0 -0
  391. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/extract_test.py +0 -0
  392. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
  393. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
  394. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
  395. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
  396. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/query.sql +0 -0
  397. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/query_serverless.sql +0 -0
  398. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
  399. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
  400. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
  401. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
  402. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
  403. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/redshift/query.py +0 -0
  404. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/salesforce/__init__.py +0 -0
  405. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/salesforce/client.py +0 -0
  406. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/salesforce/constants.py +0 -0
  407. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/salesforce/extract.py +0 -0
  408. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/salesforce/format.py +0 -0
  409. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/salesforce/format_test.py +0 -0
  410. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/salesforce/pagination.py +0 -0
  411. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/salesforce/soql.py +0 -0
  412. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/__init__.py +0 -0
  413. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/client.py +0 -0
  414. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/client_test.py +0 -0
  415. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/credentials.py +0 -0
  416. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/credentials_test.py +0 -0
  417. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/extract.py +0 -0
  418. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
  419. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/column.sql +0 -0
  420. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +0 -0
  421. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/database.sql +0 -0
  422. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/function.sql +0 -0
  423. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -0
  424. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -0
  425. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/query.sql +0 -0
  426. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/role.sql +0 -0
  427. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/schema.sql +0 -0
  428. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/table.sql +0 -0
  429. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
  430. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +0 -0
  431. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/snowflake/query.py +0 -0
  432. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/sqlserver/__init__.py +0 -0
  433. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/sqlserver/queries/.sqlfluff +0 -0
  434. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/sqlserver/queries/user.sql +0 -0
  435. {castor_extractor-0.24.32 → castor_extractor-0.24.34}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
@@ -1,12 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.24.34 - 2025-07-02
4
+
5
+ * SQLServer: multiple databases
6
+
7
+ ## 0.24.33 - 2025-07-10
8
+
9
+ * Tableau - Add an option to skip fields ingestion
10
+
3
11
  ## 0.24.32 - 2025-07-02
4
12
 
5
13
  * Salesforce reporting - extract report's metadata
6
- *
14
+
7
15
  ## 0.24.31 - 2025-07-02
8
16
 
9
- * Looker Studio: add option to list users via a provided JSON file
17
+ * Looker Studio: add an option to list users via a provided JSON file
10
18
 
11
19
  ## 0.24.30 - 2025-06-26
12
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: castor-extractor
3
- Version: 0.24.32
3
+ Version: 0.24.34
4
4
  Summary: Extract your metadata assets.
5
5
  Home-page: https://www.castordoc.com/
6
6
  License: EULA
@@ -215,13 +215,21 @@ For any questions or bug report, contact us at [support@coalesce.io](mailto:supp
215
215
 
216
216
  # Changelog
217
217
 
218
+ ## 0.24.34 - 2025-07-02
219
+
220
+ * SQLServer: multiple databases
221
+
222
+ ## 0.24.33 - 2025-07-10
223
+
224
+ * Tableau - Add an option to skip fields ingestion
225
+
218
226
  ## 0.24.32 - 2025-07-02
219
227
 
220
228
  * Salesforce reporting - extract report's metadata
221
- *
229
+
222
230
  ## 0.24.31 - 2025-07-02
223
231
 
224
- * Looker Studio: add option to list users via a provided JSON file
232
+ * Looker Studio: add an option to list users via a provided JSON file
225
233
 
226
234
  ## 0.24.30 - 2025-06-26
227
235
 
@@ -23,6 +23,16 @@ def main():
23
23
  action="store_true",
24
24
  help="Skips files already extracted instead of replacing them",
25
25
  )
26
+ parser.add_argument(
27
+ "--db-allowed",
28
+ nargs="*",
29
+ help="List of databases that should be extracted",
30
+ )
31
+ parser.add_argument(
32
+ "--db-blocked",
33
+ nargs="*",
34
+ help="List of databases that should not be extracted",
35
+ )
26
36
  parser.set_defaults(skip_existing=False)
27
37
 
28
38
  args = parser.parse_args()
@@ -35,4 +45,6 @@ def main():
35
45
  password=args.password,
36
46
  output_directory=args.output,
37
47
  skip_existing=args.skip_existing,
48
+ db_allowed=args.db_allowed,
49
+ db_blocked=args.db_blocked,
38
50
  )
@@ -28,6 +28,13 @@ def main():
28
28
  help="Option to avoid extracting Tableau columns, default to False",
29
29
  )
30
30
 
31
+ parser.add_argument(
32
+ "--skip-fields",
33
+ dest="skip_fields",
34
+ action="store_true",
35
+ help="Option to avoid extracting Tableau fields, default to False",
36
+ )
37
+
31
38
  parser.add_argument(
32
39
  "--with-pulse",
33
40
  dest="with_pulse",
@@ -41,6 +48,14 @@ def main():
41
48
  required=False,
42
49
  )
43
50
 
51
+ parser.add_argument(
52
+ "-ie",
53
+ "--ignore-errors",
54
+ action="store_true",
55
+ dest="ignore_errors",
56
+ help="Allow partial extraction of Fields and Columns: skip batch in case of Timeout errors",
57
+ )
58
+
44
59
  parser.add_argument("-o", "--output", help="Directory to write to")
45
60
 
46
61
  tableau.extract_all(**parse_filled_arguments(parser))
@@ -19,7 +19,13 @@ from .client import (
19
19
  handle_response,
20
20
  uri_encode,
21
21
  )
22
- from .collection import deduplicate, empty_iterator, group_by, mapping_from_rows
22
+ from .collection import (
23
+ deduplicate,
24
+ empty_iterator,
25
+ filter_items,
26
+ group_by,
27
+ mapping_from_rows,
28
+ )
23
29
  from .constants import OUTPUT_DIR
24
30
  from .deprecate import deprecate_python
25
31
  from .env import from_env
@@ -2,6 +2,8 @@ from collections import defaultdict
2
2
  from collections.abc import Iterable, Sequence
3
3
  from typing import (
4
4
  Any,
5
+ List,
6
+ Optional,
5
7
  TypeVar,
6
8
  )
7
9
 
@@ -80,3 +82,27 @@ def deduplicate(
80
82
  deduplicated.append(element)
81
83
 
82
84
  return deduplicated
85
+
86
+
87
+ def filter_items(
88
+ items: Iterable[T],
89
+ allowed: Optional[Iterable[T]] = None,
90
+ blocked: Optional[Iterable[T]] = None,
91
+ ) -> List[T]:
92
+ """
93
+ Filters `items` by excluding any in `blocked` or including only those in `allowed`.
94
+ If both `allowed` and `blocked` are None, returns all items.
95
+ If both are provided, raise an error.
96
+ """
97
+ items = list(items)
98
+
99
+ if allowed and blocked:
100
+ raise AttributeError(
101
+ "Only one of `allowed` and `blocked` can be provided"
102
+ )
103
+ if blocked:
104
+ return [item for item in items if item not in blocked]
105
+ if allowed:
106
+ return [item for item in items if item in allowed]
107
+
108
+ return items
@@ -1,4 +1,6 @@
1
- from .collection import deduplicate, mapping_from_rows
1
+ import pytest
2
+
3
+ from .collection import deduplicate, filter_items, mapping_from_rows
2
4
 
3
5
 
4
6
  def test__mapping_from_rows__basic_mapping():
@@ -72,3 +74,31 @@ def test_deduplicate():
72
74
  {"id": "2", "name": "duplicate"},
73
75
  ]
74
76
  assert deduplicate("id", elements) == [e1, e2, e3]
77
+
78
+
79
+ def test_sqlserver_databases():
80
+ databases = [
81
+ "prod",
82
+ "staging",
83
+ "test",
84
+ ]
85
+
86
+ # 1. No allowed or blocked: should return all
87
+ result1 = filter_items(databases)
88
+ assert result1 == [
89
+ "prod",
90
+ "staging",
91
+ "test",
92
+ ]
93
+
94
+ # 2. Block "prod": only staging and test should remain
95
+ result2 = filter_items(databases, blocked=["prod"])
96
+ assert result2 == ["staging", "test"]
97
+
98
+ # 3. Only allow "staging" and "test"
99
+ result3 = filter_items(databases, allowed=["staging", "test"])
100
+ assert result3 == ["staging", "test"]
101
+
102
+ # 4. allowed and blocked, should raise
103
+ with pytest.raises(AttributeError):
104
+ filter_items(databases, blocked=["prod"], allowed=["staging", "test"])
@@ -29,6 +29,7 @@ WITH ranked_by_datasource AS (
29
29
  `{project}.region-{region}.INFORMATION_SCHEMA.JOBS_BY_PROJECT`
30
30
  WHERE
31
31
  job_type = 'QUERY'
32
+ AND ARRAY_LENGTH(referenced_tables) > 0
32
33
  AND EXISTS (
33
34
  SELECT
34
35
  1
@@ -122,13 +122,17 @@ class TableauClient:
122
122
  credentials: TableauCredentials,
123
123
  timeout_sec: int = DEFAULT_TIMEOUT_SECONDS,
124
124
  with_columns: bool = True,
125
+ with_fields: bool = True,
125
126
  with_pulse: bool = False,
126
127
  override_page_size: Optional[int] = None,
128
+ ignore_errors: bool = False,
127
129
  ):
128
130
  self._credentials = credentials
129
131
  self._server = _server(credentials.server_url, timeout_sec)
130
132
  self._with_columns = with_columns
133
+ self._with_fields = with_fields
131
134
  self._with_pulse = with_pulse
135
+ self._ignore_errors = ignore_errors
132
136
 
133
137
  self._client_metadata = TableauClientMetadataApi(
134
138
  server=self._server,
@@ -221,6 +225,10 @@ class TableauClient:
221
225
  logger.info(f"Skipping asset {asset} - deactivated columns")
222
226
  return []
223
227
 
228
+ if asset == TableauAsset.FIELD and not self._with_fields:
229
+ logger.info(f"Skipping asset {asset} - deactivated fields")
230
+ return []
231
+
224
232
  logger.info(f"Extracting {asset.name}...")
225
233
 
226
234
  if asset == TableauAsset.DATASOURCE:
@@ -240,4 +248,4 @@ class TableauClient:
240
248
  return self._client_rest.fetch(asset)
241
249
 
242
250
  # other assets can be extracted via Metadata API
243
- return self._client_metadata.fetch(asset)
251
+ return self._client_metadata.fetch(asset, self._ignore_errors)
@@ -2,6 +2,7 @@ import logging
2
2
  from collections.abc import Iterator
3
3
  from typing import Optional
4
4
 
5
+ import requests
5
6
  import tableauserverclient as TSC # type: ignore
6
7
 
7
8
  from ....utils import SerializedAsset, retry
@@ -12,6 +13,13 @@ from .gql_queries import FIELDS_QUERIES, GQL_QUERIES, QUERY_TEMPLATE
12
13
 
13
14
  logger = logging.getLogger(__name__)
14
15
 
16
+ # These assets are known to be error-prone, so it's acceptable if a few are missed.
17
+ # If errors occur, skip the current batch.
18
+ _SAFE_MODE_ASSETS = (
19
+ TableauAsset.COLUMN,
20
+ TableauAsset.FIELD,
21
+ )
22
+
15
23
  # increase the value when extraction is too slow
16
24
  # decrease the value when timeouts arise
17
25
  _CUSTOM_PAGE_SIZE: dict[TableauAsset, int] = {
@@ -92,6 +100,7 @@ def gql_query_scroll(
92
100
  resource: str,
93
101
  fields: str,
94
102
  page_size: int,
103
+ skip_batch: bool,
95
104
  ) -> Iterator[SerializedAsset]:
96
105
  """
97
106
  Iterate over GQL query results, handling pagination and cursor
@@ -119,15 +128,22 @@ def gql_query_scroll(
119
128
 
120
129
  current_offset = 0
121
130
  while True:
122
- payload = _call(first=page_size, offset=current_offset)
123
- yield payload["nodes"]
131
+ try:
132
+ payload = _call(first=page_size, offset=current_offset)
133
+ yield payload["nodes"]
134
+
135
+ current_offset += len(payload["nodes"])
136
+ total = payload["totalCount"]
137
+ logger.info(f"Extracted {current_offset}/{total} {resource}")
124
138
 
125
- current_offset += len(payload["nodes"])
126
- total = payload["totalCount"]
127
- logger.info(f"Extracted {current_offset}/{total} {resource}")
139
+ if not payload["pageInfo"]["hasNextPage"]:
140
+ break
141
+ except requests.exceptions.ReadTimeout:
142
+ if not skip_batch:
143
+ raise
128
144
 
129
- if not payload["pageInfo"]["hasNextPage"]:
130
- break
145
+ logger.warning("Skipping batch because of TableauServer Timeout")
146
+ current_offset += page_size
131
147
 
132
148
 
133
149
  def _deduplicate(result_pages: Iterator[SerializedAsset]) -> SerializedAsset:
@@ -177,12 +193,14 @@ class TableauClientMetadataApi:
177
193
  resource: str,
178
194
  fields: str,
179
195
  page_size: int = DEFAULT_PAGE_SIZE,
196
+ skip_batch: bool = False,
180
197
  ) -> SerializedAsset:
181
198
  result_pages = gql_query_scroll(
182
199
  self._server,
183
200
  resource=resource,
184
201
  fields=fields,
185
202
  page_size=page_size,
203
+ skip_batch=skip_batch,
186
204
  )
187
205
  return _deduplicate(result_pages)
188
206
 
@@ -193,21 +211,41 @@ class TableauClientMetadataApi:
193
211
  or DEFAULT_PAGE_SIZE
194
212
  )
195
213
 
196
- def _fetch_fields(self) -> SerializedAsset:
214
+ def _fetch_fields(self, skip_batch: bool = False) -> SerializedAsset:
197
215
  result: SerializedAsset = []
198
216
  page_size = self._page_size(TableauAsset.FIELD)
199
217
  for resource, fields in FIELDS_QUERIES:
200
- current = self._call(resource, fields, page_size)
218
+ current = self._call(
219
+ resource,
220
+ fields,
221
+ page_size,
222
+ skip_batch=skip_batch,
223
+ )
201
224
  result.extend(current)
202
225
  return result
203
226
 
227
+ @staticmethod
228
+ def _should_skip_batch_with_timeout(
229
+ asset: TableauAsset,
230
+ ignore_metadata_errors: bool = False,
231
+ ) -> bool:
232
+ return asset in _SAFE_MODE_ASSETS and ignore_metadata_errors
233
+
204
234
  def fetch(
205
235
  self,
206
236
  asset: TableauAsset,
237
+ ignore_errors: bool = False,
207
238
  ) -> SerializedAsset:
239
+ skip_batch = self._should_skip_batch_with_timeout(asset, ignore_errors)
240
+
208
241
  if asset == TableauAsset.FIELD:
209
- return self._fetch_fields()
242
+ return self._fetch_fields(skip_batch=skip_batch)
210
243
 
211
244
  page_size = self._page_size(asset)
212
245
  resource, fields = GQL_QUERIES[asset]
213
- return self._call(resource, fields, page_size)
246
+ return self._call(
247
+ resource=resource,
248
+ fields=fields,
249
+ page_size=page_size,
250
+ skip_batch=skip_batch,
251
+ )
@@ -33,16 +33,20 @@ def extract_all(**kwargs) -> None:
33
33
  """
34
34
  output_directory = kwargs.get("output") or from_env(OUTPUT_DIR)
35
35
  with_columns = not kwargs.get("skip_columns")
36
+ with_fields = not kwargs.get("skip_fields")
36
37
  with_pulse = kwargs.get("with_pulse") or False
37
38
  page_size = kwargs.get("page_size")
39
+ ignore_errors = kwargs.get("ignore_errors") or False
38
40
  timestamp = current_timestamp()
39
41
 
40
42
  credentials = TableauCredentials(**kwargs)
41
43
  client = TableauClient(
42
44
  credentials,
43
45
  with_columns=with_columns,
46
+ with_fields=with_fields,
44
47
  with_pulse=with_pulse,
45
48
  override_page_size=page_size,
49
+ ignore_errors=ignore_errors,
46
50
  )
47
51
  client.login()
48
52
 
@@ -1,15 +1,20 @@
1
+ import logging
1
2
  from collections.abc import Iterator
2
3
 
3
4
  from sqlalchemy import text
4
5
 
5
6
  from ...utils import ExtractionQuery, SqlalchemyClient, uri_encode
6
7
 
8
+ logger = logging.getLogger(__name__)
9
+
7
10
  SERVER_URI = "{user}:{password}@{host}:{port}/{database}"
8
11
  MSSQL_URI = f"mssql+pymssql://{SERVER_URI}"
9
12
  DEFAULT_PORT = 1433
10
13
 
11
14
  _KEYS = ("user", "password", "host", "port", "database")
12
15
 
16
+ _SYSTEM_DATABASES = ("master", "model", "msdb", "tempdb", "DBAdmin")
17
+
13
18
 
14
19
  def _check_key(credentials: dict) -> None:
15
20
  for key in _KEYS:
@@ -51,3 +56,13 @@ class MSSQLClient(SqlalchemyClient):
51
56
  yield from results
52
57
  finally:
53
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
+ ]
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
 
3
- from ...utils import LocalStorage, from_env, write_summary
3
+ from ...utils import LocalStorage, filter_items, from_env, write_summary
4
4
  from ..abstract import (
5
5
  CATALOG_ASSETS,
6
6
  EXTERNAL_LINEAGE_ASSETS,
@@ -51,7 +51,13 @@ def extract_all(**kwargs) -> None:
51
51
 
52
52
  client = MSSQLClient(credentials=_credentials(kwargs))
53
53
 
54
- query_builder = MSSQLQueryBuilder()
54
+ databases = filter_items(
55
+ client.get_databases(), kwargs.get("allowed"), kwargs.get("blocked")
56
+ )
57
+
58
+ query_builder = MSSQLQueryBuilder(
59
+ databases=databases,
60
+ )
55
61
 
56
62
  storage = LocalStorage(directory=output_directory)
57
63
 
@@ -11,7 +11,7 @@ WITH extended_tables AS (
11
11
  table_owner_id = principal_id,
12
12
  schema_id
13
13
  FROM
14
- 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
- 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
- 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 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 sys.schemas AS ss ON et.schema_id = ss.schema_id
60
- LEFT JOIN sys.databases AS sd ON sd.name = DB_NAME()
61
- LEFT JOIN 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
@@ -70,9 +70,9 @@ columns AS (
70
70
  i.database_name,
71
71
  i.database_id,
72
72
  schema_name = c.table_schema,
73
- i.schema_id,
73
+ schema_id = CAST(i.database_id AS VARCHAR(10)) + '_' + CAST(i.schema_id AS VARCHAR(10)),
74
74
  table_name = c.table_name,
75
- i.table_id,
75
+ table_id = CAST(i.database_id AS VARCHAR(10)) + '_' + CAST(i.schema_id AS VARCHAR(10)) + '_' + CAST(i.table_id AS VARCHAR(10)),
76
76
  c.column_name,
77
77
  c.data_type,
78
78
  c.ordinal_position,
@@ -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
- 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
  (
@@ -2,4 +2,4 @@ SELECT
2
2
  db.database_id,
3
3
  database_name = db.name
4
4
  FROM sys.databases AS db
5
- WHERE db.name = DB_NAME()
5
+ WHERE db.name NOT IN ('master', 'model', 'msdb', 'tempdb', 'DBAdmin');
@@ -3,21 +3,20 @@ WITH ids AS (
3
3
  SELECT DISTINCT
4
4
  table_catalog,
5
5
  table_schema
6
- FROM information_schema.tables
7
- WHERE table_catalog = DB_NAME()
6
+ FROM {database}.information_schema.tables
8
7
  )
9
8
 
10
9
  SELECT
11
10
  d.database_id,
12
11
  database_name = i.table_catalog,
13
12
  schema_name = s.name,
14
- s.schema_id,
13
+ schema_id = CAST(d.database_id AS VARCHAR(10)) + '_' + CAST(s.schema_id AS VARCHAR(10)),
15
14
  schema_owner = u.name,
16
15
  schema_owner_id = u.uid
17
- FROM sys.schemas AS s
16
+ FROM {database}.sys.schemas AS s
18
17
  INNER JOIN ids AS i
19
18
  ON s.name = i.table_schema
20
- LEFT JOIN sys.sysusers AS u
19
+ LEFT JOIN {database}.sys.sysusers AS u
21
20
  ON s.principal_id = u.uid
22
- LEFT JOIN sys.databases AS d
21
+ LEFT JOIN {database}.sys.databases AS d
23
22
  ON i.table_catalog = d.name
@@ -11,7 +11,7 @@ WITH extended_tables AS (
11
11
  table_owner_id = principal_id,
12
12
  schema_id
13
13
  FROM
14
- 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
- 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
- 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 sys.partitions
41
+ FROM {database}.sys.partitions
42
42
  GROUP BY object_id
43
43
  ),
44
44
  -- Append row count to table properties
@@ -69,13 +69,12 @@ table_ids AS (
69
69
  table_owner = u.name,
70
70
  row_count,
71
71
  comment = CONVERT(varchar(1024), ep.value)
72
- FROM
73
- extended_tables_with_row_count AS et
74
- LEFT JOIN sys.schemas AS ss
72
+ FROM extended_tables_with_row_count AS et
73
+ LEFT JOIN {database}.sys.schemas AS ss
75
74
  ON et.schema_id = ss.schema_id
76
- LEFT JOIN sys.sysusers AS u
75
+ LEFT JOIN {database}.sys.sysusers AS u
77
76
  ON et.table_owner_id = u.uid
78
- LEFT JOIN sys.extended_properties AS ep
77
+ LEFT JOIN {database}.sys.extended_properties AS ep
79
78
  ON (
80
79
  et.table_id = ep.major_id
81
80
  AND ep.minor_id = 0
@@ -91,19 +90,18 @@ meta AS (
91
90
  t.table_name,
92
91
  t.table_type
93
92
  FROM
94
- information_schema.tables AS t
95
- LEFT JOIN sys.databases AS db
93
+ {database}.information_schema.tables AS t
94
+ LEFT JOIN {database}.sys.databases AS db
96
95
  ON t.table_catalog = db.name
97
- WHERE t.table_catalog = db_name()
98
96
  )
99
97
 
100
98
  SELECT
101
99
  m.database_name,
102
100
  m.database_id,
103
101
  m.schema_name,
104
- i.schema_id,
102
+ schema_id = CAST(m.database_id AS VARCHAR(10)) + '_' + CAST(i.schema_id AS VARCHAR(10)),
105
103
  m.table_name,
106
- i.table_id,
104
+ table_id = CAST(m.database_id AS VARCHAR(10)) + '_' + CAST(i.schema_id AS VARCHAR(10)) + '_' + CAST(i.table_id AS VARCHAR(10)),
107
105
  m.table_type,
108
106
  i.table_owner,
109
107
  i.table_owner_id,
@@ -0,0 +1,53 @@
1
+ import logging
2
+ from typing import Optional
3
+
4
+ from ..abstract import (
5
+ AbstractQueryBuilder,
6
+ ExtractionQuery,
7
+ TimeFilter,
8
+ WarehouseAsset,
9
+ )
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ _DATABASE_REQUIRED = (
15
+ WarehouseAsset.SCHEMA,
16
+ WarehouseAsset.TABLE,
17
+ WarehouseAsset.COLUMN,
18
+ )
19
+
20
+
21
+ class MSSQLQueryBuilder(AbstractQueryBuilder):
22
+ """
23
+ Builds queries to extract assets from SQL Server.
24
+ """
25
+
26
+ def __init__(
27
+ self,
28
+ databases: list[str],
29
+ time_filter: Optional[TimeFilter] = None,
30
+ ):
31
+ super().__init__(time_filter=time_filter)
32
+ self._databases = databases
33
+
34
+ @staticmethod
35
+ def _format(query: ExtractionQuery, values: dict) -> ExtractionQuery:
36
+ return ExtractionQuery(
37
+ statement=query.statement.format(**values),
38
+ params=query.params,
39
+ )
40
+
41
+ def build(self, asset: WarehouseAsset) -> list[ExtractionQuery]:
42
+ query = self.build_default(asset)
43
+
44
+ if asset not in _DATABASE_REQUIRED:
45
+ return [query]
46
+
47
+ logger.info(
48
+ f"\tWill run queries with following database params: {self._databases}",
49
+ )
50
+ return [
51
+ self._format(query, {"database": database})
52
+ for database in self._databases
53
+ ]
@@ -3,7 +3,7 @@ requires = ["setuptools>=61.2"]
3
3
 
4
4
  [tool.poetry]
5
5
  name = "castor-extractor"
6
- version = "0.24.32"
6
+ version = "0.24.34"
7
7
  description = "Extract your metadata assets."
8
8
  authors = ["Castor <support@castordoc.com>"]
9
9
  license = "EULA"