castor-extractor 0.25.14__tar.gz → 0.26.9__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.
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/CHANGELOG.md +101 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/PKG-INFO +106 -8
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/README.md +2 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_databricks.py +4 -0
- castor_extractor-0.26.9/castor_extractor/commands/extract_looker_studio.py +67 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_powerbi.py +7 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_qlik.py +6 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_snowflake.py +6 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_sqlserver.py +6 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_tableau.py +9 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/column.py +4 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/client/client.py +5 -6
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/client/pagination.py +2 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/extract.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/client/client.py +13 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/client/pagination.py +1 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/extract.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/quality/soda/client/client.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/coalesce/client/client.py +62 -23
- castor_extractor-0.26.9/castor_extractor/transformation/coalesce/client/client_test.py +175 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/coalesce/client/endpoint.py +2 -5
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/coalesce/client/pagination.py +1 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/dbt/client.py +8 -8
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/dbt/client_test.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/uploader/env.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/uploader/settings.py +3 -5
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/uploader/upload.py +6 -7
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/__init__.py +2 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/batch.py +8 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/__init__.py +1 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/abstract.py +4 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/auth.py +5 -5
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/auth_test.py +1 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/client.py +17 -16
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/pagination.py +4 -5
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/pagination_test.py +2 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/safe_request.py +5 -4
- castor_extractor-0.26.9/castor_extractor/utils/client/api/smart_pagination.py +60 -0
- castor_extractor-0.26.9/castor_extractor/utils/client/api/smart_pagination_test.py +61 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/utils.py +1 -4
- castor_extractor-0.26.9/castor_extractor/utils/client/query.py +69 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/collection.py +43 -17
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/collection_test.py +17 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/env.py +3 -5
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/files.py +3 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/formatter_test.py +1 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/load.py +1 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/object.py +3 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/pager/pager.py +2 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/pager/pager_on_id.py +3 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/pager/pager_on_id_test.py +1 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/pager/pager_test.py +1 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/retry.py +5 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/retry_test.py +6 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/safe.py +4 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/salesforce/client.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/salesforce/pagination.py +2 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/store.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/string.py +2 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/time.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/type.py +2 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/validation.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/client/client.py +2 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/extract.py +2 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/domo/client/client.py +9 -9
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/domo/client/credentials.py +1 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/domo/client/endpoints.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/domo/client/pagination.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/domo/extract.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/api/client.py +11 -12
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/api/constants.py +1 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/api/sdk.py +1 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/extract.py +3 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/client/admin_sdk_client.py +3 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/client/client.py +53 -12
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/client/credentials.py +2 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/client/looker_studio_api_client.py +2 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/client/pagination.py +1 -3
- castor_extractor-0.26.9/castor_extractor/visualization/looker_studio/constants.py +2 -0
- castor_extractor-0.26.9/castor_extractor/visualization/looker_studio/extract.py +69 -0
- castor_extractor-0.26.9/castor_extractor/visualization/looker_studio/parameters.py +152 -0
- castor_extractor-0.26.9/castor_extractor/visualization/looker_studio/parameters_test.py +85 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/api/client.py +2 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/client.py +1 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/credentials.py +2 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/shared.py +1 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/mode/client/client.py +10 -10
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/mode/errors.py +2 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/powerbi/__init__.py +4 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/powerbi/client/__init__.py +3 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/powerbi/client/authentication.py +28 -7
- castor_extractor-0.26.9/castor_extractor/visualization/powerbi/client/client.py +64 -0
- castor_extractor-0.26.9/castor_extractor/visualization/powerbi/client/client_test.py +29 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/powerbi/client/constants.py +1 -0
- castor_extractor-0.26.9/castor_extractor/visualization/powerbi/client/credentials.py +83 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/powerbi/client/credentials_test.py +3 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/powerbi/client/endpoints.py +13 -4
- castor_extractor-0.26.9/castor_extractor/visualization/powerbi/client/graph_api_client.py +72 -0
- castor_extractor-0.26.9/castor_extractor/visualization/powerbi/client/graph_api_client_test.py +38 -0
- castor_extractor-0.26.9/castor_extractor/visualization/powerbi/client/pagination.py +69 -0
- castor_extractor-0.25.14/castor_extractor/visualization/powerbi/client/client.py → castor_extractor-0.26.9/castor_extractor/visualization/powerbi/client/powerbi_api_client.py +51 -53
- castor_extractor-0.25.14/castor_extractor/visualization/powerbi/client/client_test.py → castor_extractor-0.26.9/castor_extractor/visualization/powerbi/client/powerbi_api_client_test.py +22 -30
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/powerbi/extract.py +47 -13
- castor_extractor-0.26.9/castor_extractor/visualization/powerbi/users.py +82 -0
- castor_extractor-0.26.9/castor_extractor/visualization/powerbi/users_test.py +47 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/assets.py +1 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/constants.py +1 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/engine/client.py +87 -7
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/engine/constants.py +3 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/engine/error.py +16 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/engine/error_test.py +11 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/engine/json_rpc.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/engine/websocket.py +4 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/master.py +31 -7
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/rest.py +5 -5
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/rest_test.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/extract.py +10 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/salesforce_reporting/client/rest.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/salesforce_reporting/extract.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/client/authentication.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/client/client.py +32 -19
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/client/pagination.py +2 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/client/sources_transformer.py +20 -6
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/extract.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/strategy/client/client.py +41 -14
- castor_extractor-0.26.9/castor_extractor/visualization/strategy/client/client_test.py +168 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/strategy/client/credentials.py +3 -3
- castor_extractor-0.26.9/castor_extractor/visualization/strategy/client/credentials_test.py +35 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/strategy/client/properties.py +2 -2
- castor_extractor-0.26.9/castor_extractor/visualization/strategy/client/properties_test.py +16 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/strategy/extract.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/client/client.py +85 -5
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/client/client_metadata_api.py +149 -51
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/client/client_metadata_api_test.py +53 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/client/client_rest_api.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/client/credentials.py +5 -7
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/client/gql_queries.py +19 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/extract.py +0 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/thoughtspot/client/client.py +3 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/thoughtspot/extract.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/abstract/__init__.py +4 -8
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/abstract/asset.py +17 -12
- castor_extractor-0.26.9/castor_extractor/warehouse/abstract/asset_test.py +38 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/abstract/extract.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/abstract/query.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/abstract/time_filter.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/client.py +3 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/extract.py +8 -9
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/query.py +49 -6
- castor_extractor-0.26.9/castor_extractor/warehouse/bigquery/query_test.py +40 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/api_client.py +5 -5
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/client.py +3 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/extract.py +2 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/format.py +3 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/pagination.py +1 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/utils.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/extract.py +7 -8
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/query.py +2 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/postgres/extract.py +7 -8
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/postgres/query.py +2 -4
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/__init__.py +1 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/extract.py +9 -10
- castor_extractor-0.26.9/castor_extractor/warehouse/redshift/processor.py +188 -0
- castor_extractor-0.26.9/castor_extractor/warehouse/redshift/processor_test.py +144 -0
- castor_extractor-0.26.9/castor_extractor/warehouse/redshift/queries/sql/long/common_cte.sql +47 -0
- castor_extractor-0.26.9/castor_extractor/warehouse/redshift/queries/sql/long/query_metadata.sql +85 -0
- castor_extractor-0.26.9/castor_extractor/warehouse/redshift/queries/sql/long/query_parts.sql +45 -0
- castor_extractor-0.26.9/castor_extractor/warehouse/redshift/query.py +54 -0
- castor_extractor-0.26.9/castor_extractor/warehouse/redshift/types.py +54 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/salesforce/client.py +1 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/salesforce/extract.py +2 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/salesforce/pagination.py +1 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/__init__.py +1 -1
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/client.py +4 -5
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/credentials.py +3 -6
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/extract.py +9 -9
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/queries/column.sql +3 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/queries/column_lineage.sql +7 -2
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/queries/database.sql +3 -3
- castor_extractor-0.26.9/castor_extractor/warehouse/snowflake/queries/query.sql +104 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/queries/schema.sql +3 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/queries/table.sql +3 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/queries/view_ddl.sql +3 -3
- castor_extractor-0.26.9/castor_extractor/warehouse/snowflake/query_builder.py +130 -0
- castor_extractor-0.26.9/castor_extractor/warehouse/snowflake/query_builder_test.py +93 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/client.py +42 -17
- castor_extractor-0.26.9/castor_extractor/warehouse/sqlserver/client_test.py +79 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/extract.py +15 -16
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/query.py +2 -3
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/pyproject.toml +2 -3
- castor_extractor-0.25.14/castor_extractor/commands/extract_looker_studio.py +0 -44
- castor_extractor-0.25.14/castor_extractor/utils/client/query.py +0 -20
- castor_extractor-0.25.14/castor_extractor/visualization/looker_studio/extract.py +0 -127
- castor_extractor-0.25.14/castor_extractor/visualization/looker_studio/extract_test.py +0 -19
- castor_extractor-0.25.14/castor_extractor/visualization/powerbi/client/credentials.py +0 -57
- castor_extractor-0.25.14/castor_extractor/visualization/powerbi/client/pagination.py +0 -32
- castor_extractor-0.25.14/castor_extractor/warehouse/abstract/asset_test.py +0 -29
- castor_extractor-0.25.14/castor_extractor/warehouse/redshift/query.py +0 -35
- castor_extractor-0.25.14/castor_extractor/warehouse/snowflake/queries/query.sql +0 -78
- castor_extractor-0.25.14/castor_extractor/warehouse/snowflake/query.py +0 -61
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/Dockerfile +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/DockerfileUsage.md +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/LICENCE +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_bigquery.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_confluence.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_count.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_domo.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_looker.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_metabase_api.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_metabase_db.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_mode.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_mysql.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_notion.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_postgres.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_redshift.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_salesforce.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_salesforce_reporting.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_sigma.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_strategy.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_thoughtspot.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/file_check.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/upload.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/exceptions.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/column_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/constants.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/enums.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/file.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/file_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/file_test_users.csv +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/file_test_users_valid.csv +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/templates/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/templates/generic_warehouse.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/client/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/client/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/client/endpoints.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/utils.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/confluence/utils_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/client/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/client/constants.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/client/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/client/endpoints.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/logger.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/quality/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/quality/soda/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/quality/soda/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/quality/soda/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/quality/soda/client/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/quality/soda/client/endpoints.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/quality/soda/client/pagination.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/coalesce/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/coalesce/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/coalesce/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/coalesce/client/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/dbt/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/dbt/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/transformation/dbt/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/types.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/uploader/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/uploader/constant.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/uploader/enums.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/uploader/env_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/uploader/upload_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/uploader/utils.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/argument_parser.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/argument_parser_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/batch_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/safe_request_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/api/utils_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/postgres.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/uri.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/client/uri_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/constants.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/deprecate.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/files_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/formatter.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/formatter_test.csv +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/formatter_test.json +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/json_stream_write.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/object_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/pager/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/safe_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/salesforce/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/salesforce/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/salesforce/constants.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/salesforce/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/salesforce/credentials_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/string_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/time_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/url.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/url_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/validation_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/utils/write.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/client/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/client/queries/canvas_loads.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/client/queries/canvas_permissions.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/client/queries/canvases.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/client/queries/cells.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/client/queries/projects.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/client/queries/queries.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/count/client/queries/users.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/domo/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/domo/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/domo/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/domo/client/pagination_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/api/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/api/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/api/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/api/extraction_parameters.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/api/sdk_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/api/utils.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/constant.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/constants.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/fields.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/fields_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker/multithreading.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/client/endpoints.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/client/enums.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/looker_studio/client/queries/query.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/api/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/api/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/api/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/queries/.sqlfluff +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/queries/base_url.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/queries/card.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/queries/collection.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/queries/dashboard.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/queries/dashboard_cards.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/queries/database.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/queries/table.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/db/queries/user.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/decryption.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/client/decryption_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/errors.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/extract.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/metabase/types.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/mode/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/mode/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/mode/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/mode/client/client_test.json +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/mode/client/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/mode/client/constants.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/mode/client/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/mode/extract.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/powerbi/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/engine/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/engine/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/qlik/client/engine/json_rpc_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/salesforce_reporting/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/salesforce_reporting/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/salesforce_reporting/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/salesforce_reporting/client/soql.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/client/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/client/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/client/endpoints.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/sigma/client/sources_transformer_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/strategy/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/strategy/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/strategy/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/client/client_tsc.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/client/errors.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/client/rest_fields.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/tableau/constants.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/thoughtspot/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/thoughtspot/assets.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/thoughtspot/client/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/thoughtspot/client/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/thoughtspot/client/endpoints.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/visualization/thoughtspot/client/pagination.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/abstract/time_filter_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/queries/.sqlfluff +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/queries/column.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/queries/cte/sharded.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/queries/database.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/queries/query.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/queries/schema.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/queries/table.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/queries/table_with_tags.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/queries/user.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/queries/view_ddl.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/bigquery/types.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/api_client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/credentials.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/endpoints.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/enums.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/format_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/queries/column_lineage.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/queries/table_lineage.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/sql_client.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/types.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/databricks/utils_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/client.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/queries/.sqlfluff +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/queries/column.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/queries/database.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/queries/query.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/queries/schema.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/queries/table.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/queries/user.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/mysql/queries/view_ddl.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/postgres/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/postgres/queries/.sqlfluff +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/postgres/queries/column.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/postgres/queries/database.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/postgres/queries/group.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/postgres/queries/schema.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/postgres/queries/table.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/postgres/queries/user.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/client.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/extract_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/queries/.sqlfluff +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/queries/column.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/queries/database.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/queries/group.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/queries/schema.sql +0 -0
- {castor_extractor-0.25.14/castor_extractor/warehouse/redshift/queries → castor_extractor-0.26.9/castor_extractor/warehouse/redshift/queries/sql/short}/query.sql +0 -0
- /castor_extractor-0.25.14/castor_extractor/warehouse/redshift/queries/query_serverless.sql → /castor_extractor-0.26.9/castor_extractor/warehouse/redshift/queries/sql_serverless/query.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/queries/table.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/queries/table_freshness.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/queries/user.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/redshift/queries/view_ddl.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/salesforce/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/salesforce/constants.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/salesforce/format.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/salesforce/format_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/salesforce/soql.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/client_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/credentials_test.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/queries/.sqlfluff +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/queries/function.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/snowflake/queries/user.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/__init__.py +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/queries/.sqlfluff +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/queries/column.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/queries/database.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/queries/query.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/queries/schema.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/queries/table.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/queries/user.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/sqlserver/queries/view_ddl.sql +0 -0
- {castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/warehouse/synapse/queries/column.sql +0 -0
|
@@ -1,5 +1,106 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.26.9 - 2026-01-21
|
|
4
|
+
|
|
5
|
+
* SqlServer: support default database
|
|
6
|
+
|
|
7
|
+
## 0.26.8 - 2026-01-14
|
|
8
|
+
|
|
9
|
+
* Qlik: ignore OBJECT_NOT_FOUND errors
|
|
10
|
+
|
|
11
|
+
## 0.26.7 - 2026-01-13
|
|
12
|
+
|
|
13
|
+
* Coalesce: introduce dynamic pagination
|
|
14
|
+
|
|
15
|
+
## 0.26.6 - 2025-12-30
|
|
16
|
+
|
|
17
|
+
* Snowflake: add setting `apply_db_filter_to_queries` (for future use)
|
|
18
|
+
|
|
19
|
+
## 0.26.5 - 2025-12-23
|
|
20
|
+
|
|
21
|
+
* Looker: extract dashboard's slug
|
|
22
|
+
|
|
23
|
+
## 0.26.4 - 2025-12-18
|
|
24
|
+
|
|
25
|
+
* Snowflake: extend query_blocked to column-lineage extraction
|
|
26
|
+
|
|
27
|
+
## 0.26.3 - 2025-12-17
|
|
28
|
+
|
|
29
|
+
* Tableau: catch error relationship-service-war
|
|
30
|
+
|
|
31
|
+
## 0.26.2 - 2025-12-16
|
|
32
|
+
|
|
33
|
+
* Notion: deduplicate Users
|
|
34
|
+
|
|
35
|
+
## 0.26.1 - 2025-12-15
|
|
36
|
+
|
|
37
|
+
* Power BI: pages extraction conditioned on workspace access
|
|
38
|
+
|
|
39
|
+
## 0.26.0 - 2025-12-09
|
|
40
|
+
|
|
41
|
+
* Removing support for python3.9
|
|
42
|
+
|
|
43
|
+
## 0.25.29 - 2025-12-11
|
|
44
|
+
|
|
45
|
+
* Tableau: dynamic pagination and safe mode for all types of assets
|
|
46
|
+
|
|
47
|
+
## 0.25.28 - 2025-12-08
|
|
48
|
+
|
|
49
|
+
* Tableau: fix retry exponential time
|
|
50
|
+
|
|
51
|
+
## 0.25.27 - 2025-12-04
|
|
52
|
+
|
|
53
|
+
* Sigma: retry on 503 errors
|
|
54
|
+
|
|
55
|
+
## 0.25.26 - 2025-12-03
|
|
56
|
+
|
|
57
|
+
* Strategy: deduplicate users on ID
|
|
58
|
+
|
|
59
|
+
## 0.25.25 - 2025-12-02
|
|
60
|
+
|
|
61
|
+
* Tableau: better catching of timeouts
|
|
62
|
+
|
|
63
|
+
## 0.25.24 - 2025-11-27
|
|
64
|
+
|
|
65
|
+
* Tableau: extraction of tables and columns without "Extracts"
|
|
66
|
+
|
|
67
|
+
## 0.25.23 - 2025-11-24
|
|
68
|
+
|
|
69
|
+
* Looker Studio: add option to extract source queries only
|
|
70
|
+
|
|
71
|
+
## 0.25.22 - 2025-11-19
|
|
72
|
+
|
|
73
|
+
* SQL Server: improved error log
|
|
74
|
+
* Sigma : handle service errors in queries and elements extraction
|
|
75
|
+
|
|
76
|
+
## 0.25.21 - 2025-11-05
|
|
77
|
+
|
|
78
|
+
* Qlik: Extracting sheets
|
|
79
|
+
|
|
80
|
+
## 0.25.20 - 2025-11-14
|
|
81
|
+
|
|
82
|
+
* BigQuery: skip Omni locations when extracting SQL queries
|
|
83
|
+
|
|
84
|
+
## 0.25.19 - 2025-11-14
|
|
85
|
+
|
|
86
|
+
* Redshift: support extraction of queries longer than 65,535 characters
|
|
87
|
+
|
|
88
|
+
## 0.25.18 - 2025-11-13
|
|
89
|
+
|
|
90
|
+
* Power BI: expand groups into individual users
|
|
91
|
+
|
|
92
|
+
## 0.25.17 - 2025-11-04
|
|
93
|
+
|
|
94
|
+
* Snowflake: add query_block to exclude specific sql patterns
|
|
95
|
+
|
|
96
|
+
## 0.25.16 - 2025-11-03
|
|
97
|
+
|
|
98
|
+
* Snowflake: remove duplicated queries, based on query_hash
|
|
99
|
+
|
|
100
|
+
## 0.25.15 - 2025-10-30
|
|
101
|
+
|
|
102
|
+
* Databricks: Add `http_path` mandatory field for databricks credentials
|
|
103
|
+
|
|
3
104
|
## 0.25.14 - 2025-10-28
|
|
4
105
|
|
|
5
106
|
* Removing unused dependency (google-cloud-storage)
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: castor-extractor
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.26.9
|
|
4
4
|
Summary: Extract your metadata assets.
|
|
5
5
|
Home-page: https://www.castordoc.com/
|
|
6
6
|
License: EULA
|
|
7
7
|
Author: Castor
|
|
8
8
|
Author-email: support@castordoc.com
|
|
9
|
-
Requires-Python: >=3.
|
|
9
|
+
Requires-Python: >=3.10,<3.14
|
|
10
10
|
Classifier: License :: Other/Proprietary License
|
|
11
11
|
Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
14
13
|
Classifier: Programming Language :: Python :: 3.10
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
17
|
Provides-Extra: all
|
|
18
18
|
Provides-Extra: bigquery
|
|
19
19
|
Provides-Extra: count
|
|
@@ -61,7 +61,6 @@ Requires-Dist: sqlalchemy-bigquery[bqstorage] (>=1.0.0,<=2.0.0) ; extra == "bigq
|
|
|
61
61
|
Requires-Dist: sqlalchemy-redshift (>=0.8.14,<0.9.0) ; extra == "redshift" or extra == "all"
|
|
62
62
|
Requires-Dist: tableauserverclient (>=0.25.0,<0.26.0) ; extra == "tableau" or extra == "all"
|
|
63
63
|
Requires-Dist: tqdm (>=4.0.0,<5.0.0)
|
|
64
|
-
Requires-Dist: typing-extensions (>=4,<5)
|
|
65
64
|
Requires-Dist: websocket-client (>=1,<2) ; extra == "qlik" or extra == "all"
|
|
66
65
|
Project-URL: Documentation, https://docs.castordoc.com/castor-package/castor-extractor
|
|
67
66
|
Description-Content-Type: text/markdown
|
|
@@ -102,11 +101,9 @@ It also embeds utilities to help you push your metadata to Castor:
|
|
|
102
101
|
|
|
103
102
|
## Installation
|
|
104
103
|
|
|
105
|
-
Requirements: **python3.
|
|
104
|
+
Requirements: **python3.10+**
|
|
106
105
|
<img src="https://upload.wikimedia.org/wikipedia/commons/c/c3/Python-logo-notext.svg" width=20 />
|
|
107
106
|
|
|
108
|
-
**Note:** The Strategy command requires **python3.10+**. All other modules work with python3.9+.
|
|
109
|
-
|
|
110
107
|
### Create castor-env
|
|
111
108
|
|
|
112
109
|
We advise to create a dedicated [Python environment](https://docs.python.org/3/library/venv.html).
|
|
@@ -128,7 +125,7 @@ eval "$(pyenv init --path)"
|
|
|
128
125
|
eval "$(pyenv virtualenv-init -)"
|
|
129
126
|
```
|
|
130
127
|
|
|
131
|
-
- [optional] Install python 3.
|
|
128
|
+
- [optional] Install python 3.10+ if needed
|
|
132
129
|
|
|
133
130
|
```bash
|
|
134
131
|
pyenv versions # check your local python installations
|
|
@@ -215,6 +212,107 @@ For any questions or bug report, contact us at [support@coalesce.io](mailto:supp
|
|
|
215
212
|
|
|
216
213
|
# Changelog
|
|
217
214
|
|
|
215
|
+
## 0.26.9 - 2026-01-21
|
|
216
|
+
|
|
217
|
+
* SqlServer: support default database
|
|
218
|
+
|
|
219
|
+
## 0.26.8 - 2026-01-14
|
|
220
|
+
|
|
221
|
+
* Qlik: ignore OBJECT_NOT_FOUND errors
|
|
222
|
+
|
|
223
|
+
## 0.26.7 - 2026-01-13
|
|
224
|
+
|
|
225
|
+
* Coalesce: introduce dynamic pagination
|
|
226
|
+
|
|
227
|
+
## 0.26.6 - 2025-12-30
|
|
228
|
+
|
|
229
|
+
* Snowflake: add setting `apply_db_filter_to_queries` (for future use)
|
|
230
|
+
|
|
231
|
+
## 0.26.5 - 2025-12-23
|
|
232
|
+
|
|
233
|
+
* Looker: extract dashboard's slug
|
|
234
|
+
|
|
235
|
+
## 0.26.4 - 2025-12-18
|
|
236
|
+
|
|
237
|
+
* Snowflake: extend query_blocked to column-lineage extraction
|
|
238
|
+
|
|
239
|
+
## 0.26.3 - 2025-12-17
|
|
240
|
+
|
|
241
|
+
* Tableau: catch error relationship-service-war
|
|
242
|
+
|
|
243
|
+
## 0.26.2 - 2025-12-16
|
|
244
|
+
|
|
245
|
+
* Notion: deduplicate Users
|
|
246
|
+
|
|
247
|
+
## 0.26.1 - 2025-12-15
|
|
248
|
+
|
|
249
|
+
* Power BI: pages extraction conditioned on workspace access
|
|
250
|
+
|
|
251
|
+
## 0.26.0 - 2025-12-09
|
|
252
|
+
|
|
253
|
+
* Removing support for python3.9
|
|
254
|
+
|
|
255
|
+
## 0.25.29 - 2025-12-11
|
|
256
|
+
|
|
257
|
+
* Tableau: dynamic pagination and safe mode for all types of assets
|
|
258
|
+
|
|
259
|
+
## 0.25.28 - 2025-12-08
|
|
260
|
+
|
|
261
|
+
* Tableau: fix retry exponential time
|
|
262
|
+
|
|
263
|
+
## 0.25.27 - 2025-12-04
|
|
264
|
+
|
|
265
|
+
* Sigma: retry on 503 errors
|
|
266
|
+
|
|
267
|
+
## 0.25.26 - 2025-12-03
|
|
268
|
+
|
|
269
|
+
* Strategy: deduplicate users on ID
|
|
270
|
+
|
|
271
|
+
## 0.25.25 - 2025-12-02
|
|
272
|
+
|
|
273
|
+
* Tableau: better catching of timeouts
|
|
274
|
+
|
|
275
|
+
## 0.25.24 - 2025-11-27
|
|
276
|
+
|
|
277
|
+
* Tableau: extraction of tables and columns without "Extracts"
|
|
278
|
+
|
|
279
|
+
## 0.25.23 - 2025-11-24
|
|
280
|
+
|
|
281
|
+
* Looker Studio: add option to extract source queries only
|
|
282
|
+
|
|
283
|
+
## 0.25.22 - 2025-11-19
|
|
284
|
+
|
|
285
|
+
* SQL Server: improved error log
|
|
286
|
+
* Sigma : handle service errors in queries and elements extraction
|
|
287
|
+
|
|
288
|
+
## 0.25.21 - 2025-11-05
|
|
289
|
+
|
|
290
|
+
* Qlik: Extracting sheets
|
|
291
|
+
|
|
292
|
+
## 0.25.20 - 2025-11-14
|
|
293
|
+
|
|
294
|
+
* BigQuery: skip Omni locations when extracting SQL queries
|
|
295
|
+
|
|
296
|
+
## 0.25.19 - 2025-11-14
|
|
297
|
+
|
|
298
|
+
* Redshift: support extraction of queries longer than 65,535 characters
|
|
299
|
+
|
|
300
|
+
## 0.25.18 - 2025-11-13
|
|
301
|
+
|
|
302
|
+
* Power BI: expand groups into individual users
|
|
303
|
+
|
|
304
|
+
## 0.25.17 - 2025-11-04
|
|
305
|
+
|
|
306
|
+
* Snowflake: add query_block to exclude specific sql patterns
|
|
307
|
+
|
|
308
|
+
## 0.25.16 - 2025-11-03
|
|
309
|
+
|
|
310
|
+
* Snowflake: remove duplicated queries, based on query_hash
|
|
311
|
+
|
|
312
|
+
## 0.25.15 - 2025-10-30
|
|
313
|
+
|
|
314
|
+
* Databricks: Add `http_path` mandatory field for databricks credentials
|
|
315
|
+
|
|
218
316
|
## 0.25.14 - 2025-10-28
|
|
219
317
|
|
|
220
318
|
* Removing unused dependency (google-cloud-storage)
|
|
@@ -34,11 +34,9 @@ It also embeds utilities to help you push your metadata to Castor:
|
|
|
34
34
|
|
|
35
35
|
## Installation
|
|
36
36
|
|
|
37
|
-
Requirements: **python3.
|
|
37
|
+
Requirements: **python3.10+**
|
|
38
38
|
<img src="https://upload.wikimedia.org/wikipedia/commons/c/c3/Python-logo-notext.svg" width=20 />
|
|
39
39
|
|
|
40
|
-
**Note:** The Strategy command requires **python3.10+**. All other modules work with python3.9+.
|
|
41
|
-
|
|
42
40
|
### Create castor-env
|
|
43
41
|
|
|
44
42
|
We advise to create a dedicated [Python environment](https://docs.python.org/3/library/venv.html).
|
|
@@ -60,7 +58,7 @@ eval "$(pyenv init --path)"
|
|
|
60
58
|
eval "$(pyenv virtualenv-init -)"
|
|
61
59
|
```
|
|
62
60
|
|
|
63
|
-
- [optional] Install python 3.
|
|
61
|
+
- [optional] Install python 3.10+ if needed
|
|
64
62
|
|
|
65
63
|
```bash
|
|
66
64
|
pyenv versions # check your local python installations
|
{castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_databricks.py
RENAMED
|
@@ -21,6 +21,9 @@ def main():
|
|
|
21
21
|
help="List of databricks catalogs that should not be extracted",
|
|
22
22
|
)
|
|
23
23
|
parser.add_argument("-t", "--token", help="Databricks access token")
|
|
24
|
+
parser.add_argument(
|
|
25
|
+
"-p", "--http-path", dest="http_path", help="Databricks http path"
|
|
26
|
+
)
|
|
24
27
|
parser.add_argument("-o", "--output", help="Directory to write to")
|
|
25
28
|
parser.add_argument(
|
|
26
29
|
"--skip-existing",
|
|
@@ -38,5 +41,6 @@ def main():
|
|
|
38
41
|
host=args.host,
|
|
39
42
|
output_directory=args.output,
|
|
40
43
|
token=args.token,
|
|
44
|
+
http_path=args.http_path,
|
|
41
45
|
skip_existing=args.skip_existing,
|
|
42
46
|
)
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from argparse import ArgumentParser
|
|
2
|
+
|
|
3
|
+
from castor_extractor.utils import parse_filled_arguments # type: ignore
|
|
4
|
+
from castor_extractor.visualization import looker_studio # type: ignore
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def main():
|
|
8
|
+
parser = ArgumentParser(
|
|
9
|
+
description="Extract data from Looker Studio and related BigQuery source queries"
|
|
10
|
+
)
|
|
11
|
+
parser.add_argument("-o", "--output", help="Directory to write to")
|
|
12
|
+
|
|
13
|
+
mode_group = parser.add_argument_group("Execution mode")
|
|
14
|
+
mode_group.add_argument(
|
|
15
|
+
"--source-queries-only",
|
|
16
|
+
action="store_true",
|
|
17
|
+
default=False,
|
|
18
|
+
help="If selected, only extracts BigQuery source queries (bypasses Looker Studio extraction)",
|
|
19
|
+
)
|
|
20
|
+
mode_group.add_argument(
|
|
21
|
+
"--skip-view-activity-logs",
|
|
22
|
+
action="store_true",
|
|
23
|
+
default=False,
|
|
24
|
+
help="Skip extraction of activity logs (use if credentials lack required scopes)",
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
looker_group = parser.add_argument_group("Looker Studio extraction")
|
|
28
|
+
looker_group.add_argument(
|
|
29
|
+
"-c",
|
|
30
|
+
"--credentials",
|
|
31
|
+
help="File path to Service Account credentials with Looker Studio access",
|
|
32
|
+
)
|
|
33
|
+
looker_group.add_argument(
|
|
34
|
+
"-a",
|
|
35
|
+
"--admin-email",
|
|
36
|
+
help="Email of a Google Workspace user with admin access",
|
|
37
|
+
)
|
|
38
|
+
looker_group.add_argument(
|
|
39
|
+
"--users-file-path",
|
|
40
|
+
help=(
|
|
41
|
+
"Optional path to a JSON file with user email addresses "
|
|
42
|
+
'as a list of strings (e.g. ["foo@bar.com", "fee@bar.com"]). '
|
|
43
|
+
"If provided, only extracts assets owned by the specified users."
|
|
44
|
+
),
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
bigquery_group = parser.add_argument_group("Source queries extraction")
|
|
48
|
+
bigquery_group.add_argument(
|
|
49
|
+
"-b",
|
|
50
|
+
"--bigquery-credentials",
|
|
51
|
+
help=(
|
|
52
|
+
"File path to Service Account credentials with BigQuery access. "
|
|
53
|
+
"Can point to the same file as Looker Studio credentials."
|
|
54
|
+
),
|
|
55
|
+
)
|
|
56
|
+
bigquery_group.add_argument(
|
|
57
|
+
"--db-allowed",
|
|
58
|
+
nargs="*",
|
|
59
|
+
help="Optional list of GCP projects to allow for source queries extraction",
|
|
60
|
+
)
|
|
61
|
+
bigquery_group.add_argument(
|
|
62
|
+
"--db-blocked",
|
|
63
|
+
nargs="*",
|
|
64
|
+
help="Optional list of GCP projects to block from source queries extraction",
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
looker_studio.extract_all(**parse_filled_arguments(parser))
|
{castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_powerbi.py
RENAMED
|
@@ -31,11 +31,16 @@ def main():
|
|
|
31
31
|
parser.add_argument(
|
|
32
32
|
"-sc",
|
|
33
33
|
"--scopes",
|
|
34
|
-
help="
|
|
34
|
+
help="Optional scopes for the Power BI REST API and the Microsoft Graph API",
|
|
35
35
|
nargs="*",
|
|
36
36
|
)
|
|
37
37
|
parser.add_argument("-o", "--output", help="Directory to write to")
|
|
38
38
|
parser.add_argument("-l", "--login_url", help="Login url (Optional)")
|
|
39
|
-
parser.add_argument(
|
|
39
|
+
parser.add_argument(
|
|
40
|
+
"-a", "--api_base", help="Power BI REST API base (Optional)"
|
|
41
|
+
)
|
|
42
|
+
parser.add_argument(
|
|
43
|
+
"-g", "--graph_api_base", help="Microsoft Graph API base (Optional)"
|
|
44
|
+
)
|
|
40
45
|
|
|
41
46
|
powerbi.extract_all(**parse_filled_arguments(parser))
|
{castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_qlik.py
RENAMED
|
@@ -22,5 +22,11 @@ def main():
|
|
|
22
22
|
"as warning instead. Helpful to continue script execution when "
|
|
23
23
|
"missing rights on some assets.",
|
|
24
24
|
)
|
|
25
|
+
parser.add_argument(
|
|
26
|
+
"-s",
|
|
27
|
+
"--include-sheets",
|
|
28
|
+
action="store_true",
|
|
29
|
+
help="Also extract sheets",
|
|
30
|
+
)
|
|
25
31
|
|
|
26
32
|
qlik.extract_all(**parse_filled_arguments(parser))
|
{castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_snowflake.py
RENAMED
|
@@ -35,6 +35,11 @@ def main():
|
|
|
35
35
|
nargs="*",
|
|
36
36
|
help="List of databases that should not be extracted",
|
|
37
37
|
)
|
|
38
|
+
parser.add_argument(
|
|
39
|
+
"--query-blocked",
|
|
40
|
+
nargs="*",
|
|
41
|
+
help="List of query patterns that should not be extracted. SQL wildcards are supported: % and _",
|
|
42
|
+
)
|
|
38
43
|
parser.add_argument(
|
|
39
44
|
"--fetch-transient",
|
|
40
45
|
action="store_true",
|
|
@@ -67,6 +72,7 @@ def main():
|
|
|
67
72
|
role=args.role,
|
|
68
73
|
db_allowed=args.db_allowed,
|
|
69
74
|
db_blocked=args.db_blocked,
|
|
75
|
+
query_blocked=args.query_blocked,
|
|
70
76
|
output_directory=args.output,
|
|
71
77
|
skip_existing=args.skip_existing,
|
|
72
78
|
fetch_transient=args.fetch_transient,
|
{castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_sqlserver.py
RENAMED
|
@@ -40,6 +40,10 @@ def main():
|
|
|
40
40
|
nargs="*",
|
|
41
41
|
help="List of databases that should not be extracted",
|
|
42
42
|
)
|
|
43
|
+
parser.add_argument(
|
|
44
|
+
"--default-db",
|
|
45
|
+
help="Optional database used only when the SQL Server login cannot connect via its default database (e.g. Azure SQL). Not required for most setups.",
|
|
46
|
+
)
|
|
43
47
|
parser.set_defaults(skip_existing=False)
|
|
44
48
|
|
|
45
49
|
args = parser.parse_args()
|
|
@@ -51,6 +55,8 @@ def main():
|
|
|
51
55
|
password=args.password,
|
|
52
56
|
output_directory=args.output,
|
|
53
57
|
skip_existing=args.skip_existing,
|
|
58
|
+
skip_queries=args.skip_queries,
|
|
54
59
|
db_allowed=args.db_allowed,
|
|
55
60
|
db_blocked=args.db_blocked,
|
|
61
|
+
default_db=args.default_db,
|
|
56
62
|
)
|
{castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/commands/extract_tableau.py
RENAMED
|
@@ -4,6 +4,8 @@ from argparse import ArgumentParser
|
|
|
4
4
|
from castor_extractor.utils import parse_filled_arguments # type: ignore
|
|
5
5
|
from castor_extractor.visualization import tableau # type: ignore
|
|
6
6
|
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
7
9
|
logging.basicConfig(level=logging.INFO, format="%(levelname)s - %(message)s")
|
|
8
10
|
|
|
9
11
|
|
|
@@ -53,8 +55,14 @@ def main():
|
|
|
53
55
|
"--ignore-errors",
|
|
54
56
|
action="store_true",
|
|
55
57
|
dest="ignore_errors",
|
|
56
|
-
help="
|
|
58
|
+
help="(DEPRECATED) This option no longer has any effect and will be removed in a future version.",
|
|
57
59
|
)
|
|
60
|
+
args = parser.parse_args()
|
|
61
|
+
if args.ignore_errors:
|
|
62
|
+
logger.warning(
|
|
63
|
+
"--ignore-errors is deprecated and has no more effect. It will be removed in a future version."
|
|
64
|
+
)
|
|
65
|
+
|
|
58
66
|
parser.add_argument(
|
|
59
67
|
"--ignore-ssl",
|
|
60
68
|
action="store_true",
|
{castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/file_checker/column.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from
|
|
1
|
+
from collections.abc import Callable
|
|
2
2
|
|
|
3
3
|
from dateutil.parser import parse
|
|
4
4
|
|
|
@@ -29,8 +29,8 @@ class ColumnChecker:
|
|
|
29
29
|
data_type: DataType = DataType.STRING,
|
|
30
30
|
is_mandatory: bool = True,
|
|
31
31
|
is_unique: bool = False,
|
|
32
|
-
foreign:
|
|
33
|
-
enum_values:
|
|
32
|
+
foreign: set[str] | None = None,
|
|
33
|
+
enum_values: set[str] | None = None,
|
|
34
34
|
):
|
|
35
35
|
self.data_type = data_type
|
|
36
36
|
self.is_mandatory = is_mandatory
|
|
@@ -79,7 +79,7 @@ class ColumnChecker:
|
|
|
79
79
|
return True
|
|
80
80
|
return value in self.foreign
|
|
81
81
|
|
|
82
|
-
def check(self, value:
|
|
82
|
+
def check(self, value: str | None) -> Issue | None:
|
|
83
83
|
"""
|
|
84
84
|
Do all checks to validate that the given value respect the column rules.
|
|
85
85
|
Return an issue if something's wrong.
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from collections.abc import Iterator
|
|
2
|
+
from collections.abc import Iterable, Iterator
|
|
3
3
|
from functools import partial
|
|
4
|
-
from typing import Iterable, Optional
|
|
5
4
|
|
|
6
5
|
from ....utils import (
|
|
7
6
|
APIClient,
|
|
@@ -31,8 +30,8 @@ class ConfluenceClient(APIClient):
|
|
|
31
30
|
credentials: ConfluenceCredentials,
|
|
32
31
|
include_archived_spaces: bool = False,
|
|
33
32
|
include_personal_spaces: bool = False,
|
|
34
|
-
space_ids_allowed:
|
|
35
|
-
space_ids_blocked:
|
|
33
|
+
space_ids_allowed: set[str] | None = None,
|
|
34
|
+
space_ids_blocked: set[str] | None = None,
|
|
36
35
|
):
|
|
37
36
|
self.account_id = credentials.account_id
|
|
38
37
|
auth = BasicAuth(
|
|
@@ -150,8 +149,8 @@ class ConfluenceClient(APIClient):
|
|
|
150
149
|
self,
|
|
151
150
|
asset: ConfluenceAsset,
|
|
152
151
|
*,
|
|
153
|
-
folder_ids:
|
|
154
|
-
database_ids:
|
|
152
|
+
folder_ids: Iterator[str] | None = None,
|
|
153
|
+
database_ids: Iterator[str] | None = None,
|
|
155
154
|
) -> Iterator[dict]:
|
|
156
155
|
"""Returns the needed metadata for the queried asset"""
|
|
157
156
|
if asset == ConfluenceAsset.FOLDERS:
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from typing import Optional, Union
|
|
2
|
-
|
|
3
1
|
from pydantic import AliasPath, Field
|
|
4
2
|
|
|
5
3
|
from ....utils import (
|
|
@@ -14,7 +12,7 @@ class ConfluencePagination(PaginationModel):
|
|
|
14
12
|
fetch_by: FetchNextPageBy = FetchNextPageBy.URL
|
|
15
13
|
|
|
16
14
|
results: list = Field(default_factory=list)
|
|
17
|
-
next_url:
|
|
15
|
+
next_url: str | None = Field(
|
|
18
16
|
validation_alias=AliasPath("_links", "next"),
|
|
19
17
|
default=None,
|
|
20
18
|
)
|
|
@@ -23,7 +21,7 @@ class ConfluencePagination(PaginationModel):
|
|
|
23
21
|
"""Stopping condition for the pagination"""
|
|
24
22
|
return self.next_url is None
|
|
25
23
|
|
|
26
|
-
def next_page_payload(self) ->
|
|
24
|
+
def next_page_payload(self) -> str | None:
|
|
27
25
|
"""Payload enabling to generate the request for the next page"""
|
|
28
26
|
return self.next_url
|
|
29
27
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from collections.abc import Iterable, Iterator
|
|
3
|
-
from typing import Union
|
|
4
3
|
|
|
5
4
|
from ...utils import (
|
|
6
5
|
OUTPUT_DIR,
|
|
@@ -20,7 +19,7 @@ logger = logging.getLogger(__name__)
|
|
|
20
19
|
|
|
21
20
|
def iterate_all_data(
|
|
22
21
|
client: ConfluenceClient,
|
|
23
|
-
) -> Iterable[tuple[ConfluenceAsset,
|
|
22
|
+
) -> Iterable[tuple[ConfluenceAsset, list | Iterator | dict]]:
|
|
24
23
|
"""Iterate over the extracted data from Confluence"""
|
|
25
24
|
|
|
26
25
|
logger.info("Extracting USERS from API")
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
from collections.abc import Iterator
|
|
2
2
|
from functools import partial
|
|
3
3
|
from http import HTTPStatus
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
|
-
from ....utils import
|
|
5
|
+
from ....utils import (
|
|
6
|
+
APIClient,
|
|
7
|
+
BearerAuth,
|
|
8
|
+
RequestSafeMode,
|
|
9
|
+
deduplicate,
|
|
10
|
+
fetch_all_pages,
|
|
11
|
+
)
|
|
7
12
|
from ..assets import NotionAsset
|
|
8
13
|
from .constants import CASTOR_NOTION_USER_AGENT, NOTION_BASE_URL, NOTION_VERSION
|
|
9
14
|
from .credentials import NotionCredentials
|
|
@@ -40,7 +45,7 @@ class NotionClient(APIClient):
|
|
|
40
45
|
def __init__(
|
|
41
46
|
self,
|
|
42
47
|
credentials: NotionCredentials,
|
|
43
|
-
safe_mode:
|
|
48
|
+
safe_mode: RequestSafeMode | None = None,
|
|
44
49
|
):
|
|
45
50
|
auth = NotionAuth(token=credentials.token)
|
|
46
51
|
super().__init__(
|
|
@@ -52,8 +57,12 @@ class NotionClient(APIClient):
|
|
|
52
57
|
)
|
|
53
58
|
|
|
54
59
|
def users(self) -> Iterator[dict]:
|
|
60
|
+
"""
|
|
61
|
+
Yield all Notion users, deduplicated by user ID.
|
|
62
|
+
"""
|
|
55
63
|
request = partial(self._get, endpoint=NotionEndpointFactory.users())
|
|
56
|
-
|
|
64
|
+
all_users = fetch_all_pages(request, NotionPagination)
|
|
65
|
+
return deduplicate("id", all_users)
|
|
57
66
|
|
|
58
67
|
def _page_listing(self) -> Iterator[dict]:
|
|
59
68
|
request = partial(
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
1
|
from pydantic import Field
|
|
4
2
|
|
|
5
3
|
from ....utils import PaginationModel
|
|
@@ -9,7 +7,7 @@ class NotionPagination(PaginationModel):
|
|
|
9
7
|
"""Class to handle paginated results"""
|
|
10
8
|
|
|
11
9
|
results: list = Field(default_factory=list)
|
|
12
|
-
next_cursor:
|
|
10
|
+
next_cursor: str | None = None
|
|
13
11
|
has_more: bool = False
|
|
14
12
|
|
|
15
13
|
def is_last(self) -> bool:
|
{castor_extractor-0.25.14 → castor_extractor-0.26.9}/castor_extractor/knowledge/notion/extract.py
RENAMED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from collections.abc import Iterable, Iterator
|
|
3
|
-
from typing import Union
|
|
4
3
|
|
|
5
4
|
from ...utils import (
|
|
6
5
|
OUTPUT_DIR,
|
|
@@ -19,7 +18,7 @@ logger = logging.getLogger(__name__)
|
|
|
19
18
|
|
|
20
19
|
def iterate_all_data(
|
|
21
20
|
client: NotionClient,
|
|
22
|
-
) -> Iterable[tuple[NotionAsset,
|
|
21
|
+
) -> Iterable[tuple[NotionAsset, list | Iterator | dict]]:
|
|
23
22
|
"""Iterate over the extracted data from Notion"""
|
|
24
23
|
|
|
25
24
|
logger.info("Extracting USERS from API")
|