castor-extractor 0.24.54__tar.gz → 0.24.57__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.24.54 → castor_extractor-0.24.57}/CHANGELOG.md +15 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/PKG-INFO +17 -2
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/__init__.py +1 -1
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/constants.py +1 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/store.py +3 -2
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/write.py +4 -5
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/assets.py +1 -1
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/client/client.py +18 -101
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/client/endpoints.py +4 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/client/pagination.py +21 -1
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/client/sources_transformer.py +28 -9
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/extract.py +8 -6
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/pyproject.toml +7 -6
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/Dockerfile +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/DockerfileUsage.md +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/LICENCE +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/README.md +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_bigquery.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_confluence.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_databricks.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_domo.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_looker.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_looker_studio.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_metabase_api.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_metabase_db.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_mode.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_mysql.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_notion.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_postgres.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_powerbi.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_qlik.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_redshift.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_salesforce.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_salesforce_reporting.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_sigma.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_snowflake.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_sqlserver.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_strategy.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_tableau.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_thoughtspot.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/file_check.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/upload.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/column.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/column_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/enums.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/file.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/file_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/file_test_users.csv +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/templates/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/client/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/client/endpoints.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/client/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/utils.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/confluence/utils_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/notion/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/notion/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/notion/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/notion/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/notion/client/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/notion/client/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/notion/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/notion/client/endpoints.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/notion/client/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/notion/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/logger.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/quality/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/quality/soda/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/quality/soda/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/quality/soda/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/quality/soda/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/quality/soda/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/quality/soda/client/endpoints.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/quality/soda/client/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/coalesce/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/coalesce/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/coalesce/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/coalesce/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/coalesce/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/coalesce/client/endpoint.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/coalesce/client/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/dbt/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/dbt/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/dbt/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/dbt/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/transformation/dbt/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/types.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/uploader/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/uploader/constant.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/uploader/enums.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/uploader/env.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/uploader/env_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/uploader/settings.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/uploader/upload.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/uploader/upload_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/uploader/utils.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/argument_parser.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/argument_parser_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/batch.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/batch_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/abstract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/auth.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/auth_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/pagination_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/safe_request.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/safe_request_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/utils.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/api/utils_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/postgres.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/query.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/uri.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/client/uri_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/collection.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/collection_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/deprecate.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/env.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/files.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/files_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/formatter.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/formatter_test.csv +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/formatter_test.json +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/formatter_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/json_stream_write.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/load.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/object.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/object_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/pager/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/pager/pager.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/pager/pager_on_id.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/pager/pager_on_id_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/pager/pager_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/retry.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/retry_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/safe.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/safe_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/salesforce/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/salesforce/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/salesforce/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/salesforce/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/salesforce/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/salesforce/credentials_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/salesforce/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/string.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/string_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/time.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/time_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/type.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/url.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/url_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/validation.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/utils/validation_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/domo/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/domo/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/domo/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/domo/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/domo/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/domo/client/endpoints.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/domo/client/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/domo/client/pagination_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/domo/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/api/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/api/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/api/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/api/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/api/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/api/extraction_parameters.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/api/sdk.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/api/utils.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/constant.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/fields.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/fields_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker/multithreading.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/client/admin_sdk_client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/client/endpoints.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/client/enums.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/client/looker_studio_api_client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/client/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/client/queries/query.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/looker_studio/extract_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/api/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/api/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/client/shared.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/errors.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/metabase/types.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/mode/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/mode/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/mode/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/mode/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/mode/client/client_test.json +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/mode/client/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/mode/client/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/mode/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/mode/errors.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/mode/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/client/authentication.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/client/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/client/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/client/credentials_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/client/endpoints.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/client/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/powerbi/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/engine/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/engine/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/engine/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/engine/error.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/engine/error_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/engine/websocket.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/master.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/rest.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/client/rest_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/qlik/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/salesforce_reporting/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/salesforce_reporting/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/salesforce_reporting/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/salesforce_reporting/client/rest.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/salesforce_reporting/client/soql.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/salesforce_reporting/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/client/authentication.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/client/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/client/sources_transformer_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/strategy/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/strategy/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/strategy/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/strategy/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/strategy/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/strategy/client/properties.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/strategy/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/client/client_metadata_api.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/client/client_metadata_api_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/client/client_rest_api.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/client/client_tsc.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/client/errors.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/client/gql_queries.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/client/rest_fields.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/tableau/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/thoughtspot/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/thoughtspot/assets.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/thoughtspot/client/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/thoughtspot/client/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/thoughtspot/client/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/thoughtspot/client/endpoints.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/thoughtspot/client/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/thoughtspot/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/abstract/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/abstract/asset.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/abstract/asset_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/abstract/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/abstract/query.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/abstract/time_filter.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/query.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/bigquery/types.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/api_client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/api_client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/endpoints.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/enums.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/format.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/format_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/queries/column_lineage.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/queries/table_lineage.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/sql_client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/types.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/utils.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/databricks/utils_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/queries/column.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/queries/database.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/queries/query.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/queries/schema.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/queries/table.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/queries/user.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/queries/view_ddl.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/mysql/query.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/postgres/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/postgres/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/postgres/query.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/extract_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/query.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/query_serverless.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/redshift/query.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/salesforce/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/salesforce/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/salesforce/constants.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/salesforce/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/salesforce/format.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/salesforce/format_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/salesforce/pagination.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/salesforce/soql.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/client_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/credentials.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/credentials_test.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/column.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/database.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/function.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/query.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/role.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/schema.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/table.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/snowflake/query.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/__init__.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/client.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/extract.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/queries/column.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/queries/database.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/queries/query.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/queries/schema.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/queries/table.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/queries/user.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/queries/view_ddl.sql +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/sqlserver/query.py +0 -0
- {castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.24.57 - 2025-09-24
|
|
4
|
+
|
|
5
|
+
* Sigma:
|
|
6
|
+
* fix pagination
|
|
7
|
+
* remove redundant element lineages endpoint
|
|
8
|
+
* extract data model sources
|
|
9
|
+
|
|
10
|
+
## 0.24.56 - 2025-09-24
|
|
11
|
+
|
|
12
|
+
* bump dependencies
|
|
13
|
+
|
|
14
|
+
## 0.24.55 - 2025-09-19
|
|
15
|
+
|
|
16
|
+
* Fix encoding in LocalStorage - force to utf-8
|
|
17
|
+
|
|
3
18
|
## 0.24.54 - 2025-09-18
|
|
4
19
|
|
|
5
20
|
* SqlServer: fix typo in the extraction query of schemas
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: castor-extractor
|
|
3
|
-
Version: 0.24.
|
|
3
|
+
Version: 0.24.57
|
|
4
4
|
Summary: Extract your metadata assets.
|
|
5
5
|
Home-page: https://www.castordoc.com/
|
|
6
6
|
License: EULA
|
|
@@ -36,7 +36,7 @@ Requires-Dist: google-api-core (>=2.1.1,<3.0.0)
|
|
|
36
36
|
Requires-Dist: google-api-python-client (>=2.121.0,<3.0.0) ; extra == "lookerstudio" or extra == "all"
|
|
37
37
|
Requires-Dist: google-auth (>=2,<3)
|
|
38
38
|
Requires-Dist: google-cloud-core (>=2.1.0,<3.0.0)
|
|
39
|
-
Requires-Dist: google-cloud-storage (>=
|
|
39
|
+
Requires-Dist: google-cloud-storage (>=3.1.0,<4.0.0)
|
|
40
40
|
Requires-Dist: google-resumable-media (>=2.0.3,<3.0.0)
|
|
41
41
|
Requires-Dist: googleapis-common-protos (>=1.53.0,<2.0.0)
|
|
42
42
|
Requires-Dist: looker-sdk (>=25.0.0,<26.0.0) ; extra == "looker" or extra == "all"
|
|
@@ -215,6 +215,21 @@ For any questions or bug report, contact us at [support@coalesce.io](mailto:supp
|
|
|
215
215
|
|
|
216
216
|
# Changelog
|
|
217
217
|
|
|
218
|
+
## 0.24.57 - 2025-09-24
|
|
219
|
+
|
|
220
|
+
* Sigma:
|
|
221
|
+
* fix pagination
|
|
222
|
+
* remove redundant element lineages endpoint
|
|
223
|
+
* extract data model sources
|
|
224
|
+
|
|
225
|
+
## 0.24.56 - 2025-09-24
|
|
226
|
+
|
|
227
|
+
* bump dependencies
|
|
228
|
+
|
|
229
|
+
## 0.24.55 - 2025-09-19
|
|
230
|
+
|
|
231
|
+
* Fix encoding in LocalStorage - force to utf-8
|
|
232
|
+
|
|
218
233
|
## 0.24.54 - 2025-09-18
|
|
219
234
|
|
|
220
235
|
* SqlServer: fix typo in the extraction query of schemas
|
|
@@ -26,7 +26,7 @@ from .collection import (
|
|
|
26
26
|
group_by,
|
|
27
27
|
mapping_from_rows,
|
|
28
28
|
)
|
|
29
|
-
from .constants import OUTPUT_DIR
|
|
29
|
+
from .constants import ENCODING_UTF8, OUTPUT_DIR
|
|
30
30
|
from .deprecate import deprecate_python
|
|
31
31
|
from .env import from_env
|
|
32
32
|
from .files import explode, search_files
|
|
@@ -4,6 +4,7 @@ from collections.abc import Iterable, Iterator
|
|
|
4
4
|
from io import StringIO
|
|
5
5
|
from typing import Optional
|
|
6
6
|
|
|
7
|
+
from .constants import ENCODING_UTF8
|
|
7
8
|
from .formatter import CsvFormatter, Formatter
|
|
8
9
|
from .time import current_timestamp
|
|
9
10
|
from .write import timestamped_filename
|
|
@@ -58,11 +59,11 @@ class LocalStorage(AbstractStorage):
|
|
|
58
59
|
|
|
59
60
|
def put(self, name: str, data: Iterable[dict]) -> str:
|
|
60
61
|
path = self.path(name)
|
|
61
|
-
with open(path, "w") as file:
|
|
62
|
+
with open(path, "w", encoding=ENCODING_UTF8) as file:
|
|
62
63
|
self._formatter.serialize(file, data)
|
|
63
64
|
return path
|
|
64
65
|
|
|
65
66
|
def get(self, name: str) -> Iterator[dict]:
|
|
66
67
|
path = self.path(name)
|
|
67
|
-
with open(path, "r") as file:
|
|
68
|
+
with open(path, "r", encoding=ENCODING_UTF8) as file:
|
|
68
69
|
return self._formatter.deserialize(StringIO(file.read()))
|
|
@@ -3,11 +3,11 @@ import logging
|
|
|
3
3
|
import os
|
|
4
4
|
import sys
|
|
5
5
|
from datetime import datetime
|
|
6
|
+
from importlib.metadata import version
|
|
6
7
|
from typing import Any
|
|
7
8
|
|
|
8
|
-
import
|
|
9
|
+
from ..utils import ENCODING_UTF8
|
|
9
10
|
|
|
10
|
-
ENCODING = "utf8"
|
|
11
11
|
SUMMARY_FILENAME = "summary.json"
|
|
12
12
|
|
|
13
13
|
logger = logging.getLogger(__name__)
|
|
@@ -33,15 +33,14 @@ def write_json(filename: str, data: Any):
|
|
|
33
33
|
"""
|
|
34
34
|
write the data to a json file at path filename
|
|
35
35
|
"""
|
|
36
|
-
with open(filename, "w", encoding=
|
|
36
|
+
with open(filename, "w", encoding=ENCODING_UTF8) as f:
|
|
37
37
|
json.dump(data, f)
|
|
38
38
|
logger.info(f"Wrote output file: {filename} ({f.tell()} bytes)")
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
def _current_version() -> str:
|
|
42
42
|
"""fetch the current version of castor extractor running"""
|
|
43
|
-
|
|
44
|
-
return str(packages[0].version)
|
|
43
|
+
return version("castor-extractor")
|
|
45
44
|
|
|
46
45
|
|
|
47
46
|
def write_summary(output_directory: str, ts: int, **kwargs):
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/visualization/sigma/assets.py
RENAMED
|
@@ -5,11 +5,11 @@ class SigmaAsset(ExternalAsset):
|
|
|
5
5
|
"""Sigma assets"""
|
|
6
6
|
|
|
7
7
|
DATAMODELS = "datamodels"
|
|
8
|
+
DATAMODEL_SOURCES = "datamodel_sources"
|
|
8
9
|
DATASETS = "datasets"
|
|
9
10
|
DATASET_SOURCES = "dataset_sources"
|
|
10
11
|
ELEMENTS = "elements"
|
|
11
12
|
FILES = "files"
|
|
12
|
-
LINEAGES = "lineages"
|
|
13
13
|
MEMBERS = "members"
|
|
14
14
|
QUERIES = "queries"
|
|
15
15
|
WORKBOOKS = "workbooks"
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from collections.abc import Iterator
|
|
3
|
-
from concurrent.futures import ThreadPoolExecutor
|
|
4
3
|
from functools import partial
|
|
5
4
|
from http import HTTPStatus
|
|
6
5
|
from typing import Callable, Iterable, Optional
|
|
7
6
|
|
|
8
|
-
from pydantic import BaseModel
|
|
9
|
-
|
|
10
7
|
from ....utils import (
|
|
11
8
|
APIClient,
|
|
12
9
|
RequestSafeMode,
|
|
13
10
|
fetch_all_pages,
|
|
14
|
-
retry,
|
|
15
11
|
)
|
|
16
12
|
from ..assets import SigmaAsset
|
|
17
13
|
from .authentication import SigmaBearerAuth
|
|
@@ -55,38 +51,12 @@ SIGMA_SAFE_MODE = RequestSafeMode(
|
|
|
55
51
|
max_errors=_VOLUME_IGNORED,
|
|
56
52
|
status_codes=_IGNORED_ERROR_CODES,
|
|
57
53
|
)
|
|
58
|
-
SIGMA_SAFE_MODE_LINEAGE = RequestSafeMode(
|
|
59
|
-
max_errors=_VOLUME_IGNORED,
|
|
60
|
-
status_codes=(
|
|
61
|
-
*_IGNORED_ERROR_CODES,
|
|
62
|
-
HTTPStatus.FORBIDDEN,
|
|
63
|
-
),
|
|
64
|
-
)
|
|
65
|
-
_THREADS_LINEAGE = 10 # empirically found; hit the rate limit with 20 workers
|
|
66
54
|
_RETRY_NUMBER = 1
|
|
67
55
|
_RETRY_BASE_MS = 60_000
|
|
68
56
|
|
|
69
57
|
|
|
70
|
-
class LineageContext(BaseModel):
|
|
71
|
-
"""all info needed to build the endpoint for lineage retrieval"""
|
|
72
|
-
|
|
73
|
-
workbook_id: str
|
|
74
|
-
element_id: str
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
class Lineage(BaseModel):
|
|
78
|
-
"""holds response from lineage API and context used to retrieve it"""
|
|
79
|
-
|
|
80
|
-
lineage: dict
|
|
81
|
-
context: LineageContext
|
|
82
|
-
|
|
83
|
-
|
|
84
58
|
class SigmaClient(APIClient):
|
|
85
|
-
def __init__(
|
|
86
|
-
self,
|
|
87
|
-
credentials: SigmaCredentials,
|
|
88
|
-
safe_mode: Optional[RequestSafeMode] = None,
|
|
89
|
-
):
|
|
59
|
+
def __init__(self, credentials: SigmaCredentials):
|
|
90
60
|
auth = SigmaBearerAuth(
|
|
91
61
|
host=credentials.host,
|
|
92
62
|
token_payload=credentials.token_payload,
|
|
@@ -96,7 +66,7 @@ class SigmaClient(APIClient):
|
|
|
96
66
|
auth=auth,
|
|
97
67
|
headers=_SIGMA_HEADERS,
|
|
98
68
|
timeout=_SIGMA_TIMEOUT_S,
|
|
99
|
-
safe_mode=
|
|
69
|
+
safe_mode=SIGMA_SAFE_MODE,
|
|
100
70
|
)
|
|
101
71
|
|
|
102
72
|
def _get_paginated(
|
|
@@ -175,68 +145,6 @@ class SigmaClient(APIClient):
|
|
|
175
145
|
page=page, workbook_id=workbook_id
|
|
176
146
|
)
|
|
177
147
|
|
|
178
|
-
@retry(
|
|
179
|
-
(ConnectionError,),
|
|
180
|
-
max_retries=_RETRY_NUMBER,
|
|
181
|
-
base_ms=_RETRY_BASE_MS,
|
|
182
|
-
log_exc_info=True,
|
|
183
|
-
)
|
|
184
|
-
def _get_lineage(self, lineage_context: LineageContext) -> Lineage:
|
|
185
|
-
"""
|
|
186
|
-
return the lineage from API and other ids needed to characterize
|
|
187
|
-
lineage in castor
|
|
188
|
-
"""
|
|
189
|
-
workbook_id = lineage_context.workbook_id
|
|
190
|
-
element_id = lineage_context.element_id
|
|
191
|
-
endpoint = SigmaEndpointFactory.lineage(workbook_id, element_id)
|
|
192
|
-
return Lineage(lineage=self._get(endpoint), context=lineage_context)
|
|
193
|
-
|
|
194
|
-
@staticmethod
|
|
195
|
-
def _lineage_context(elements: list[dict]) -> list[LineageContext]:
|
|
196
|
-
"""
|
|
197
|
-
Helper function to prepare context for lineage retrieval.
|
|
198
|
-
Elements without associated columns are skipped.
|
|
199
|
-
"""
|
|
200
|
-
contexts: list[LineageContext] = []
|
|
201
|
-
for element in elements:
|
|
202
|
-
if element.get("columns") is None:
|
|
203
|
-
continue
|
|
204
|
-
|
|
205
|
-
context = LineageContext(
|
|
206
|
-
workbook_id=element["workbook_id"],
|
|
207
|
-
element_id=element["elementId"],
|
|
208
|
-
)
|
|
209
|
-
contexts.append(context)
|
|
210
|
-
return contexts
|
|
211
|
-
|
|
212
|
-
def _get_all_lineages(self, elements: list[dict]) -> Iterator[dict]:
|
|
213
|
-
"""
|
|
214
|
-
The safe mode is temporarily modified to include 403 errors.
|
|
215
|
-
|
|
216
|
-
Due to concurrency issues, we force a refresh of the token in hopes that
|
|
217
|
-
the lineage extraction takes less than the token expiration time of
|
|
218
|
-
1 hour.
|
|
219
|
-
"""
|
|
220
|
-
safe_mode = self._safe_mode
|
|
221
|
-
self._safe_mode = SIGMA_SAFE_MODE_LINEAGE
|
|
222
|
-
|
|
223
|
-
lineage_context = self._lineage_context(elements)
|
|
224
|
-
|
|
225
|
-
with ThreadPoolExecutor(max_workers=_THREADS_LINEAGE) as executor:
|
|
226
|
-
results = executor.map(self._get_lineage, lineage_context)
|
|
227
|
-
|
|
228
|
-
for lineage in results:
|
|
229
|
-
if not lineage.lineage:
|
|
230
|
-
continue
|
|
231
|
-
|
|
232
|
-
yield {
|
|
233
|
-
**lineage.lineage,
|
|
234
|
-
"workbook_id": lineage.context.workbook_id,
|
|
235
|
-
"element_id": lineage.context.element_id,
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
self._safe_mode = safe_mode
|
|
239
|
-
|
|
240
148
|
@staticmethod
|
|
241
149
|
def _yield_deduplicated_queries(
|
|
242
150
|
queries: Iterable[dict], workbook_id: str
|
|
@@ -266,6 +174,13 @@ class SigmaClient(APIClient):
|
|
|
266
174
|
|
|
267
175
|
yield from self._yield_deduplicated_queries(queries, workbook_id)
|
|
268
176
|
|
|
177
|
+
def _get_all_datamodel_sources(
|
|
178
|
+
self, datamodels: list[dict]
|
|
179
|
+
) -> Iterator[dict]:
|
|
180
|
+
yield from SigmaSourcesTransformer(
|
|
181
|
+
self, table_id_key="tableId"
|
|
182
|
+
).get_datamodel_sources(datamodels)
|
|
183
|
+
|
|
269
184
|
def _get_all_dataset_sources(self, datasets: list[dict]) -> Iterator[dict]:
|
|
270
185
|
yield from SigmaSourcesTransformer(self).get_dataset_sources(datasets)
|
|
271
186
|
|
|
@@ -277,14 +192,22 @@ class SigmaClient(APIClient):
|
|
|
277
192
|
def fetch(
|
|
278
193
|
self,
|
|
279
194
|
asset: SigmaAsset,
|
|
195
|
+
datamodels: Optional[list[dict]] = None,
|
|
280
196
|
datasets: Optional[list[dict]] = None,
|
|
281
|
-
elements: Optional[list[dict]] = None,
|
|
282
197
|
workbooks: Optional[list[dict]] = None,
|
|
283
198
|
) -> Iterator[dict]:
|
|
284
199
|
"""Returns the needed metadata for the queried asset"""
|
|
285
200
|
if asset == SigmaAsset.DATAMODELS:
|
|
286
201
|
yield from self._get_all_datamodels()
|
|
287
202
|
|
|
203
|
+
elif asset == SigmaAsset.DATAMODEL_SOURCES:
|
|
204
|
+
if datamodels is None:
|
|
205
|
+
raise ValueError(
|
|
206
|
+
"Missing data models to extract data model sources"
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
yield from self._get_all_datamodel_sources(datamodels)
|
|
210
|
+
|
|
288
211
|
elif asset == SigmaAsset.DATASETS:
|
|
289
212
|
yield from self._get_all_datasets()
|
|
290
213
|
|
|
@@ -303,12 +226,6 @@ class SigmaClient(APIClient):
|
|
|
303
226
|
elif asset == SigmaAsset.FILES:
|
|
304
227
|
yield from self._get_all_files()
|
|
305
228
|
|
|
306
|
-
elif asset == SigmaAsset.LINEAGES:
|
|
307
|
-
if elements is None:
|
|
308
|
-
raise ValueError("Missing elements to extract lineage")
|
|
309
|
-
|
|
310
|
-
yield from self._get_all_lineages(elements)
|
|
311
|
-
|
|
312
229
|
elif asset == SigmaAsset.MEMBERS:
|
|
313
230
|
yield from self._get_all_members()
|
|
314
231
|
|
|
@@ -19,6 +19,10 @@ class SigmaEndpointFactory:
|
|
|
19
19
|
def datamodels(cls) -> str:
|
|
20
20
|
return f"v2/{cls.DATAMODELS}"
|
|
21
21
|
|
|
22
|
+
@classmethod
|
|
23
|
+
def datamodel_sources(cls, datamodel_id: str) -> str:
|
|
24
|
+
return f"v2/{cls.DATAMODELS}/{datamodel_id}/sources"
|
|
25
|
+
|
|
22
26
|
@classmethod
|
|
23
27
|
def datasets(cls) -> str:
|
|
24
28
|
return f"v2/{cls.DATASETS}"
|
|
@@ -10,7 +10,7 @@ SIGMA_QUERIES_PAGINATION_LIMIT = 50
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class SigmaPagination(PaginationModel):
|
|
13
|
-
next_page: Optional[str] =
|
|
13
|
+
next_page: Optional[str] = None
|
|
14
14
|
entries: list = Field(default_factory=list)
|
|
15
15
|
|
|
16
16
|
model_config = ConfigDict(
|
|
@@ -27,3 +27,23 @@ class SigmaPagination(PaginationModel):
|
|
|
27
27
|
|
|
28
28
|
def page_results(self) -> list:
|
|
29
29
|
return self.entries
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SigmaTokenPagination(PaginationModel):
|
|
33
|
+
next_page_token: Optional[str] = "" # noqa: S105
|
|
34
|
+
entries: list = Field(default_factory=list)
|
|
35
|
+
|
|
36
|
+
model_config = ConfigDict(
|
|
37
|
+
alias_generator=to_camel,
|
|
38
|
+
populate_by_name=True,
|
|
39
|
+
from_attributes=True,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
def is_last(self) -> bool:
|
|
43
|
+
return not self.next_page_token
|
|
44
|
+
|
|
45
|
+
def next_page_payload(self) -> dict:
|
|
46
|
+
return {"pageToken": self.next_page_token}
|
|
47
|
+
|
|
48
|
+
def page_results(self) -> list:
|
|
49
|
+
return self.entries
|
|
@@ -2,8 +2,9 @@ import logging
|
|
|
2
2
|
from http import HTTPStatus
|
|
3
3
|
from typing import TYPE_CHECKING, Callable, Iterator
|
|
4
4
|
|
|
5
|
-
from ....utils import retry_request
|
|
5
|
+
from ....utils import fetch_all_pages, retry_request
|
|
6
6
|
from .endpoints import SigmaEndpointFactory
|
|
7
|
+
from .pagination import SigmaTokenPagination
|
|
7
8
|
|
|
8
9
|
if TYPE_CHECKING:
|
|
9
10
|
from .client import SigmaClient
|
|
@@ -17,8 +18,11 @@ SIGMA_CONNECTION_PATH_SLEEP_MS = 30_000 # 30 seconds
|
|
|
17
18
|
class SigmaSourcesTransformer:
|
|
18
19
|
"""Retrieves asset sources and enhances them with additional information."""
|
|
19
20
|
|
|
20
|
-
def __init__(
|
|
21
|
+
def __init__(
|
|
22
|
+
self, api_client: "SigmaClient", table_id_key: str = "inodeId"
|
|
23
|
+
):
|
|
21
24
|
self.api_client = api_client
|
|
25
|
+
self.table_id_key = table_id_key
|
|
22
26
|
|
|
23
27
|
@retry_request(
|
|
24
28
|
status_codes=(HTTPStatus.TOO_MANY_REQUESTS,),
|
|
@@ -38,9 +42,9 @@ class SigmaSourcesTransformer:
|
|
|
38
42
|
logger.info("Mapping table ids to connection and path information")
|
|
39
43
|
|
|
40
44
|
unique_table_ids = {
|
|
41
|
-
source[
|
|
45
|
+
source[self.table_id_key]
|
|
42
46
|
for asset_sources in all_sources
|
|
43
|
-
for source in asset_sources
|
|
47
|
+
for source in asset_sources.get("sources", [])
|
|
44
48
|
if source["type"] == "table"
|
|
45
49
|
}
|
|
46
50
|
|
|
@@ -49,15 +53,14 @@ class SigmaSourcesTransformer:
|
|
|
49
53
|
for table_id in unique_table_ids
|
|
50
54
|
}
|
|
51
55
|
|
|
52
|
-
|
|
53
|
-
def _enhance_table_source(source: dict, table_to_path: dict) -> dict:
|
|
56
|
+
def _enhance_table_source(self, source: dict, table_to_path: dict) -> dict:
|
|
54
57
|
"""
|
|
55
58
|
Combines a single table source with its connection and path information.
|
|
56
59
|
"""
|
|
57
60
|
if source["type"] != "table":
|
|
58
61
|
return source
|
|
59
62
|
|
|
60
|
-
path_info = table_to_path.get(source[
|
|
63
|
+
path_info = table_to_path.get(source[self.table_id_key], {})
|
|
61
64
|
source["connectionId"] = path_info.get("connectionId")
|
|
62
65
|
source["path"] = path_info.get("path")
|
|
63
66
|
return source
|
|
@@ -82,19 +85,35 @@ class SigmaSourcesTransformer:
|
|
|
82
85
|
}
|
|
83
86
|
|
|
84
87
|
def _get_all_sources(
|
|
85
|
-
self,
|
|
88
|
+
self,
|
|
89
|
+
endpoint: Callable[[str], str],
|
|
90
|
+
asset_ids: set[str],
|
|
91
|
+
with_pagination: bool = False,
|
|
86
92
|
) -> Iterator[dict]:
|
|
87
93
|
"""Returns transformed sources for the given assets"""
|
|
88
94
|
all_sources = []
|
|
89
95
|
|
|
90
96
|
for asset_id in asset_ids:
|
|
91
|
-
|
|
97
|
+
endpoint_url = endpoint(asset_id)
|
|
98
|
+
if with_pagination:
|
|
99
|
+
request = self.api_client._get_paginated(endpoint=endpoint_url)
|
|
100
|
+
sources = list(fetch_all_pages(request, SigmaTokenPagination))
|
|
101
|
+
else:
|
|
102
|
+
sources = self.api_client._get(endpoint=endpoint_url)
|
|
92
103
|
all_sources.append({"asset_id": asset_id, "sources": sources})
|
|
93
104
|
|
|
94
105
|
table_to_path = self._map_table_id_to_connection_path(all_sources)
|
|
95
106
|
|
|
96
107
|
yield from self._transform_sources(all_sources, table_to_path)
|
|
97
108
|
|
|
109
|
+
def get_datamodel_sources(self, datamodels: list[dict]) -> Iterator[dict]:
|
|
110
|
+
asset_ids = {datamodel["dataModelId"] for datamodel in datamodels}
|
|
111
|
+
yield from self._get_all_sources(
|
|
112
|
+
endpoint=SigmaEndpointFactory.datamodel_sources,
|
|
113
|
+
asset_ids=asset_ids,
|
|
114
|
+
with_pagination=True,
|
|
115
|
+
)
|
|
116
|
+
|
|
98
117
|
def get_dataset_sources(self, datasets: list[dict]) -> Iterator[dict]:
|
|
99
118
|
asset_ids = {dataset["datasetId"] for dataset in datasets}
|
|
100
119
|
yield from self._get_all_sources(
|
|
@@ -23,8 +23,14 @@ def iterate_all_data(
|
|
|
23
23
|
"""Iterate over the extracted data from Sigma"""
|
|
24
24
|
|
|
25
25
|
logger.info("Extracting DATA MODELS from API")
|
|
26
|
-
datamodels = client.fetch(SigmaAsset.DATAMODELS)
|
|
27
|
-
yield SigmaAsset.DATASETS,
|
|
26
|
+
datamodels = list(client.fetch(SigmaAsset.DATAMODELS))
|
|
27
|
+
yield SigmaAsset.DATASETS, deep_serialize(datamodels)
|
|
28
|
+
|
|
29
|
+
logger.info("Extracting DATAMODEL SOURCES from API")
|
|
30
|
+
datamodel_sources = client.fetch(
|
|
31
|
+
SigmaAsset.DATAMODEL_SOURCES, datamodels=datamodels
|
|
32
|
+
)
|
|
33
|
+
yield SigmaAsset.DATAMODEL_SOURCES, list(deep_serialize(datamodel_sources))
|
|
28
34
|
|
|
29
35
|
logger.info("Extracting DATASETS from API")
|
|
30
36
|
datasets = list(client.fetch(SigmaAsset.DATASETS))
|
|
@@ -62,10 +68,6 @@ def iterate_all_data(
|
|
|
62
68
|
elements = list(client.fetch(SigmaAsset.ELEMENTS, workbooks=workbooks))
|
|
63
69
|
yield SigmaAsset.ELEMENTS, list(deep_serialize(elements))
|
|
64
70
|
|
|
65
|
-
logging.info("Extracting LINEAGES data from API")
|
|
66
|
-
lineages = client.fetch(SigmaAsset.LINEAGES, elements=elements)
|
|
67
|
-
yield SigmaAsset.LINEAGES, list(deep_serialize(lineages))
|
|
68
|
-
|
|
69
71
|
|
|
70
72
|
def extract_all(**kwargs) -> None:
|
|
71
73
|
"""
|
|
@@ -3,7 +3,7 @@ requires = ["setuptools>=61.2"]
|
|
|
3
3
|
|
|
4
4
|
[tool.poetry]
|
|
5
5
|
name = "castor-extractor"
|
|
6
|
-
version = "0.24.
|
|
6
|
+
version = "0.24.57"
|
|
7
7
|
description = "Extract your metadata assets."
|
|
8
8
|
authors = ["Castor <support@castordoc.com>"]
|
|
9
9
|
license = "EULA"
|
|
@@ -32,7 +32,7 @@ google-api-core = ">=2.1.1, <3.0.0"
|
|
|
32
32
|
google-api-python-client = {version = "^2.121.0", optional = true}
|
|
33
33
|
google-auth = "^2"
|
|
34
34
|
google-cloud-core = ">=2.1.0, <3.0.0"
|
|
35
|
-
google-cloud-storage = "^
|
|
35
|
+
google-cloud-storage = "^3.1.0"
|
|
36
36
|
google-resumable-media = "^2.0.3"
|
|
37
37
|
googleapis-common-protos = "^1.53.0"
|
|
38
38
|
looker-sdk = { version = "^25.0.0", optional = true }
|
|
@@ -197,15 +197,16 @@ pytest-freezegun = "freezegun"
|
|
|
197
197
|
DEP004 = ["pytest", "requests_mock", "freezegun"]
|
|
198
198
|
# SQL Alchemy needs some dependencies to be installed
|
|
199
199
|
DEP002 = [
|
|
200
|
+
"numpy", # See comment on numpy in dependencies
|
|
201
|
+
"pandas", # See comment on pandas in dependencies
|
|
200
202
|
"psycopg2-binary",
|
|
203
|
+
"pymssql",
|
|
204
|
+
"pymysql",
|
|
205
|
+
"setuptools",
|
|
201
206
|
"snowflake-connector-python",
|
|
202
207
|
"snowflake-sqlalchemy",
|
|
203
208
|
"sqlalchemy-bigquery",
|
|
204
209
|
"sqlalchemy-redshift",
|
|
205
|
-
"pymysql",
|
|
206
|
-
"pymssql",
|
|
207
|
-
"numpy", # See comment on numpy in dependencies
|
|
208
|
-
"pandas", # See comment on pandas in dependencies
|
|
209
210
|
]
|
|
210
211
|
|
|
211
212
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_bigquery.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_domo.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_looker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_mode.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_mysql.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_notion.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_postgres.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_powerbi.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_qlik.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_redshift.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_sigma.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_snowflake.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_sqlserver.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_strategy.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/extract_tableau.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/commands/file_check.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/column.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/column_test.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/constants.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/enums.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/file_checker/file_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.54 → castor_extractor-0.24.57}/castor_extractor/knowledge/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|