castor-extractor 0.19.7__tar.gz → 0.20.0__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 (415) hide show
  1. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/CHANGELOG.md +14 -0
  2. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/PKG-INFO +17 -3
  3. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_tableau.py +8 -22
  4. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/notion/client/client.py +3 -0
  5. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/notion/client/pagination.py +5 -3
  6. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/quality/soda/client/client.py +15 -5
  7. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/quality/soda/client/credentials.py +3 -0
  8. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/quality/soda/client/pagination.py +1 -2
  9. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/__init__.py +1 -1
  10. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/client.py +7 -7
  11. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/pagination.py +2 -2
  12. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/write.py +1 -1
  13. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/domo/client/client.py +3 -1
  14. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/api/client.py +9 -2
  15. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/extract.py +10 -7
  16. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/api_client.py +6 -0
  17. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/client.py +11 -5
  18. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/table.sql +2 -0
  19. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/sqlserver/client.py +2 -2
  20. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/pyproject.toml +5 -5
  21. castor_extractor-0.19.7/castor_extractor/warehouse/synapse/__init__.py +0 -1
  22. castor_extractor-0.19.7/castor_extractor/warehouse/synapse/extract.py +0 -21
  23. castor_extractor-0.19.7/castor_extractor/warehouse/synapse/queries/.sqlfluff +0 -2
  24. castor_extractor-0.19.7/castor_extractor/warehouse/synapse/queries/database.sql +0 -6
  25. castor_extractor-0.19.7/castor_extractor/warehouse/synapse/queries/query.sql +0 -33
  26. castor_extractor-0.19.7/castor_extractor/warehouse/synapse/queries/schema.sql +0 -7
  27. castor_extractor-0.19.7/castor_extractor/warehouse/synapse/queries/table.sql +0 -36
  28. castor_extractor-0.19.7/castor_extractor/warehouse/synapse/queries/user.sql +0 -4
  29. castor_extractor-0.19.7/castor_extractor/warehouse/synapse/queries/view_ddl.sql +0 -8
  30. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/Dockerfile +0 -0
  31. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/DockerfileUsage.md +0 -0
  32. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/LICENCE +0 -0
  33. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/README.md +0 -0
  34. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/__init__.py +0 -0
  35. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/__init__.py +0 -0
  36. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_bigquery.py +0 -0
  37. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_databricks.py +0 -0
  38. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_domo.py +0 -0
  39. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_looker.py +0 -0
  40. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_metabase_api.py +0 -0
  41. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_metabase_db.py +0 -0
  42. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_mode.py +0 -0
  43. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_mysql.py +0 -0
  44. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_notion.py +0 -0
  45. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_postgres.py +0 -0
  46. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_powerbi.py +0 -0
  47. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_qlik.py +0 -0
  48. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_redshift.py +0 -0
  49. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_salesforce.py +0 -0
  50. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_salesforce_reporting.py +0 -0
  51. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_sigma.py +0 -0
  52. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_snowflake.py +0 -0
  53. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/extract_sqlserver.py +0 -0
  54. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/file_check.py +0 -0
  55. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/commands/upload.py +0 -0
  56. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/__init__.py +0 -0
  57. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/column.py +0 -0
  58. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/column_test.py +0 -0
  59. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/constants.py +0 -0
  60. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/enums.py +0 -0
  61. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/file.py +0 -0
  62. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/file_test.py +0 -0
  63. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/file_test_users.csv +0 -0
  64. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
  65. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/templates/__init__.py +0 -0
  66. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
  67. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/__init__.py +0 -0
  68. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/notion/__init__.py +0 -0
  69. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/notion/assets.py +0 -0
  70. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/notion/client/__init__.py +0 -0
  71. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/notion/client/client_test.py +0 -0
  72. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/notion/client/constants.py +0 -0
  73. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/notion/client/credentials.py +0 -0
  74. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/notion/client/endpoints.py +0 -0
  75. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/knowledge/notion/extract.py +0 -0
  76. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/logger.py +0 -0
  77. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/quality/__init__.py +0 -0
  78. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/quality/soda/__init__.py +0 -0
  79. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/quality/soda/assets.py +0 -0
  80. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/quality/soda/client/__init__.py +0 -0
  81. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/quality/soda/client/endpoints.py +0 -0
  82. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/types.py +0 -0
  83. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/uploader/__init__.py +0 -0
  84. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/uploader/constant.py +0 -0
  85. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/uploader/env.py +0 -0
  86. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/uploader/env_test.py +0 -0
  87. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/uploader/upload.py +0 -0
  88. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/uploader/upload_test.py +0 -0
  89. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/uploader/utils.py +0 -0
  90. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/argument_parser.py +0 -0
  91. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/argument_parser_test.py +0 -0
  92. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/__init__.py +0 -0
  93. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/abstract.py +0 -0
  94. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/__init__.py +0 -0
  95. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/auth.py +0 -0
  96. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/auth_test.py +0 -0
  97. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/client_test.py +0 -0
  98. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/pagination_test.py +0 -0
  99. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/safe_request.py +0 -0
  100. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/safe_request_test.py +0 -0
  101. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/utils.py +0 -0
  102. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/api/utils_test.py +0 -0
  103. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/postgres.py +0 -0
  104. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/query.py +0 -0
  105. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/uri.py +0 -0
  106. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/client/uri_test.py +0 -0
  107. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/collection.py +0 -0
  108. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/collection_test.py +0 -0
  109. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/constants.py +0 -0
  110. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/dbt/__init__.py +0 -0
  111. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/dbt/assets.py +0 -0
  112. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/dbt/client.py +0 -0
  113. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/dbt/client_test.py +0 -0
  114. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/dbt/credentials.py +0 -0
  115. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/deprecate.py +0 -0
  116. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/env.py +0 -0
  117. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/files.py +0 -0
  118. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/files_test.py +0 -0
  119. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/formatter.py +0 -0
  120. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/formatter_test.csv +0 -0
  121. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/formatter_test.json +0 -0
  122. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/formatter_test.py +0 -0
  123. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/json_stream_write.py +0 -0
  124. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/load.py +0 -0
  125. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/object.py +0 -0
  126. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/object_test.py +0 -0
  127. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/pager/__init__.py +0 -0
  128. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/pager/pager.py +0 -0
  129. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/pager/pager_on_id.py +0 -0
  130. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/pager/pager_on_id_test.py +0 -0
  131. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/pager/pager_test.py +0 -0
  132. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/retry.py +0 -0
  133. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/retry_test.py +0 -0
  134. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/safe.py +0 -0
  135. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/safe_test.py +0 -0
  136. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/salesforce/__init__.py +0 -0
  137. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/salesforce/client.py +0 -0
  138. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/salesforce/client_test.py +0 -0
  139. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/salesforce/constants.py +0 -0
  140. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/salesforce/credentials.py +0 -0
  141. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/salesforce/credentials_test.py +0 -0
  142. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/salesforce/pagination.py +0 -0
  143. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/store.py +0 -0
  144. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/string.py +0 -0
  145. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/string_test.py +0 -0
  146. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/time.py +0 -0
  147. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/time_test.py +0 -0
  148. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/type.py +0 -0
  149. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/validation.py +0 -0
  150. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/utils/validation_test.py +0 -0
  151. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/__init__.py +0 -0
  152. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/domo/__init__.py +0 -0
  153. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/domo/assets.py +0 -0
  154. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/domo/client/__init__.py +0 -0
  155. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/domo/client/credentials.py +0 -0
  156. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/domo/client/endpoints.py +0 -0
  157. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/domo/client/pagination.py +0 -0
  158. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/domo/client/pagination_test.py +0 -0
  159. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/domo/extract.py +0 -0
  160. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/__init__.py +0 -0
  161. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/api/__init__.py +0 -0
  162. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/api/client.py +0 -0
  163. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/api/client_test.py +0 -0
  164. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/api/constants.py +0 -0
  165. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/api/credentials.py +0 -0
  166. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/api/extraction_parameters.py +0 -0
  167. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/api/sdk.py +0 -0
  168. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
  169. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/api/utils.py +0 -0
  170. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/assets.py +0 -0
  171. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/constant.py +0 -0
  172. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/constants.py +0 -0
  173. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/extract.py +0 -0
  174. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/fields.py +0 -0
  175. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/fields_test.py +0 -0
  176. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/looker/multithreading.py +0 -0
  177. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/__init__.py +0 -0
  178. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/assets.py +0 -0
  179. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
  180. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
  181. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/api/client_test.py +0 -0
  182. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
  183. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
  184. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/client.py +0 -0
  185. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/credentials.py +0 -0
  186. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
  187. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
  188. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
  189. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
  190. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
  191. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
  192. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
  193. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
  194. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
  195. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
  196. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
  197. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/client/shared.py +0 -0
  198. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/errors.py +0 -0
  199. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/extract.py +0 -0
  200. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/metabase/types.py +0 -0
  201. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/mode/__init__.py +0 -0
  202. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/mode/assets.py +0 -0
  203. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/mode/client/__init__.py +0 -0
  204. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/mode/client/client.py +0 -0
  205. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/mode/client/client_test.json +0 -0
  206. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/mode/client/client_test.py +0 -0
  207. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/mode/client/constants.py +0 -0
  208. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/mode/client/credentials.py +0 -0
  209. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/mode/errors.py +0 -0
  210. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/mode/extract.py +0 -0
  211. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/__init__.py +0 -0
  212. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/assets.py +0 -0
  213. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/client/__init__.py +0 -0
  214. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/client/constants.py +0 -0
  215. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/client/credentials.py +0 -0
  216. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/client/credentials_test.py +0 -0
  217. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/client/rest.py +0 -0
  218. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/client/rest_test.py +0 -0
  219. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/client/utils.py +0 -0
  220. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/client/utils_test.py +0 -0
  221. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/powerbi/extract.py +0 -0
  222. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/__init__.py +0 -0
  223. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/assets.py +0 -0
  224. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
  225. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/constants.py +0 -0
  226. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
  227. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/engine/client.py +0 -0
  228. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/engine/constants.py +0 -0
  229. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/engine/credentials.py +0 -0
  230. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/engine/error.py +0 -0
  231. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/engine/error_test.py +0 -0
  232. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +0 -0
  233. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
  234. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/engine/websocket.py +0 -0
  235. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/master.py +0 -0
  236. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/rest.py +0 -0
  237. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/client/rest_test.py +0 -0
  238. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/qlik/extract.py +0 -0
  239. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/salesforce_reporting/__init__.py +0 -0
  240. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/salesforce_reporting/assets.py +0 -0
  241. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/salesforce_reporting/client/__init__.py +0 -0
  242. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/salesforce_reporting/client/rest.py +0 -0
  243. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/salesforce_reporting/client/soql.py +0 -0
  244. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/salesforce_reporting/extract.py +0 -0
  245. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/sigma/__init__.py +0 -0
  246. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/sigma/assets.py +0 -0
  247. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
  248. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/sigma/client/client.py +0 -0
  249. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
  250. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/sigma/client/endpoints.py +0 -0
  251. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/sigma/client/pagination.py +0 -0
  252. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/sigma/extract.py +0 -0
  253. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/__init__.py +0 -0
  254. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/assets.py +0 -0
  255. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/client/__init__.py +0 -0
  256. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/client/client.py +0 -0
  257. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/client/client_utils.py +0 -0
  258. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/client/credentials.py +0 -0
  259. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/client/project.py +0 -0
  260. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/client/safe_mode.py +0 -0
  261. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/constants.py +0 -0
  262. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/errors.py +0 -0
  263. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/extract.py +0 -0
  264. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/gql_fields.py +0 -0
  265. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/__init__.py +0 -0
  266. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/__init__.py +0 -0
  267. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_1_get.json +0 -0
  268. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_2_get.json +0 -0
  269. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/auth.xml +0 -0
  270. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/project_get.xml +0 -0
  271. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/user_get.xml +0 -0
  272. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/view_get_usage.xml +0 -0
  273. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/workbook_get.xml +0 -0
  274. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/graphql/__init__.py +0 -0
  275. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/graphql/paginated_object_test.py +0 -0
  276. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/__init__.py +0 -0
  277. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/auth_test.py +0 -0
  278. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/credentials_test.py +0 -0
  279. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/projects_test.py +0 -0
  280. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/usages_test.py +0 -0
  281. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/users_test.py +0 -0
  282. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/workbooks_test.py +0 -0
  283. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/utils/__init__.py +0 -0
  284. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tests/unit/utils/env_key.py +0 -0
  285. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/tsc_fields.py +0 -0
  286. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/types.py +0 -0
  287. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau/usage.py +0 -0
  288. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/__init__.py +0 -0
  289. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/assets.py +0 -0
  290. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/client/__init__.py +0 -0
  291. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/client/client.py +0 -0
  292. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/client/client_metadata_api.py +0 -0
  293. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/client/client_rest_api.py +0 -0
  294. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/client/client_tsc.py +0 -0
  295. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/client/credentials.py +0 -0
  296. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/client/errors.py +0 -0
  297. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/client/gql_queries.py +0 -0
  298. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/client/rest_fields.py +0 -0
  299. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/visualization/tableau_revamp/constants.py +0 -0
  300. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/__init__.py +0 -0
  301. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/abstract/__init__.py +0 -0
  302. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/abstract/asset.py +0 -0
  303. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/abstract/asset_test.py +0 -0
  304. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/abstract/extract.py +0 -0
  305. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/abstract/query.py +0 -0
  306. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/abstract/time_filter.py +0 -0
  307. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
  308. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
  309. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/client.py +0 -0
  310. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
  311. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/credentials.py +0 -0
  312. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/extract.py +0 -0
  313. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
  314. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
  315. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
  316. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
  317. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
  318. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
  319. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
  320. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
  321. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
  322. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
  323. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/query.py +0 -0
  324. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/bigquery/types.py +0 -0
  325. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/__init__.py +0 -0
  326. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/api_client_test.py +0 -0
  327. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/client_test.py +0 -0
  328. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/credentials.py +0 -0
  329. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/endpoints.py +0 -0
  330. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/extract.py +0 -0
  331. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/format.py +0 -0
  332. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/format_test.py +0 -0
  333. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/lineage.py +0 -0
  334. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/lineage_test.py +0 -0
  335. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/pagination.py +0 -0
  336. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/sql_client.py +0 -0
  337. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/test_constants.py +0 -0
  338. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/types.py +0 -0
  339. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/utils.py +0 -0
  340. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/databricks/utils_test.py +0 -0
  341. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/__init__.py +0 -0
  342. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/client.py +0 -0
  343. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/client_test.py +0 -0
  344. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/extract.py +0 -0
  345. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/queries/.sqlfluff +0 -0
  346. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/queries/column.sql +0 -0
  347. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/queries/database.sql +0 -0
  348. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/queries/query.sql +0 -0
  349. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/queries/schema.sql +0 -0
  350. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/queries/table.sql +0 -0
  351. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/queries/user.sql +0 -0
  352. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/queries/view_ddl.sql +0 -0
  353. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/mysql/query.py +0 -0
  354. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/postgres/__init__.py +0 -0
  355. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/postgres/extract.py +0 -0
  356. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
  357. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
  358. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
  359. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
  360. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
  361. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
  362. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
  363. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/postgres/query.py +0 -0
  364. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/__init__.py +0 -0
  365. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/client.py +0 -0
  366. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/client_test.py +0 -0
  367. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/extract.py +0 -0
  368. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
  369. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
  370. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
  371. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
  372. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/queries/query.sql +0 -0
  373. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
  374. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
  375. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
  376. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
  377. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
  378. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/redshift/query.py +0 -0
  379. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/salesforce/__init__.py +0 -0
  380. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/salesforce/client.py +0 -0
  381. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/salesforce/constants.py +0 -0
  382. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/salesforce/extract.py +0 -0
  383. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/salesforce/format.py +0 -0
  384. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/salesforce/format_test.py +0 -0
  385. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/salesforce/pagination.py +0 -0
  386. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/salesforce/soql.py +0 -0
  387. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/__init__.py +0 -0
  388. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/client.py +0 -0
  389. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/client_test.py +0 -0
  390. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/credentials.py +0 -0
  391. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/credentials_test.py +0 -0
  392. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/extract.py +0 -0
  393. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
  394. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/column.sql +0 -0
  395. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +0 -0
  396. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/database.sql +0 -0
  397. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/function.sql +0 -0
  398. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -0
  399. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -0
  400. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/query.sql +0 -0
  401. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/role.sql +0 -0
  402. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/schema.sql +0 -0
  403. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
  404. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +0 -0
  405. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/snowflake/query.py +0 -0
  406. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/sqlserver/__init__.py +0 -0
  407. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/sqlserver/extract.py +0 -0
  408. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/sqlserver/queries/.sqlfluff +0 -0
  409. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/sqlserver/queries/column.sql +0 -0
  410. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/sqlserver/queries/database.sql +0 -0
  411. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/sqlserver/queries/schema.sql +0 -0
  412. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/sqlserver/queries/table.sql +0 -0
  413. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/sqlserver/queries/user.sql +0 -0
  414. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/sqlserver/query.py +0 -0
  415. {castor_extractor-0.19.7 → castor_extractor-0.20.0}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
