castor-extractor 0.12.1__tar.gz → 0.12.2__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.12.1 → castor_extractor-0.12.2}/CHANGELOG.md +4 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/PKG-INFO +1 -1
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/__init__.py +7 -1
- castor_extractor-0.12.2/castor_extractor/utils/client/__init__.py +4 -0
- castor_extractor-0.12.1/castor_extractor/warehouse/abstract/client.py → castor_extractor-0.12.2/castor_extractor/utils/client/abstract.py +2 -2
- castor_extractor-0.12.1/castor_extractor/warehouse/postgres/client.py → castor_extractor-0.12.2/castor_extractor/utils/client/postgres.py +2 -2
- castor_extractor-0.12.2/castor_extractor/utils/client/query.py +6 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/client.py +28 -45
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/credentials.py +12 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/abstract/__init__.py +0 -1
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/abstract/extract.py +9 -3
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/client.py +1 -2
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/__init__.py +0 -1
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/extract.py +1 -2
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/client.py +1 -2
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/client_test.py +1 -1
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/client.py +1 -2
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/client_test.py +1 -1
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/client.py +1 -2
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/pyproject.toml +1 -1
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/Dockerfile +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/LICENCE +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/README.md +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_bigquery.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_domo.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_looker.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_metabase_api.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_metabase_db.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_mode.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_postgres.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_powerbi.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_qlik.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_redshift.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_sigma.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_snowflake.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_sqlserver.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_tableau.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/file_check.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/upload.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/column.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/column_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/enums.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/file.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/file_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/file_test_users.csv +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/templates/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/logger.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/transformation/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/transformation/dbt/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/transformation/dbt/assets.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/transformation/dbt/client/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/transformation/dbt/client/client.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/transformation/dbt/client/client_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/transformation/dbt/client/credentials.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/types.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/uploader/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/uploader/constant.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/uploader/env.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/uploader/env_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/uploader/upload.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/uploader/upload_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/uploader/utils.py +0 -0
- {castor_extractor-0.12.1/castor_extractor/utils → castor_extractor-0.12.2/castor_extractor/utils/client}/uri.py +0 -0
- {castor_extractor-0.12.1/castor_extractor/utils → castor_extractor-0.12.2/castor_extractor/utils/client}/uri_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/collection.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/deprecate.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/env.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/files.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/files_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/formatter.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/formatter_test.csv +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/formatter_test.json +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/formatter_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/json_stream_write.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/load.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/object.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/object_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/pager.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/pager_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/retry.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/retry_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/safe.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/safe_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/store.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/string.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/string_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/time.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/time_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/type.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/validation.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/validation_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/write.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/assets.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/client/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/client/client.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/client/client_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/client/credentials.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/client/endpoints.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/client/pagination.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/client/pagination_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/api/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/api/client.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/api/client_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/api/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/api/sdk.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/api/utils.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/assets.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/constant.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/env.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/fields.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/fields_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/multithreading.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/parameters.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/assets.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/api/client.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/client/shared.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/errors.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/metabase/types.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/mode/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/mode/assets.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/mode/client/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/mode/client/client.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/mode/client/client_test.json +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/mode/client/client_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/mode/client/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/mode/client/credentials.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/mode/errors.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/mode/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/assets.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/client/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/client/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/client/credentials.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/client/credentials_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/client/rest.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/client/rest_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/client/utils.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/client/utils_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/powerbi/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/assets.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/engine/client.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/engine/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/engine/error.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/engine/error_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/engine/websocket.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/master.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/rest.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/client/rest_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/qlik/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/sigma/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/sigma/assets.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/sigma/client/client.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/sigma/client/client_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/sigma/client/endpoints.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/sigma/client/pagination.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/sigma/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/sigma/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/assets.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/client/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/client/client.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/client/client_utils.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/client/credentials.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/client/project.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/client/safe_mode.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/constants.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/errors.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/gql_fields.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_1_get.json +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_2_get.json +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/auth.xml +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/project_get.xml +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/user_get.xml +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/view_get_usage.xml +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/workbook_get.xml +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/graphql/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/graphql/paginated_object_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/auth_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/credentials_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/projects_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/usages_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/users_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/workbooks_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/utils/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tests/unit/utils/env_key.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/tsc_fields.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/types.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/tableau/usage.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/abstract/asset.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/abstract/query.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/abstract/time_filter.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/query.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/types.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/query.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/queries/query.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/query.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/column.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/database.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/query.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/role.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/schema.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/table.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/query.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/queries/.sqlfluff +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/queries/column.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/queries/database.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/queries/schema.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/queries/table.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/queries/user.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/query.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/synapse/__init__.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/synapse/extract.py +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/synapse/queries/.sqlfluff +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/synapse/queries/database.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/synapse/queries/query.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/synapse/queries/schema.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/synapse/queries/table.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/synapse/queries/user.sql +0 -0
- {castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/synapse/queries/view_ddl.sql +0 -0
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
from .client import (
|
|
2
|
+
AbstractSourceClient,
|
|
3
|
+
ExtractionQuery,
|
|
4
|
+
PostgresClient,
|
|
5
|
+
SqlalchemyClient,
|
|
6
|
+
uri_encode,
|
|
7
|
+
)
|
|
1
8
|
from .collection import group_by
|
|
2
9
|
from .constants import OUTPUT_DIR
|
|
3
10
|
from .deprecate import deprecate_python
|
|
@@ -26,7 +33,6 @@ from .time import (
|
|
|
26
33
|
past_date,
|
|
27
34
|
)
|
|
28
35
|
from .type import Callback, Getter, JsonType, SerializedAsset
|
|
29
|
-
from .uri import uri_encode
|
|
30
36
|
from .validation import validate_baseurl
|
|
31
37
|
from .write import (
|
|
32
38
|
get_output_filename,
|
|
@@ -7,7 +7,7 @@ from sqlalchemy.engine import Connection, ResultProxy, create_engine
|
|
|
7
7
|
from .query import ExtractionQuery
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
class
|
|
10
|
+
class AbstractSourceClient(ABC):
|
|
11
11
|
"""interface for the client to connect to the source"""
|
|
12
12
|
|
|
13
13
|
def __init__(self, **credentials: dict):
|
|
@@ -26,7 +26,7 @@ class AbstractWarehouseClient(ABC):
|
|
|
26
26
|
pass
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
class SqlalchemyClient(
|
|
29
|
+
class SqlalchemyClient(AbstractSourceClient, ABC):
|
|
30
30
|
def __init__(self, credentials: dict):
|
|
31
31
|
super().__init__(**credentials)
|
|
32
32
|
self._uri = self._build_uri(credentials)
|
|
@@ -7,7 +7,12 @@ from sqlalchemy import create_engine
|
|
|
7
7
|
from sqlalchemy.engine import Engine
|
|
8
8
|
from sqlalchemy.exc import OperationalError
|
|
9
9
|
|
|
10
|
-
from .....utils import
|
|
10
|
+
from .....utils import (
|
|
11
|
+
ExtractionQuery,
|
|
12
|
+
PostgresClient,
|
|
13
|
+
SerializedAsset,
|
|
14
|
+
from_env,
|
|
15
|
+
)
|
|
11
16
|
from ...assets import EXPORTED_FIELDS, MetabaseAsset
|
|
12
17
|
from ...errors import EncryptionSecretKeyRequired, MetabaseLoginError
|
|
13
18
|
from ..decryption import decrypt
|
|
@@ -18,8 +23,6 @@ logger = logging.getLogger(__name__)
|
|
|
18
23
|
|
|
19
24
|
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
20
25
|
|
|
21
|
-
PG_URL = "postgresql://{user}:{password}@{host}:{port}/{database}"
|
|
22
|
-
SSL_SUFFIX = "?sslmode=require"
|
|
23
26
|
SQL_FILE_PATH = "queries/{name}.sql"
|
|
24
27
|
|
|
25
28
|
ENCRYPTION_SECRET_KEY = "CASTOR_METABASE_ENCRYPTION_SECRET_KEY" # noqa: S105
|
|
@@ -33,56 +36,53 @@ def _optional_arg(args: dict, client_key: str, env_key: str) -> Optional[str]:
|
|
|
33
36
|
return from_env(env_key, allow_missing=True)
|
|
34
37
|
|
|
35
38
|
|
|
36
|
-
class DbClient:
|
|
39
|
+
class DbClient(PostgresClient):
|
|
37
40
|
"""
|
|
38
41
|
Connect to Metabase Database and fetch main assets.
|
|
39
42
|
"""
|
|
40
43
|
|
|
44
|
+
@staticmethod
|
|
45
|
+
def name() -> str:
|
|
46
|
+
"""return the name of the client"""
|
|
47
|
+
return "Metabase/DB"
|
|
48
|
+
|
|
49
|
+
def _engine_options(self, credentials: dict) -> dict:
|
|
50
|
+
sslmode = "require" if self.require_ssl else "prefer"
|
|
51
|
+
return {"connect_args": {"sslmode": sslmode}}
|
|
52
|
+
|
|
41
53
|
def __init__(
|
|
42
54
|
self,
|
|
43
55
|
**kwargs,
|
|
44
56
|
):
|
|
45
|
-
self._credentials = CredentialsDb(
|
|
46
|
-
host=get_value(CredentialsDbKey.HOST, kwargs),
|
|
47
|
-
port=get_value(CredentialsDbKey.PORT, kwargs),
|
|
48
|
-
database=get_value(CredentialsDbKey.DATABASE, kwargs),
|
|
49
|
-
schema=get_value(CredentialsDbKey.SCHEMA, kwargs),
|
|
50
|
-
user=get_value(CredentialsDbKey.USER, kwargs),
|
|
51
|
-
password=get_value(CredentialsDbKey.PASSWORD, kwargs),
|
|
52
|
-
)
|
|
57
|
+
self._credentials = CredentialsDb.from_env(kwargs)
|
|
53
58
|
self.encryption_secret_key = _optional_arg(
|
|
54
59
|
kwargs, "encryption_secret_key", ENCRYPTION_SECRET_KEY
|
|
55
60
|
)
|
|
56
61
|
self.require_ssl = bool(
|
|
57
62
|
_optional_arg(kwargs, "require_ssl", REQUIRE_SSL_KEY)
|
|
58
63
|
)
|
|
59
|
-
self._engine = self._login()
|
|
60
|
-
|
|
61
|
-
def _url(self) -> str:
|
|
62
|
-
url = PG_URL.format(**self._credentials.to_dict(hide=False))
|
|
63
|
-
if self.require_ssl:
|
|
64
|
-
url += SSL_SUFFIX
|
|
65
|
-
return url
|
|
66
|
-
|
|
67
|
-
def _login(self) -> Engine:
|
|
68
|
-
url = self._url()
|
|
69
64
|
try:
|
|
70
|
-
|
|
71
|
-
engine.connect()
|
|
72
|
-
return engine
|
|
65
|
+
super().__init__(self._credentials.to_dict())
|
|
73
66
|
except OperationalError as err:
|
|
74
67
|
raise MetabaseLoginError(
|
|
75
68
|
credentials_info=self._credentials.to_dict(hide=True),
|
|
76
69
|
error_details=err.args,
|
|
77
70
|
)
|
|
78
71
|
|
|
79
|
-
def _load_query(self, name: str) ->
|
|
72
|
+
def _load_query(self, name: str) -> ExtractionQuery:
|
|
80
73
|
"""load SQL text from file"""
|
|
81
74
|
filename = SQL_FILE_PATH.format(name=name)
|
|
82
75
|
path = os.path.join(CURRENT_DIR, filename)
|
|
83
76
|
with open(path, "r") as f:
|
|
84
77
|
content = f.read()
|
|
85
|
-
|
|
78
|
+
statement = content.format(schema=self._credentials.schema)
|
|
79
|
+
return ExtractionQuery(statement=statement, params={})
|
|
80
|
+
|
|
81
|
+
def base_url(self) -> str:
|
|
82
|
+
"""Fetches the `base_url` of the Metabase instance"""
|
|
83
|
+
query = self._load_query(name="base_url")
|
|
84
|
+
rows = list(self.execute(query))
|
|
85
|
+
return rows[0]["value"]
|
|
86
86
|
|
|
87
87
|
def _database_specifics(
|
|
88
88
|
self,
|
|
@@ -106,27 +106,10 @@ class DbClient:
|
|
|
106
106
|
|
|
107
107
|
return databases
|
|
108
108
|
|
|
109
|
-
@staticmethod
|
|
110
|
-
def name() -> str:
|
|
111
|
-
"""return the name of the client"""
|
|
112
|
-
return "Metabase/DB"
|
|
113
|
-
|
|
114
|
-
def base_url(self) -> str:
|
|
115
|
-
"""Fetches the `base_url` of the Metabase instance"""
|
|
116
|
-
query = self._load_query(name="base_url")
|
|
117
|
-
result = self._engine.execute(query)
|
|
118
|
-
return result.fetchone()["value"]
|
|
119
|
-
|
|
120
109
|
def fetch(self, asset: MetabaseAsset) -> SerializedAsset:
|
|
121
110
|
"""fetches the given asset"""
|
|
122
111
|
query = self._load_query(asset.value.lower())
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
# convert row proxies into dictionaries
|
|
126
|
-
assets = [
|
|
127
|
-
{column: value for column, value in rowproxy.items()}
|
|
128
|
-
for rowproxy in result
|
|
129
|
-
]
|
|
112
|
+
assets = list(self.execute(query))
|
|
130
113
|
|
|
131
114
|
if asset == MetabaseAsset.DATABASE:
|
|
132
115
|
assets = self._database_specifics(assets)
|
|
@@ -52,6 +52,18 @@ class CredentialsDb:
|
|
|
52
52
|
self.user = user
|
|
53
53
|
self.password = password
|
|
54
54
|
|
|
55
|
+
@classmethod
|
|
56
|
+
def from_env(cls, env: dict) -> "CredentialsDb":
|
|
57
|
+
"""returns a new CredentialsDb with values from ENV"""
|
|
58
|
+
return CredentialsDb(
|
|
59
|
+
host=get_value(CredentialsDbKey.HOST, env),
|
|
60
|
+
port=get_value(CredentialsDbKey.PORT, env),
|
|
61
|
+
database=get_value(CredentialsDbKey.DATABASE, env),
|
|
62
|
+
schema=get_value(CredentialsDbKey.SCHEMA, env),
|
|
63
|
+
user=get_value(CredentialsDbKey.USER, env),
|
|
64
|
+
password=get_value(CredentialsDbKey.PASSWORD, env),
|
|
65
|
+
)
|
|
66
|
+
|
|
55
67
|
def to_dict(self, hide: bool = False) -> Dict[str, str]:
|
|
56
68
|
safe = (
|
|
57
69
|
CredentialsDbKey.HOST,
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/abstract/extract.py
RENAMED
|
@@ -2,9 +2,15 @@ import logging
|
|
|
2
2
|
from itertools import chain
|
|
3
3
|
from typing import Callable, Iterator, List, Optional, Tuple
|
|
4
4
|
|
|
5
|
-
from ...utils import
|
|
5
|
+
from ...utils import (
|
|
6
|
+
OUTPUT_DIR,
|
|
7
|
+
AbstractSourceClient,
|
|
8
|
+
AbstractStorage,
|
|
9
|
+
SafeMode,
|
|
10
|
+
from_env,
|
|
11
|
+
safe_mode,
|
|
12
|
+
)
|
|
6
13
|
from .asset import WarehouseAsset
|
|
7
|
-
from .client import AbstractWarehouseClient
|
|
8
14
|
from .query import AbstractQueryBuilder, ExtractionQuery
|
|
9
15
|
|
|
10
16
|
logger = logging.getLogger(__name__)
|
|
@@ -22,7 +28,7 @@ class ExtractionProcessor:
|
|
|
22
28
|
|
|
23
29
|
def __init__(
|
|
24
30
|
self,
|
|
25
|
-
client:
|
|
31
|
+
client: AbstractSourceClient,
|
|
26
32
|
query_builder: AbstractQueryBuilder,
|
|
27
33
|
storage: AbstractStorage,
|
|
28
34
|
safe_mode: Optional[SafeMode] = None,
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/bigquery/client.py
RENAMED
|
@@ -7,8 +7,7 @@ from google.cloud.bigquery import Client as GoogleCloudClient # type: ignore
|
|
|
7
7
|
from google.cloud.bigquery.dataset import Dataset # type: ignore
|
|
8
8
|
from google.oauth2.service_account import Credentials # type: ignore
|
|
9
9
|
|
|
10
|
-
from ...utils import retry
|
|
11
|
-
from ..abstract import SqlalchemyClient
|
|
10
|
+
from ...utils import SqlalchemyClient, retry
|
|
12
11
|
|
|
13
12
|
logger = logging.getLogger(__name__)
|
|
14
13
|
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/postgres/extract.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from collections import OrderedDict
|
|
3
3
|
|
|
4
|
-
from ...utils import LocalStorage, from_env, write_summary
|
|
4
|
+
from ...utils import LocalStorage, PostgresClient, from_env, write_summary
|
|
5
5
|
from ..abstract import (
|
|
6
6
|
CATALOG_ASSETS,
|
|
7
7
|
ExtractionProcessor,
|
|
@@ -10,7 +10,6 @@ from ..abstract import (
|
|
|
10
10
|
WarehouseAssetGroup,
|
|
11
11
|
common_args,
|
|
12
12
|
)
|
|
13
|
-
from .client import PostgresClient
|
|
14
13
|
from .query import PostgresQueryBuilder
|
|
15
14
|
|
|
16
15
|
logger = logging.getLogger(__name__)
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/redshift/client.py
RENAMED
|
@@ -4,8 +4,7 @@ from typing import Iterator
|
|
|
4
4
|
from psycopg2 import extensions # type: ignore
|
|
5
5
|
from sqlalchemy.engine import Connection, ResultProxy
|
|
6
6
|
|
|
7
|
-
from ...utils import decode_when_bytes, uri_encode
|
|
8
|
-
from ..abstract import SqlalchemyClient
|
|
7
|
+
from ...utils import SqlalchemyClient, decode_when_bytes, uri_encode
|
|
9
8
|
|
|
10
9
|
REDSHIFT_URI = "redshift+psycopg2://{user}:{password}@{host}:{port}/{database}"
|
|
11
10
|
|
|
@@ -15,7 +15,7 @@ def fake_execute(statement: str, params: dict):
|
|
|
15
15
|
|
|
16
16
|
@patch.object(RedshiftClient, "_build_uri")
|
|
17
17
|
@patch.object(RedshiftClient, "_engine_options")
|
|
18
|
-
@patch(f"{CASTOR_EXTRACTOR_PATH}.
|
|
18
|
+
@patch(f"{CASTOR_EXTRACTOR_PATH}.utils.client.abstract.create_engine")
|
|
19
19
|
@patch.object(RedshiftClient, "close")
|
|
20
20
|
@patch.object(RedshiftClient, "connect")
|
|
21
21
|
def test_redshift_client_execute(
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/snowflake/client.py
RENAMED
|
@@ -7,8 +7,7 @@ from cryptography.hazmat.backends import default_backend
|
|
|
7
7
|
from cryptography.hazmat.primitives import serialization
|
|
8
8
|
from sqlalchemy.engine import Connection
|
|
9
9
|
|
|
10
|
-
from ...utils import to_string_array, uri_encode
|
|
11
|
-
from ..abstract import SqlalchemyClient
|
|
10
|
+
from ...utils import SqlalchemyClient, to_string_array, uri_encode
|
|
12
11
|
|
|
13
12
|
SNOWFLAKE_URI = "snowflake://{user}:{password}@{account}/?application=castor"
|
|
14
13
|
PK_URI = "snowflake://{user}:@{account}/?application=castor"
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/warehouse/sqlserver/client.py
RENAMED
|
@@ -3,8 +3,7 @@ from typing import Iterator
|
|
|
3
3
|
import pymssql # type: ignore
|
|
4
4
|
from sqlalchemy import text
|
|
5
5
|
|
|
6
|
-
from ...utils import uri_encode
|
|
7
|
-
from ..abstract import ExtractionQuery, SqlalchemyClient
|
|
6
|
+
from ...utils import ExtractionQuery, SqlalchemyClient, uri_encode
|
|
8
7
|
|
|
9
8
|
SERVER_URI = "{user}:{password}@{host}:{port}/{database}"
|
|
10
9
|
MSSQL_URI = f"mssql+pymssql://{SERVER_URI}"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_bigquery.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_domo.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_looker.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_metabase_db.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_mode.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_postgres.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_powerbi.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_qlik.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_redshift.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_sigma.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_snowflake.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_sqlserver.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/commands/extract_tableau.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/column_test.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/constants.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/file_checker/file_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/transformation/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/transformation/dbt/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/transformation/dbt/assets.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/uploader/upload_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/formatter_test.csv
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/formatter_test.json
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/formatter_test.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/json_stream_write.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/utils/validation_test.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/assets.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/constants.py
RENAMED
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/domo/extract.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.12.1 → castor_extractor-0.12.2}/castor_extractor/visualization/looker/api/sdk.py
RENAMED
|
File without changes
|
|
File without changes
|