castor-extractor 0.23.2__tar.gz → 0.24.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 (440) hide show
  1. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/CHANGELOG.md +8 -0
  2. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/PKG-INFO +17 -7
  3. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/README.md +8 -6
  4. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_snowflake.py +6 -0
  5. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/confluence/client/client.py +0 -13
  6. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/confluence/client/endpoints.py +1 -1
  7. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/client.py +17 -7
  8. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/credentials.py +1 -0
  9. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/extract.py +7 -0
  10. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/pyproject.toml +1 -1
  11. castor_extractor-0.23.2/castor_extractor/visualization/tableau/__init__.py +0 -3
  12. castor_extractor-0.23.2/castor_extractor/visualization/tableau/assets.py +0 -49
  13. castor_extractor-0.23.2/castor_extractor/visualization/tableau/client/__init__.py +0 -2
  14. castor_extractor-0.23.2/castor_extractor/visualization/tableau/client/client.py +0 -229
  15. castor_extractor-0.23.2/castor_extractor/visualization/tableau/client/client_utils.py +0 -75
  16. castor_extractor-0.23.2/castor_extractor/visualization/tableau/client/credentials.py +0 -104
  17. castor_extractor-0.23.2/castor_extractor/visualization/tableau/client/project.py +0 -28
  18. castor_extractor-0.23.2/castor_extractor/visualization/tableau/client/safe_mode.py +0 -70
  19. castor_extractor-0.23.2/castor_extractor/visualization/tableau/constants.py +0 -9
  20. castor_extractor-0.23.2/castor_extractor/visualization/tableau/errors.py +0 -5
  21. castor_extractor-0.23.2/castor_extractor/visualization/tableau/extract.py +0 -121
  22. castor_extractor-0.23.2/castor_extractor/visualization/tableau/gql_fields.py +0 -249
  23. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/__init__.py +0 -0
  24. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_1_get.json +0 -15
  25. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_2_get.json +0 -15
  26. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/auth.xml +0 -7
  27. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/project_get.xml +0 -9
  28. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/user_get.xml +0 -8
  29. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/view_get_usage.xml +0 -24
  30. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/workbook_get.xml +0 -19
  31. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/graphql/__init__.py +0 -0
  32. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/graphql/paginated_object_test.py +0 -63
  33. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/rest_api/__init__.py +0 -0
  34. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/rest_api/auth_test.py +0 -39
  35. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/rest_api/credentials_test.py +0 -13
  36. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/rest_api/projects_test.py +0 -59
  37. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/rest_api/usages_test.py +0 -49
  38. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/rest_api/users_test.py +0 -52
  39. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/rest_api/workbooks_test.py +0 -60
  40. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/utils/__init__.py +0 -1
  41. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests/unit/utils/env_key.py +0 -6
  42. castor_extractor-0.23.2/castor_extractor/visualization/tableau/tsc_fields.py +0 -46
  43. castor_extractor-0.23.2/castor_extractor/visualization/tableau/types.py +0 -11
  44. castor_extractor-0.23.2/castor_extractor/visualization/tableau/usage.py +0 -14
  45. castor_extractor-0.23.2/castor_extractor/warehouse/__init__.py +0 -0
  46. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/Dockerfile +0 -0
  47. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/DockerfileUsage.md +0 -0
  48. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/LICENCE +0 -0
  49. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/__init__.py +0 -0
  50. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/__init__.py +0 -0
  51. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_bigquery.py +0 -0
  52. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_confluence.py +0 -0
  53. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_databricks.py +0 -0
  54. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_domo.py +0 -0
  55. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_looker.py +0 -0
  56. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_metabase_api.py +0 -0
  57. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_metabase_db.py +0 -0
  58. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_mode.py +0 -0
  59. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_mysql.py +0 -0
  60. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_notion.py +0 -0
  61. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_postgres.py +0 -0
  62. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_powerbi.py +0 -0
  63. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_qlik.py +0 -0
  64. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_redshift.py +0 -0
  65. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_salesforce.py +0 -0
  66. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_salesforce_reporting.py +0 -0
  67. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_sigma.py +0 -0
  68. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_sqlserver.py +0 -0
  69. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_tableau.py +0 -0
  70. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/extract_thoughtspot.py +0 -0
  71. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/file_check.py +0 -0
  72. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/commands/upload.py +0 -0
  73. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/__init__.py +0 -0
  74. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/column.py +0 -0
  75. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/column_test.py +0 -0
  76. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/constants.py +0 -0
  77. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/enums.py +0 -0
  78. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/file.py +0 -0
  79. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/file_test.py +0 -0
  80. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/file_test_users.csv +0 -0
  81. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
  82. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/templates/__init__.py +0 -0
  83. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
  84. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/__init__.py +0 -0
  85. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/confluence/__init__.py +0 -0
  86. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/confluence/assets.py +0 -0
  87. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/confluence/client/__init__.py +0 -0
  88. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/confluence/client/credentials.py +0 -0
  89. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/confluence/client/pagination.py +0 -0
  90. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/confluence/extract.py +0 -0
  91. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/notion/__init__.py +0 -0
  92. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/notion/assets.py +0 -0
  93. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/notion/client/__init__.py +0 -0
  94. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/notion/client/client.py +0 -0
  95. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/notion/client/client_test.py +0 -0
  96. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/notion/client/constants.py +0 -0
  97. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/notion/client/credentials.py +0 -0
  98. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/notion/client/endpoints.py +0 -0
  99. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/notion/client/pagination.py +0 -0
  100. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/knowledge/notion/extract.py +0 -0
  101. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/logger.py +0 -0
  102. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/quality/__init__.py +0 -0
  103. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/quality/soda/__init__.py +0 -0
  104. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/quality/soda/assets.py +0 -0
  105. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/quality/soda/client/__init__.py +0 -0
  106. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/quality/soda/client/client.py +0 -0
  107. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/quality/soda/client/credentials.py +0 -0
  108. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/quality/soda/client/endpoints.py +0 -0
  109. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/quality/soda/client/pagination.py +0 -0
  110. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/types.py +0 -0
  111. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/uploader/__init__.py +0 -0
  112. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/uploader/constant.py +0 -0
  113. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/uploader/env.py +0 -0
  114. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/uploader/env_test.py +0 -0
  115. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/uploader/settings.py +0 -0
  116. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/uploader/upload.py +0 -0
  117. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/uploader/upload_test.py +0 -0
  118. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/uploader/utils.py +0 -0
  119. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/__init__.py +0 -0
  120. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/argument_parser.py +0 -0
  121. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/argument_parser_test.py +0 -0
  122. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/__init__.py +0 -0
  123. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/abstract.py +0 -0
  124. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/__init__.py +0 -0
  125. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/auth.py +0 -0
  126. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/auth_test.py +0 -0
  127. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/client.py +0 -0
  128. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/client_test.py +0 -0
  129. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/pagination.py +0 -0
  130. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/pagination_test.py +0 -0
  131. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/safe_request.py +0 -0
  132. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/safe_request_test.py +0 -0
  133. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/utils.py +0 -0
  134. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/api/utils_test.py +0 -0
  135. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/postgres.py +0 -0
  136. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/query.py +0 -0
  137. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/uri.py +0 -0
  138. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/client/uri_test.py +0 -0
  139. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/collection.py +0 -0
  140. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/collection_test.py +0 -0
  141. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/constants.py +0 -0
  142. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/dbt/__init__.py +0 -0
  143. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/dbt/assets.py +0 -0
  144. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/dbt/client.py +0 -0
  145. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/dbt/client_test.py +0 -0
  146. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/dbt/credentials.py +0 -0
  147. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/deprecate.py +0 -0
  148. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/env.py +0 -0
  149. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/files.py +0 -0
  150. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/files_test.py +0 -0
  151. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/formatter.py +0 -0
  152. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/formatter_test.csv +0 -0
  153. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/formatter_test.json +0 -0
  154. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/formatter_test.py +0 -0
  155. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/json_stream_write.py +0 -0
  156. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/load.py +0 -0
  157. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/object.py +0 -0
  158. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/object_test.py +0 -0
  159. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/pager/__init__.py +0 -0
  160. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/pager/pager.py +0 -0
  161. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/pager/pager_on_id.py +0 -0
  162. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/pager/pager_on_id_test.py +0 -0
  163. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/pager/pager_test.py +0 -0
  164. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/retry.py +0 -0
  165. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/retry_test.py +0 -0
  166. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/safe.py +0 -0
  167. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/safe_test.py +0 -0
  168. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/salesforce/__init__.py +0 -0
  169. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/salesforce/client.py +0 -0
  170. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/salesforce/client_test.py +0 -0
  171. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/salesforce/constants.py +0 -0
  172. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/salesforce/credentials.py +0 -0
  173. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/salesforce/credentials_test.py +0 -0
  174. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/salesforce/pagination.py +0 -0
  175. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/store.py +0 -0
  176. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/string.py +0 -0
  177. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/string_test.py +0 -0
  178. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/time.py +0 -0
  179. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/time_test.py +0 -0
  180. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/type.py +0 -0
  181. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/validation.py +0 -0
  182. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/validation_test.py +0 -0
  183. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/utils/write.py +0 -0
  184. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/__init__.py +0 -0
  185. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/domo/__init__.py +0 -0
  186. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/domo/assets.py +0 -0
  187. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/domo/client/__init__.py +0 -0
  188. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/domo/client/client.py +0 -0
  189. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/domo/client/credentials.py +0 -0
  190. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/domo/client/endpoints.py +0 -0
  191. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/domo/client/pagination.py +0 -0
  192. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/domo/client/pagination_test.py +0 -0
  193. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/domo/extract.py +0 -0
  194. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/__init__.py +0 -0
  195. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/api/__init__.py +0 -0
  196. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/api/client.py +0 -0
  197. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/api/client_test.py +0 -0
  198. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/api/constants.py +0 -0
  199. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/api/credentials.py +0 -0
  200. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/api/extraction_parameters.py +0 -0
  201. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/api/sdk.py +0 -0
  202. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
  203. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/api/utils.py +0 -0
  204. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/assets.py +0 -0
  205. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/constant.py +0 -0
  206. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/constants.py +0 -0
  207. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/extract.py +0 -0
  208. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/fields.py +0 -0
  209. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/fields_test.py +0 -0
  210. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker/multithreading.py +0 -0
  211. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/__init__.py +0 -0
  212. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/assets.py +0 -0
  213. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/client/__init__.py +0 -0
  214. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/client/admin_sdk_client.py +0 -0
  215. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/client/client.py +0 -0
  216. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/client/credentials.py +0 -0
  217. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/client/endpoints.py +0 -0
  218. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/client/enums.py +0 -0
  219. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/client/looker_studio_api_client.py +0 -0
  220. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/client/pagination.py +0 -0
  221. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/looker_studio/client/scopes.py +0 -0
  222. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/__init__.py +0 -0
  223. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/assets.py +0 -0
  224. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
  225. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
  226. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/api/client.py +0 -0
  227. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/api/client_test.py +0 -0
  228. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
  229. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
  230. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/client.py +0 -0
  231. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/credentials.py +0 -0
  232. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
  233. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
  234. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
  235. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
  236. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
  237. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
  238. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
  239. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
  240. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
  241. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
  242. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
  243. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/client/shared.py +0 -0
  244. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/errors.py +0 -0
  245. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/extract.py +0 -0
  246. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/metabase/types.py +0 -0
  247. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/mode/__init__.py +0 -0
  248. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/mode/assets.py +0 -0
  249. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/mode/client/__init__.py +0 -0
  250. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/mode/client/client.py +0 -0
  251. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/mode/client/client_test.json +0 -0
  252. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/mode/client/client_test.py +0 -0
  253. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/mode/client/constants.py +0 -0
  254. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/mode/client/credentials.py +0 -0
  255. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/mode/errors.py +0 -0
  256. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/mode/extract.py +0 -0
  257. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/__init__.py +0 -0
  258. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/assets.py +0 -0
  259. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/client/__init__.py +0 -0
  260. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/client/authentication.py +0 -0
  261. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/client/client.py +0 -0
  262. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/client/client_test.py +0 -0
  263. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/client/constants.py +0 -0
  264. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/client/credentials.py +0 -0
  265. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/client/credentials_test.py +0 -0
  266. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/client/endpoints.py +0 -0
  267. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/client/pagination.py +0 -0
  268. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/powerbi/extract.py +0 -0
  269. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/__init__.py +0 -0
  270. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/assets.py +0 -0
  271. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
  272. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/constants.py +0 -0
  273. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
  274. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/engine/client.py +0 -0
  275. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/engine/constants.py +0 -0
  276. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/engine/credentials.py +0 -0
  277. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/engine/error.py +0 -0
  278. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/engine/error_test.py +0 -0
  279. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +0 -0
  280. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
  281. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/engine/websocket.py +0 -0
  282. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/master.py +0 -0
  283. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/rest.py +0 -0
  284. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/client/rest_test.py +0 -0
  285. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/qlik/extract.py +0 -0
  286. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/salesforce_reporting/__init__.py +0 -0
  287. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/salesforce_reporting/assets.py +0 -0
  288. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/salesforce_reporting/client/__init__.py +0 -0
  289. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/salesforce_reporting/client/rest.py +0 -0
  290. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/salesforce_reporting/client/soql.py +0 -0
  291. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/salesforce_reporting/extract.py +0 -0
  292. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/sigma/__init__.py +0 -0
  293. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/sigma/assets.py +0 -0
  294. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
  295. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/sigma/client/client.py +0 -0
  296. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
  297. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/sigma/client/endpoints.py +0 -0
  298. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/sigma/client/pagination.py +0 -0
  299. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/sigma/extract.py +0 -0
  300. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/__init__.py +0 -0
  301. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/assets.py +0 -0
  302. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/client/__init__.py +0 -0
  303. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/client/client.py +0 -0
  304. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/client/client_metadata_api.py +0 -0
  305. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/client/client_rest_api.py +0 -0
  306. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/client/client_tsc.py +0 -0
  307. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/client/credentials.py +0 -0
  308. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/client/errors.py +0 -0
  309. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/client/gql_queries.py +0 -0
  310. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/client/rest_fields.py +0 -0
  311. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/constants.py +0 -0
  312. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/tableau_revamp/extract.py +0 -0
  313. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/thoughtspot/__init__.py +0 -0
  314. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/thoughtspot/assets.py +0 -0
  315. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/thoughtspot/client/__init__.py +0 -0
  316. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/thoughtspot/client/client.py +0 -0
  317. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/thoughtspot/client/credentials.py +0 -0
  318. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/thoughtspot/client/endpoints.py +0 -0
  319. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/thoughtspot/client/utils.py +0 -0
  320. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/thoughtspot/client/utils_test.py +0 -0
  321. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/visualization/thoughtspot/extract.py +0 -0
  322. {castor_extractor-0.23.2/castor_extractor/visualization/tableau/tests → castor_extractor-0.24.0/castor_extractor/warehouse}/__init__.py +0 -0
  323. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/abstract/__init__.py +0 -0
  324. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/abstract/asset.py +0 -0
  325. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/abstract/asset_test.py +0 -0
  326. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/abstract/extract.py +0 -0
  327. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/abstract/query.py +0 -0
  328. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/abstract/time_filter.py +0 -0
  329. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
  330. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
  331. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/client.py +0 -0
  332. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
  333. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/credentials.py +0 -0
  334. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/extract.py +0 -0
  335. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
  336. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
  337. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
  338. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
  339. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
  340. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
  341. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
  342. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
  343. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
  344. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
  345. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/query.py +0 -0
  346. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/bigquery/types.py +0 -0
  347. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/__init__.py +0 -0
  348. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/api_client.py +0 -0
  349. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/api_client_test.py +0 -0
  350. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/client.py +0 -0
  351. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/client_test.py +0 -0
  352. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/credentials.py +0 -0
  353. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/endpoints.py +0 -0
  354. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/enums.py +0 -0
  355. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/extract.py +0 -0
  356. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/format.py +0 -0
  357. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/format_test.py +0 -0
  358. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/lineage.py +0 -0
  359. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/lineage_test.py +0 -0
  360. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/pagination.py +0 -0
  361. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/sql_client.py +0 -0
  362. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/types.py +0 -0
  363. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/utils.py +0 -0
  364. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/databricks/utils_test.py +0 -0
  365. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/__init__.py +0 -0
  366. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/client.py +0 -0
  367. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/client_test.py +0 -0
  368. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/extract.py +0 -0
  369. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/queries/.sqlfluff +0 -0
  370. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/queries/column.sql +0 -0
  371. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/queries/database.sql +0 -0
  372. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/queries/query.sql +0 -0
  373. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/queries/schema.sql +0 -0
  374. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/queries/table.sql +0 -0
  375. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/queries/user.sql +0 -0
  376. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/queries/view_ddl.sql +0 -0
  377. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/mysql/query.py +0 -0
  378. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/postgres/__init__.py +0 -0
  379. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/postgres/extract.py +0 -0
  380. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
  381. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
  382. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
  383. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
  384. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
  385. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
  386. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
  387. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/postgres/query.py +0 -0
  388. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/__init__.py +0 -0
  389. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/client.py +0 -0
  390. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/client_test.py +0 -0
  391. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/extract.py +0 -0
  392. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/extract_test.py +0 -0
  393. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
  394. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
  395. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
  396. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
  397. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/query.sql +0 -0
  398. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/query_serverless.sql +0 -0
  399. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
  400. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
  401. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
  402. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
  403. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
  404. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/redshift/query.py +0 -0
  405. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/salesforce/__init__.py +0 -0
  406. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/salesforce/client.py +0 -0
  407. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/salesforce/constants.py +0 -0
  408. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/salesforce/extract.py +0 -0
  409. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/salesforce/format.py +0 -0
  410. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/salesforce/format_test.py +0 -0
  411. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/salesforce/pagination.py +0 -0
  412. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/salesforce/soql.py +0 -0
  413. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/__init__.py +0 -0
  414. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/client_test.py +0 -0
  415. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/credentials_test.py +0 -0
  416. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
  417. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/column.sql +0 -0
  418. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +0 -0
  419. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/database.sql +0 -0
  420. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/function.sql +0 -0
  421. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -0
  422. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -0
  423. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/query.sql +0 -0
  424. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/role.sql +0 -0
  425. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/schema.sql +0 -0
  426. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/table.sql +0 -0
  427. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
  428. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +0 -0
  429. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/snowflake/query.py +0 -0
  430. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/sqlserver/__init__.py +0 -0
  431. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/sqlserver/client.py +0 -0
  432. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/sqlserver/extract.py +0 -0
  433. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/sqlserver/queries/.sqlfluff +0 -0
  434. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/sqlserver/queries/column.sql +0 -0
  435. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/sqlserver/queries/database.sql +0 -0
  436. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/sqlserver/queries/schema.sql +0 -0
  437. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/sqlserver/queries/table.sql +0 -0
  438. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/sqlserver/queries/user.sql +0 -0
  439. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/sqlserver/query.py +0 -0
  440. {castor_extractor-0.23.2 → castor_extractor-0.24.0}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.24.0 - 2025-03-10