@@ -1,6 +1,20 @@
1
1
 
2
2
  # Changelog
3
3
 
4
+ ## 0.20.0 - 2024-09-23
5
+
6
+ * Switch to Tableau revamped connector
7
+
8
+ ## 0.19.9 - 2024-09-19
9
+
10
+ * Databricks: multithreading to retrieve column lineage
11
+
12
+ ## 0.19.8 - 2024-09-18
13
+
14
+ * Metabase: Handle duplicate dashboards
15
+ * Snowflake: Exclude unnamed tables from extraction
16
+ * Bump dependencies: cryptography, setuptools
17
+
4
18
  ## 0.19.7 - 2024-09-05
5
19
 
6
20
  * Metabase: Handle compatibility with older version
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: castor-extractor
3
- Version: 0.19.7
3
+ Version: 0.20.0
4
4
  Summary: Extract your metadata assets.
5
5
  Home-page: https://www.castordoc.com/
6
6
  License: EULA
@@ -29,7 +29,7 @@ Provides-Extra: redshift
29
29
  Provides-Extra: snowflake
30
30
  Provides-Extra: sqlserver
31
31
  Provides-Extra: tableau
32
- Requires-Dist: cryptography (>=42.0.0,<43.0.0) ; extra == "snowflake"
32
+ Requires-Dist: cryptography (>=43.0.0,<44.0.0) ; extra == "snowflake"
33
33
  Requires-Dist: databricks-sql-connector (>=3.2.0,<4.0.0) ; extra == "databricks" or extra == "all"
