castor-extractor 0.12.0__py3-none-any.whl → 0.12.2__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.

Files changed (25) hide show
  1. CHANGELOG.md +8 -0
  2. castor_extractor/utils/__init__.py +7 -1
  3. castor_extractor/utils/client/__init__.py +4 -0
  4. castor_extractor/{warehouse/abstract/client.py → utils/client/abstract.py} +2 -2
  5. castor_extractor/{warehouse/postgres/client.py → utils/client/postgres.py} +2 -2
  6. castor_extractor/utils/client/query.py +6 -0
  7. castor_extractor/visualization/metabase/client/db/client.py +28 -45
  8. castor_extractor/visualization/metabase/client/db/credentials.py +12 -0
  9. castor_extractor/visualization/tableau/gql_fields.py +1 -1
  10. castor_extractor/warehouse/abstract/__init__.py +0 -1
  11. castor_extractor/warehouse/abstract/extract.py +9 -3
  12. castor_extractor/warehouse/bigquery/client.py +1 -2
  13. castor_extractor/warehouse/postgres/__init__.py +0 -1
  14. castor_extractor/warehouse/postgres/extract.py +1 -2
  15. castor_extractor/warehouse/redshift/client.py +1 -2
  16. castor_extractor/warehouse/redshift/client_test.py +1 -1
  17. castor_extractor/warehouse/snowflake/client.py +1 -2
  18. castor_extractor/warehouse/snowflake/client_test.py +1 -1
  19. castor_extractor/warehouse/sqlserver/client.py +1 -2
  20. {castor_extractor-0.12.0.dist-info → castor_extractor-0.12.2.dist-info}/METADATA +1 -1
  21. {castor_extractor-0.12.0.dist-info → castor_extractor-0.12.2.dist-info}/RECORD +25 -23
  22. /castor_extractor/utils/{uri.py → client/uri.py} +0 -0
  23. /castor_extractor/utils/{uri_test.py → client/uri_test.py} +0 -0
  24. {castor_extractor-0.12.0.dist-info → castor_extractor-0.12.2.dist-info}/WHEEL +0 -0
  25. {castor_extractor-0.12.0.dist-info → castor_extractor-0.12.2.dist-info}/entry_points.txt +0 -0
CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.2 - 2023-12-27
4
+
5
+ * Metabase: Align postgres connection to postgres connector
6
+
7
+ ## 0.12.1 - 2023-12-27
8
+
9
+ * Tableau: replace luid with id during dashboards extraction
10
+
3
11
  ## 0.12.0 - 2023-12-18
4
12
 
5
13
  * SQL Server: extract catalog
@@ -1,3 +1,10 @@
1
+ from .client import (
2
+ AbstractSourceClient,
3
+ ExtractionQuery,
4
+ PostgresClient,
5
+ SqlalchemyClient,
6
+ uri_encode,
7
+ )
1
8
  from .collection import group_by
2
9
  from .constants import OUTPUT_DIR
3
10
  from .deprecate import deprecate_python
@@ -26,7 +33,6 @@ from .time import (
26
33
  past_date,
27
34
  )
28
35
  from .type import Callback, Getter, JsonType, SerializedAsset
29
- from .uri import uri_encode
30
36
  from .validation import validate_baseurl