4
+
5
+ * Remove legacy Tableau Connector
6
+
7
+ ## 0.23.3 - 2025-02-19
8
+
9
+ * Snowflake : add --insecure-mode option to turn off OCSP checking
10
+
3
11
  ## 0.23.2 - 2025-02-17
4
12
 
5
13
  * support page_size in Tableau extraction command
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: castor-extractor
3
- Version: 0.23.2
3
+ Version: 0.24.0
4
4
  Summary: Extract your metadata assets.
5
5
  Home-page: https://www.castordoc.com/
6
6
  License: EULA
@@ -100,14 +100,14 @@ It also embeds utilities to help you push your metadata to Castor:
100
100
 
101
101
  ## Installation
102
102
 
103
- Requirements: **python3.8+**
103
+ Requirements: **python3.9+**
104
104
  <img src="https://upload.wikimedia.org/wikipedia/commons/c/c3/Python-logo-notext.svg" width=20 />
105
105
 
106
106
  ### Create castor-env
107
107
 
108
108
  We advise to create a dedicated [Python environment](https://docs.python.org/3/library/venv.html).
109
109
 
110
- Here's an example using `Pyenv` and Python `3.8.12`:
110
+ Here's an example using `Pyenv`:
111
111
 
112
112
  - Install Pyenv
113
113
 
@@ -124,22 +124,24 @@ eval "$(pyenv init --path)"
124
124
  eval "$(pyenv virtualenv-init -)"
125
125
  ```
126
126
 
127
- - [optional] Install python 3.8+
127
+ - [optional] Install python 3.9+ if needed
128
128
 
129
129
  ```bash
130
130
  pyenv versions # check your local python installations
131
131
 
132
- pyenv install -v 3.8.12 # if none of the installed versions satisfy requirements 8+
132
+ # install Python if none of the installed versions satisfy requirements 3.9+
133
+ # in this example, we will install Python 3.11.9
134
+ pyenv install -v 3.11.9
133
135
  ```
134
136
 
135
137
  - Create your virtual env
136
138
 
137
139
  ```bash
138
- pyenv virtualenv 3.8.12 castor-env # create a dedicated env
140
+ pyenv virtualenv 3.11.9 castor-env # create a dedicated env
139
141
  pyenv shell castor-env # activate the environment
140
142
 
141
143
  # optional checks
142
- python --version # should be `3.8.12`
144
+ python --version # should be `3.11.9`
143
145
  pyenv version # should be `castor-env`
144
146
  ```
145
147
 
@@ -206,6 +208,14 @@ For any questions or bug report, contact us at [support@castordoc.com](mailto:su
206
208
 
207
209
  # Changelog
208
210
 
211
+ ## 0.24.0 - 2025-03-10
212
+
213
+ * Remove legacy Tableau Connector
214
+
215
+ ## 0.23.3 - 2025-02-19
216
+
217
+ * Snowflake : add --insecure-mode option to turn off OCSP checking
218
+
209
219
  ## 0.23.2 - 2025-02-17
210
220
 
211
221
  * support page_size in Tableau extraction command
@@ -34,14 +34,14 @@ It also embeds utilities to help you push your metadata to Castor:
34
34
 
35
35
  ## Installation
36
36
 
37
- Requirements: **python3.8+**
37
+ Requirements: **python3.9+**
38
38
  <img src="https://upload.wikimedia.org/wikipedia/commons/c/c3/Python-logo-notext.svg" width=20 />
39
39
 
40
40
  ### Create castor-env
41
41
 
42
42
  We advise to create a dedicated [Python environment](https://docs.python.org/3/library/venv.html).
43
43
 
44
- Here's an example using `Pyenv` and Python `3.8.12`:
44
+ Here's an example using `Pyenv`:
45
45
 
46
46
  - Install Pyenv
47
47
 
@@ -58,22 +58,24 @@ eval "$(pyenv init --path)"
58
58
  eval "$(pyenv virtualenv-init -)"
59
59
  ```
60
60
 
61
- - [optional] Install python 3.8+
61
+ - [optional] Install python 3.9+ if needed
62
62
 
63
63
  ```bash
64
64
  pyenv versions # check your local python installations
65
65
 
66
- pyenv install -v 3.8.12 # if none of the installed versions satisfy requirements 8+
66
+ # install Python if none of the installed versions satisfy requirements 3.9+
67
+ # in this example, we will install Python 3.11.9
68
+ pyenv install -v 3.11.9
67
69
  ```
68
70
 
69
71
  - Create your virtual env
70
72
 
71
73
  ```bash
72
- pyenv virtualenv 3.8.12 castor-env # create a dedicated env
74
+ pyenv virtualenv 3.11.9 castor-env # create a dedicated env
73
75
  pyenv shell castor-env # activate the environment
74
76
 
75
77
  # optional checks
76
- python --version # should be `3.8.12`
78
+ python --version # should be `3.11.9`
77
79
  pyenv version # should be `castor-env`
78
80
  ```
79
81
 
@@ -40,6 +40,11 @@ def main():
40
40
  action="store_true",
41
41
  help="Optional: will fetch transients tables if added",
42
42
  )