34
34
  Requires-Dist: google-api-core (>=2.1.1,<3.0.0)
35
35
  Requires-Dist: google-auth (>=2,<3)
@@ -52,7 +52,7 @@ Requires-Dist: pymssql (>=2.2.11,<3.0.0) ; extra == "sqlserver" or extra == "all
52
52
  Requires-Dist: pymysql[rsa] (>=1.1.0,<2.0.0) ; extra == "mysql" or extra == "all"
53
53
  Requires-Dist: python-dateutil (>=2.0.0,<=3.0.0)
54
54
  Requires-Dist: requests (>=2.0.0,<3.0.0)
55
- Requires-Dist: setuptools (>=72,<73)
55
+ Requires-Dist: setuptools (>=74,<75)
56
56
  Requires-Dist: snowflake-connector-python (>=3.4.0,<4.0.0) ; extra == "snowflake" or extra == "all"
57
57
  Requires-Dist: snowflake-sqlalchemy (!=1.2.5,<2.0.0) ; extra == "snowflake" or extra == "all"
58
58
  Requires-Dist: sqlalchemy (>=1.4,<1.5)
@@ -208,6 +208,20 @@ For any questions or bug report, contact us at [support@castordoc.com](mailto:su
208
208
 
209
209
  # Changelog
210
210
 
211
+ ## 0.20.0 - 2024-09-23
212
+
213
+ * Switch to Tableau revamped connector
214
+
215
+ ## 0.19.9 - 2024-09-19
216
+
217
+ * Databricks: multithreading to retrieve column lineage
218
+
219
+ ## 0.19.8 - 2024-09-18
220
+
221
+ * Metabase: Handle duplicate dashboards
222
+ * Snowflake: Exclude unnamed tables from extraction
223
+ * Bump dependencies: cryptography, setuptools
224
+
211
225
  ## 0.19.7 - 2024-09-05
212
226
 
213
227
  * Metabase: Handle compatibility with older version
@@ -1,7 +1,8 @@
1
1
  import logging
2
2
  from argparse import ArgumentParser
3
3
 
4
- from castor_extractor.visualization import tableau # type: ignore
4
+ from castor_extractor.utils import parse_filled_arguments # type: ignore
5
+ from castor_extractor.visualization import tableau_revamp # type: ignore
5
6
 
6
7
  logging.basicConfig(level=logging.INFO, format="%(levelname)s - %(message)s")
7
8
 
@@ -19,29 +20,14 @@ def main():
19
20
 
20
21
  parser.add_argument("-b", "--server-url", help="Tableau server url")
21
22
  parser.add_argument("-i", "--site-id", help="Tableau site ID")
23
+
22
24
  parser.add_argument(
23
- "-s",
24
- "--safe-mode",
25
- help="Tableau safe mode",
25
+ "--with-pulse",
26
+ dest="with_pulse",
26
27
  action="store_true",
28
+ help="Extract Tableau Pulse assets: Metrics and Subscriptions",
27
29
  )
28
- parser.add_argument("-o", "--output", help="Directory to write to")
29
30
 
30
- args = parser.parse_args()
31
-
32
- client = tableau.ApiClient(
33
- user=args.user,
34
- password=args.password,
35
- token_name=args.token_name,
36
- token=args.token,
37
- server_url=args.server_url,
38
- site_id=args.site_id,
39
- safe_mode=args.safe_mode,
40
- )
41
-
42
- client.login()
31
+ parser.add_argument("-o", "--output", help="Directory to write to")
43
32
 
44
- tableau.extract_all(
45
- client,
46
- output_directory=args.output,
47
- )
33
+ tableau_revamp.extract_all(**parse_filled_arguments(parser))
@@ -20,6 +20,8 @@ NOTION_BASE_HEADERS = {
20
20
  "User-Agent": CASTOR_NOTION_USER_AGENT,
21
21
  }
22
22
 
23
+ NOTION_DEFAULT_TIMEOUT_S = 180
24
+
23
25
 
24
26
  def _search_filter(asset: str) -> Dict[str, Dict[str, str]]:
25
27
  return {"filter": {"value": asset, "property": "object"}}
@@ -45,6 +47,7 @@ class NotionClient(APIClient):
45
47
  auth=auth,
46
48
  headers=NOTION_BASE_HEADERS,
47
49
  safe_mode=safe_mode or NOTION_SAFE_MODE,
50
+ timeout=NOTION_DEFAULT_TIMEOUT_S,
48
51
  )
