castor-extractor 0.22.5__py3-none-any.whl → 0.23.1__py3-none-any.whl

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.

CHANGELOG.md CHANGED
@@ -1,6 +1,13 @@
1
-
2
1
  # Changelog
3
2
 
3
+ ## 0.23.1 - 2025-02-10
4
+
5
+ * change command for Confluence from password to token to reflect better their documentation
6
+
7
+ ## 0.22.6 - 2025-01-21
8
+
9
+ * bump dependencies: looker, databricks, deptry, ...
10
+
4
11
  ## 0.22.5 - 2025-01-09
5
12
 
6
13
  * Databricks: validate and deduplicate lineage links
@@ -13,7 +13,7 @@ def main():
13
13
  parser.add_argument("-a", "--account_id", help="Confluence account id")
14
14
  parser.add_argument("-b", "--base_url", help="Confluence account base url")
15
15
  parser.add_argument("-o", "--output", help="Directory to write to")
16
- parser.add_argument("-p", "--password", help="Confluence password")
16
+ parser.add_argument("-t", "--token", help="Confluence API token")
17
17
  parser.add_argument("-u", "--username", help="Confluence username")
18
18
 
19
19
  confluence.extract_all(**parse_filled_arguments(parser))
@@ -123,7 +123,7 @@ class FileCheckerRun:
123
123
  """
124
124
  if not self.verbose:
125
125
  return
126
- header = f"Issues detected on Row #{index+1}\n"
126
+ header = f"Issues detected on Row #{index + 1}\n"
127
127
  for k, v in row.items():
128
128
  header += f"{str(k):<20} {str(v):<100}\n"
129
129
  self.logger.info(header + _SEPARATOR + issue_log + _SEPARATOR)
@@ -37,7 +37,7 @@ class ConfluenceClient(APIClient):
37
37
  ):
38
38
  self.account_id = credentials.account_id
39
39
  auth = BasicAuth(
40
- username=credentials.username, password=credentials.password
40
+ username=credentials.username, password=credentials.token
41
41
  )
42
42
  super().__init__(
43
43
  auth=auth,
@@ -14,5 +14,5 @@ class ConfluenceCredentials(BaseSettings):
14
14
 
15
15
  account_id: str
16
16
  base_url: str
17
- password: str
17
+ token: str
18
18
  username: str
@@ -11,7 +11,7 @@ from .endpoints import NotionEndpointFactory
11
11
  from .pagination import NotionPagination
12
12
 
13
13
  VOLUME_IGNORED = 10
14
- IGNORED_ERROR_CODES = (HTTPStatus.BAD_GATEWAY,)
14
+ IGNORED_ERROR_CODES = (HTTPStatus.BAD_GATEWAY, HTTPStatus.NOT_FOUND)
15
15
  NOTION_SAFE_MODE = RequestSafeMode(
16
16
  max_errors=VOLUME_IGNORED,
17
17
  status_codes=IGNORED_ERROR_CODES,
@@ -37,10 +37,10 @@ def test_validate_baseurl():
37
37
  validate_baseurl("")
38
38
 
39
39
  with pytest.raises(ValueError):
40
- validate_baseurl("ftp://tesla.looker.eu")
40
+ validate_baseurl("ftp://timber.looker.eu")
41
41
 
42
42
  with pytest.raises(ValueError):
43
- validate_baseurl("https://tesla.looker.eu:19999?query=params")
43
+ validate_baseurl("https://timber.looker.eu:19999?query=params")
44
44
 
45
45
  with pytest.raises(ValueError):
46
- validate_baseurl("https://tesla.looker.eu:19999#fragment")
46
+ validate_baseurl("https://timber.looker.eu:19999#fragment")
@@ -1,4 +1,6 @@
1
+ from contextlib import contextmanager
1
2
  from functools import partial
3
+ from http import HTTPStatus
2
4
  from typing import Iterator, Optional
3
5
 
4
6
  from google.auth.transport.requests import Request
@@ -7,6 +9,7 @@ from google.oauth2.service_account import Credentials
7
9
  from ....utils import (
8
10
  APIClient,
9
11
  BearerAuth,
12
+ RequestSafeMode,
10
13
  fetch_all_pages,
11
14
  )
12
15
  from .credentials import LookerStudioCredentials
@@ -16,6 +19,22 @@ from .pagination import LookerStudioPagination
16
19
  from .scopes import SCOPES
17
20
 
18
21
 
22
+ @contextmanager
23
+ def temporary_safe_request(client: APIClient):
24
+ """
25
+ Allows applying the safe mode only to specific requests instead of all
26
+ API calls.
27
+ """
28
+ client._safe_mode = RequestSafeMode(
29
+ max_errors=float("inf"),
30
+ status_codes=(HTTPStatus.UNAUTHORIZED,),
31
+ )
32
+ try:
33
+ yield client
34
+ finally:
35
+ client._safe_mode = RequestSafeMode()
36
+
37
+
19
38
  class LookerStudioAPIAuth(BearerAuth):
20
39
  def __init__(
21
40
  self,
@@ -56,9 +75,14 @@ class LookerStudioAPIClient(APIClient):
56
75
 
57
76
  See also https://developers.google.com/looker-studio/integrate/api/reference/types#Permissions
58
77
  """
