castor-extractor 0.16.11__tar.gz → 0.17.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.
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/CHANGELOG.md +20 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/PKG-INFO +1 -1
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/upload.py +4 -4
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/uploader/constant.py +8 -1
- castor_extractor-0.17.0/castor_extractor/uploader/upload.py +133 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/uploader/upload_test.py +4 -3
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/uploader/utils.py +10 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/client/api.py +8 -3
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/retry.py +3 -1
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau_revamp/client/client.py +5 -2
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau_revamp/client/gql_queries.py +10 -1
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/abstract/__init__.py +2 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/abstract/asset.py +14 -0
- castor_extractor-0.17.0/castor_extractor/warehouse/databricks/client.py +465 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/databricks/client_test.py +61 -1
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/databricks/extract.py +36 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/databricks/format.py +13 -0
- castor_extractor-0.17.0/castor_extractor/warehouse/databricks/test_constants.py +79 -0
- castor_extractor-0.17.0/castor_extractor/warehouse/databricks/types.py +8 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/extract.py +2 -0
- castor_extractor-0.17.0/castor_extractor/warehouse/snowflake/queries/function.sql +10 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/pyproject.toml +1 -1
- castor_extractor-0.16.11/castor_extractor/uploader/upload.py +0 -116
- castor_extractor-0.16.11/castor_extractor/warehouse/databricks/client.py +0 -229
- castor_extractor-0.16.11/castor_extractor/warehouse/databricks/types.py +0 -3
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/Dockerfile +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/LICENCE +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/README.md +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_bigquery.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_databricks.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_domo.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_looker.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_metabase_api.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_metabase_db.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_mode.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_mysql.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_postgres.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_powerbi.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_qlik.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_redshift.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_salesforce.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_salesforce_reporting.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_sigma.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_snowflake.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_sqlserver.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/extract_tableau.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/commands/file_check.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/column.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/column_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/enums.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/file.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/file_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/file_test_users.csv +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/templates/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/logger.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/types.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/uploader/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/uploader/env.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/uploader/env_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/client/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/client/abstract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/client/api_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/client/postgres.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/client/query.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/client/uri.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/client/uri_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/collection.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/collection_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/dbt/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/dbt/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/dbt/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/dbt/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/dbt/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/deprecate.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/env.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/files.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/files_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/formatter.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/formatter_test.csv +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/formatter_test.json +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/formatter_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/json_stream_write.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/load.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/object.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/object_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/pager/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/pager/pager.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/pager/pager_on_id.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/pager/pager_on_id_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/pager/pager_on_token.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/pager/pager_on_token_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/pager/pager_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/retry_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/safe.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/safe_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/salesforce/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/salesforce/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/salesforce/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/salesforce/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/salesforce/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/salesforce/credentials_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/store.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/string.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/string_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/time.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/time_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/type.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/validation.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/validation_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/utils/write.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/client/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/client/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/client/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/client/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/client/endpoints.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/client/pagination.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/client/pagination_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/domo/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/api/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/api/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/api/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/api/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/api/sdk.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/api/utils.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/constant.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/env.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/fields.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/fields_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/multithreading.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/looker/parameters.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/api/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/api/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/client/shared.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/errors.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/metabase/types.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/mode/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/mode/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/mode/client/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/mode/client/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/mode/client/client_test.json +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/mode/client/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/mode/client/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/mode/client/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/mode/errors.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/mode/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/client/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/client/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/client/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/client/credentials_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/client/rest.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/client/rest_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/client/utils.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/client/utils_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/powerbi/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/engine/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/engine/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/engine/error.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/engine/error_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/engine/websocket.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/master.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/rest.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/client/rest_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/qlik/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/salesforce_reporting/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/salesforce_reporting/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/salesforce_reporting/client/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/salesforce_reporting/client/rest.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/salesforce_reporting/client/soql.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/salesforce_reporting/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/sigma/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/sigma/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/sigma/client/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/sigma/client/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/sigma/client/endpoints.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/sigma/client/pagination.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/sigma/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/sigma/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/client/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/client/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/client/client_utils.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/client/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/client/project.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/client/safe_mode.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/errors.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/gql_fields.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_1_get.json +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_2_get.json +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/auth.xml +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/project_get.xml +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/user_get.xml +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/view_get_usage.xml +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/workbook_get.xml +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/graphql/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/graphql/paginated_object_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/auth_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/credentials_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/projects_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/usages_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/users_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/rest_api/workbooks_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/utils/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tests/unit/utils/env_key.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/tsc_fields.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/types.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau/usage.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau_revamp/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau_revamp/assets.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau_revamp/client/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau_revamp/client/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau_revamp/client/errors.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau_revamp/client/tsc_fields.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau_revamp/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/visualization/tableau_revamp/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/abstract/asset_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/abstract/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/abstract/query.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/abstract/time_filter.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/query.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/bigquery/types.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/databricks/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/databricks/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/databricks/format_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/queries/.sqlfluff +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/queries/column.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/queries/database.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/queries/query.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/queries/schema.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/queries/table.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/queries/user.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/queries/view_ddl.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/mysql/query.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/postgres/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/postgres/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/postgres/query.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/queries/query.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/redshift/query.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/salesforce/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/salesforce/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/salesforce/constants.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/salesforce/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/salesforce/format.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/salesforce/format_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/salesforce/soql.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/client_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/credentials.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/credentials_test.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/column.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/database.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/query.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/role.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/schema.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/table.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/snowflake/query.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/sqlserver/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/sqlserver/client.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/sqlserver/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/sqlserver/queries/.sqlfluff +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/sqlserver/queries/column.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/sqlserver/queries/database.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/sqlserver/queries/schema.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/sqlserver/queries/table.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/sqlserver/queries/user.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/sqlserver/query.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/synapse/__init__.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/synapse/extract.py +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/synapse/queries/.sqlfluff +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/synapse/queries/database.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/synapse/queries/query.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/synapse/queries/schema.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/synapse/queries/table.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/synapse/queries/user.sql +0 -0
- {castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/synapse/queries/view_ddl.sql +0 -0
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.17.0 - 2024-06-10
|
|
4
|
+
|
|
5
|
+
* Uploader: redirect to the proxy, replace credentials with token
|
|
6
|
+
|
|
7
|
+
## 0.16.15 - 2024-06-07
|
|
8
|
+
|
|
9
|
+
* Tableau: extract database_name for CustomSQLTables
|
|
10
|
+
|
|
11
|
+
## 0.16.14 - 2024-06-06
|
|
12
|
+
|
|
13
|
+
* Snowflake: Extract SQL user defined function
|
|
14
|
+
|
|
15
|
+
## 0.16.13 - 2024-06-05
|
|
16
|
+
|
|
17
|
+
* Tableau: extract database_name for tables
|
|
18
|
+
|
|
19
|
+
## 0.16.12 - 2024-06-04
|
|
20
|
+
|
|
21
|
+
* Databricks: Extract lineage
|
|
22
|
+
|
|
3
23
|
## 0.16.11 - 2024-06-03
|
|
4
24
|
|
|
5
25
|
* Tableau: add extra fields to optimise storage
|
|
@@ -13,10 +13,10 @@ logging.basicConfig(level=logging.INFO, format="%(levelname)s - %(message)s")
|
|
|
13
13
|
def _args():
|
|
14
14
|
parser = argparse.ArgumentParser()
|
|
15
15
|
parser.add_argument(
|
|
16
|
-
"-
|
|
17
|
-
"--
|
|
16
|
+
"-k",
|
|
17
|
+
"--token",
|
|
18
18
|
required=True,
|
|
19
|
-
help="""
|
|
19
|
+
help="""API token provided by Castor""",
|
|
20
20
|
)
|
|
21
21
|
parser.add_argument(
|
|
22
22
|
"-s",
|
|
@@ -44,7 +44,7 @@ def _args():
|
|
|
44
44
|
)
|
|
45
45
|
parsed = parser.parse_args()
|
|
46
46
|
return {
|
|
47
|
-
"
|
|
47
|
+
"token": parsed.token,
|
|
48
48
|
"source_id": parsed.source_id,
|
|
49
49
|
"file_path": parsed.file_path,
|
|
50
50
|
"directory_path": parsed.directory_path,
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
from enum import Enum
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
from ..utils import RetryStrategy
|
|
4
|
+
|
|
5
|
+
# url of the gcs proxy
|
|
6
|
+
INGEST_URL = "https://ingest.castordoc.com"
|
|
7
|
+
|
|
8
|
+
RETRY_BASE_MS = 10_000
|
|
9
|
+
RETRY_JITTER_MS = 1_000
|
|
10
|
+
RETRY_STRATEGY = RetryStrategy.LINEAR
|
|
4
11
|
|
|
5
12
|
|
|
6
13
|
class FileType(Enum):
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
import logging
|
|
3
|
+
import ntpath
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from typing import Dict, Iterable, Optional, Tuple
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
import requests
|
|
9
|
+
|
|
10
|
+
from ..utils.retry import retry
|
|
11
|
+
from .constant import (
|
|
12
|
+
INGEST_URL,
|
|
13
|
+
PATH_TEMPLATES,
|
|
14
|
+
RETRY_BASE_MS,
|
|
15
|
+
RETRY_JITTER_MS,
|
|
16
|
+
RETRY_STRATEGY,
|
|
17
|
+
FileType,
|
|
18
|
+
)
|
|
19
|
+
from .env import get_blob_env
|
|
20
|
+
from .utils import iter_files
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
_EXCEPTIONS = (
|
|
25
|
+
requests.exceptions.Timeout,
|
|
26
|
+
requests.exceptions.ConnectTimeout,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _path_and_url(
|
|
31
|
+
source_id: UUID,
|
|
32
|
+
file_type: FileType,
|
|
33
|
+
file_path: str,
|
|
34
|
+
) -> Tuple[str, str]:
|
|
35
|
+
|
|
36
|
+
now = datetime.utcnow()
|
|
37
|
+
timestamp = int(now.timestamp())
|
|
38
|
+
filename = ntpath.basename(file_path)
|
|
39
|
+
path_template = PATH_TEMPLATES[file_type]
|
|
40
|
+
path = path_template.format(
|
|
41
|
+
timestamp=timestamp,
|
|
42
|
+
source_id=source_id,
|
|
43
|
+
filename=filename,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
url = f"{INGEST_URL}/{path}"
|
|
47
|
+
|
|
48
|
+
return path, url
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _headers(token: str) -> Dict:
|
|
52
|
+
return {
|
|
53
|
+
"Authorization": f"Token {token}",
|
|
54
|
+
"Accept": "text/csv, application/json",
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _upload(
|
|
59
|
+
token: str,
|
|
60
|
+
source_id: UUID,
|
|
61
|
+
file_path: str,
|
|
62
|
+
file_type: FileType,
|
|
63
|
+
) -> None:
|
|
64
|
+
"""
|
|
65
|
+
Upload the given file to Google Cloud Storage (GCS)
|
|
66
|
+
- Don't call GCS API directly
|
|
67
|
+
- Call the ingestion proxy which handles authorisation and uploading
|
|
68
|
+
"""
|
|
69
|
+
path, url = _path_and_url(source_id, file_type, file_path)
|
|
70
|
+
headers = _headers(token)
|
|
71
|
+
timeout, max_retries = get_blob_env()
|
|
72
|
+
|
|
73
|
+
with open(file_path, "rb") as file_content:
|
|
74
|
+
|
|
75
|
+
@retry(
|
|
76
|
+
exceptions=_EXCEPTIONS,
|
|
77
|
+
max_retries=max_retries,
|
|
78
|
+
base_ms=RETRY_BASE_MS,
|
|
79
|
+
jitter_ms=RETRY_JITTER_MS,
|
|
80
|
+
strategy=RETRY_STRATEGY,
|
|
81
|
+
)
|
|
82
|
+
def _request_post():
|
|
83
|
+
response = requests.post(
|
|
84
|
+
url=url,
|
|
85
|
+
headers=headers,
|
|
86
|
+
data=file_content,
|
|
87
|
+
timeout=timeout,
|
|
88
|
+
)
|
|
89
|
+
response.raise_for_status()
|
|
90
|
+
|
|
91
|
+
_request_post()
|
|
92
|
+
|
|
93
|
+
logger.info(f"Uploaded {file_path} as {file_type.value} to {path}")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def upload_manifest(
|
|
97
|
+
token: str,
|
|
98
|
+
source_id: UUID,
|
|
99
|
+
file_path: str,
|
|
100
|
+
) -> None:
|
|
101
|
+
"""
|
|
102
|
+
credentials: path to file or dict
|
|
103
|
+
source_id: id for the source
|
|
104
|
+
file_path: path to the local manifest to upload
|
|
105
|
+
"""
|
|
106
|
+
_upload(token, source_id, file_path, FileType.DBT)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def upload(
|
|
110
|
+
token: str,
|
|
111
|
+
source_id: UUID,
|
|
112
|
+
file_type: FileType,
|
|
113
|
+
file_path: Optional[str] = None,
|
|
114
|
+
directory_path: Optional[str] = None,
|
|
115
|
+
) -> None:
|
|
116
|
+
"""
|
|
117
|
+
credentials: path to file or dict
|
|
118
|
+
source_id: id for the source
|
|
119
|
+
file_type: type of file(s) uploaded - see FileType Enum
|
|
120
|
+
file_path: path to the local visualization or warehouse file to upload
|
|
121
|
+
directory_path: path to the local directory containing files to upload
|
|
122
|
+
"""
|
|
123
|
+
files: Iterable[str]
|
|
124
|
+
if directory_path:
|
|
125
|
+
files = iter_files(directory_path)
|
|
126
|
+
elif file_path:
|
|
127
|
+
files = [file_path]
|
|
128
|
+
else:
|
|
129
|
+
message = "either file_path or directory_path should be defined"
|
|
130
|
+
raise ValueError(message)
|
|
131
|
+
|
|
132
|
+
for file_ in files:
|
|
133
|
+
_upload(token, source_id, file_, file_type)
|
{castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/uploader/upload_test.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from uuid import UUID
|
|
2
2
|
|
|
3
|
-
from .constant import FileType
|
|
4
|
-
from .upload import
|
|
3
|
+
from .constant import INGEST_URL, FileType
|
|
4
|
+
from .upload import _path_and_url
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
def test__path():
|
|
@@ -9,5 +9,6 @@ def test__path():
|
|
|
9
9
|
file_type = FileType.VIZ
|
|
10
10
|
file_path = "filename"
|
|
11
11
|
|
|
12
|
-
path =
|
|
12
|
+
path, url = _path_and_url(source_id, file_type, file_path)
|
|
13
13
|
assert path == f"visualization-{source_id}/{file_path}"
|
|
14
|
+
assert url == f"{INGEST_URL}/{path}"
|
|
@@ -1,13 +1,23 @@
|
|
|
1
|
+
import logging
|
|
1
2
|
import os
|
|
2
3
|
from typing import Iterator
|
|
3
4
|
|
|
5
|
+
logger = logging.getLogger(__name__)
|
|
6
|
+
|
|
7
|
+
_ALLOWED_EXTENSION = (".json", ".csv")
|
|
8
|
+
|
|
4
9
|
|
|
5
10
|
def iter_files(repository_path: str) -> Iterator[str]:
|
|
6
11
|
"""
|
|
7
12
|
Given a repository path yield all files in that repository
|
|
13
|
+
Removes file whose extension is not allowed
|
|
8
14
|
"""
|
|
9
15
|
|
|
10
16
|
for file in os.listdir(repository_path):
|
|
17
|
+
_, ext = os.path.splitext(file)
|
|
18
|
+
if ext not in _ALLOWED_EXTENSION:
|
|
19
|
+
logger.info(f"Forbidden file extension : skipping {file}")
|
|
20
|
+
continue
|
|
11
21
|
file_path = os.path.join(repository_path, file)
|
|
12
22
|
|
|
13
23
|
if os.path.isfile(file_path):
|
|
@@ -5,7 +5,7 @@ import requests
|
|
|
5
5
|
|
|
6
6
|
logger = logging.getLogger(__name__)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
DEFAULT_TIMEOUT_S = 30
|
|
9
9
|
|
|
10
10
|
# https://requests.readthedocs.io/en/latest/api/#requests.request
|
|
11
11
|
HttpMethod = Literal["GET", "OPTIONS", "HEAD", "POST", "PUT", "PATCH", "DELETE"]
|
|
@@ -20,7 +20,7 @@ class APIClient:
|
|
|
20
20
|
def __init__(self, host: str, token: Optional[str] = None):
|
|
21
21
|
self._host = host
|
|
22
22
|
self._token = token or ""
|
|
23
|
-
self._timeout =
|
|
23
|
+
self._timeout = DEFAULT_TIMEOUT_S
|
|
24
24
|
|
|
25
25
|
@staticmethod
|
|
26
26
|
def build_url(host: str, path: str):
|
|
@@ -44,7 +44,12 @@ class APIClient:
|
|
|
44
44
|
) -> Any:
|
|
45
45
|
logger.debug(f"Calling {method} on {url}")
|
|
46
46
|
result = requests.request(
|
|
47
|
-
method,
|
|
47
|
+
method,
|
|
48
|
+
url,
|
|
49
|
+
headers=self._headers(),
|
|
50
|
+
params=params,
|
|
51
|
+
json=data,
|
|
52
|
+
timeout=self._timeout,
|
|
48
53
|
)
|
|
49
54
|
result.raise_for_status()
|
|
50
55
|
|
|
@@ -68,7 +68,8 @@ class Retry(BaseModel):
|
|
|
68
68
|
self._retry_attempts += 1
|
|
69
69
|
wait_ms = self.base() + self.jitter()
|
|
70
70
|
wait_s = float(wait_ms) / MS_IN_SEC
|
|
71
|
-
|
|
71
|
+
msg = f"Attempting a new call in {wait_s} seconds, {self._retry_attempts} attempt(s) / {self.max_retries} max retries"
|
|
72
|
+
logger.warning(msg)
|
|
72
73
|
time.sleep(wait_s)
|
|
73
74
|
return True
|
|
74
75
|
|
|
@@ -93,6 +94,7 @@ def retry(
|
|
|
93
94
|
try:
|
|
94
95
|
return None, callable(*args, **kwargs)
|
|
95
96
|
except exceptions_ as err:
|
|
97
|
+
logger.warning(f"Exception within {callable.__name__}")
|
|
96
98
|
return err, None
|
|
97
99
|
|
|
98
100
|
def _func(*args, **kwargs) -> Any:
|
|
@@ -31,8 +31,11 @@ _TSC_ASSETS = (
|
|
|
31
31
|
# increase the value when extraction is too slow
|
|
32
32
|
# decrease the value when timeouts arise
|
|
33
33
|
_CUSTOM_PAGE_SIZE: Dict[TableauRevampAsset, int] = {
|
|
34
|
-
#
|
|
35
|
-
|
|
34
|
+
# for some clients, extraction of columns tend to hit the node limit
|
|
35
|
+
# https://community.tableau.com/s/question/0D54T00000YuK60SAF/metadata-query-nodelimitexceeded-error
|
|
36
|
+
# the workaround is to reduce pagination
|
|
37
|
+
TableauRevampAsset.COLUMN: 50,
|
|
38
|
+
# fields are light but volumes are bigger
|
|
36
39
|
TableauRevampAsset.FIELD: 1000,
|
|
37
40
|
TableauRevampAsset.TABLE: 50,
|
|
38
41
|
}
|
|
@@ -63,12 +63,21 @@ downstreamWorkbooks { id }
|
|
|
63
63
|
id
|
|
64
64
|
name
|
|
65
65
|
... on DatabaseTable {
|
|
66
|
-
connectionType
|
|
67
66
|
fullName
|
|
68
67
|
schema
|
|
68
|
+
database {
|
|
69
|
+
connectionType
|
|
70
|
+
id
|
|
71
|
+
name
|
|
72
|
+
}
|
|
69
73
|
}
|
|
70
74
|
... on CustomSQLTable {
|
|
71
75
|
query
|
|
76
|
+
database {
|
|
77
|
+
connectionType
|
|
78
|
+
id
|
|
79
|
+
name
|
|
80
|
+
}
|
|
72
81
|
}
|
|
73
82
|
"""
|
|
74
83
|
|
{castor_extractor-0.16.11 → castor_extractor-0.17.0}/castor_extractor/warehouse/abstract/asset.py
RENAMED
|
@@ -7,6 +7,8 @@ from ...types import ExternalAsset, classproperty
|
|
|
7
7
|
class WarehouseAsset(ExternalAsset):
|
|
8
8
|
"""Assets that can be extracted from warehouses"""
|
|
9
9
|
|
|
10
|
+
ADDITIONAL_COLUMN_LINEAGE = "additional_column_lineage"
|
|
11
|
+
ADDITIONAL_TABLE_LINEAGE = "additional_table_lineage"
|
|
10
12
|
COLUMN = "column"
|
|
11
13
|
COLUMN_LINEAGE = "column_lineage" # specific to snowflake
|
|
12
14
|
DATABASE = "database"
|
|
@@ -19,22 +21,28 @@ class WarehouseAsset(ExternalAsset):
|
|
|
19
21
|
ROLE = "role"
|
|
20
22
|
SCHEMA = "schema"
|
|
21
23
|
TABLE = "table"
|
|
24
|
+
FUNCTION = "function"
|
|
22
25
|
USER = "user"
|
|
23
26
|
VIEW_DDL = "view_ddl"
|
|
24
27
|
|
|
25
28
|
@classproperty
|
|
26
29
|
def optional(cls) -> Set["WarehouseAsset"]:
|
|
27
30
|
return {
|
|
31
|
+
WarehouseAsset.ADDITIONAL_COLUMN_LINEAGE,
|
|
32
|
+
WarehouseAsset.ADDITIONAL_TABLE_LINEAGE,
|
|
28
33
|
WarehouseAsset.EXTERNAL_COLUMN_LINEAGE,
|
|
29
34
|
WarehouseAsset.EXTERNAL_TABLE_LINEAGE,
|
|
35
|
+
WarehouseAsset.FUNCTION,
|
|
30
36
|
}
|
|
31
37
|
|
|
32
38
|
|
|
33
39
|
class WarehouseAssetGroup(Enum):
|
|
34
40
|
"""Groups of assets that can be extracted together"""
|
|
35
41
|
|
|
42
|
+
ADDITIONAL_LINEAGE = "additional_lineage"
|
|
36
43
|
CATALOG = "catalog"
|
|
37
44
|
EXTERNAL_LINEAGE = "external_lineage"
|
|
45
|
+
FUNCTION = "function"
|
|
38
46
|
QUERY = "query"
|
|
39
47
|
ROLE = "role"
|
|
40
48
|
SNOWFLAKE_LINEAGE = "snowflake_lineage"
|
|
@@ -53,6 +61,7 @@ CATALOG_ASSETS = (
|
|
|
53
61
|
)
|
|
54
62
|
|
|
55
63
|
# shared by technologies supporting queries
|
|
64
|
+
FUNCTIONS_ASSETS = (WarehouseAsset.FUNCTION,)
|
|
56
65
|
QUERIES_ASSETS = (WarehouseAsset.QUERY,)
|
|
57
66
|
VIEWS_ASSETS = (WarehouseAsset.VIEW_DDL,)
|
|
58
67
|
|
|
@@ -61,6 +70,11 @@ EXTERNAL_LINEAGE_ASSETS = (
|
|
|
61
70
|
WarehouseAsset.EXTERNAL_TABLE_LINEAGE,
|
|
62
71
|
)
|
|
63
72
|
|
|
73
|
+
ADDITIONAL_LINEAGE_ASSETS = (
|
|
74
|
+
WarehouseAsset.ADDITIONAL_COLUMN_LINEAGE,
|
|
75
|
+
WarehouseAsset.ADDITIONAL_TABLE_LINEAGE,
|
|
76
|
+
)
|
|
77
|
+
|
|
64
78
|
NON_EXTRACTABLE_ASSETS = {WarehouseAssetGroup.EXTERNAL_LINEAGE}
|
|
65
79
|
|
|
66
80
|
|