43
+ parser.add_argument(
44
+ "--insecure-mode",
45
+ action="store_true",
46
+ help="Optional: turns off OCSP checking",
47
+ )
43
48
 
44
49
  parser.add_argument("-o", "--output", help="Directory to write to")
45
50
 
@@ -65,4 +70,5 @@ def main():
65
70
  output_directory=args.output,
66
71
  skip_existing=args.skip_existing,
67
72
  fetch_transient=args.fetch_transient,
73
+ insecure_mode=args.insecure_mode,
68
74
  )
@@ -1,12 +1,9 @@
1
1
  from collections.abc import Iterator
2
2
  from functools import partial
3
- from http import HTTPStatus
4
- from typing import Optional
5
3
 
6
4
  from ....utils import (
7
5
  APIClient,
8
6
  BasicAuth,
9
- RequestSafeMode,
10
7
  fetch_all_pages,
11
8
  )
12
9
  from ..assets import (
@@ -21,19 +18,11 @@ _HEADERS = {
21
18
  "Content-Type": "application/json",
22
19
  }
23
20
 
24
- _MAX_ERROR_IGNORED_COUNT = 10
25
- _IGNORED_ERROR_CODES = (HTTPStatus.BAD_GATEWAY,)
26
- _SAFE_MODE = RequestSafeMode(
27
- max_errors=_MAX_ERROR_IGNORED_COUNT,
28
- status_codes=_IGNORED_ERROR_CODES,
29
- )
30
-
31
21
 
32
22
  class ConfluenceClient(APIClient):
33
23
  def __init__(
34
24
  self,
35
25
  credentials: ConfluenceCredentials,
36
- safe_mode: Optional[RequestSafeMode] = None,
37
26
  ):
38
27
  self.account_id = credentials.account_id
39
28
  auth = BasicAuth(
@@ -43,14 +32,12 @@ class ConfluenceClient(APIClient):
43
32
  auth=auth,
44
33
  host=credentials.base_url,
45
34
  headers=_HEADERS,
46
- safe_mode=safe_mode or _SAFE_MODE,
47
35
  )
48
36
 
49
37
  def pages(self):
50
38
  request = partial(
51
39
  self._get,
52
40
  endpoint=ConfluenceEndpointFactory.pages(),
53
- params={"body-format": "atlas_doc_format"},
54
41
  )
55
42
  yield from fetch_all_pages(request, ConfluencePagination)
56
43
 
@@ -14,7 +14,7 @@ class ConfluenceEndpointFactory:
14
14
  Endpoint to fetch all pages.
15
15
  More: https://developer.atlassian.com/cloud/confluence/rest/v2/api-group-page/#api-pages-get
16
16
  """
17
- return f"{cls.API}{cls.PAGES}"
17
+ return f"{cls.API}{cls.PAGES}?body-format=atlas_doc_format"
18
18
 
19
19
  @classmethod
20
20
  def users(cls) -> str:
@@ -112,6 +112,7 @@ class SnowflakeClient(SqlalchemyClient):
112
112
  role: Optional[str] = None,
113
113
  ):
114
114
  self.private_key = _private_key(credentials.get("private_key"))
115
+ self.insecure_mode = credentials.get("insecure_mode", False)
115
116
  super().__init__(credentials)
116
117
  self._role = role
117
118
  self._warehouse = warehouse
@@ -121,13 +122,22 @@ class SnowflakeClient(SqlalchemyClient):
121
122
  return "Snowflake"
122
123
 
123
124
  def _engine_options(self, credentials: dict) -> dict:
124
- if not self.private_key:
125
- return {}
126
- return {
127
- "connect_args": {
128
- "private_key": self.private_key,
129
- }
130
- }
125
+ """
126
+ Sets the engine options.
127
+ * `insecure_mode` = True turns off OCSP checking.
128
+ See https://community.snowflake.com/s/article/How-to-turn-off-OCSP-checking-in-Snowflake-client-drivers
129
+ * `private_key` = Snowflake private key for key pair authentication.
130
+ See https://docs.snowflake.com/en/user-guide/key-pair-auth
131
+ """
132
+ connection_args: dict = dict()
133
+
134
+ if self.insecure_mode:
135
+ connection_args["insecure_mode"] = True
136
+
137
+ if self.private_key:
138
+ connection_args["private_key"] = self.private_key
139
+
140
+ return {"connect_args": connection_args}
131
141
 
132
142
  def _build_uri(self, credentials: dict) -> str:
133
143
  if self.private_key:
@@ -17,6 +17,7 @@ class SnowflakeCredentials:
17
17
  account: str
18
18
  user: str
19
19
 
20
+ insecure_mode: Optional[bool] = field(default=False)
20
21
  password: Optional[str] = field(metadata={"sensitive": True}, default=None)
21
22
  private_key: Optional[str] = field(
22
23
  metadata={"sensitive": True}, default=None
@@ -38,6 +38,7 @@ SNOWFLAKE_ACCOUNT = "CASTOR_SNOWFLAKE_ACCOUNT"
38
38
  SNOWFLAKE_USER = "CASTOR_SNOWFLAKE_USER"
39
39
  SNOWFLAKE_PASSWORD = "CASTOR_SNOWFLAKE_PASSWORD" # noqa: S105
40
40
  SNOWFLAKE_PRIVATE_KEY = "CASTOR_SNOWFLAKE_PRIVATE_KEY"
41
+ SNOWFLAKE_INSECURE_MODE = "CASTOR_SNOWFLAKE_INSECURE_MODE"
41
42
 
42
43
 
43
44
  def _credentials(params: dict) -> dict:
@@ -46,9 +47,15 @@ def _credentials(params: dict) -> dict:
46
47
  private_key = params.get("private_key") or from_env(
47
48
  SNOWFLAKE_PRIVATE_KEY, True
48
49
  )
50
+ insecure_mode = (
51
+ params.get("insecure_mode")
52
+ or from_env(SNOWFLAKE_INSECURE_MODE, allow_missing=True)
53
+ or False
54
+ )
49
55
  common = {
50
56
  "account": params.get("account") or from_env(SNOWFLAKE_ACCOUNT),
51
57
  "user": params.get("user") or from_env(SNOWFLAKE_USER),
58
+ "insecure_mode": insecure_mode,
52
59
  }
53
60
  if password:
54
61
  return {**common, "password": password}
@@ -3,7 +3,7 @@ requires = ["setuptools>=61.2"]
3
3
 
4
4
  [tool.poetry]
5
5
  name = "castor-extractor"
6
- version = "0.23.2"
6
+ version = "0.24.0"
7
7
  description = "Extract your metadata assets."
8
8
  authors = ["Castor <support@castordoc.com>"]
9
9
  license = "EULA"
@@ -1,3 +0,0 @@
1
- from .assets import TableauAsset
2
- from .client import ApiClient
3
- from .extract import extract_all, iterate_all_data
@@ -1,49 +0,0 @@
1
- from enum import Enum
2
-
3
- from ...types import ExternalAsset, classproperty
4
-
5
-
6
- class TableauAsset(ExternalAsset):
7
- """
8
- Tableau assets
9
- """
10
-
11
- CUSTOM_SQL_TABLE = "custom_sql_tables"
12
- CUSTOM_SQL_QUERY = "custom_sql_queries"
13
- DASHBOARD = "dashboards"
14
- DASHBOARD_SHEET = "dashboards_sheets"
15
- DATASOURCE = "datasources"
16
- FIELD = "fields"
17
- PROJECT = "projects"
18
- PUBLISHED_DATASOURCE = "published_datasources"
19
- SHEET = "sheets"
20
- USAGE = "views"
21
- USER = "users"
22
- WORKBOOK = "workbooks"
23
- WORKBOOK_TO_DATASOURCE = "workbooks_to_datasource"
24
-
25
- @classproperty
26
- def optional(cls) -> set["TableauAsset"]:
27
- return {
28
- TableauAsset.DASHBOARD,
29
- TableauAsset.DASHBOARD_SHEET,
30
- TableauAsset.FIELD,
31
- TableauAsset.SHEET,
32
- TableauAsset.PUBLISHED_DATASOURCE,
33
- }
34
-
35
-
36
- class TableauGraphqlAsset(Enum):
37
- """
38
- Assets which can be fetched from Tableau
39
- """
40
-
41
- BIN_FIELD = "binFields"
42
- CALCULATED_FIELD = "calculatedFields"
43
- COLUMN_FIELD = "columnFields"
44
- CUSTOM_SQL = "customSQLTables"
45
- DASHBOARD = "dashboards"
46
- DATASOURCE = "datasources"
47
- GROUP_FIELD = "groupFields"
48
- SHEETS = "sheets"
49
- WORKBOOK_TO_DATASOURCE = "workbooks"
@@ -1,2 +0,0 @@
1
- from .client import ApiClient
2
- from .client_utils import get_paginated_objects
@@ -1,229 +0,0 @@
1
- import logging
2
-
3
- import tableauserverclient as TSC # type: ignore
4
-
5
- from ....utils import SerializedAsset
6
- from ..assets import TableauAsset
7
- from ..constants import PAGE_SIZE, TABLEAU_SERVER_VERSION
8
- from ..usage import compute_usage_views
9
- from .client_utils import extract_asset, get_paginated_objects
10
- from .credentials import CredentialsApi, CredentialsKey, get_value
11
- from .project import compute_project_path
12
- from .safe_mode import safe_mode_fetch_usage
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
-
17
- class ApiClient:
18
- """
19
- Connect to Tableau REST API and fetch main assets.
20
- Superuser credentials are required.
21
- https://tableau.github.io/server-client-python/docs/
22
- """
23
-
24
- def __init__(
25
- self,
26
- **kwargs,
27
- ):
28
- self._credentials = CredentialsApi(
29
- user=get_value(CredentialsKey.TABLEAU_USER, kwargs, True),
30
- password=get_value(CredentialsKey.TABLEAU_PASSWORD, kwargs, True),
31
- token_name=get_value(
32
- CredentialsKey.TABLEAU_TOKEN_NAME,
33
- kwargs,
34
- True,
35
- ),
36
- token=get_value(CredentialsKey.TABLEAU_TOKEN, kwargs, True),
37
- server_url=get_value(CredentialsKey.TABLEAU_SERVER_URL, kwargs),
38
- site_id=get_value(CredentialsKey.TABLEAU_SITE_ID, kwargs, True),
39
- )
40
- self._server = TSC.Server(self._credentials.server_url)
41
- self._server.add_http_options({"verify": True})
42
- self._page_size = PAGE_SIZE
43
- self._server.version = TABLEAU_SERVER_VERSION
44
- self._safe_mode = bool(kwargs.get("safe_mode"))
45
- self.errors: list[str] = []
46
-
47
- @staticmethod
48
- def name() -> str:
49
- return "Tableau/API"
50
-
51
- def _user_password_login(self) -> None:
52
- """Login into Tableau using user and password"""
53
- self._server.auth.sign_in(
54
- TSC.TableauAuth(
55
- self._credentials.user,
56
- self._credentials.password,
57
- site_id=self._credentials.site_id,
58
- ),
59
- )
60
-
61
- def _pat_login(self) -> None:
62
- """Login into Tableau using personal authentication token"""
63
- self._server.auth.sign_in(
64
- TSC.PersonalAccessTokenAuth(
65
- self._credentials.token_name,
66
- self._credentials.token,
67
- site_id=self._credentials.site_id,
68
- ),
69
- )
70
-
71
- def login(self) -> None:
72
- """Login into Tableau"""
73
-
74
- if self._credentials.user and self._credentials.password:
75
- logger.info("Logging in using user and password authentication")
76
- return self._user_password_login()
77
-
78
- if self._credentials.token_name and self._credentials.token:
79
- logger.info("Logging in using token authentication")
80
- return self._pat_login()
81
-
82
- raise ValueError(
83
- """Wrong authentication: you should provide either user and password
84
- or personal access token""",
85
- )
86
-
87
- def base_url(self) -> str:
88
- return self._credentials.server_url
89
-
90
- def _fetch_users(self) -> SerializedAsset:
91
- """Fetches list of User"""
92
- return [
93
- extract_asset(user, TableauAsset.USER)
94
- for user in TSC.Pager(self._server.users)
95
- ]
96
-
97
- def _fetch_workbooks(self) -> SerializedAsset:
98
- """Fetches list of Workbooks"""
99
-
100
- return [
101
- extract_asset(workbook, TableauAsset.WORKBOOK)
102
- for workbook in TSC.Pager(self._server.workbooks)
103
- ]
104
-
105
- def _fetch_usages(self, safe_mode: bool) -> SerializedAsset:
106
- """Fetches list of Usages"""
107
- if not safe_mode:
108
- usages = [
109
- extract_asset(usage, TableauAsset.USAGE)
110
- for usage in TSC.Pager(self._server.views, usage=True)
111
- ]
112
-
113
- return compute_usage_views(usages)
114
-
115
- return safe_mode_fetch_usage(self)
116
-
117
- def _fetch_projects(self) -> SerializedAsset:
118
- """Fetches list of Projects"""
119
- return compute_project_path(
120
- [
121
- extract_asset(project, TableauAsset.PROJECT)
122
- for project in TSC.Pager(self._server.projects)
123
- ],
124
- )
125
-
126
- def _fetch_workbooks_to_datasource(self) -> SerializedAsset:
127
- """Fetches workbooks to datasource"""
128
-
129
- return self._fetch_paginated_objects(
130
- TableauAsset.WORKBOOK_TO_DATASOURCE,
131
- )
132
-
133
- def _fetch_published_datasources(self) -> SerializedAsset:
134
- """Fetches list of published datasources"""
135
-
136
- return [
137
- extract_asset(datasource, TableauAsset.PUBLISHED_DATASOURCE)
138
- for datasource in TSC.Pager(self._server.datasources)
139
- ]
140
-
141
- def _fetch_datasources(self) -> SerializedAsset:
142
- """Fetches both embedded and published datasource"""
143
-
144
- return self._fetch_paginated_objects(
145
- TableauAsset.DATASOURCE,
146
- )
147
-
148
- def _fetch_fields(self) -> SerializedAsset:
149
- """Fetches fields"""
150
- return self._fetch_paginated_objects(
151
- TableauAsset.FIELD,
152
- )
153
-
154
- def _fetch_custom_sql_queries(self) -> SerializedAsset:
155
- """Fetches custom sql queries"""
156
-
157
- return self._fetch_paginated_objects(
158
- TableauAsset.CUSTOM_SQL_QUERY,
159
- )
160
-
161
- def _fetch_custom_sql_tables(self) -> SerializedAsset:
162
- """Fetches custom sql tables"""
163
-
164
- return self._fetch_paginated_objects(
165
- TableauAsset.CUSTOM_SQL_TABLE,
166
- )
167
-
168
- def _fetch_dashboards(self) -> SerializedAsset:
169
- """Fetches dashboards"""
170
-
171
- return self._fetch_paginated_objects(
172
- TableauAsset.DASHBOARD,
173
- )
174
-
175
- def _fetch_sheets(self) -> SerializedAsset:
176
- """Fetches sheets"""
177
-
178
- return self._fetch_paginated_objects(
179
- TableauAsset.SHEET,
180
- )
181
-
182
- def _fetch_paginated_objects(self, asset: TableauAsset) -> SerializedAsset:
183
- """Fetches paginated objects"""
184
-
185
- return get_paginated_objects(self._server, asset, self._page_size)
186
-
187
- def fetch(self, asset: TableauAsset) -> SerializedAsset:
188
- """Fetches the given asset"""
189
- logger.info(f"Fetching {asset.name}")
190
-
191
- if asset == TableauAsset.CUSTOM_SQL_QUERY:
192
- assets = self._fetch_custom_sql_queries()
193
-
194
- if asset == TableauAsset.CUSTOM_SQL_TABLE:
195
- assets = self._fetch_custom_sql_tables()
196
-
197
- if asset == TableauAsset.DASHBOARD:
198
- assets = self._fetch_dashboards()
199
-
200
- if asset == TableauAsset.DATASOURCE:
201
- assets = self._fetch_datasources()
202
-
203
- if asset == TableauAsset.FIELD:
204
- assets = self._fetch_fields()
205
-
206
- if asset == TableauAsset.PROJECT:
207
- assets = self._fetch_projects()
208
-
209
- if asset == TableauAsset.PUBLISHED_DATASOURCE:
210
- assets = self._fetch_published_datasources()
211
-
212
- if asset == TableauAsset.SHEET:
213
- assets = self._fetch_sheets()
214
-
215
- if asset == TableauAsset.USAGE:
216
- assets = self._fetch_usages(self._safe_mode)
217
-
218
- if asset == TableauAsset.USER:
219
- assets = self._fetch_users()
220
-
221
- if asset == TableauAsset.WORKBOOK:
222
- assets = self._fetch_workbooks()
223
-
224
- if asset == TableauAsset.WORKBOOK_TO_DATASOURCE:
225
- assets = self._fetch_workbooks_to_datasource()
226
-
227
- logger.info(f"Fetched {asset.name} ({len(assets)} results)")
228
-
229
- return assets
@@ -1,75 +0,0 @@
1
- from collections.abc import Iterator
2
- from typing import Optional
3
-
4
- from ....utils import SerializedAsset
5
- from ..assets import TableauAsset
6
- from ..gql_fields import QUERY_FIELDS
7
- from ..tsc_fields import TSC_FIELDS
8
-
9
- QUERY_TEMPLATE = """
10
- {{
11
- {object_type}Connection(first: {page_size}, after: AFTER_TOKEN_SIGNAL) {{
12
- nodes {{ {query_fields}
13
- }}
14
- pageInfo {{
15
- hasNextPage
16
- endCursor
17
- }}
18
- totalCount
19
- }}
20
- }}
21
- """
22
-
23
- RESOURCE_TEMPLATE = "{resource}Connection"
24
-
25
-
26
- def get_paginated_objects(
27
- server,
28
- asset: TableauAsset,
29
- page_size: int,
30
- ) -> SerializedAsset:
31
- assets: SerializedAsset = []
32
- for query in QUERY_FIELDS[asset]:
33
- fields = query["fields"].value
34
- object_type = query["object_type"].value
35
- query_formatted = QUERY_TEMPLATE.format(
36
- object_type=object_type,
37
- page_size=page_size,
38
- query_fields=fields,
39
- )
40
- resource = RESOURCE_TEMPLATE.format(resource=object_type)
41
- result_pages = query_scroll(server, query_formatted, resource)
42
- queried_assets = [asset for page in result_pages for asset in page]
43
- assets.extend(queried_assets)
44
- return assets
45
-
46
-
47
- def query_scroll(
48
- server,
49
- query: str,
50
- resource: str,
51
- ) -> Iterator[SerializedAsset]:
52
- """build a tableau query iterator handling pagination and cursor"""
53
-
54
- def _call(cursor: Optional[str]) -> dict:
55
- # If cursor is defined it must be quoted else use null token
56
- token = "null" if cursor is None else f'"{cursor}"'
57
- query_ = query.replace("AFTER_TOKEN_SIGNAL", token)
58
-
59
- return server.metadata.query(query_)["data"][resource]
60
-
61
- cursor = None
62
- while True:
63
- payload = _call(cursor)
64
- yield payload["nodes"]
65
-
66
- page_info = payload["pageInfo"]
67
- if page_info["hasNextPage"]:
68
- cursor = page_info["endCursor"]
69
- else:
70
- break
71
-
72
-
73
- def extract_asset(asset: dict, asset_type: TableauAsset) -> dict:
74
- """Agnostic function extracting dedicated attributes with define asset"""
75
- return {key: getattr(asset, key) for key in TSC_FIELDS[asset_type]}