49
52
 
50
53
  def users(self) -> Iterator[dict]:
@@ -1,14 +1,16 @@
1
1
  from typing import Optional
2
2
 
3
+ from pydantic import Field
4
+
3
5
  from ....utils import PaginationModel
4
6
 
5
7
 
6
8
  class NotionPagination(PaginationModel):
7
9
  """Class to handle paginated results"""
8
10
 
9
- results: list
10
- next_cursor: Optional[str]
11
- has_more: bool
11
+ results: list = Field(default_factory=list)
12
+ next_cursor: Optional[str] = None
13
+ has_more: bool = False
12
14
 
13
15
  def is_last(self) -> bool:
14
16
  return not self.has_more
@@ -1,5 +1,5 @@
1
1
  from functools import partial
2
- from typing import Iterator
2
+ from typing import Callable, Iterator
3
3
 
4
4
  from ....utils import (
5
5
  APIClient,
@@ -11,10 +11,10 @@ from .credentials import SodaCredentials
11
11
  from .endpoints import SodaEndpointFactory
12
12
  from .pagination import SodaCloudPagination
13
13
 
14
- _CLOUD_API = "https://cloud.soda.io/api/v1/"
15
14
  _REQUESTS_PER_MINUTE = 10
16
15
  _SECONDS_PER_MINUTE = 60
17
16
  _RATE_LIMIT_MS = (_SECONDS_PER_MINUTE // _REQUESTS_PER_MINUTE) + 1
17
+ _CLOUD_PAGE_SIZE = 100
18
18
 
19
19
  HEADERS = {"Content-Type": "application/json"}
20
20
 
@@ -24,16 +24,26 @@ class SodaClient(APIClient):
24
24
  cloud_auth = BasicAuth(
25
25
  username=credentials.api_key, password=credentials.secret
26
26
  )
27
- super().__init__(host=_CLOUD_API, auth=cloud_auth, headers=HEADERS)
27
+ super().__init__(
28
+ host=credentials.host, auth=cloud_auth, headers=HEADERS
29
+ )
30
+
31
+ @property
32
+ def _base_request(self) -> Callable:
33
+ return partial(self._get, params={"size": _CLOUD_PAGE_SIZE})
28
34
 
29
35
  def datasets(self) -> Iterator[dict]:
30
- request = partial(self._get, endpoint=SodaEndpointFactory.datasets())
36
+ request = partial(
37
+ self._base_request, endpoint=SodaEndpointFactory.datasets()
38
+ )
31
39
  yield from fetch_all_pages(
32
40
  request, SodaCloudPagination, rate_limit=_RATE_LIMIT_MS
33
41
  )
34
42
 
35
43
  def checks(self) -> Iterator[dict]:
36
- request = partial(self._get, endpoint=SodaEndpointFactory.checks())
44
+ request = partial(
45
+ self._base_request, endpoint=SodaEndpointFactory.checks()
46
+ )
37
47
  yield from fetch_all_pages(
38
48
  request, SodaCloudPagination, rate_limit=_RATE_LIMIT_MS
39
49
  )
@@ -3,6 +3,8 @@ from pydantic_settings import BaseSettings, SettingsConfigDict
3
3
 
4
4
  SODA_ENV_PREFIX = "CASTOR_SODA_"
5
5
 
6
+ _CLOUD_API = "https://cloud.soda.io/api/v1/"
7
+
6
8
 
7
9
  class SodaCredentials(BaseSettings):
8
10
  """Class to handle Soda rest API permissions"""
@@ -15,3 +17,4 @@ class SodaCredentials(BaseSettings):
15
17
 
16
18
  api_key: str = Field(repr=False)
17
19
  secret: str = Field(repr=False)
20
+ host: str = Field(default=_CLOUD_API)
@@ -2,7 +2,6 @@ from typing import List
2
2
 
3
3
  from ....utils import PaginationModel
4
4
 
5
- _CLOUD_PAGE_SIZE = 100
6
5
  _CLOUD_FIRST_PAGE = 0
7
6
 
8
7
 
@@ -19,7 +18,7 @@ class SodaCloudPagination(PaginationModel):
19
18
  if self.current_page_payload
20
19
  else _CLOUD_FIRST_PAGE
21
20
  )
22
- return {"page": current_page + 1, "size": _CLOUD_PAGE_SIZE}
21
+ return {"page": current_page + 1}
23
22
 
24
23
  def page_results(self) -> list:
25
24
  return self.content
@@ -34,7 +34,7 @@ from .pager import (
34
34
  PagerOnIdLogger,
35
35
  PagerStopStrategy,
36
36
  )
37
- from .retry import RetryStrategy, retry
37
+ from .retry import RetryStrategy, retry, retry_request
38
38
  from .safe import SafeMode, safe_mode
39
39
  from .store import AbstractStorage, LocalStorage
40
40
  from .string import decode_when_bytes, string_to_tuple
@@ -26,18 +26,18 @@ def _generate_payloads(
26
26
  params: Optional[dict],
27
27
  data: Optional[dict],
28
28
  pagination_params: Optional[dict],
29
- ) -> Tuple[dict, dict]:
29
+ ) -> Tuple[Optional[dict], Optional[dict]]:
30
30
  _pagination_params = pagination_params or {}
