castor-extractor 0.5.0__tar.gz → 0.5.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.5.0 → castor_extractor-0.5.2}/CHANGELOG.md +6 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/PKG-INFO +1 -1
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/__init__.py +1 -1
- castor_extractor-0.5.2/castor_extractor/utils/time.py +38 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/api/client.py +49 -1
- castor_extractor-0.5.2/castor_extractor/visualization/looker/api/client_test.py +65 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/api/constants.py +9 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/assets.py +6 -5
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/extract.py +4 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/client.py +1 -1
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/pyproject.toml +1 -1
- castor_extractor-0.5.0/castor_extractor/utils/time.py +0 -18
- castor_extractor-0.5.0/castor_extractor/visualization/looker/api/client_test.py +0 -30
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/LICENCE +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/README.md +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_bigquery.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_looker.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_metabase_api.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_metabase_db.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_mode.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_postgres.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_powerbi.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_qlik.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_redshift.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_sigma.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_snowflake.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_tableau.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/file_check.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/upload.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/column.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/column_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/constants.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/enums.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/file.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/file_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/file_test_users.csv +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/templates/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/logger.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/transformation/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/transformation/dbt/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/transformation/dbt/assets.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/transformation/dbt/client/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/transformation/dbt/client/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/transformation/dbt/client/credentials.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/types.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/uploader/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/uploader/constant.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/uploader/env.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/uploader/env_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/uploader/upload.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/uploader/upload_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/uploader/utils.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/collection.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/constants.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/deprecate.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/env.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/files.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/files_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/formatter.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/formatter_test.csv +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/formatter_test.json +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/formatter_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/load.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/object.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/object_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/pager.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/pager_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/retry.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/retry_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/safe.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/safe_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/store.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/string.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/string_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/type.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/uri.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/uri_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/validation.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/validation_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/write.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/api/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/api/sdk.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/api/utils.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/constant.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/env.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/fields.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/fields_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/parameters.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/assets.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/api/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/credentials.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/client/shared.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/errors.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/types.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/assets.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/client/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/client/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/client/client_test.json +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/client/client_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/client/constants.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/client/credentials.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/errors.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/assets.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/client/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/client/constants.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/client/credentials.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/client/credentials_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/client/rest.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/client/rest_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/client/utils.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/client/utils_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/powerbi/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/assets.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/constants.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/engine/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/engine/constants.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/engine/error.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/engine/error_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/engine/websocket.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/master.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/rest.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/client/rest_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/constants.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/qlik/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/sigma/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/sigma/assets.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/sigma/client/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/sigma/client/client_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/sigma/client/endpoints.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/sigma/client/pagination.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/sigma/constants.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/sigma/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/assets.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/client/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/client/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/client/client_utils.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/client/credentials.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/client/project.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/client/safe_mode.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/constants.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/errors.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/gql_fields.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_1_get.json +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_2_get.json +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/auth.xml +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/project_get.xml +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/user_get.xml +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/view_get_usage.xml +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/assets/rest_api/workbook_get.xml +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/graphql/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/graphql/paginated_object_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/auth_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/credentials_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/projects_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/usages_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/users_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/rest_api/workbooks_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/utils/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tests/unit/utils/env_key.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/tsc_fields.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/types.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/tableau/usage.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/abstract/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/abstract/asset.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/abstract/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/abstract/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/abstract/query.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/abstract/time_filter.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/query.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/bigquery/types.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/postgres/query.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/client_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/queries/query.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/redshift/query.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/client.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/client_test.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/column.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/database.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/query.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/role.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/schema.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/table.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/snowflake/query.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/synapse/__init__.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/synapse/extract.py +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/synapse/queries/.sqlfluff +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/synapse/queries/database.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/synapse/queries/query.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/synapse/queries/schema.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/synapse/queries/table.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/synapse/queries/user.sql +0 -0
- {castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/warehouse/synapse/queries/view_ddl.sql +0 -0
|
@@ -17,7 +17,7 @@ from .retry import RetryStrategy, retry
|
|
|
17
17
|
from .safe import SafeMode, safe_mode
|
|
18
18
|
from .store import AbstractStorage, LocalStorage
|
|
19
19
|
from .string import string_to_tuple
|
|
20
|
-
from .time import current_date, current_datetime, current_timestamp
|
|
20
|
+
from .time import current_date, current_datetime, current_timestamp, past_date
|
|
21
21
|
from .type import Callback, Getter, JsonType, SerializedAsset
|
|
22
22
|
from .uri import uri_encode
|
|
23
23
|
from .validation import validate_baseurl
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from datetime import date, datetime, timedelta, timezone
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def current_datetime() -> datetime:
|
|
5
|
+
"""Returns the current datetime"""
|
|
6
|
+
return datetime.utcnow()
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def current_date() -> date:
|
|
10
|
+
"""Returns the current datetime"""
|
|
11
|
+
return current_datetime().date()
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def current_timestamp() -> int:
|
|
15
|
+
"""
|
|
16
|
+
Returns the current timestamp from epoch (rounded to the nearest second)
|
|
17
|
+
"""
|
|
18
|
+
return int(datetime.timestamp(current_datetime()))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _set_uct_timezone(ts: datetime) -> datetime:
|
|
22
|
+
if ts.tzinfo is None:
|
|
23
|
+
return ts.replace(tzinfo=timezone.utc)
|
|
24
|
+
return ts
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def now(tz: bool = False) -> datetime:
|
|
28
|
+
"""
|
|
29
|
+
provide current time
|
|
30
|
+
optionally localize timezone
|
|
31
|
+
"""
|
|
32
|
+
ts = datetime.utcnow()
|
|
33
|
+
return _set_uct_timezone(ts) if tz else ts
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def past_date(past_days: int) -> date:
|
|
37
|
+
"""returns a date in the past"""
|
|
38
|
+
return now().date() - timedelta(past_days)
|
|
@@ -1,11 +1,18 @@
|
|
|
1
|
+
import functools
|
|
1
2
|
import logging
|
|
3
|
+
from datetime import date, timedelta
|
|
2
4
|
from typing import Callable, Iterator, List, Optional, Sequence, Tuple
|
|
3
5
|
|
|
4
|
-
from
|
|
6
|
+
from dateutil.utils import today
|
|
7
|
+
from looker_sdk.sdk.api40.models import ContentView
|
|
8
|
+
|
|
9
|
+
from ....utils import Pager, PagerLogger, SafeMode, past_date, safe_mode
|
|
5
10
|
from ..env import page_size
|
|
6
11
|
from ..fields import format_fields
|
|
7
12
|
from .constants import (
|
|
8
13
|
CONNECTION_FIELDS,
|
|
14
|
+
CONTENT_VIEWS_FIELDS,
|
|
15
|
+
CONTENT_VIEWS_HISTORY_DAYS,
|
|
9
16
|
DASHBOARD_FIELDS,
|
|
10
17
|
FOLDER_FIELDS,
|
|
11
18
|
GROUPS_HIERARCHY_FIELDS,
|
|
@@ -38,6 +45,20 @@ logger = logging.getLogger(__name__)
|
|
|
38
45
|
OnApiCall = Callable[[], None]
|
|
39
46
|
|
|
40
47
|
|
|
48
|
+
def _mondays(history_depth_in_days: int) -> Iterator[date]:
|
|
49
|
+
"""
|
|
50
|
+
Fetch all Mondays of the elapsed period
|
|
51
|
+
"""
|
|
52
|
+
_MSG = "History depth must be strictly positive"
|
|
53
|
+
assert history_depth_in_days > 0, _MSG
|
|
54
|
+
current_date = past_date(history_depth_in_days)
|
|
55
|
+
end_date = today().date()
|
|
56
|
+
while current_date < end_date:
|
|
57
|
+
if current_date.weekday() == 0:
|
|
58
|
+
yield current_date
|
|
59
|
+
current_date += timedelta(days=1)
|
|
60
|
+
|
|
61
|
+
|
|
41
62
|
class ApiPagerLogger(PagerLogger):
|
|
42
63
|
def __init__(self, on_api_call: Optional[OnApiCall]):
|
|
43
64
|
self._on_api_call = on_api_call
|
|
@@ -217,3 +238,30 @@ class ApiClient:
|
|
|
217
238
|
)
|
|
218
239
|
logger.info("All looker groups_roles fetched")
|
|
219
240
|
return list(groups_roles)
|
|
241
|
+
|
|
242
|
+
def content_views(self) -> List[ContentView]:
|
|
243
|
+
"""
|
|
244
|
+
List the number of views per {user x week x dashboard|look}
|
|
245
|
+
https://cloud.google.com/looker/docs/reference/looker-api/latest/types/ContentView
|
|
246
|
+
"""
|
|
247
|
+
content_views: List[ContentView] = []
|
|
248
|
+
|
|
249
|
+
for day in _mondays(history_depth_in_days=CONTENT_VIEWS_HISTORY_DAYS):
|
|
250
|
+
formatted_day = day.strftime("%Y-%m-%d")
|
|
251
|
+
logger.info(f"Fetching content views for week {formatted_day}")
|
|
252
|
+
|
|
253
|
+
_fetch = functools.partial(
|
|
254
|
+
self._sdk.search_content_views,
|
|
255
|
+
fields=format_fields(CONTENT_VIEWS_FIELDS),
|
|
256
|
+
start_of_week_date=formatted_day,
|
|
257
|
+
user_id="NOT NULL",
|
|
258
|
+
)
|
|
259
|
+
look_views = list(_fetch(look_id="NOT NULL"))
|
|
260
|
+
dashboard_views = list(_fetch(dashboard_id="NOT NULL"))
|
|
261
|
+
|
|
262
|
+
content_views.extend(look_views + dashboard_views)
|
|
263
|
+
|
|
264
|
+
logger.info(
|
|
265
|
+
f"All looker content views fetched - {len(content_views)} rows"
|
|
266
|
+
)
|
|
267
|
+
return content_views
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
from unittest.mock import patch
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
from castor_extractor.visualization.looker import ( # type: ignore
|
|
6
|
+
ApiClient,
|
|
7
|
+
Credentials,
|
|
8
|
+
)
|
|
9
|
+
from dateutil.utils import today
|
|
10
|
+
from freezegun import freeze_time
|
|
11
|
+
from source.packages.extractor.castor_extractor.visualization.looker.api.client import (
|
|
12
|
+
_mondays,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _credentials():
|
|
17
|
+
return Credentials(
|
|
18
|
+
base_url="base_url",
|
|
19
|
+
client_id="client_id",
|
|
20
|
+
client_secret="secret",
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@patch("castor_extractor.visualization.looker.api.client.init40")
|
|
25
|
+
@patch("castor_extractor.visualization.looker.api.client.has_admin_permissions")
|
|
26
|
+
def test_api_client_has_admin_permissions(
|
|
27
|
+
mock_has_admin_permission, mock_init40
|
|
28
|
+
):
|
|
29
|
+
mock_has_admin_permission.return_value = False
|
|
30
|
+
with pytest.raises(PermissionError):
|
|
31
|
+
ApiClient(_credentials())
|
|
32
|
+
|
|
33
|
+
mock_has_admin_permission.return_value = True
|
|
34
|
+
mock_init40.return_value = "sdk"
|
|
35
|
+
client = ApiClient(_credentials())
|
|
36
|
+
assert client._sdk == "sdk"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@freeze_time("2023-7-4")
|
|
40
|
+
def test__mondays():
|
|
41
|
+
expected_30_days = {
|
|
42
|
+
datetime.date(2023, 7, 3),
|
|
43
|
+
datetime.date(2023, 6, 26),
|
|
44
|
+
datetime.date(2023, 6, 19),
|
|
45
|
+
datetime.date(2023, 6, 12),
|
|
46
|
+
datetime.date(2023, 6, 5),
|
|
47
|
+
}
|
|
48
|
+
assert set(_mondays(history_depth_in_days=30)) == expected_30_days
|
|
49
|
+
|
|
50
|
+
# only mondays
|
|
51
|
+
assert all([day.weekday() == 0 for day in _mondays(30)])
|
|
52
|
+
assert all([day.weekday() == 0 for day in _mondays(100)])
|
|
53
|
+
|
|
54
|
+
# all days must remain in the elapsed history
|
|
55
|
+
history_days = 1_000
|
|
56
|
+
end = today().date()
|
|
57
|
+
start = end - datetime.timedelta(days=history_days)
|
|
58
|
+
output = _mondays(history_depth_in_days=history_days)
|
|
59
|
+
|
|
60
|
+
assert all([day >= start for day in output])
|
|
61
|
+
assert all([day < end for day in output])
|
|
62
|
+
|
|
63
|
+
with pytest.raises(AssertionError):
|
|
64
|
+
list(_mondays(history_depth_in_days=0))
|
|
65
|
+
list(_mondays(history_depth_in_days=-5))
|
|
@@ -208,6 +208,15 @@ GROUPS_ROLES_FIELDS = (
|
|
|
208
208
|
},
|
|
209
209
|
)
|
|
210
210
|
|
|
211
|
+
CONTENT_VIEWS_FIELDS = (
|
|
212
|
+
"dashboard_id",
|
|
213
|
+
"look_id",
|
|
214
|
+
"start_of_week_date",
|
|
215
|
+
"user_id",
|
|
216
|
+
"view_count",
|
|
217
|
+
)
|
|
218
|
+
CONTENT_VIEWS_HISTORY_DAYS = 30
|
|
219
|
+
|
|
211
220
|
|
|
212
221
|
# Model from looker
|
|
213
222
|
LOOKML_PROJECT_NAME_BLOCKLIST = ("looker-data", "system__activity")
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/assets.py
RENAMED
|
@@ -4,13 +4,14 @@ from enum import Enum
|
|
|
4
4
|
class LookerAsset(Enum):
|
|
5
5
|
"""Looker assets"""
|
|
6
6
|
|
|
7
|
+
CONNECTIONS = "connections"
|
|
8
|
+
CONTENT_VIEWS = "content_views"
|
|
7
9
|
DASHBOARDS = "dashboards"
|
|
8
10
|
EXPLORES = "explores"
|
|
9
11
|
FOLDERS = "folders"
|
|
10
|
-
LOOKS = "looks"
|
|
11
|
-
LOOKML_MODELS = "lookml_models"
|
|
12
|
-
USERS = "users"
|
|
13
|
-
CONNECTIONS = "connections"
|
|
14
|
-
PROJECTS = "projects"
|
|
15
12
|
GROUPS_HIERARCHY = "groups_hierarchy"
|
|
16
13
|
GROUPS_ROLES = "groups_roles"
|
|
14
|
+
LOOKML_MODELS = "lookml_models"
|
|
15
|
+
LOOKS = "looks"
|
|
16
|
+
PROJECTS = "projects"
|
|
17
|
+
USERS = "users"
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/extract.py
RENAMED
|
@@ -80,6 +80,10 @@ def iterate_all_data(
|
|
|
80
80
|
groups_roles = client.groups_roles()
|
|
81
81
|
yield LookerAsset.GROUPS_ROLES, deep_serialize(groups_roles)
|
|
82
82
|
|
|
83
|
+
logger.info("Extracting content views from Looker API")
|
|
84
|
+
content_views = client.content_views()
|
|
85
|
+
yield LookerAsset.CONTENT_VIEWS, deep_serialize(content_views)
|
|
86
|
+
|
|
83
87
|
|
|
84
88
|
def extract_all(**kwargs) -> None:
|
|
85
89
|
"""
|
|
@@ -17,7 +17,7 @@ logger = logging.getLogger(__name__)
|
|
|
17
17
|
|
|
18
18
|
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
19
19
|
|
|
20
|
-
PG_URL = "postgresql://{
|
|
20
|
+
PG_URL = "postgresql://{user}:{password}@{host}:{port}/{database}"
|
|
21
21
|
SQL_FILE_PATH = "queries/{name}.sql"
|
|
22
22
|
|
|
23
23
|
ENCRYPTION_SECRET_KEY = "CASTOR_METABASE_ENCRYPTION_SECRET_KEY"
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
from datetime import date, datetime
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def current_datetime() -> datetime:
|
|
5
|
-
"""Returns the current datetime"""
|
|
6
|
-
return datetime.utcnow()
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def current_date() -> date:
|
|
10
|
-
"""Returns the current datetime"""
|
|
11
|
-
return current_datetime().date()
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def current_timestamp() -> int:
|
|
15
|
-
"""
|
|
16
|
-
Returns the current timestamp from epoch (rounded to the nearest second)
|
|
17
|
-
"""
|
|
18
|
-
return int(datetime.timestamp(current_datetime()))
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
from unittest.mock import patch
|
|
2
|
-
|
|
3
|
-
import pytest
|
|
4
|
-
from castor_extractor.visualization.looker import ( # type: ignore
|
|
5
|
-
ApiClient,
|
|
6
|
-
Credentials,
|
|
7
|
-
)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def _credentials():
|
|
11
|
-
return Credentials(
|
|
12
|
-
base_url="base_url",
|
|
13
|
-
client_id="client_id",
|
|
14
|
-
client_secret="secret",
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@patch("castor_extractor.visualization.looker.api.client.init40")
|
|
19
|
-
@patch("castor_extractor.visualization.looker.api.client.has_admin_permissions")
|
|
20
|
-
def test_api_client_has_admin_permissions(
|
|
21
|
-
mock_has_admin_permission, mock_init40
|
|
22
|
-
):
|
|
23
|
-
mock_has_admin_permission.return_value = False
|
|
24
|
-
with pytest.raises(PermissionError):
|
|
25
|
-
ApiClient(_credentials())
|
|
26
|
-
|
|
27
|
-
mock_has_admin_permission.return_value = True
|
|
28
|
-
mock_init40.return_value = "sdk"
|
|
29
|
-
client = ApiClient(_credentials())
|
|
30
|
-
assert client._sdk == "sdk"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_bigquery.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_looker.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_metabase_api.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_metabase_db.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_postgres.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_powerbi.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_redshift.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_sigma.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_snowflake.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/commands/extract_tableau.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/column_test.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/constants.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/file_test.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/file_checker/file_test_users.csv
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/transformation/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/transformation/dbt/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.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
|
|
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.5.0 → castor_extractor-0.5.2}/castor_extractor/utils/formatter_test.json
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/api/sdk.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/api/utils.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/constant.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/env.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/looker/fields.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/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
|
|
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.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/errors.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/extract.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/metabase/types.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.5.0 → castor_extractor-0.5.2}/castor_extractor/visualization/mode/assets.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|