31
37
  from .write import (
32
38
  get_output_filename,
@@ -0,0 +1,4 @@
1
+ from .abstract import AbstractSourceClient, SqlalchemyClient
2
+ from .postgres import PostgresClient
3
+ from .query import ExtractionQuery
4
+ from .uri import uri_encode
@@ -7,7 +7,7 @@ from sqlalchemy.engine import Connection, ResultProxy, create_engine
7
7
  from .query import ExtractionQuery
8
8
 
9
9
 
10
- class AbstractWarehouseClient(ABC):
10
+ class AbstractSourceClient(ABC):
11
11
  """interface for the client to connect to the source"""
12
12
 
13
13
  def __init__(self, **credentials: dict):
@@ -26,7 +26,7 @@ class AbstractWarehouseClient(ABC):
26
26
  pass
27
27
 
28
28
 
29
- class SqlalchemyClient(AbstractWarehouseClient, ABC):
29
+ class SqlalchemyClient(AbstractSourceClient, ABC):
30
30
  def __init__(self, credentials: dict):
31
31
  super().__init__(**credentials)
32
32
  self._uri = self._build_uri(credentials)
@@ -1,5 +1,5 @@
1
- from ...utils import uri_encode
2
- from ..abstract import SqlalchemyClient
1
+ from .abstract import SqlalchemyClient
2
+ from .uri import uri_encode
3
3
 
4
4
  POSTGRES_URI = "postgresql://{user}:{password}@{host}:{port}/{database}"
5
5
 
@@ -0,0 +1,6 @@
1
+ class ExtractionQuery:
2
+ """contains both statement and parameters for the query"""
3
+
4
+ def __init__(self, statement: str, params: dict):
5
+ self.statement = statement
6
+ self.params = params
@@ -7,7 +7,12 @@ from sqlalchemy import create_engine
7
7
  from sqlalchemy.engine import Engine
8
8
  from sqlalchemy.exc import OperationalError
9
9
 
10
- from .....utils import SerializedAsset, from_env
10
+ from .....utils import (
11
+ ExtractionQuery,
12
+ PostgresClient,
13
+ SerializedAsset,
14
+ from_env,
15
+ )
11
16
  from ...assets import EXPORTED_FIELDS, MetabaseAsset
12
17
  from ...errors import EncryptionSecretKeyRequired, MetabaseLoginError
13
18
  from ..decryption import decrypt
@@ -18,8 +23,6 @@ logger = logging.getLogger(__name__)
18
23
 
19
24
  CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
20
25
 
21
- PG_URL = "postgresql://{user}:{password}@{host}:{port}/{database}"
22
- SSL_SUFFIX = "?sslmode=require"
23
26
  SQL_FILE_PATH = "queries/{name}.sql"
24
27
 
25
28
  ENCRYPTION_SECRET_KEY = "CASTOR_METABASE_ENCRYPTION_SECRET_KEY" # noqa: S105
@@ -33,56 +36,53 @@ def _optional_arg(args: dict, client_key: str, env_key: str) -> Optional[str]:
33
36
  return from_env(env_key, allow_missing=True)
34
37
 
35
38
 
36
- class DbClient:
39
+ class DbClient(PostgresClient):
37
40
  """
38
41
  Connect to Metabase Database and fetch main assets.
39
42
  """
40
43
 
44
+ @staticmethod
45
+ def name() -> str:
46
+ """return the name of the client"""
47
+ return "Metabase/DB"
48
+
49
+ def _engine_options(self, credentials: dict) -> dict:
50
+ sslmode = "require" if self.require_ssl else "prefer"
51
+ return {"connect_args": {"sslmode": sslmode}}
52
+
41
53
  def __init__(
42
54
  self,
43
55
  **kwargs,
44
56
  ):
45
- self._credentials = CredentialsDb(
46
- host=get_value(CredentialsDbKey.HOST, kwargs),
47
- port=get_value(CredentialsDbKey.PORT, kwargs),
48
- database=get_value(CredentialsDbKey.DATABASE, kwargs),
49
- schema=get_value(CredentialsDbKey.SCHEMA, kwargs),
50
- user=get_value(CredentialsDbKey.USER, kwargs),
51
- password=get_value(CredentialsDbKey.PASSWORD, kwargs),
52
- )
57
+ self._credentials = CredentialsDb.from_env(kwargs)
53
58
  self.encryption_secret_key = _optional_arg(
54
59
  kwargs, "encryption_secret_key", ENCRYPTION_SECRET_KEY
55
60
  )
56
61
  self.require_ssl = bool(
57
62
  _optional_arg(kwargs, "require_ssl", REQUIRE_SSL_KEY)
58
63
  )
59
- self._engine = self._login()
60
-
61
- def _url(self) -> str:
62
- url = PG_URL.format(**self._credentials.to_dict(hide=False))
63
- if self.require_ssl:
64
- url += SSL_SUFFIX
65
- return url
66
-
67
- def _login(self) -> Engine:
68
- url = self._url()
69
64
  try:
70
- engine = create_engine(url)
71
- engine.connect()
72
- return engine
65
+ super().__init__(self._credentials.to_dict())
73
66
  except OperationalError as err:
74
67
  raise MetabaseLoginError(
75
68
  credentials_info=self._credentials.to_dict(hide=True),
76
69
  error_details=err.args,
77
70
  )
78
71
 
79
- def _load_query(self, name: str) -> str:
72
+ def _load_query(self, name: str) -> ExtractionQuery:
80
73
  """load SQL text from file"""
81
74
  filename = SQL_FILE_PATH.format(name=name)
82
75
  path = os.path.join(CURRENT_DIR, filename)
83
76
  with open(path, "r") as f:
84
77
  content = f.read()
85
- return content.format(schema=self._credentials.schema)
78
+ statement = content.format(schema=self._credentials.schema)
79
+ return ExtractionQuery(statement=statement, params={})
80
+
81
+ def base_url(self) -> str:
82
+ """Fetches the `base_url` of the Metabase instance"""
83
+ query = self._load_query(name="base_url")
84
+ rows = list(self.execute(query))
85
+ return rows[0]["value"]
86
86
 
87
87
  def _database_specifics(
88
88
  self,
@@ -106,27 +106,10 @@ class DbClient:
106
106
 
107
107
  return databases
108
108
 
109
- @staticmethod
110
- def name() -> str:
111
- """return the name of the client"""
112
- return "Metabase/DB"
113
-
114
- def base_url(self) -> str:
115
- """Fetches the `base_url` of the Metabase instance"""
116
- query = self._load_query(name="base_url")
117
- result = self._engine.execute(query)
118
- return result.fetchone()["value"]
119
-
120
109
  def fetch(self, asset: MetabaseAsset) -> SerializedAsset:
121
110
  """fetches the given asset"""
122
111
  query = self._load_query(asset.value.lower())
123
- result = self._engine.execute(query)
124
-
125
- # convert row proxies into dictionaries
126
- assets = [
127
- {column: value for column, value in rowproxy.items()}
128
- for rowproxy in result
129
- ]
112
+ assets = list(self.execute(query))
130
113
 
131
114
  if asset == MetabaseAsset.DATABASE:
132
115
  assets = self._database_specifics(assets)
@@ -52,6 +52,18 @@ class CredentialsDb:
52
52
  self.user = user
53
53
  self.password = password
54
54
 
55
+ @classmethod
56
+ def from_env(cls, env: dict) -> "CredentialsDb":
57
+ """returns a new CredentialsDb with values from ENV"""
58
+ return CredentialsDb(
59
+ host=get_value(CredentialsDbKey.HOST, env),
60
+ port=get_value(CredentialsDbKey.PORT, env),
61
+ database=get_value(CredentialsDbKey.DATABASE, env),
62
+ schema=get_value(CredentialsDbKey.SCHEMA, env),
63
+ user=get_value(CredentialsDbKey.USER, env),
64
+ password=get_value(CredentialsDbKey.PASSWORD, env),
65
+ )
66
+
55
67
  def to_dict(self, hide: bool = False) -> Dict[str, str]:
56
68
  safe = (
57
69
  CredentialsDbKey.HOST,
@@ -111,7 +111,7 @@ class GQLQueryFields(Enum):
111
111
  """
112
112
 
113
113
  DASHBOARDS: str = """
114
- luid
114
+ id
115
115
  name
116
116
  path
117
117
  tags {
@@ -6,7 +6,6 @@ from .asset import (
6
6
  WarehouseAsset,
7
7
  WarehouseAssetGroup,
8
8
  )
9
- from .client import AbstractWarehouseClient, SqlalchemyClient
10
9
  from .extract import ExtractionProcessor, common_args
11
10
  from .query import (
12
11
  QUERIES_DIR,
@@ -2,9 +2,15 @@ import logging
2
2
  from itertools import chain
3
3
  from typing import Callable, Iterator, List, Optional, Tuple
4
4
 
5
- from ...utils import OUTPUT_DIR, AbstractStorage, SafeMode, from_env, safe_mode
5
+ from ...utils import (
6
+ OUTPUT_DIR,
7
+ AbstractSourceClient,
8
+ AbstractStorage,
9
+ SafeMode,
10
+ from_env,
11
+ safe_mode,
12
+ )
6
13
  from .asset import WarehouseAsset
7
- from .client import AbstractWarehouseClient
8
14
  from .query import AbstractQueryBuilder, ExtractionQuery
9
15
 
10
16
  logger = logging.getLogger(__name__)
@@ -22,7 +28,7 @@ class ExtractionProcessor:
22
28
 
23
29
  def __init__(
24
30
  self,
25
- client: AbstractWarehouseClient,
31
+ client: AbstractSourceClient,
26
32
  query_builder: AbstractQueryBuilder,
27
33
  storage: AbstractStorage,
28
34
  safe_mode: Optional[SafeMode] = None,
@@ -7,8 +7,7 @@ from google.cloud.bigquery import Client as GoogleCloudClient # type: ignore
7
7
  from google.cloud.bigquery.dataset import Dataset # type: ignore
8
8
  from google.oauth2.service_account import Credentials # type: ignore
9
9
 
10
- from ...utils import retry
11
- from ..abstract import SqlalchemyClient
10
+ from ...utils import SqlalchemyClient, retry
12
11
 
13
12
  logger = logging.getLogger(__name__)
14
13
 
@@ -1,3 +1,2 @@
1
- from .client import PostgresClient
2
1
  from .extract import POSTGRES_ASSETS, extract_all
3
2
  from .query import PostgresQueryBuilder
@@ -1,7 +1,7 @@
1
1
  import logging
2
2
  from collections import OrderedDict
3
3
 
4
- from ...utils import LocalStorage, from_env, write_summary
4
+ from ...utils import LocalStorage, PostgresClient, from_env, write_summary
5
5
  from ..abstract import (
6
6
  CATALOG_ASSETS,
7
7
  ExtractionProcessor,
@@ -10,7 +10,6 @@ from ..abstract import (
10
10
  WarehouseAssetGroup,
11
11
  common_args,
12
12
  )
13
- from .client import PostgresClient
14
13
  from .query import PostgresQueryBuilder
15
14
 
16
15
  logger = logging.getLogger(__name__)
@@ -4,8 +4,7 @@ from typing import Iterator
4
4
  from psycopg2 import extensions # type: ignore
5
5
  from sqlalchemy.engine import Connection, ResultProxy
6
6
 
7
- from ...utils import decode_when_bytes, uri_encode
8
- from ..abstract import SqlalchemyClient
7
+ from ...utils import SqlalchemyClient, decode_when_bytes, uri_encode
9
8
 
10
9
  REDSHIFT_URI = "redshift+psycopg2://{user}:{password}@{host}:{port}/{database}"
11
10
 
@@ -15,7 +15,7 @@ def fake_execute(statement: str, params: dict):
15
15
 
16
16
  @patch.object(RedshiftClient, "_build_uri")
17
17
  @patch.object(RedshiftClient, "_engine_options")
18
- @patch(f"{CASTOR_EXTRACTOR_PATH}.warehouse.abstract.client.create_engine")
18
+ @patch(f"{CASTOR_EXTRACTOR_PATH}.utils.client.abstract.create_engine")
19
19
  @patch.object(RedshiftClient, "close")
20
20
  @patch.object(RedshiftClient, "connect")
21
21
  def test_redshift_client_execute(
@@ -7,8 +7,7 @@ from cryptography.hazmat.backends import default_backend
7
7
  from cryptography.hazmat.primitives import serialization
8
8
  from sqlalchemy.engine import Connection
9
9
 
10
- from ...utils import to_string_array, uri_encode
11
- from ..abstract import SqlalchemyClient
10
+ from ...utils import SqlalchemyClient, to_string_array, uri_encode
12
11
 
13
12
  SNOWFLAKE_URI = "snowflake://{user}:{password}@{account}/?application=castor"
14
13
  PK_URI = "snowflake://{user}:@{account}/?application=castor"
@@ -2,7 +2,7 @@
2
2
 
3
3
  from unittest.mock import patch
4
4
 
5
- from ..abstract import SqlalchemyClient
5
+ from ...utils import SqlalchemyClient
6
6
  from .client import SnowflakeClient, _scalar
7
7
 
8
8
 
@@ -3,8 +3,7 @@ from typing import Iterator
3
3
  import pymssql # type: ignore
4
4
  from sqlalchemy import text
5
5
 
6
- from ...utils import uri_encode
7
- from ..abstract import ExtractionQuery, SqlalchemyClient
6
+ from ...utils import ExtractionQuery, SqlalchemyClient, uri_encode
8
7
 
9
8
  SERVER_URI = "{user}:{password}@{host}:{port}/{database}"
10
9
  MSSQL_URI = f"mssql+pymssql://{SERVER_URI}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: castor-extractor
3
- Version: 0.12.0
3
+ Version: 0.12.2
4
4
  Summary: Extract your metadata assets.
5
5
  Home-page: https://www.castordoc.com/
6
6
  License: EULA
@@ -1,4 +1,4 @@
1
- CHANGELOG.md,sha256=ZnaAPHiO73zCG8sV5bRU6RSmd38BHeg85pnkZXlVpb8,7815
1
+ CHANGELOG.md,sha256=4HnkKvQi75tOjZa0k1rj_gYzaaMpJiHk7B6MbSvlGSs,7986
2
2
  Dockerfile,sha256=TC6hFjG3mvnt1nkw2EpaS42hRYaGA2YIPKgWhVSKTWc,303
3
3
  LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
4
4
  README.md,sha256=EL6JpZxvaQFOYv5WFuSjZvSk9Hcpsf7alMlUC5IPFjA,3423
@@ -47,7 +47,13 @@ castor_extractor/uploader/env_test.py,sha256=ClCWWtwd2N-5ClIDUxVMeKkWfhhOTxpppsX
47
47
  castor_extractor/uploader/upload.py,sha256=5Aj3UOx8cpSVvzjYRz7S6nLk249IqUiCia70utU_970,3363
48
48
  castor_extractor/uploader/upload_test.py,sha256=BfGjAYEEDBmEcUS6_b3SlKyiQNR1iRf6-qmADDirTJI,328
49
49
  castor_extractor/uploader/utils.py,sha256=NCe0tkB28BVhqzOaDhDjaSfODjjcPWB17X6chnvyCWs,478
50
- castor_extractor/utils/__init__.py,sha256=_mGJy7amJr1Vv3kBY3HS_lbMKmE3ZaN-WDN3Y-4S4Ug,1032
50
+ castor_extractor/utils/__init__.py,sha256=456PxaVAicXbHLr92AIke9khesohkSlWeDMIj5x-HUs,1133
51
+ castor_extractor/utils/client/__init__.py,sha256=CRE-xJKm6fVV9dB8ljzB5YoOxX4I1sCD1KSgqs3Y8_Y,161
52
+ castor_extractor/utils/client/abstract.py,sha256=AS5P7yH4GeGFlHY3m_GR5uy7sH_Jg_jpkfxD2qurOu8,2064
53
+ castor_extractor/utils/client/postgres.py,sha256=n6ulaT222WWPY0_6qAZ0MHF0m91HtI9mMqL71nyygo0,866
54
+ castor_extractor/utils/client/query.py,sha256=O6D5EjD1KmBlwa786Uw4D4kzxx97_HH50xIIeSWt0B8,205
55
+ castor_extractor/utils/client/uri.py,sha256=jmP9hY-6PRqdc3-vAOdtll_U6q9VCqSqmBAN6QRs3ZI,150
56
+ castor_extractor/utils/client/uri_test.py,sha256=1XKF6qSseCeD4G4ckaNO07JXfGbt7XUVinOZdpEYrDQ,259
51
57
  castor_extractor/utils/collection.py,sha256=uenJvfamphxV5ZFt12BgfsRs99pWffYJIMjAD_Laz2Q,417
52
58
  castor_extractor/utils/constants.py,sha256=qBQprS9U66mS-RIBXiLujdTSV3WvGv40Bc0khP4Abdk,39
53
59
  castor_extractor/utils/deprecate.py,sha256=_uzQiwHiz2yEqQeNMmzvVmBY46IgBhhEbGPhTrVjZU4,817
@@ -74,8 +80,6 @@ castor_extractor/utils/string_test.py,sha256=OmRVCJUXMcCTwY-QJDhUViYpxkvQQgNRJLC
74
80
  castor_extractor/utils/time.py,sha256=kUlvWrteGgVu550QcGDQ1kzxQRGzuL8jliFLTUv3tlU,1062
75
81
  castor_extractor/utils/time_test.py,sha256=6xUhPxXZCj_Y5TDO2Ez4DmEm3YiPeRx8ELTnaGUdrk8,168
76
82
  castor_extractor/utils/type.py,sha256=87t32cTctEjX-_BqZLtPLWu-M9OVvw_lFU4DbaQ6V0U,313
77
- castor_extractor/utils/uri.py,sha256=jmP9hY-6PRqdc3-vAOdtll_U6q9VCqSqmBAN6QRs3ZI,150
78
- castor_extractor/utils/uri_test.py,sha256=1XKF6qSseCeD4G4ckaNO07JXfGbt7XUVinOZdpEYrDQ,259
79
83
  castor_extractor/utils/validation.py,sha256=Q1x8ZEN5K4tVhWhWs7IlTVRn-KXi-x_xdiojbDizG-c,1913
80
84
  castor_extractor/utils/validation_test.py,sha256=aSetitOCkH_K-Wto9ISOVGso5jGfTUOBLm3AZnvavO8,1181
81
85
  castor_extractor/utils/write.py,sha256=CbLMz-mkUFduwogERwe69GXXVO65HEDirVm-kDJkRxg,2135
@@ -114,8 +118,8 @@ castor_extractor/visualization/metabase/client/api/__init__.py,sha256=bWs7daLw2N
114
118
  castor_extractor/visualization/metabase/client/api/client.py,sha256=2Pfy4N1tX2TaSJ__yuykXqPSLfq0er6TFXWPY7yAnHU,5622
115
119
  castor_extractor/visualization/metabase/client/api/credentials.py,sha256=hVj3Gxa99Al_p_rg6xHuWwDkfjddIvy4ZCnwAyx5vh8,1348
116
120
  castor_extractor/visualization/metabase/client/db/__init__.py,sha256=xmqEI59hvioLxE8LXcH4_njCrBy8_3QjIrZNb6bW6Rs,29
117
- castor_extractor/visualization/metabase/client/db/client.py,sha256=ZZGADIHYoS5ZPTEPj0r1KZqVvQ9ND3rLP75Pk_-vw9Q,4682
118
- castor_extractor/visualization/metabase/client/db/credentials.py,sha256=WSoALbUO9l6PU3didg3bsl6rPcKfAbH3RvzlnyMYJcQ,1891
121
+ castor_extractor/visualization/metabase/client/db/client.py,sha256=csd7bD7Kxh9rHCcT12Ss9SrAygAjf-Ik66ATBxXMs6M,4041
122
+ castor_extractor/visualization/metabase/client/db/credentials.py,sha256=oJ33ECQ8-658bzue0wq-9QggVOeOXMAQMt-Wzj5EJi4,2421
119
123
  castor_extractor/visualization/metabase/client/db/queries/.sqlfluff,sha256=sOQQOpAa9QMj9cBlulfmt-DZ_kQzMpzSAEnh10QGSB0,76
120
124
  castor_extractor/visualization/metabase/client/db/queries/base_url.sql,sha256=p2EL9kdt-hw_yh3aeCE91AXEB4RrYAbG2QrBBNqQjDE,79
121
125
  castor_extractor/visualization/metabase/client/db/queries/card.sql,sha256=U4-ZrZP5XS7Kssd3CFlpGrABbHAMK09Bh_yeT3z7Yk8,419
@@ -190,7 +194,7 @@ castor_extractor/visualization/tableau/client/safe_mode.py,sha256=MF_PTfR3oAA255
190
194
  castor_extractor/visualization/tableau/constants.py,sha256=O2CqeviFz122BumNHoJ1N-e1lzyqIHF9OYnGQttg4hg,126
191
195
  castor_extractor/visualization/tableau/errors.py,sha256=WWvmnp5pdxFJqanPKeDRADZc0URSPxkJqxDI6bwoifQ,91
192
196
  castor_extractor/visualization/tableau/extract.py,sha256=tCa5g1_RyhS7OeeEMhLJReMIYfQCF1cwHt8KbZoHFyI,3040
193
- castor_extractor/visualization/tableau/gql_fields.py,sha256=q2LPKBkshRuXenw1UvT3DGuvxIVbU3aFQDGzRcI64zY,5043
197
+ castor_extractor/visualization/tableau/gql_fields.py,sha256=leyE_z723sZzFX_tt1O6YZr_coffxH76QI_3bb9qdNo,5041
194
198
  castor_extractor/visualization/tableau/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
199
  castor_extractor/visualization/tableau/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
196
200
  castor_extractor/visualization/tableau/tests/unit/assets/graphql/metadata/metadata_1_get.json,sha256=4iMvJ_VakDa67xN2ROraAccaz_DDxX6Y5Y1XnTU5F5Y,446
@@ -215,15 +219,14 @@ castor_extractor/visualization/tableau/tsc_fields.py,sha256=BoV6XVu-HUan9hxeYRbv
215
219
  castor_extractor/visualization/tableau/types.py,sha256=_T3fahMHRkV2TVaYcjITh61T0FLzSBYKD21VurzkF5M,322
216
220
  castor_extractor/visualization/tableau/usage.py,sha256=LlFwlbEr-EnYUJjKZha99CRCRrERJ350oAvzBQlp9_s,427
217
221
  castor_extractor/warehouse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
218
- castor_extractor/warehouse/abstract/__init__.py,sha256=vyyZaByx8YeZMfvvPknEvHtDEO6_NDzBmc-WOxwSIjE,366
222
+ castor_extractor/warehouse/abstract/__init__.py,sha256=p7cRfBNFt5ohw73c5rz4sTnjYKG_gI90mMeRTft1ET8,304
219
223
  castor_extractor/warehouse/abstract/asset.py,sha256=vf7IRfXYWD3660AXQe9VLQ-O1xLdqIJiDT-uAVBWRdE,1278
220
- castor_extractor/warehouse/abstract/client.py,sha256=HbVPLj0xiG2N885PyxUYJa4HS4oI11-F9wFgSVf0G48,2070
221
- castor_extractor/warehouse/abstract/extract.py,sha256=gIQPZi9M6cji_klvYO4DDsQMTfK-liHVjCVKt54XafE,2901
224
+ castor_extractor/warehouse/abstract/extract.py,sha256=52-XVEgSN9mcz29r03NVWU0sDg05nPAP-XcH6IuEbTQ,2905
222
225
  castor_extractor/warehouse/abstract/query.py,sha256=GAgeISCmAdrkTKzFGO79hQDf6SA6EFrrlW43w-LiXKo,2632
223
226
  castor_extractor/warehouse/abstract/time_filter.py,sha256=bggIONfMmUxffkA6TwM3BsjfS2l9WFxPq8krfsau5pw,935
224
227
  castor_extractor/warehouse/abstract/time_filter_test.py,sha256=PIkegB7KOKBdpc6zIvmyl_CeQyADeFDplyQ8HTNU5LA,448
225
228
  castor_extractor/warehouse/bigquery/__init__.py,sha256=cQTw-nkKg3CQemgufknJHPssvUWCPURTMVb6q5hiIcs,125
226
- castor_extractor/warehouse/bigquery/client.py,sha256=ldMa7JoSS1RTrnAtKVHG9eUAhYHaQF6T8H1-ZgvKVAs,4370
229
+ castor_extractor/warehouse/bigquery/client.py,sha256=8a94Lmj2LIC-gwLHCIkxROQMZnpH9EdZ-PFmFFybvEQ,4348
227
230
  castor_extractor/warehouse/bigquery/client_test.py,sha256=Ym8e4d--0YQwiVcNUnXLx0X-X6ZznwNMBMbMaDS5oEA,1514
228
231
  castor_extractor/warehouse/bigquery/extract.py,sha256=jo_9sxsCFl0ZaL1VdQ9JZ5iEEGJQVm_ogJhfpmVgT3k,2810
229
232
  castor_extractor/warehouse/bigquery/queries/.sqlfluff,sha256=ce8UDW2k39v6RBVxgKqjOHHYMoGN9S9f7BCZNHHhox8,30
@@ -238,9 +241,8 @@ castor_extractor/warehouse/bigquery/queries/user.sql,sha256=bE4pSoVv8AujDupx-z9c
238
241
  castor_extractor/warehouse/bigquery/queries/view_ddl.sql,sha256=obCm-IN9V8_YSZTwcgNSBDD0ZXPgRjlxJjrZDSEH2MU,326
239
242
  castor_extractor/warehouse/bigquery/query.py,sha256=hrFfjd5jW2oQnZ6ozlkn-gDe6sCIzu5zSX19T9W6fIk,4162
240
243
  castor_extractor/warehouse/bigquery/types.py,sha256=LZVWSmE57lOemNbB5hBRyYmDk9bFAU4nbRaJWALl6N8,140
241
- castor_extractor/warehouse/postgres/__init__.py,sha256=Yb1G_u5JgNB4ROuK8-PSe0THo94Su-FL_gOrPI1hkK0,125
242
- castor_extractor/warehouse/postgres/client.py,sha256=RzYnR9AFo46ljjrYL9IpAH8OmLEzQ52ZyteYAHy5ZGM,871
243
- castor_extractor/warehouse/postgres/extract.py,sha256=gmTpS-uqhx5mrAXRi6yVj263L2oUCpplX6CCf383wQU,2131
244
+ castor_extractor/warehouse/postgres/__init__.py,sha256=k18laeV6G7pg9rxTCoFVusP03NoFYRpSUJRoFu7h-nY,90
245
+ castor_extractor/warehouse/postgres/extract.py,sha256=lFhrsPKPkds0hCGR1ILZnt7YeM3JUPPiyk-MdlB3wZY,2112
244
246
  castor_extractor/warehouse/postgres/queries/.sqlfluff,sha256=Z7nq1jdnKxpOKpKTpJIyCCd5zxaxWtQwlpVTzaJq7m4,30
245
247
  castor_extractor/warehouse/postgres/queries/column.sql,sha256=N7UzWK0aslvoaXQritSf-EE7h8fpadT4AYFaCwfMo9s,1632
246
248
  castor_extractor/warehouse/postgres/queries/database.sql,sha256=GRM-CHI3EGCjpEEvgzdefLhV74EPTqCOCaud0S1Rv_E,241
@@ -250,8 +252,8 @@ castor_extractor/warehouse/postgres/queries/table.sql,sha256=ok9IGlX8b2v8AETpgG9
250
252
  castor_extractor/warehouse/postgres/queries/user.sql,sha256=sEXveJAuNvZacvpI6WfwsX6VavoMb2VqYA32f6Dt-_Y,170
251
253
  castor_extractor/warehouse/postgres/query.py,sha256=5QmI79BP_EjqxeABNg56rxuM9XuuXHuFFzCk6svnFEw,540
252
254
  castor_extractor/warehouse/redshift/__init__.py,sha256=CC82SejYDlwYhZhhn40ln-oTsRx7AJ1Km61cxPkymjE,125
253
- castor_extractor/warehouse/redshift/client.py,sha256=FZU6Xy1Ecq_AKouwQiVsfhRKrkbtJ0c1cvxMOq6NdfI,2194
254
- castor_extractor/warehouse/redshift/client_test.py,sha256=yVFNfdq982GTL0lDLkntEj5LPRswnNMcoJwxzPdFDWY,1027
255
+ castor_extractor/warehouse/redshift/client.py,sha256=My7003HGBhTpS6X5NgYcKwntR7h45scLaGr-LSY0tIc,2172
256
+ castor_extractor/warehouse/redshift/client_test.py,sha256=74lZfna71qs80EKAuitJ8_ZjAGtpYHf5tChySinVPoQ,1023
255
257
  castor_extractor/warehouse/redshift/extract.py,sha256=3TJ_AkLk1ml578HkgMc2wxwAzmkjidioy7dnm8MPdMM,2270
256
258
  castor_extractor/warehouse/redshift/queries/.sqlfluff,sha256=W4pFQiY8KMtXwn3WguYQJA8cj78VR7K-iokPoZoy5aM,30
257
259
  castor_extractor/warehouse/redshift/queries/column.sql,sha256=VLmt8yfILajepv5ZEOyinA4101eZKHr1Mew4f2DqDk0,7044
@@ -265,8 +267,8 @@ castor_extractor/warehouse/redshift/queries/user.sql,sha256=sEXveJAuNvZacvpI6Wfw
265
267
  castor_extractor/warehouse/redshift/queries/view_ddl.sql,sha256=Pkyh_QT6d4rhTeyiVcqw6O8CRl7NEhk2p7eM5YIn5kg,719
266
268
  castor_extractor/warehouse/redshift/query.py,sha256=0C81rkt2cpkWrJIxxwALDyqr-49vlqQM04y_N6wwStc,540
267
269
  castor_extractor/warehouse/snowflake/__init__.py,sha256=G4PGCtcpNaf33sKcT_ypAITI0zu8NxQhAeBmfL05LZg,128
268
- castor_extractor/warehouse/snowflake/client.py,sha256=LIZrA5CvG1NwLrmlj8OhCcWQzy0Um20zJPj2BQQE2hY,5152
269
- castor_extractor/warehouse/snowflake/client_test.py,sha256=ScE1a7Py7nO1cEcblixfzWD-nmscdZwC7z3oPRcbGvA,1435
270
+ castor_extractor/warehouse/snowflake/client.py,sha256=jaCu0QrWS4sxn1lL7na711drmOvE9TSf8ZnX7IKjqSQ,5130
271
+ castor_extractor/warehouse/snowflake/client_test.py,sha256=dRT5wdY2cI1vdRb7811skUdHh429nL9SyosQU1ZGfAI,1433
270
272
  castor_extractor/warehouse/snowflake/extract.py,sha256=n6v-KpakPCuFFakvbi7u9aQqvERGEk_XYYubekM0Q_s,2833
271
273
  castor_extractor/warehouse/snowflake/queries/.sqlfluff,sha256=vttrwcr64JVIuvc7WIg9C54cbOkjg_VjXNR7YnTGOPE,31
272
274
  castor_extractor/warehouse/snowflake/queries/column.sql,sha256=pAW2UNnut0a483OY2rjOXCdCtQg0g254g61Bt51CIB4,1803
@@ -282,7 +284,7 @@ castor_extractor/warehouse/snowflake/queries/user.sql,sha256=88V8eRj1NDaD_ufclsK
282
284
  castor_extractor/warehouse/snowflake/queries/view_ddl.sql,sha256=eWsci_50cxiYIv3N7BKkbXVM3RoIzqSDtohqRnE5kg4,673
283
285
  castor_extractor/warehouse/snowflake/query.py,sha256=yDpG4e23xtjEfAKNSAgL9wx17ChFSlvAbig2mJ5ZEC0,1769
284
286
  castor_extractor/warehouse/sqlserver/__init__.py,sha256=PdOuYznmvKAbfWAm8UdN47MfEsd9jqPi_dDi3WEo1KY,116
285
- castor_extractor/warehouse/sqlserver/client.py,sha256=1eoQZdnPKHbhzOTvOzxyaVZNelLyTxwmyyZE_BhhYaQ,1645
287
+ castor_extractor/warehouse/sqlserver/client.py,sha256=8jMmyoTc791GExNl0TQje2B8NtP9SkAIBigIjfAM_hg,1623
286
288
  castor_extractor/warehouse/sqlserver/extract.py,sha256=GVmwYNGU7rNJGeZZBhh6THJ1EMwnIkHGuVACc28-ezk,2006
287
289
  castor_extractor/warehouse/sqlserver/queries/.sqlfluff,sha256=yy0KQdz8I_67vnXyX8eeWwOWkxTXvHyVKSVwhURktd8,48
288
290
  castor_extractor/warehouse/sqlserver/queries/column.sql,sha256=Szdf8hwcDffRTgtD6zf4ZuIyHIVijFgSDk1rZbKI3g8,2480
@@ -301,7 +303,7 @@ castor_extractor/warehouse/synapse/queries/schema.sql,sha256=aX9xNrBD_ydwl-znGSF
301
303
  castor_extractor/warehouse/synapse/queries/table.sql,sha256=mCE8bR1Vb7j7SwZW2gafcXidQ2fo1HwxcybA8wP2Kfs,1049
302
304
  castor_extractor/warehouse/synapse/queries/user.sql,sha256=sTb_SS7Zj3AXW1SggKPLNMCd0qoTpL7XI_BJRMaEpBg,67
303
305
  castor_extractor/warehouse/synapse/queries/view_ddl.sql,sha256=3EVbp5_yTgdByHFIPLHmnoOnqqLE77SrjAwFDvu4e54,249
304
- castor_extractor-0.12.0.dist-info/METADATA,sha256=WmaE_Oibue89TvToT6-QWQWlEtgczBPgy1NrxqKtDSk,6034
305
- castor_extractor-0.12.0.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
306
- castor_extractor-0.12.0.dist-info/entry_points.txt,sha256=o9J7c2_FLIxVIgy0WU3eUfHQqbRAfL-0-_wtqHibwLc,1119
307
- castor_extractor-0.12.0.dist-info/RECORD,,
306
+ castor_extractor-0.12.2.dist-info/METADATA,sha256=LzaD2xYqkzhTHpyxpNb7ykoMqFmM2qWhlnK0flUO7zk,6034
307
+ castor_extractor-0.12.2.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
308
+ castor_extractor-0.12.2.dist-info/entry_points.txt,sha256=o9J7c2_FLIxVIgy0WU3eUfHQqbRAfL-0-_wtqHibwLc,1119
309
+ castor_extractor-0.12.2.dist-info/RECORD,,
File without changes