59
- data = self._get(LookerStudioAPIEndpoint.permissions(asset_name))
60
- permissions = data["permissions"]
61
- return len(permissions.keys()) == 1
78
+ with temporary_safe_request(self):
79
+ data = self._get(LookerStudioAPIEndpoint.permissions(asset_name))
80
+ permissions = data.get("permissions")
81
+
82
+ if not permissions:
83
+ return True
84
+
85
+ return len(permissions.keys()) == 1
62
86
 
63
87
  def _user_assets(
64
88
  self, asset_type: LookerStudioAssetType, user_email: str
@@ -76,7 +100,7 @@ class LookerStudioAPIClient(APIClient):
76
100
 
77
101
  for asset in assets:
78
102
  asset_name = asset["name"]
79
- owner = asset["owner"]
103
+ owner = asset.get("owner", "")
80
104
  if owner == user_email and not self._is_private_asset(asset_name):
81
105
  yield asset
82
106
 
@@ -8,6 +8,7 @@ class PowerBiAsset(ExternalAsset):
8
8
  DASHBOARDS = "dashboards"
9
9
  DATASETS = "datasets"
10
10
  DATASET_FIELDS = "dataset_fields"
11
+ DATASET_RELATIONSHIPS = "dataset_relationships"
11
12
  METADATA = "metadata"
12
13
  PAGES = "pages"
13
14
  REPORTS = "reports"
@@ -19,20 +20,9 @@ class PowerBiAsset(ExternalAsset):
19
20
  def optional(cls) -> set["PowerBiAsset"]:
20
21
  return {
21
22
  PowerBiAsset.DATASET_FIELDS,
23
+ PowerBiAsset.DATASET_RELATIONSHIPS,
22
24
  PowerBiAsset.PAGES,
23
25
  PowerBiAsset.TABLES,
24
26
  PowerBiAsset.TILES,
25
27
  PowerBiAsset.USERS,
26
28
  }
27
-
28
-
29
- # Assets extracted from the Metadata file
30
- # They are not directly fetched from the PowerBi api.
31
- METADATA_ASSETS = (
32
- PowerBiAsset.DATASET_FIELDS,
33
- PowerBiAsset.TABLES,
34
- PowerBiAsset.TILES,
35
- PowerBiAsset.USERS,
36
- )
37
-
38
- REPORTS_ASSETS = (PowerBiAsset.PAGES,)
@@ -11,7 +11,7 @@ from ...utils import (
11
11
  write_json,
12
12
  write_summary,
13
13
  )
14
- from .assets import METADATA_ASSETS, REPORTS_ASSETS, PowerBiAsset
14
+ from .assets import PowerBiAsset
15
15
  from .client import PowerbiClient, PowerbiCredentials
16
16
 
17
17
  logger = logging.getLogger(__name__)
@@ -21,7 +21,7 @@ def iterate_all_data(
21
21
  client: PowerbiClient,
22
22
  ) -> Iterable[tuple[PowerBiAsset, Union[list, dict]]]:
23
23
  for asset in PowerBiAsset:
24
- if asset in METADATA_ASSETS + REPORTS_ASSETS:
24
+ if asset in PowerBiAsset.optional:
25
25
  continue
26
26
 
27
27
  logger.info(f"Extracting {asset.name} from API")
@@ -60,7 +60,7 @@ class SQLExtractionProcessor:
60
60
  total = len(queries)
61
61
 
62
62
  for i, query in enumerate(queries):
63
- logger.info(f"Extracting {asset.value}: query {i+1}/{total}")
63
+ logger.info(f"Extracting {asset.value}: query {i + 1}/{total}")
64
64
  # concatenate results of all queries
65
65
  data = chain(data, self._fetch(query))
66
66
 
@@ -66,9 +66,9 @@ class BigQueryClient(SqlalchemyClient):
66
66
  return BIGQUERY_URI
67
67
 
68
68
  def _credentials(self) -> Credentials:
69
- assert (
70
- CREDENTIALS_INFO_KEY in self._options
71
- ), "Missing BigQuery credentials in engine's options"
69
+ assert CREDENTIALS_INFO_KEY in self._options, (
70
+ "Missing BigQuery credentials in engine's options"
71
+ )
72
72
  credentials = self._options[CREDENTIALS_INFO_KEY]
73
73
  return Credentials.from_service_account_info(credentials)
74
74
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: castor-extractor
3
- Version: 0.22.5
3
+ Version: 0.23.1
4
4
  Summary: Extract your metadata assets.
5
5
  Home-page: https://www.castordoc.com/
6
6
  License: EULA
@@ -30,7 +30,7 @@ Provides-Extra: snowflake
30
30
  Provides-Extra: sqlserver
31
31
  Provides-Extra: tableau
32
32
  Requires-Dist: cryptography (>=43.0.0,<44.0.0) ; extra == "snowflake"
33
- Requires-Dist: databricks-sql-connector (>=3.2.0,<4.0.0) ; extra == "databricks" or extra == "all"
33
+ Requires-Dist: databricks-sql-connector (==3.6.0) ; extra == "databricks" or extra == "all"
34
34
  Requires-Dist: google-api-core (>=2.1.1,<3.0.0)
35
35
  Requires-Dist: google-api-python-client (>=2.121.0,<3.0.0) ; extra == "lookerstudio" or extra == "all"
36
36
  Requires-Dist: google-auth (>=2,<3)
@@ -38,7 +38,7 @@ Requires-Dist: google-cloud-core (>=2.1.0,<3.0.0)
38
38
  Requires-Dist: google-cloud-storage (>=2,<3)
39
39
  Requires-Dist: google-resumable-media (>=2.0.3,<3.0.0)
40
40
  Requires-Dist: googleapis-common-protos (>=1.53.0,<2.0.0)
41
- Requires-Dist: looker-sdk (>=24.16.0,<24.17.0) ; extra == "looker" or extra == "all"
41
+ Requires-Dist: looker-sdk (>=25.0.0,<26.0.0) ; extra == "looker" or extra == "all"
42
42
  Requires-Dist: msal (>=1.20.0,<2.0.0) ; extra == "powerbi" or extra == "all"
43
43
  Requires-Dist: numpy (<2) ; extra == "bigquery" or extra == "databricks" or extra == "all"
44
44
  Requires-Dist: numpy (>=1.26) ; (python_version >= "3.12" and python_version < "3.13") and (extra == "bigquery" or extra == "databricks" or extra == "all")
@@ -57,7 +57,7 @@ Requires-Dist: snowflake-sqlalchemy (!=1.2.5,<2.0.0) ; extra == "snowflake" or e
57
57
  Requires-Dist: sqlalchemy (>=1.4,<1.5)
58
58
  Requires-Dist: sqlalchemy-bigquery[bqstorage] (>=1.0.0,<=2.0.0) ; extra == "bigquery" or extra == "all"
59
59
  Requires-Dist: sqlalchemy-redshift (>=0.8.14,<0.9.0) ; extra == "redshift" or extra == "all"
60
- Requires-Dist: tableauserverclient (==0.25.0) ; extra == "tableau" or extra == "all"
60
+ Requires-Dist: tableauserverclient (>=0.25.0,<0.26.0) ; extra == "tableau" or extra == "all"
61
61
  Requires-Dist: tqdm (>=4.0.0,<5.0.0)
62
62
  Requires-Dist: typing-extensions (>=4,<5)
63
63
  Requires-Dist: websocket-client (>=1,<2) ; extra == "qlik" or extra == "all"
@@ -204,9 +204,16 @@ For any questions or bug report, contact us at [support@castordoc.com](mailto:su
204
204
 
205
205
  [Castor](https://castordoc.com) helps you find, understand, use your data assets
206
206
 
207
-
208
207
  # Changelog
209
208
 
209
+ ## 0.23.1 - 2025-02-10
210
+
211
+ * change command for Confluence from password to token to reflect better their documentation
212
+
213
+ ## 0.22.6 - 2025-01-21
214
+
215
+ * bump dependencies: looker, databricks, deptry, ...
216
+
210
217
  ## 0.22.5 - 2025-01-09
211
218
 
212
219
  * Databricks: validate and deduplicate lineage links
@@ -1,4 +1,4 @@
1
- CHANGELOG.md,sha256=JzTJEZxIMP9F_aePVfIvqLt0OuG0jYcDygsLyfTAV84,15335
1
+ CHANGELOG.md,sha256=uItbpd54X3IEvlXwXFbSLqCgkY3lwgOoNrhIu_VaJk8,15530
2
2
  Dockerfile,sha256=xQ05-CFfGShT3oUqaiumaldwA288dj9Yb_pxofQpufg,301
3
3
  DockerfileUsage.md,sha256=2hkJQF-5JuuzfPZ7IOxgM6QgIQW7l-9oRMFVwyXC4gE,998
4
4
  LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
@@ -6,7 +6,7 @@ README.md,sha256=uF6PXm9ocPITlKVSh9afTakHmpLx3TvawLf-CbMP3wM,3578
6
6
  castor_extractor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  castor_extractor/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  castor_extractor/commands/extract_bigquery.py,sha256=dU4OiYO1V0n32orvZnMh1_xtFKF_VxHNXcVsH3otY-g,1269
9
- castor_extractor/commands/extract_confluence.py,sha256=o4vjN7nxN2MQWyLgdgjbaO9Rd53f2icYst5tv_evwT4,750
9
+ castor_extractor/commands/extract_confluence.py,sha256=xQjC0VZdz8jFHnugqQ0fQGjzGq34v49cqcP4ONeVYNs,748
10
10
  castor_extractor/commands/extract_databricks.py,sha256=SVKyoa-BBUQAM6HRHf1Wdg9-tpICic2yyvXQwHcNBhA,1264
11
11
  castor_extractor/commands/extract_domo.py,sha256=jvAawUsUTHrwCn_koK6StmQr4n_b5GyvJi6uu6WS0SM,1061
12
12
  castor_extractor/commands/extract_looker.py,sha256=cySLiolLCgrREJ9d0kMrJ7P8K3efHTBTzShalWVfI3A,1214
@@ -33,7 +33,7 @@ castor_extractor/file_checker/column.py,sha256=6bJhcW1snYwgHKkqlS0Ak7XLHZr4YBwO4
33
33
  castor_extractor/file_checker/column_test.py,sha256=1j8PxvmvmJgpd-mk30iMYOme32ovPSIn4yCXywFoXrg,1935
34
34
  castor_extractor/file_checker/constants.py,sha256=X9UvTqcKKZf0pkJErngq0UH_e9PL0dXUlS1g_Lbo5q8,289
35
35
  castor_extractor/file_checker/enums.py,sha256=Js8YN8hAoPChH1j2I7Mmk1yHsSNh8WjndHv4gz7c9KA,536
36
- castor_extractor/file_checker/file.py,sha256=pvS5ujYLrDFXfGRiPRWT5wkhqv9TIvoa0ekwTyPCNtw,6535
36
+ castor_extractor/file_checker/file.py,sha256=WXcnsqnDA5mF26sPuMPnCVtusNe3IIM8QVJdqXRiqrA,6537
37
37
  castor_extractor/file_checker/file_test.py,sha256=gFcXiRdzX7q5gWEJ2JaywRCHP6Kq1OH2yk5gh92V6KY,2124
38
38
  castor_extractor/file_checker/file_test_users.csv,sha256=ftw4T_RBg71c8_DAxnd9fHG3FNg4mwbEQKe1DuEn3ps,547
39
39
  castor_extractor/file_checker/file_test_users_valid.csv,sha256=Ek3q7DjUS0neOu1LQaNmObINdEIR3qeHvI4IuKuHLSA,286
@@ -43,15 +43,15 @@ castor_extractor/knowledge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
43
43
  castor_extractor/knowledge/confluence/__init__.py,sha256=pRT615pMDlB7Ifs09erVn2EdpZHgkvX5selemWU3VPE,129
44
44
  castor_extractor/knowledge/confluence/assets.py,sha256=zv2G2LB8H0fKDbVJ4kHrAjbqehXI_K-wgd_ghSXGFvs,144
45
45
  castor_extractor/knowledge/confluence/client/__init__.py,sha256=ALAzo0JEhxFzH2FnIO6HmtkAGS2_bGY8KXXMcTGV3aE,84
46
- castor_extractor/knowledge/confluence/client/client.py,sha256=rr0PsBkV3jMDK2yUNnEfGKp0ZsxClD8wJ2rUiUfAAFY,2117
47
- castor_extractor/knowledge/confluence/client/credentials.py,sha256=2LUjnCOMwq2NBrkHty99TpWlgyOOsYjwC9NeekZMH84,422
46
+ castor_extractor/knowledge/confluence/client/client.py,sha256=lGLRBbAOkEXcEKwHwdBhgG5cvAUkzpSL-7pPcmZpsE8,2114
47
+ castor_extractor/knowledge/confluence/client/credentials.py,sha256=tqUMw-SVoAi4o6I6OeGk4MeDiIPU3-ihhaomXv4CQ64,419
48
48
  castor_extractor/knowledge/confluence/client/endpoints.py,sha256=b7PIvw9_W942L4zsEZa__KhZDTo4yt-CdIO0eas69TE,736
49
49
  castor_extractor/knowledge/confluence/client/pagination.py,sha256=ty4meiMEujDVSiQyOJTibd-ReYyDyGezdFuk7EAGtMA,862
50
50
  castor_extractor/knowledge/confluence/extract.py,sha256=6pA68CmYNC50qCJ7NgZMW0jD4ev0a_ltI5kSyBqSC0U,1565
51
51
  castor_extractor/knowledge/notion/__init__.py,sha256=ZDmh0eNSxHf1zVPm0aYlKPci-vzOXhAgdsWjS2hdjh4,117
52
52
  castor_extractor/knowledge/notion/assets.py,sha256=QHv1-pomt5UeN_prP2L6t_zJ-tDSqB8LgopkGAODYPQ,164
53
53
  castor_extractor/knowledge/notion/client/__init__.py,sha256=CDPorBCethuNTEtpjvHGcWnWeVfqkEq-IbakWjDKATw,76
54
- castor_extractor/knowledge/notion/client/client.py,sha256=xRPyxTiyRN8vc2w1kGniyK_7zUgcW1z0Ht4aoNZO6fg,3706
54
+ castor_extractor/knowledge/notion/client/client.py,sha256=fUjdmQXVBA0Dn75s10-umjCovEavXt_qAdiXjUuYizM,3727
55
55
  castor_extractor/knowledge/notion/client/client_test.py,sha256=fo3_WgCIUfeF3nMfHTSB6wjxIW_dHp1XZL41tNzBisQ,1976
56
56
  castor_extractor/knowledge/notion/client/constants.py,sha256=dZCpSrxFlLbR_cFPJKz4M5wcMVcY4UfWFG0N5S22Fhw,147
57
57
  castor_extractor/knowledge/notion/client/credentials.py,sha256=-mBY6IhAb9z2RP1MilzIyS3BW39J__u_M5n9uIuUlxA,398
@@ -139,7 +139,7 @@ castor_extractor/utils/time.py,sha256=jmP1QWg4lv21Jp_Oy71lfJ47hjNOSgHiBOFf964RMP
139
139
  castor_extractor/utils/time_test.py,sha256=pH8DSosNlwDYZXZNNjYDcL0WbmZc_c212LEEn88Oqew,647
140
140
  castor_extractor/utils/type.py,sha256=Sd8JlEgbGkBUZnRqCUDtREeBkOMTXtlNMyCph90_J0Q,328
141
141
  castor_extractor/utils/validation.py,sha256=kQAFtqt3gfy7YqYQ0u-60vyNYUF_96he5QDVUQnZmDo,1896
142
- castor_extractor/utils/validation_test.py,sha256=aSetitOCkH_K-Wto9ISOVGso5jGfTUOBLm3AZnvavO8,1181
142
+ castor_extractor/utils/validation_test.py,sha256=A7P6VmI0kYX2aGIeEN12y7LsY7Kpm8pE4bdVFhbBAMw,1184
143
143
  castor_extractor/utils/write.py,sha256=Z_RYm47XeHiUPPUMYMuAjQrVZ18CAkL3daQHQG1XPlM,2148
144
144
  castor_extractor/visualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
145
  castor_extractor/visualization/domo/__init__.py,sha256=1axOCPm4RpdIyUt9LQEvlMvbOPllW8rk63h6EjVgJ0Y,111
@@ -176,7 +176,7 @@ castor_extractor/visualization/looker_studio/client/client.py,sha256=AYdR46NOdn_
176
176
  castor_extractor/visualization/looker_studio/client/credentials.py,sha256=yzTaiJQ5cArTnbybUPF6fZZXbX9XQ0SBq-jVI2ECovA,521
177
177
  castor_extractor/visualization/looker_studio/client/endpoints.py,sha256=5eY-ffqNDdlDBOOpiF7LpjyHMrzeClJktidCr1pTDUs,669
178
178
  castor_extractor/visualization/looker_studio/client/enums.py,sha256=fHgemTaQpnwee8cw1YQVDsVnH--vTyFwT4Px8aVYYHQ,167
179
- castor_extractor/visualization/looker_studio/client/looker_studio_api_client.py,sha256=Oqu_bGBEqYRR_aitBFyvfCZnx0kSZf4qGEI16tIRnhw,3482
179
+ castor_extractor/visualization/looker_studio/client/looker_studio_api_client.py,sha256=oySC6rsppj67RSifxwSCw4bFrz1Irx6IFJhX7tc_v1E,4087
180
180
  castor_extractor/visualization/looker_studio/client/pagination.py,sha256=9HQ3Rkdiz2VB6AvYtZ0F-WouiD0pMmdZyAmkv-3wh08,783
181
181
  castor_extractor/visualization/looker_studio/client/scopes.py,sha256=824cqqgZuGq4L-rPNoHJe0ibXsxkRwB0CLG_kqw9Q0g,256
182
182
  castor_extractor/visualization/metabase/__init__.py,sha256=3E36cmkMyEgBB6Ot5rWk-N75i0G-7k24QTlc-Iol4pM,193
@@ -215,7 +215,7 @@ castor_extractor/visualization/mode/client/credentials.py,sha256=ptIpCCpoNt06yYa
215
215
  castor_extractor/visualization/mode/errors.py,sha256=SKpFT2AiLOuWx2VRLyO7jbAiKcGDFXXrsebpNEKtr0E,1495
216
216
  castor_extractor/visualization/mode/extract.py,sha256=PmLWWjUwplQh3TNMemiGwyFdxMcKVMvumZPxSMLJAwk,1625
217
217
  castor_extractor/visualization/powerbi/__init__.py,sha256=AJnmfdmm2mGaInWJkUfZxRqrI7dBkTUSebpow05g5zo,135
218
- castor_extractor/visualization/powerbi/assets.py,sha256=71c_Y6288KBuw8_vRkT_c0_-yQOOqf-kkQ2MBi_qxok,908
218
+ castor_extractor/visualization/powerbi/assets.py,sha256=IB_XKwgdN1pZYGZ4RfeHrLjflianTzWf_6tg-4CIwu0,742
219
219
  castor_extractor/visualization/powerbi/client/__init__.py,sha256=8Bzhd9Z0ebVg2gDchXCOPa80Yqlq_9oCjbGi8u1M6J0,93
220
220
  castor_extractor/visualization/powerbi/client/authentication.py,sha256=fz0v9qxeADwA1jiS9UzAQN5mA5kmZT53onlcWon2RGw,892
221
221
  castor_extractor/visualization/powerbi/client/client.py,sha256=Y_rwkyPO3GbTAtaOClqnGVEK5iWmREIuDKDJx0LefHs,7203
@@ -225,7 +225,7 @@ castor_extractor/visualization/powerbi/client/credentials.py,sha256=sVi4ecJP8ydf
225
225
  castor_extractor/visualization/powerbi/client/credentials_test.py,sha256=TzFqxsWVQ3sXR_n0bJsexK9Uz7ceXCEPVqDGWTJzW60,993
226
226
  castor_extractor/visualization/powerbi/client/endpoints.py,sha256=DrAFpYHhp9Z7fxebdy_Ir6LFfFluHRBJId4tVCYTUVs,2051
227
227
  castor_extractor/visualization/powerbi/client/pagination.py,sha256=OZMjoDQPRGMoWd9QcKKrPh3aErJR20SHlrTqY_siLkk,755
228
- castor_extractor/visualization/powerbi/extract.py,sha256=3AiT5wpPi7_Yh9jQ1gCVEhFEPqVcd8uasrKob2RZHV4,1353
228
+ castor_extractor/visualization/powerbi/extract.py,sha256=Z5KbqMhMnqjWcnzged2G1-Gf6GYWJobTL9_TpAdgb8o,1309
229
229
  castor_extractor/visualization/qlik/__init__.py,sha256=u6lIfm_WOykBwt6SlaB7C0Dtx37XBliUbM5oWv26gC8,177
230
230
  castor_extractor/visualization/qlik/assets.py,sha256=Ab_kG61mHcK8GoGZbfQW7RSWyd7D9bVga9DOqnm0iSE,1625
231
231
  castor_extractor/visualization/qlik/client/__init__.py,sha256=5O5N9Jrt3d99agFEJ28lKWs2KkDaXK-lZ07IUtLj56M,130
@@ -318,12 +318,12 @@ castor_extractor/warehouse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
318
318
  castor_extractor/warehouse/abstract/__init__.py,sha256=Fdfa026tgOo64MvzVRLHM_F2G-JmcehrF0mh3dHgb7s,419
319
319
  castor_extractor/warehouse/abstract/asset.py,sha256=JiFRohZfPkQrgJJ8gTirD69snY1ubjPr5_Mg3vM--RY,2647
320
320
  castor_extractor/warehouse/abstract/asset_test.py,sha256=_kd4ybNlWSAdSdEgJKC-jhJTa1nMRa9i8RO3YbqKLM4,758
321
- castor_extractor/warehouse/abstract/extract.py,sha256=M0FFQJ407vlsqPPPPLZCXW46vDXDKWjRCPBQiOqmIWg,2922
321
+ castor_extractor/warehouse/abstract/extract.py,sha256=9Y2fUn3y2-2WjiHnrabjvAvOA8UETJeTYr18zcM7bdI,2924
322
322
  castor_extractor/warehouse/abstract/query.py,sha256=20vGhKKX0Kdprj0pbyt0A7L82hwVPezovx38h8seEfA,2614
323
323
  castor_extractor/warehouse/abstract/time_filter.py,sha256=bggIONfMmUxffkA6TwM3BsjfS2l9WFxPq8krfsau5pw,935
324
324
  castor_extractor/warehouse/abstract/time_filter_test.py,sha256=PIkegB7KOKBdpc6zIvmyl_CeQyADeFDplyQ8HTNU5LA,448
325
325
  castor_extractor/warehouse/bigquery/__init__.py,sha256=PCGNYdi7dHv-SyanUWzRuBp-ypuQ01PkDaQjVnaNhbM,170
326
- castor_extractor/warehouse/bigquery/client.py,sha256=bkvn-aPQGf0CiqGvMvFcVMOxMI6uhCNT9aSRkYeqScE,5595
326
+ castor_extractor/warehouse/bigquery/client.py,sha256=lPAn6WUwDq0rIPNaMOcabet8C4TYJ93EWZUxX72XrZc,5595
327
327
  castor_extractor/warehouse/bigquery/client_test.py,sha256=Ym8e4d--0YQwiVcNUnXLx0X-X6ZznwNMBMbMaDS5oEA,1514
328
328
  castor_extractor/warehouse/bigquery/credentials.py,sha256=oCZ8H7qpudKzwM7PRMpVAmWXt7bjIRa8Harmp-ysQJ4,425
329
329
  castor_extractor/warehouse/bigquery/extract.py,sha256=TAxpdwZ6kfSe7xv22vcFwAE3-Rr1VF9UnX0DM_IPdF8,2934
@@ -436,8 +436,8 @@ castor_extractor/warehouse/sqlserver/queries/table.sql,sha256=kbBQP-TdG5px1IVgyx
436
436
  castor_extractor/warehouse/sqlserver/queries/user.sql,sha256=gOrZsMVypusR2dc4vwVs4E1a-CliRsr_UjnD2EbXs-A,94
437
437
  castor_extractor/warehouse/sqlserver/query.py,sha256=g0hPT-RmeGi2DyenAi3o72cTlQsLToXIFYojqc8E5fQ,533
438
438
  castor_extractor/warehouse/synapse/queries/column.sql,sha256=lNcFoIW3Y0PFOqoOzJEXmPvZvfAsY0AP63Mu2LuPzPo,1351
439
- castor_extractor-0.22.5.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
440
- castor_extractor-0.22.5.dist-info/METADATA,sha256=11A9xI9Bd6Uu1Na_AJngfTbkt-ECXjsabWNTppaZsOk,22352
441
- castor_extractor-0.22.5.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
442
- castor_extractor-0.22.5.dist-info/entry_points.txt,sha256=7aVSxc-_2dicp28Ow-S4y0p4wGoTm9zGmVptMvfLdw8,1649
443
- castor_extractor-0.22.5.dist-info/RECORD,,
439
+ castor_extractor-0.23.1.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
440
+ castor_extractor-0.23.1.dist-info/METADATA,sha256=6yGEAuCwBKELYaRnIf8hZAXsJMOAlJqPlJiNYWhEmok,22546
441
+ castor_extractor-0.23.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
442
+ castor_extractor-0.23.1.dist-info/entry_points.txt,sha256=7aVSxc-_2dicp28Ow-S4y0p4wGoTm9zGmVptMvfLdw8,1649
443
+ castor_extractor-0.23.1.dist-info/RECORD,,