castor-extractor 0.24.2__tar.gz → 0.24.4__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.2 → castor_extractor-0.24.4}/CHANGELOG.md +12 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/PKG-INFO +13 -1
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/thoughtspot/client/client.py +54 -17
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/thoughtspot/client/endpoints.py +2 -2
- castor_extractor-0.24.4/castor_extractor/visualization/thoughtspot/client/pagination.py +25 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/column.sql +3 -1
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/query.sql +19 -11
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/schema.sql +1 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/table.sql +2 -2
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/pyproject.toml +1 -1
- castor_extractor-0.24.2/castor_extractor/visualization/thoughtspot/client/utils.py +0 -31
- castor_extractor-0.24.2/castor_extractor/visualization/thoughtspot/client/utils_test.py +0 -75
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/Dockerfile +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/DockerfileUsage.md +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/LICENCE +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/README.md +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_bigquery.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_confluence.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_databricks.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_domo.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_looker.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_looker_studio.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_metabase_api.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_metabase_db.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_mode.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_mysql.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_notion.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_postgres.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_powerbi.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_qlik.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_redshift.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_salesforce.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_salesforce_reporting.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_sigma.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_snowflake.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_sqlserver.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_tableau.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_thoughtspot.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/file_check.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/upload.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/column.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/column_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/enums.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/file.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/file_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/file_test_users.csv +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/templates/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/confluence/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/confluence/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/confluence/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/confluence/client/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/confluence/client/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/confluence/client/endpoints.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/confluence/client/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/confluence/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/client/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/client/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/client/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/client/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/client/endpoints.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/client/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/logger.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/soda/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/soda/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/soda/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/soda/client/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/soda/client/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/soda/client/endpoints.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/soda/client/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/types.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/uploader/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/uploader/constant.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/uploader/env.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/uploader/env_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/uploader/settings.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/uploader/upload.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/uploader/upload_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/uploader/utils.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/argument_parser.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/argument_parser_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/abstract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/auth.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/auth_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/pagination_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/safe_request.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/safe_request_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/utils.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/api/utils_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/postgres.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/query.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/uri.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/uri_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/collection.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/collection_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/dbt/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/dbt/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/dbt/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/dbt/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/dbt/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/deprecate.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/env.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/files.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/files_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/formatter.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/formatter_test.csv +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/formatter_test.json +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/formatter_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/json_stream_write.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/load.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/object.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/object_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/pager/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/pager/pager.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/pager/pager_on_id.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/pager/pager_on_id_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/pager/pager_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/retry.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/retry_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/safe.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/safe_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/salesforce/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/salesforce/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/salesforce/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/salesforce/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/salesforce/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/salesforce/credentials_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/salesforce/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/store.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/string.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/string_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/time.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/time_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/type.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/validation.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/validation_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/write.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/domo/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/domo/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/domo/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/domo/client/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/domo/client/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/domo/client/endpoints.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/domo/client/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/domo/client/pagination_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/domo/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/api/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/api/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/api/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/api/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/api/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/api/extraction_parameters.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/api/sdk.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/api/utils.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/constant.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/fields.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/fields_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker/multithreading.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/client/admin_sdk_client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/client/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/client/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/client/endpoints.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/client/enums.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/client/looker_studio_api_client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/client/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/client/queries/query.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/client/scopes.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/looker_studio/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/api/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/api/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/client/shared.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/errors.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/metabase/types.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/mode/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/mode/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/mode/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/mode/client/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/mode/client/client_test.json +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/mode/client/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/mode/client/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/mode/client/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/mode/errors.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/mode/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/client/authentication.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/client/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/client/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/client/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/client/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/client/credentials_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/client/endpoints.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/client/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/powerbi/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/engine/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/engine/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/engine/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/engine/error.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/engine/error_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/engine/websocket.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/master.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/rest.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/client/rest_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/qlik/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/salesforce_reporting/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/salesforce_reporting/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/salesforce_reporting/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/salesforce_reporting/client/rest.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/salesforce_reporting/client/soql.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/salesforce_reporting/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/sigma/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/sigma/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/sigma/client/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/sigma/client/endpoints.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/sigma/client/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/sigma/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/client/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/client/client_metadata_api.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/client/client_rest_api.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/client/client_tsc.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/client/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/client/errors.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/client/gql_queries.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/client/rest_fields.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/tableau/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/thoughtspot/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/thoughtspot/assets.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/thoughtspot/client/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/thoughtspot/client/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/visualization/thoughtspot/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/abstract/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/abstract/asset.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/abstract/asset_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/abstract/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/abstract/query.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/abstract/time_filter.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/query.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/bigquery/types.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/api_client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/api_client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/endpoints.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/enums.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/format.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/format_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/lineage.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/lineage_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/sql_client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/types.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/utils.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/databricks/utils_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/queries/column.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/queries/database.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/queries/query.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/queries/schema.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/queries/table.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/queries/user.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/queries/view_ddl.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/mysql/query.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/postgres/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/postgres/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/postgres/query.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/extract_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/query.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/query_serverless.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/redshift/query.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/salesforce/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/salesforce/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/salesforce/constants.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/salesforce/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/salesforce/format.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/salesforce/format_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/salesforce/pagination.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/salesforce/soql.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/client_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/credentials.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/credentials_test.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/database.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/function.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/role.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/snowflake/query.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/sqlserver/__init__.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/sqlserver/client.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/sqlserver/extract.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/sqlserver/queries/.sqlfluff +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/sqlserver/queries/column.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/sqlserver/queries/database.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/sqlserver/queries/schema.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/sqlserver/queries/table.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/sqlserver/queries/user.sql +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/sqlserver/query.py +0 -0
- {castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.24.4 - 2025-03-19
|
|
4
|
+
|
|
5
|
+
* Snowflake:
|
|
6
|
+
* improve the list of ignored queries in the query history extraction
|
|
7
|
+
* ignore the following query types : CALL, COMMENT, EXPLAIN, REFRESH_DYNAMIC_TABLE_AT_REFRESH_VERSION, REVOKE, TRUNCATE_TABLE, UNDROP
|
|
8
|
+
* ignore queries with empty text
|
|
9
|
+
* filter out schemas with empty names
|
|
10
|
+
|
|
11
|
+
## 0.24.3 - 2025-03-18
|
|
12
|
+
|
|
13
|
+
* Replace ThoughtSpot endpoint `/api/rest/2.0/report/liveboard` with `/api/rest/2.0/metadata/liveboard/data` following the deprecation of the CSV option
|
|
14
|
+
|
|
3
15
|
## 0.24.2 - 2025-03-17
|
|
4
16
|
|
|
5
17
|
* Rename Revamped Tableau Connector classes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: castor-extractor
|
|
3
|
-
Version: 0.24.
|
|
3
|
+
Version: 0.24.4
|
|
4
4
|
Summary: Extract your metadata assets.
|
|
5
5
|
Home-page: https://www.castordoc.com/
|
|
6
6
|
License: EULA
|
|
@@ -210,6 +210,18 @@ For any questions or bug report, contact us at [support@castordoc.com](mailto:su
|
|
|
210
210
|
|
|
211
211
|
# Changelog
|
|
212
212
|
|
|
213
|
+
## 0.24.4 - 2025-03-19
|
|
214
|
+
|
|
215
|
+
* Snowflake:
|
|
216
|
+
* improve the list of ignored queries in the query history extraction
|
|
217
|
+
* ignore the following query types : CALL, COMMENT, EXPLAIN, REFRESH_DYNAMIC_TABLE_AT_REFRESH_VERSION, REVOKE, TRUNCATE_TABLE, UNDROP
|
|
218
|
+
* ignore queries with empty text
|
|
219
|
+
* filter out schemas with empty names
|
|
220
|
+
|
|
221
|
+
## 0.24.3 - 2025-03-18
|
|
222
|
+
|
|
223
|
+
* Replace ThoughtSpot endpoint `/api/rest/2.0/report/liveboard` with `/api/rest/2.0/metadata/liveboard/data` following the deprecation of the CSV option
|
|
224
|
+
|
|
213
225
|
## 0.24.2 - 2025-03-17
|
|
214
226
|
|
|
215
227
|
* Rename Revamped Tableau Connector classes
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
+
import logging
|
|
1
2
|
from collections.abc import Iterator
|
|
2
|
-
from
|
|
3
|
+
from functools import partial
|
|
4
|
+
from typing import Iterable, Optional
|
|
3
5
|
|
|
4
6
|
import requests
|
|
7
|
+
from requests import Response
|
|
5
8
|
|
|
6
9
|
from ....utils import (
|
|
7
10
|
APIClient,
|
|
8
11
|
BearerAuth,
|
|
9
12
|
RequestSafeMode,
|
|
10
13
|
build_url,
|
|
14
|
+
fetch_all_pages,
|
|
11
15
|
handle_response,
|
|
12
16
|
)
|
|
13
17
|
from ..assets import (
|
|
@@ -19,9 +23,7 @@ from .credentials import (
|
|
|
19
23
|
from .endpoints import (
|
|
20
24
|
ThoughtspotEndpointFactory,
|
|
21
25
|
)
|
|
22
|
-
from .
|
|
23
|
-
usage_liveboard_reader,
|
|
24
|
-
)
|
|
26
|
+
from .pagination import METADATA_BATCH_SIZE, ThoughtSpotPagination
|
|
25
27
|
|
|
26
28
|
_AUTH_TIMEOUT_S = 60
|
|
27
29
|
_THOUGHTSPOT_HEADERS = {
|
|
@@ -29,7 +31,6 @@ _THOUGHTSPOT_HEADERS = {
|
|
|
29
31
|
"Accept": "application/json",
|
|
30
32
|
"Content-Type": "application/json",
|
|
31
33
|
}
|
|
32
|
-
_METADATA_BATCH_SIZE = 100
|
|
33
34
|
# https://docs.thoughtspot.com/cloud/latest/object-usage-liveboard
|
|
34
35
|
_OBJECT_USAGE_LIVEBOARD = "Object Usage"
|
|
35
36
|
_ANSWER_USAGE_VIZ = "Answer Usage, by User"
|
|
@@ -40,6 +41,9 @@ _LIVEBOARD_USAGE_VIZ = "Popular Liveboards Last 30 Days"
|
|
|
40
41
|
THOUGHTSPOT_SAFE_MODE = RequestSafeMode()
|
|
41
42
|
|
|
42
43
|
|
|
44
|
+
logger = logging.getLogger(__name__)
|
|
45
|
+
|
|
46
|
+
|
|
43
47
|
class ThoughtspotBearerAuth(BearerAuth):
|
|
44
48
|
def __init__(self, host: str, token_payload: dict[str, str]):
|
|
45
49
|
auth_endpoint = ThoughtspotEndpointFactory.authentication()
|
|
@@ -86,7 +90,7 @@ class ThoughtspotClient(APIClient):
|
|
|
86
90
|
search_filters = {
|
|
87
91
|
"metadata": [{"type": metadata_type}],
|
|
88
92
|
"include_details": True,
|
|
89
|
-
"record_size":
|
|
93
|
+
"record_size": METADATA_BATCH_SIZE,
|
|
90
94
|
"record_offset": offset,
|
|
91
95
|
}
|
|
92
96
|
if identifier:
|
|
@@ -100,9 +104,9 @@ class ThoughtspotClient(APIClient):
|
|
|
100
104
|
data=search_filters,
|
|
101
105
|
)
|
|
102
106
|
yield from metadata
|
|
103
|
-
if len(metadata) <
|
|
107
|
+
if len(metadata) < METADATA_BATCH_SIZE:
|
|
104
108
|
break
|
|
105
|
-
offset = offset +
|
|
109
|
+
offset = offset + METADATA_BATCH_SIZE
|
|
106
110
|
|
|
107
111
|
def _get_all_answers(self) -> Iterator[dict]:
|
|
108
112
|
yield from self._metadata_search(metadata_type="ANSWER")
|
|
@@ -120,7 +124,7 @@ class ThoughtspotClient(APIClient):
|
|
|
120
124
|
self,
|
|
121
125
|
liveboard_name: str,
|
|
122
126
|
visualization_name: str,
|
|
123
|
-
) -> Iterator[
|
|
127
|
+
) -> Iterator[list[list]]:
|
|
124
128
|
"""
|
|
125
129
|
Yields the data of a given visualization in the given liveboard.
|
|
126
130
|
ThoughtSpot maintains two system liveboards with stats about data usage,
|
|
@@ -133,29 +137,62 @@ class ThoughtspotClient(APIClient):
|
|
|
133
137
|
)
|
|
134
138
|
liveboard_id = usage_liveboard["metadata_id"]
|
|
135
139
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
140
|
+
def handler(response: Response) -> dict:
|
|
141
|
+
response_dict = response.json()
|
|
142
|
+
contents = response_dict.get("contents", [])
|
|
143
|
+
if not contents:
|
|
144
|
+
logger.warning("No data found in response")
|
|
145
|
+
return dict()
|
|
146
|
+
return contents[0]
|
|
147
|
+
|
|
148
|
+
request = partial(
|
|
149
|
+
self._post,
|
|
150
|
+
endpoint=ThoughtspotEndpointFactory.liveboard_data(),
|
|
139
151
|
data={
|
|
140
152
|
"metadata_identifier": liveboard_id,
|
|
141
|
-
"file_format": "CSV",
|
|
142
153
|
"visualization_identifiers": [visualization_name],
|
|
154
|
+
"record_offset": 0,
|
|
155
|
+
"record_size": METADATA_BATCH_SIZE,
|
|
143
156
|
},
|
|
144
|
-
handler=
|
|
157
|
+
handler=handler,
|
|
145
158
|
)
|
|
146
|
-
yield from
|
|
159
|
+
yield from fetch_all_pages(request, ThoughtSpotPagination)
|
|
147
160
|
|
|
148
161
|
def _get_answer_usages(self) -> Iterator[dict]:
|
|
149
|
-
|
|
162
|
+
"""
|
|
163
|
+
Returns the usage data of saved Answers, which is found in a visualization
|
|
164
|
+
of the "Object Usage" liveboard.
|
|
165
|
+
Each data row returned by the API is transformed from a list into a dictionary.
|
|
166
|
+
The columns are explicitly listed here because in the API response,
|
|
167
|
+
there is a mismatch between the number of column names and the number
|
|
168
|
+
of values per data row.
|
|
169
|
+
"""
|
|
170
|
+
data: Iterable[list[list]] = self._get_usages(
|
|
150
171
|
liveboard_name=_OBJECT_USAGE_LIVEBOARD,
|
|
151
172
|
visualization_name=_ANSWER_USAGE_VIZ,
|
|
152
173
|
)
|
|
174
|
+
columns = (
|
|
175
|
+
"Answer name",
|
|
176
|
+
"Number of unique users",
|
|
177
|
+
"Count of object interactions",
|
|
178
|
+
)
|
|
179
|
+
for row in data:
|
|
180
|
+
yield dict(zip(columns, row))
|
|
153
181
|
|
|
154
182
|
def _get_liveboards_usages(self) -> Iterator[dict]:
|
|
155
|
-
|
|
183
|
+
"""
|
|
184
|
+
Returns the usage data of Liveboards, which is found in a visualization
|
|
185
|
+
of the "User Adoption" liveboard.
|
|
186
|
+
Each data row returned by the API is transformed from a list into a dictionary.
|
|
187
|
+
See `_get_answer_usages` regarding the columns list.
|
|
188
|
+
"""
|
|
189
|
+
data: Iterable[list[list]] = self._get_usages(
|
|
156
190
|
liveboard_name=_USER_ADOPTION_LIVEBOARD,
|
|
157
191
|
visualization_name=_LIVEBOARD_USAGE_VIZ,
|
|
158
192
|
)
|
|
193
|
+
columns = ("Pinboard", "Unique Number of User", "Pinboard Views")
|
|
194
|
+
for row in data:
|
|
195
|
+
yield dict(zip(columns, row))
|
|
159
196
|
|
|
160
197
|
def fetch(self, asset: ThoughtspotAsset) -> Iterator[dict]:
|
|
161
198
|
if asset == ThoughtspotAsset.ANSWERS:
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from pydantic import ConfigDict, Field
|
|
2
|
+
|
|
3
|
+
from ....utils import PaginationModel
|
|
4
|
+
|
|
5
|
+
METADATA_BATCH_SIZE = 100
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ThoughtSpotPagination(PaginationModel):
|
|
9
|
+
data_rows: list = Field(default_factory=list)
|
|
10
|
+
record_offset: int
|
|
11
|
+
record_size: int
|
|
12
|
+
|
|
13
|
+
model_config = ConfigDict(
|
|
14
|
+
populate_by_name=True,
|
|
15
|
+
from_attributes=True,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
def is_last(self) -> bool:
|
|
19
|
+
return len(self.data_rows) < METADATA_BATCH_SIZE
|
|
20
|
+
|
|
21
|
+
def next_page_payload(self) -> dict:
|
|
22
|
+
return {"record_offset": self.record_offset + METADATA_BATCH_SIZE}
|
|
23
|
+
|
|
24
|
+
def page_results(self) -> list:
|
|
25
|
+
return self.data_rows
|
|
@@ -47,7 +47,9 @@ FROM snowflake.account_usage.columns AS c
|
|
|
47
47
|
JOIN snowflake.account_usage.tables AS t ON t.table_id = c.table_id
|
|
48
48
|
JOIN tags_agg_columns ta ON c.column_id = ta.column_id
|
|
49
49
|
WHERE TRUE
|
|
50
|
-
AND COALESCE(c.column_name, '') != ''
|
|
50
|
+
AND TRIM(COALESCE(c.column_name, '')) != ''
|
|
51
|
+
AND TRIM(COALESCE(t.table_name, '')) != ''
|
|
52
|
+
AND TRIM(COALESCE(s.schema_name, '')) != ''
|
|
51
53
|
AND UPPER(c.table_catalog) NOT IN ('SNOWFLAKE', 'UTIL_DB')
|
|
52
54
|
AND (
|
|
53
55
|
c.deleted IS NULL
|
|
@@ -51,20 +51,28 @@ WHERE TRUE
|
|
|
51
51
|
AND HOUR(CONVERT_TIMEZONE('UTC', start_time)) BETWEEN :hour_min AND :hour_max
|
|
52
52
|
AND execution_status = 'SUCCESS'
|
|
53
53
|
AND query_text != 'SELECT 1'
|
|
54
|
+
AND TRIM(COALESCE(query_text, '')) != ''
|
|
54
55
|
AND query_type NOT IN (
|
|
55
|
-
'SHOW',
|
|
56
|
-
'USE',
|
|
57
|
-
'ROLLBACK',
|
|
58
|
-
'DESCRIBE',
|
|
59
56
|
'ALTER_SESSION',
|
|
60
|
-
'
|
|
57
|
+
'BEGIN_TRANSACTION',
|
|
58
|
+
'CALL',
|
|
59
|
+
'COMMENT',
|
|
60
|
+
'COMMIT',
|
|
61
61
|
'CREATE', -- create objects: stage|function|schema|procedure|file|storage|pipe|notification integration
|
|
62
|
-
'
|
|
62
|
+
'DESCRIBE',
|
|
63
|
+
'DROP',
|
|
64
|
+
'EXPLAIN',
|
|
65
|
+
'GET_FILES',
|
|
63
66
|
'GRANT',
|
|
64
|
-
'
|
|
67
|
+
'PUT_FILES',
|
|
68
|
+
'REFRESH_DYNAMIC_TABLE_AT_REFRESH_VERSION',
|
|
69
|
+
'REMOVE_FILES',
|
|
70
|
+
'REVOKE',
|
|
71
|
+
'ROLLBACK',
|
|
72
|
+
'SET',
|
|
73
|
+
'SHOW',
|
|
74
|
+
'TRUNCATE_TABLE',
|
|
75
|
+
'UNDROP',
|
|
65
76
|
'UNLOAD',
|
|
66
|
-
'
|
|
67
|
-
'DROP',
|
|
68
|
-
'BEGIN_TRANSACTION',
|
|
69
|
-
'REMOVE_FILES'
|
|
77
|
+
'USE'
|
|
70
78
|
)
|
|
@@ -16,6 +16,7 @@ WHERE TRUE
|
|
|
16
16
|
deleted IS NULL
|
|
17
17
|
OR deleted > CURRENT_TIMESTAMP - INTERVAL '1 day'
|
|
18
18
|
)
|
|
19
|
+
AND TRIM(COALESCE(schema_name, '')) != ''
|
|
19
20
|
{database_allowed}
|
|
20
21
|
{database_blocked}
|
|
21
22
|
AND CASE {has_fetch_transient} WHEN FALSE THEN NOT s.is_transient::BOOLEAN ELSE TRUE END
|
|
@@ -41,8 +41,8 @@ FROM snowflake.account_usage.tables AS t
|
|
|
41
41
|
JOIN snowflake.account_usage.schemata AS s ON s.schema_id = t.table_schema_id
|
|
42
42
|
JOIN tags_agg_tables ta ON t.table_id = ta.table_id
|
|
43
43
|
WHERE TRUE
|
|
44
|
-
AND t.table_name
|
|
45
|
-
AND
|
|
44
|
+
AND TRIM(COALESCE(t.table_name, '')) != ''
|
|
45
|
+
AND TRIM(COALESCE(s.schema_name, '')) != ''
|
|
46
46
|
AND UPPER(t.table_catalog) NOT IN ('SNOWFLAKE', 'UTIL_DB')
|
|
47
47
|
AND (
|
|
48
48
|
t.deleted IS NULL
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import csv
|
|
2
|
-
import re
|
|
3
|
-
from collections.abc import Iterator
|
|
4
|
-
from io import StringIO
|
|
5
|
-
|
|
6
|
-
_END_OF_GENERATED_TEXT = r'^""$'
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def usage_liveboard_reader(usage_liveboard_csv: str) -> Iterator[dict]:
|
|
10
|
-
"""
|
|
11
|
-
Converts a CSV string into an iterator of dictionaries after
|
|
12
|
-
ignoring the generated text that preceeds the actual CSV header row.
|
|
13
|
-
The generated block ends with a row containing only two double quotes.
|
|
14
|
-
Here is an example:
|
|
15
|
-
|
|
16
|
-
"Data extract produced by Castor on 09/19/2024 06:54"
|
|
17
|
-
"Filters applied on data :"
|
|
18
|
-
"User Action IN [pinboard_embed_view,pinboard_tspublic_no_runtime_filter,pinboard_tspublic_runtime_filter,pinboard_view]"
|
|
19
|
-
"Pinboard NOT IN [mlm - availability pinboard,null]"
|
|
20
|
-
"Timestamp >= 20240820 00:00:00 < 20240919 00:00:00"
|
|
21
|
-
"Timestamp >= 20240919 00:00:00 < 20240920 00:00:00"
|
|
22
|
-
""
|
|
23
|
-
|
|
24
|
-
"""
|
|
25
|
-
csv_file = StringIO(usage_liveboard_csv)
|
|
26
|
-
|
|
27
|
-
line = next(csv_file)
|
|
28
|
-
while not re.match(_END_OF_GENERATED_TEXT, line.strip()):
|
|
29
|
-
line = next(csv_file)
|
|
30
|
-
|
|
31
|
-
yield from csv.DictReader(csv_file)
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
from .utils import (
|
|
2
|
-
usage_liveboard_reader,
|
|
3
|
-
)
|
|
4
|
-
|
|
5
|
-
VALID_CSV_1 = '''"Data extract produced by Castor on 09/19/2024 06:54"
|
|
6
|
-
"Filters applied on data :"
|
|
7
|
-
"User Action IN [pinboard_embed_view,pinboard_tspublic_no_runtime_filter,pinboard_tspublic_runtime_filter,pinboard_view]"
|
|
8
|
-
"Pinboard NOT IN [mlm - availability pinboard,null]"
|
|
9
|
-
"Timestamp >= 20240820 00:00:00 < 20240919 00:00:00"
|
|
10
|
-
"Timestamp >= 20240919 00:00:00 < 20240920 00:00:00"
|
|
11
|
-
""
|
|
12
|
-
"Pinboard","Pinboard Views","Unique Number of User"
|
|
13
|
-
"Market Report","559","19"
|
|
14
|
-
"Retailer report","204","14"
|
|
15
|
-
"Second-hand market","72","6"
|
|
16
|
-
"September test","25","2"'''
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
VALID_CSV_2 = '''"Data extract produced by Castor on 01/07/2025 16:07"
|
|
20
|
-
"Filters applied on data :"
|
|
21
|
-
"Timestamp >= 20241208 00:00:00 < 20250107 00:00:00"
|
|
22
|
-
""
|
|
23
|
-
"Answer name","User name","Number of unique users","Count of object interactions"
|
|
24
|
-
"toto","tata","1","666"'''
|
|
25
|
-
|
|
26
|
-
# Invalid CSV input (missing data rows)
|
|
27
|
-
INVALID_CSV = '''"Data extract produced by Castor on 09/19/2024 06:54"
|
|
28
|
-
"Filters applied on data :"
|
|
29
|
-
"User Action IN [pinboard_embed_view,pinboard_tspublic_no_runtime_filter,pinboard_tspublic_runtime_filter,pinboard_view]"
|
|
30
|
-
"Pinboard NOT IN [mlm - availability pinboard,null]"
|
|
31
|
-
"Timestamp >= 20240820 00:00:00 < 20240919 00:00:00"
|
|
32
|
-
"Timestamp >= 20240919 00:00:00 < 20240920 00:00:00"
|
|
33
|
-
""'''
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def test_usage_liveboard_reader():
|
|
37
|
-
expected_output_1 = [
|
|
38
|
-
{
|
|
39
|
-
"Pinboard": "Market Report",
|
|
40
|
-
"Pinboard Views": "559",
|
|
41
|
-
"Unique Number of User": "19",
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"Pinboard": "Retailer report",
|
|
45
|
-
"Pinboard Views": "204",
|
|
46
|
-
"Unique Number of User": "14",
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"Pinboard": "Second-hand market",
|
|
50
|
-
"Pinboard Views": "72",
|
|
51
|
-
"Unique Number of User": "6",
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"Pinboard": "September test",
|
|
55
|
-
"Pinboard Views": "25",
|
|
56
|
-
"Unique Number of User": "2",
|
|
57
|
-
},
|
|
58
|
-
]
|
|
59
|
-
expected_output_2 = [
|
|
60
|
-
{
|
|
61
|
-
"Answer name": "toto",
|
|
62
|
-
"User name": "tata",
|
|
63
|
-
"Number of unique users": "1",
|
|
64
|
-
"Count of object interactions": "666",
|
|
65
|
-
}
|
|
66
|
-
]
|
|
67
|
-
|
|
68
|
-
result = list(usage_liveboard_reader(VALID_CSV_1))
|
|
69
|
-
assert result == expected_output_1
|
|
70
|
-
|
|
71
|
-
result = list(usage_liveboard_reader(VALID_CSV_2))
|
|
72
|
-
assert result == expected_output_2
|
|
73
|
-
|
|
74
|
-
result = list(usage_liveboard_reader(INVALID_CSV))
|
|
75
|
-
assert result == [] # Expect an empty result since there is no data
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_bigquery.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_confluence.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_databricks.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_domo.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_looker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_metabase_db.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_mode.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_mysql.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_notion.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_postgres.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_powerbi.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_qlik.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_redshift.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_salesforce.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_sigma.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_snowflake.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_sqlserver.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_tableau.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/commands/extract_thoughtspot.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/column_test.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/constants.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/file_checker/file_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/confluence/assets.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/confluence/extract.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/assets.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/knowledge/notion/extract.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/soda/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/soda/client/__init__.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/quality/soda/client/client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/uploader/upload_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/argument_parser.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/argument_parser_test.py
RENAMED
|
File without changes
|
{castor_extractor-0.24.2 → castor_extractor-0.24.4}/castor_extractor/utils/client/__init__.py
RENAMED
|
File without changes
|