31
- params = params or {}
32
- data = data or {}
33
31
 
34
32
  if method == "GET":
33
+ params = params or {}
35
34
  params = {**params, **_pagination_params}
36
- elif method == "POST":
35
+ return data, params
36
+ if method == "POST":
37
+ data = data or {}
37
38
  data = {**data, **_pagination_params}
38
- else:
39
- raise ValueError(f"Method {method} is not yet supported")
40
- return data, params
39
+ return data, params
40
+ raise ValueError(f"Method {method} is not yet supported")
41
41
 
42
42
 
43
43
  class APIClient:
@@ -67,7 +67,7 @@ def fetch_all_pages(
67
67
  response_payload = request()
68
68
  paginated_response = pagination_model(**response_payload)
69
69
  while not paginated_response.is_last():
70
- logger.info(f"Fetching page number {page_number}")
70
+ logger.debug(f"Fetching page number {page_number}")
71
71
  yield from paginated_response.page_results()
72
72
  next_page_parameters = paginated_response.next_page_parameters()
73
73
  new_request = partial(request, **next_page_parameters)
@@ -79,5 +79,5 @@ def fetch_all_pages(
79
79
  page_number += 1
80
80
 
81
81
  # send last page's results
82
- logger.info(f"Fetching page number {page_number}")
82
+ logger.debug(f"Fetching page number {page_number}")
83
83
  yield from paginated_response.page_results()
@@ -35,7 +35,7 @@ def write_json(filename: str, data: Any):
35
35
  """
36
36
  with open(filename, "w", encoding=ENCODING) as f:
37
37
  json.dump(data, f)
38
- logger.info(f"Wrote output file: {filename}")
38
+ logger.info(f"Wrote output file: {filename} ({f.tell()} bytes)")
39
39
 
40
40
 
41
41
  def _current_version() -> str:
@@ -45,6 +45,8 @@ _RETRY_EXCEPTIONS = [
45
45
  _RETRY_COUNT = 2
46
46
  _RETRY_BASE_MS = 10 * 60 * 1000 # 10 minutes
47
47
 
48
+ _PARENT_FOLDER = "/Dashboards"
49
+
48
50
  logger = logging.getLogger(__name__)
49
51
 
50
52
 
@@ -177,7 +179,7 @@ class DomoClient:
177
179
  def _process_pages(
178
180
  self,
179
181
  page_tree: List[dict],
180
- parent_path: str = "/root",
182
+ parent_path: str = _PARENT_FOLDER,
181
183
  ) -> Iterator[dict]:
182
184
  """Recursively fetch pages while building the folder architecture"""
183
185
  if not page_tree:
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  from http import HTTPStatus
3
- from typing import Any, Dict, Iterator, List, Optional, cast
3
+ from typing import Any, Dict, Iterator, List, Optional, Set, cast
4
4
 
5
5
  import requests
6
6
  from requests import HTTPError
@@ -134,15 +134,22 @@ class ApiClient:
134
134
  collection = self._call(f"collection/{_id}/items?models=dashboard")
135
135
  if not collection:
136
136
  continue
137
+
138
+ seen_dashboard_ids: Set[int] = set()
139
+
137
140
  for dashboard in cast(SerializedAsset, collection):
138
141
  if dashboard.get("model") != "dashboard":
139
142
  # This is to maintain compatibility with older versions
140
143
  # where ?models=dashboard has no effects
141
144
  continue
145
+
142
146
  dashboard_id = dashboard.get("id")
143
147
  if not dashboard_id:
144
148
  continue
145
- yield cast(Dict, self._call(f"dashboard/{dashboard_id}"))
149
+
150
+ if dashboard_id not in seen_dashboard_ids:
151
+ seen_dashboard_ids.add(dashboard_id)
152
+ yield cast(Dict, self._call(f"dashboard/{dashboard_id}"))
146
153
 
147
154
  @staticmethod
148
155
  def _collection_specifics(collections: SerializedAsset) -> SerializedAsset:
@@ -11,7 +11,7 @@ from ...utils import (
11
11
  write_summary,
12
12
  )
13
13
  from .assets import TableauRevampAsset
14
- from .client import TableauRevampClient
14
+ from .client import TableauRevampClient, TableauRevampCredentials
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
@@ -26,16 +26,19 @@ def iterate_all_data(
26
26
  yield asset, deep_serialize(data)
27
27
 
28
28
 
29
- def extract_all(client: TableauRevampClient, **kwargs: str) -> None:
29
+ def extract_all(**kwargs) -> None:
30
30
  """
31
- Extract Data from tableau
32
- Store data locally in files under the output_directory
33
- If errors from Tableau's API are catch store them locally in file under the output_directory
31
+ Extract Data From tableau and store it locally in files under the
32
+ output_directory
34
33
  """
35
- output_directory = kwargs.get("output_directory") or from_env(OUTPUT_DIR)
36
-
34
+ output_directory = kwargs.get("output") or from_env(OUTPUT_DIR)
35
+ with_pulse = kwargs.get("with_pulse") or False
37
36
  timestamp = current_timestamp()
38
37
 
38
+ credentials = TableauRevampCredentials(**kwargs)
39
+ client = TableauRevampClient(credentials, with_pulse=with_pulse)
40
+ client.login()
41
+
39
42
  for key, data in iterate_all_data(client):
40
43
  filename = get_output_filename(key.value, output_directory, timestamp)
41
44
  write_json(filename, data)
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  from functools import partial
3
+ from http import HTTPStatus
3
4
  from typing import Iterator, List, Optional, Set, Tuple
4
5
 
5
6
  import requests
@@ -12,6 +13,7 @@ from ...utils import (
12
13
  fetch_all_pages,
13
14
  handle_response,
14
15
  retry,
16
+ retry_request,
15
17
  safe_mode,
16
18
  )
17
19
  from ..abstract import TimeFilter
@@ -135,6 +137,10 @@ class DatabricksAPIClient(APIClient):
135
137
  max_retries=_RETRY_ATTEMPTS,
136
138
  base_ms=_RETRY_BASE_MS,
137
139
  )
140
+ @retry_request(
141
+ status_codes=(HTTPStatus.TOO_MANY_REQUESTS,),
142
+ max_retries=_RETRY_ATTEMPTS,
143
+ )
138
144
  def get_single_column_lineage(
139
145
  self,
140
146
  names: Tuple[str, str],
@@ -15,7 +15,8 @@ from .types import TablesColumns, TimestampedLink
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
18
- _MAX_THREADS = 10
18
+ _THREADS_COLUMN_LINEAGE = 2
19
+ _THREADS_TABLE_LINEAGE = 10
19
20
 
20
21
 
21
22
  class DatabricksClient:
@@ -99,7 +100,7 @@ class DatabricksClient:
99
100
  Wrapper function that retrieves all table lineage
100
101
  """
101
102
  # retrieve table lineage
102
- with ThreadPoolExecutor(max_workers=_MAX_THREADS) as executor:
103
+ with ThreadPoolExecutor(max_workers=_THREADS_TABLE_LINEAGE) as executor:
103
104
  table_paths = [
104
105
  ".".join([table["schema_id"], table["table_name"]])
105
106
  for table in tables
@@ -121,10 +122,15 @@ class DatabricksClient:
121
122
  candidate_paths = paths_for_column_lineage(
122
123
  tables, columns, table_lineage
123
124
  )
125
+ # retrieve column lineage
126
+ with ThreadPoolExecutor(
127
+ max_workers=_THREADS_COLUMN_LINEAGE
128
+ ) as executor:
129
+ results = executor.map(
130
+ self.api_client.get_single_column_lineage, candidate_paths
131
+ )
124
132
  lineages: List[TimestampedLink] = [
125
- link
126
- for paths in candidate_paths
127
- for link in self.api_client.get_single_column_lineage(paths)
133
+ link for links in results for link in links
128
134
  ]
129
135
  deduplicated = deduplicate_lineage(lineages)
130
136
  return self.formatter.format_lineage(deduplicated)
@@ -41,6 +41,8 @@ FROM snowflake.account_usage.tables AS t
41
41
  JOIN snowflake.account_usage.schemata AS s ON s.schema_id = t.table_schema_id
42
42
  JOIN tags_agg_tables ta ON t.table_id = ta.table_id
43
43
  WHERE TRUE
44
+ AND t.table_name IS NOT NULL
45
+ AND t.table_name != ''
44
46
  AND UPPER(t.table_catalog) NOT IN ('SNOWFLAKE', 'UTIL_DB')
45
47
  AND (
46
48
  t.deleted IS NULL
@@ -12,8 +12,8 @@ _KEYS = ("user", "password", "host", "port", "database")
12
12
 
13
13
 
14
14
  def _check_key(credentials: dict) -> None:
15
- for key in credentials:
16
- if key not in _KEYS:
15
+ for key in _KEYS:
16
+ if key not in credentials:
17
17
  raise KeyError(f"Missing {key} in credentials")
18
18
 
19
19
 
@@ -3,7 +3,7 @@ requires = ["setuptools>=61.2"]
3
3
 
4
4
  [tool.poetry]
5
5
  name = "castor-extractor"
6
- version = "0.19.7"
6
+ version = "0.20.0"
7
7
  description = "Extract your metadata assets."
8
8
  authors = ["Castor <support@castordoc.com>"]
9
9
  license = "EULA"
@@ -27,7 +27,7 @@ include = [
27
27
  [tool.poetry.dependencies]
28
28
  python = ">=3.8, <3.13"
29
29
 
30
- cryptography = { version = "^42.0.0", optional = true }
30
+ cryptography = { version = "^43.0.0", optional = true }
31
31
  google-api-core = ">=2.1.1, <3.0.0"
32
32
  google-auth = "^2"
33
33
  google-cloud-core = ">=2.1.0, <3.0.0"
@@ -51,7 +51,7 @@ python-dateutil = ">=2.0.0, <=3.0.0"
51
51
  requests = ">=2.0.0, <3.0.0"
52
52
  snowflake-connector-python = { version = "^3.4.0", optional = true }
53
53
  snowflake-sqlalchemy = { version = "!=1.2.5, <2.0.0", optional = true }
54
- setuptools = "^72"
54
+ setuptools = "^74"
55
55
  sqlalchemy = "~1.4"
56
56
  sqlalchemy-bigquery = { version = ">=1.0.0, <= 2.0.0", optional = true, extras = [
57
57
  "bqstorage",
@@ -108,10 +108,10 @@ all = [
108
108
  pytest = "^8"
109
109
  pytest-freezegun = "^0.4"
110
110
  requests-mock = "^1.11"
111
- ruff = "^0.5.7"
111
+ ruff = "^0.6.4"
112
112
 
113
113
  [tool.poetry.group.dev.dependencies]
114
- deptry = "^0.19"
114
+ deptry = "^0.20"
115
115
 
116
116
  [tool.poetry.scripts]
117
117
  castor-extract-bigquery = "castor_extractor.commands.extract_bigquery:main"
@@ -1 +0,0 @@
1
- from .extract import SYNAPSE_ASSETS
@@ -1,21 +0,0 @@
1
- import logging
2
-
3
- from ..abstract import (
4
- CATALOG_ASSETS,
5
- EXTERNAL_LINEAGE_ASSETS,
6
- QUERIES_ASSETS,
7
- VIEWS_ASSETS,
8
- SupportedAssets,
9
- WarehouseAsset,
10
- WarehouseAssetGroup,
11
- )
12
-
13
- logger = logging.getLogger(__name__)
14
-
15
- SYNAPSE_ASSETS: SupportedAssets = {
16
- WarehouseAssetGroup.CATALOG: CATALOG_ASSETS,
17
- WarehouseAssetGroup.QUERY: QUERIES_ASSETS,
18
- WarehouseAssetGroup.VIEW_DDL: VIEWS_ASSETS,
19
- WarehouseAssetGroup.ROLE: (WarehouseAsset.USER,),
20
- WarehouseAssetGroup.EXTERNAL_LINEAGE: EXTERNAL_LINEAGE_ASSETS,
21
- }
@@ -1,2 +0,0 @@
1
- [sqlfluff]
2
- dialect = tsql
@@ -1,6 +0,0 @@
1
- SELECT
2
- d.name AS database_id,
3
- d.name AS database_name,
4
- NULL AS "comment"
5
- FROM sys.databases AS d
6
- WHERE d.name != 'master'
@@ -1,33 +0,0 @@
1
- WITH query_execution AS (
2
- SELECT
3
- plan_id,
4
- CASE execution_type_desc
5
- WHEN 'Aborted' THEN 1
6
- WHEN 'Exception' THEN 1
7
- ELSE 0
8
- END AS aborted,
9
- MIN(CAST(first_execution_time AS DATETIME)) AS start_time,
10
- MAX(CAST(last_execution_time AS DATETIME)) AS end_time
11
- FROM sys.query_store_runtime_stats
12
- WHERE CAST(first_execution_time AS DATE) = CAST(DATEADD(day, -1, getdate()) AS DATE)
13
- -- Filtering on hour will be needed when running that query out of notebooks
14
- GROUP BY plan_id, execution_type_desc
15
- )
16
-
17
- SELECT
18
- q.query_id,
19
- qt.query_sql_text AS query_text,
20
- DB_NAME() AS database_id,
21
- DB_NAME() AS database_name,
22
- 'SYNAPSE' AS user_name,
23
- qp.plan_id AS process_id,
24
- qe.aborted AS aborted,
25
- qe.start_time AS start_time,
26
- qe.end_time AS end_time
27
- FROM sys.query_store_query AS q
28
- JOIN sys.query_store_query_text AS qt
29
- ON q.query_text_id = qt.query_text_id
30
- JOIN sys.query_store_plan AS qp
31
- ON q.query_id = qp.query_id
32
- JOIN query_execution AS qe
33
- ON qp.plan_id = qe.plan_id
@@ -1,7 +0,0 @@
1
- SELECT DISTINCT
2
- s.catalog_name AS database_id,
3
- s.catalog_name AS database_name,
4
- s.schema_name AS schema_name,
5
- s.schema_owner AS schema_owner,
6
- s.catalog_name + '.' + s.schema_name AS schema_id
7
- FROM INFORMATION_SCHEMA.SCHEMATA AS s
@@ -1,36 +0,0 @@
1
- WITH users AS (
2
- SELECT DISTINCT
3
- uid,
4
- name
5
- FROM sys.sysusers
6
- )
7
-
8
- SELECT
9
- DB_NAME() as database_id,
10
- DB_NAME() AS database_name,
11
- DB_NAME() + '.' + s.name AS schema_id,
12
- s.name AS schema_name,
13
- DB_NAME() + '.' + s.name + '.' + o.name AS table_id,
14
- o.name AS table_name,
15
- CASE UPPER(REPLACE(o.type, ' ', ''))
16
- WHEN 'U' THEN 'TABLE'
17
- WHEN 'V' THEN 'VIEW'
18
- ELSE 'UNKNOWN'
19
- END AS table_type,
20
- -- Normally schema owner is table owner, but we can
21
- -- change table owner with ALTER AUTHORIZATION command
22
- -- in this case we have to look up for the owner
23
- -- in sys.objects table
24
- COALESCE(su.name, pu.name) AS table_owner,
25
- COALESCE(su.uid, pu.uid) AS table_owner_id,
26
- NULL AS comment
27
- FROM sys.objects AS o
28
- JOIN sys.schemas AS s
29
- ON o.schema_id = s.schema_id
30
- LEFT JOIN users AS pu
31
- ON s.principal_id = pu.uid
32
- LEFT JOIN users AS su
33
- ON o.principal_id = su.uid
34
- WHERE
35
- -- SYNAPSE NOTATION: U for TABLE, V for VIEW
36
- o.type IN ('U', 'V')
@@ -1,4 +0,0 @@
1
- SELECT
2
- name AS user_name,
3
- uid AS user_id
4
- FROM sys.sysusers
@@ -1,8 +0,0 @@
1
- SELECT
2
- DB_NAME() AS database_id,
3
- DB_NAME() AS database_name,
4
- DB_NAME() + '.' + table_schema AS schema_id,
5
- table_schema AS schema_name,
6
- table_name AS view_name,
7
- view_definition AS view_definition
8
- FROM INFORMATION_SCHEMA.VIEWS