castor-extractor 0.25.2__py3-none-any.whl → 0.25.6__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 +16 -0
- castor_extractor/commands/extract_powerbi.py +6 -2
- castor_extractor/utils/client/abstract.py +11 -0
- castor_extractor/utils/client/api/pagination.py +1 -1
- castor_extractor/visualization/powerbi/client/credentials.py +10 -2
- castor_extractor/visualization/sigma/client/sources_transformer.py +29 -10
- castor_extractor/warehouse/abstract/extract.py +1 -0
- castor_extractor/warehouse/abstract/query.py +13 -2
- castor_extractor/warehouse/snowflake/extract.py +1 -6
- castor_extractor/warehouse/sqlserver/client.py +14 -1
- castor_extractor/warehouse/sqlserver/query.py +7 -6
- {castor_extractor-0.25.2.dist-info → castor_extractor-0.25.6.dist-info}/METADATA +17 -1
- {castor_extractor-0.25.2.dist-info → castor_extractor-0.25.6.dist-info}/RECORD +16 -19
- castor_extractor/warehouse/snowflake/queries/grant_to_role.sql +0 -14
- castor_extractor/warehouse/snowflake/queries/grant_to_user.sql +0 -8
- castor_extractor/warehouse/snowflake/queries/role.sql +0 -6
- {castor_extractor-0.25.2.dist-info → castor_extractor-0.25.6.dist-info}/LICENCE +0 -0
- {castor_extractor-0.25.2.dist-info → castor_extractor-0.25.6.dist-info}/WHEEL +0 -0
- {castor_extractor-0.25.2.dist-info → castor_extractor-0.25.6.dist-info}/entry_points.txt +0 -0
CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.25.6 - 2025-10-06
|
|
4
|
+
|
|
5
|
+
* PowerBi: Support additional authentication methods
|
|
6
|
+
|
|
7
|
+
## 0.25.5 - 2025-10-06
|
|
8
|
+
|
|
9
|
+
* Snowflake: remove extraction of roles and grants
|
|
10
|
+
|
|
11
|
+
## 0.25.4 - 2025-10-02
|
|
12
|
+
|
|
13
|
+
* SqlServer: switch database to support clients running their instance on Azure
|
|
14
|
+
|
|
15
|
+
## 0.25.3 - 2025-10-01
|
|
16
|
+
|
|
17
|
+
* Sigma: sleep between sources requests to avoid rate limit errors
|
|
18
|
+
|
|
3
19
|
## 0.25.2 - 2025-09-30
|
|
4
20
|
|
|
5
21
|
* PowerBi: Support auth with private_key
|
|
@@ -21,8 +21,12 @@ def main():
|
|
|
21
21
|
auth_group.add_argument(
|
|
22
22
|
"-cert",
|
|
23
23
|
"--certificate",
|
|
24
|
-
help=
|
|
25
|
-
|
|
24
|
+
help=(
|
|
25
|
+
"Path to certificate file for authentication. "
|
|
26
|
+
"Accepts: X.509 certificates (.pem, .crt), "
|
|
27
|
+
"PKCS#12 files (.p12, .pfx), or JSON files containing "
|
|
28
|
+
"certificate data or custom authentication secrets."
|
|
29
|
+
),
|
|
26
30
|
)
|
|
27
31
|
parser.add_argument(
|
|
28
32
|
"-sc",
|
|
@@ -26,6 +26,17 @@ class AbstractSourceClient(ABC):
|
|
|
26
26
|
def execute(self, query: ExtractionQuery) -> Iterator[dict]:
|
|
27
27
|
pass
|
|
28
28
|
|
|
29
|
+
def set_database(self, database: Optional[str]) -> None:
|
|
30
|
+
"""
|
|
31
|
+
Set the active database for this client.
|
|
32
|
+
|
|
33
|
+
Some source technologies require establishing a new connection
|
|
34
|
+
or using a different connection URI when switching databases.
|
|
35
|
+
|
|
36
|
+
Default behaviour is to do nothing.
|
|
37
|
+
"""
|
|
38
|
+
pass
|
|
39
|
+
|
|
29
40
|
|
|
30
41
|
class SqlalchemyClient(AbstractSourceClient, ABC):
|
|
31
42
|
def __init__(self, credentials: dict):
|
|
@@ -58,7 +58,7 @@ class PaginationModel(BaseModel):
|
|
|
58
58
|
def fetch_all_pages(
|
|
59
59
|
request: Callable,
|
|
60
60
|
pagination_model: type[PaginationModel],
|
|
61
|
-
rate_limit: Optional[
|
|
61
|
+
rate_limit: Optional[float] = None,
|
|
62
62
|
) -> Iterator:
|
|
63
63
|
"""
|
|
64
64
|
Method to return all results of a Paginated API based on the
|
|
@@ -11,9 +11,17 @@ REST_API_BASE_PATH = "https://api.powerbi.com/v1.0/myorg"
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class PowerbiCertificate(BaseModel):
|
|
14
|
+
"""
|
|
15
|
+
Supports all dict credentials formats supported by PowerBI
|
|
16
|
+
https://learn.microsoft.com/en-us/python/api/msal/msal.application.confidentialclientapplication
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
client_assertion: Optional[str] = None
|
|
20
|
+
passphrase: Optional[str] = None
|
|
21
|
+
private_key: Optional[str] = None
|
|
22
|
+
private_key_pfx_path: Optional[str] = None
|
|
14
23
|
public_certificate: Optional[str] = None
|
|
15
|
-
|
|
16
|
-
thumbprint: str
|
|
24
|
+
thumbprint: Optional[str] = None
|
|
17
25
|
|
|
18
26
|
|
|
19
27
|
class PowerbiCredentials(BaseSettings):
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from http import HTTPStatus
|
|
3
|
+
from time import sleep
|
|
3
4
|
from typing import TYPE_CHECKING, Callable, Iterator
|
|
4
5
|
|
|
5
6
|
from ....utils import fetch_all_pages, retry_request
|
|
@@ -13,6 +14,7 @@ logger = logging.getLogger(__name__)
|
|
|
13
14
|
|
|
14
15
|
SIGMA_CONNECTION_PATH_MAX_RETRY = 1
|
|
15
16
|
SIGMA_CONNECTION_PATH_SLEEP_MS = 30_000 # 30 seconds
|
|
17
|
+
SIGMA_SOURCES_SLEEP_MS = 2 / 1000 # 0.2 seconds
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
class SigmaSourcesTransformer:
|
|
@@ -84,6 +86,29 @@ class SigmaSourcesTransformer:
|
|
|
84
86
|
"sources": enhanced_sources,
|
|
85
87
|
}
|
|
86
88
|
|
|
89
|
+
def _fetch_asset_sources(
|
|
90
|
+
self,
|
|
91
|
+
asset_id: str,
|
|
92
|
+
endpoint: Callable[[str], str],
|
|
93
|
+
with_pagination: bool,
|
|
94
|
+
) -> dict:
|
|
95
|
+
"""Fetches sources for a single asset."""
|
|
96
|
+
endpoint_url = endpoint(asset_id)
|
|
97
|
+
|
|
98
|
+
if with_pagination:
|
|
99
|
+
request = self.api_client._get_paginated(endpoint=endpoint_url)
|
|
100
|
+
pages_generator = fetch_all_pages(
|
|
101
|
+
request=request,
|
|
102
|
+
pagination_model=SigmaTokenPagination,
|
|
103
|
+
rate_limit=SIGMA_SOURCES_SLEEP_MS,
|
|
104
|
+
)
|
|
105
|
+
sources = list(pages_generator)
|
|
106
|
+
else:
|
|
107
|
+
sources = self.api_client._get(endpoint=endpoint_url)
|
|
108
|
+
sleep(SIGMA_SOURCES_SLEEP_MS)
|
|
109
|
+
|
|
110
|
+
return {"asset_id": asset_id, "sources": sources}
|
|
111
|
+
|
|
87
112
|
def _get_all_sources(
|
|
88
113
|
self,
|
|
89
114
|
endpoint: Callable[[str], str],
|
|
@@ -91,16 +116,10 @@ class SigmaSourcesTransformer:
|
|
|
91
116
|
with_pagination: bool = False,
|
|
92
117
|
) -> Iterator[dict]:
|
|
93
118
|
"""Returns transformed sources for the given assets"""
|
|
94
|
-
all_sources = [
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if with_pagination:
|
|
99
|
-
request = self.api_client._get_paginated(endpoint=endpoint_url)
|
|
100
|
-
sources = list(fetch_all_pages(request, SigmaTokenPagination))
|
|
101
|
-
else:
|
|
102
|
-
sources = self.api_client._get(endpoint=endpoint_url)
|
|
103
|
-
all_sources.append({"asset_id": asset_id, "sources": sources})
|
|
119
|
+
all_sources = [
|
|
120
|
+
self._fetch_asset_sources(asset_id, endpoint, with_pagination)
|
|
121
|
+
for asset_id in asset_ids
|
|
122
|
+
]
|
|
104
123
|
|
|
105
124
|
table_to_path = self._map_table_id_to_connection_path(all_sources)
|
|
106
125
|
|
|
@@ -51,6 +51,7 @@ class SQLExtractionProcessor:
|
|
|
51
51
|
def _fetch(self, query: ExtractionQuery) -> Iterator[dict]:
|
|
52
52
|
default: Callable[[], Iterator] = lambda: iter(()) # type: ignore
|
|
53
53
|
decorator = safe_mode(self._safe_mode, default)
|
|
54
|
+
self._client.set_database(query.database)
|
|
54
55
|
decorated_execute = decorator(self._client.execute)
|
|
55
56
|
return decorated_execute(query)
|
|
56
57
|
|
|
@@ -21,11 +21,22 @@ class AssetNotSupportedError(NotImplementedError):
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class ExtractionQuery:
|
|
24
|
-
"""
|
|
24
|
+
"""
|
|
25
|
+
Contains useful context to run the query:
|
|
26
|
+
- the sql statement itself
|
|
27
|
+
- parameters { ... }
|
|
28
|
+
- optionally, the target database (can be used to change the engine's URI)
|
|
29
|
+
"""
|
|
25
30
|
|
|
26
|
-
def __init__(
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
statement: str,
|
|
34
|
+
params: dict,
|
|
35
|
+
database: Optional[str] = None,
|
|
36
|
+
):
|
|
27
37
|
self.statement = statement
|
|
28
38
|
self.params = params
|
|
39
|
+
self.database = database
|
|
29
40
|
|
|
30
41
|
|
|
31
42
|
class AbstractQueryBuilder(ABC):
|
|
@@ -24,12 +24,7 @@ SNOWFLAKE_ASSETS: SupportedAssets = {
|
|
|
24
24
|
WarehouseAssetGroup.FUNCTION: FUNCTIONS_ASSETS,
|
|
25
25
|
WarehouseAssetGroup.QUERY: QUERIES_ASSETS,
|
|
26
26
|
WarehouseAssetGroup.VIEW_DDL: VIEWS_ASSETS,
|
|
27
|
-
WarehouseAssetGroup.ROLE: (
|
|
28
|
-
WarehouseAsset.GRANT_TO_ROLE,
|
|
29
|
-
WarehouseAsset.GRANT_TO_USER,
|
|
30
|
-
WarehouseAsset.ROLE,
|
|
31
|
-
WarehouseAsset.USER,
|
|
32
|
-
),
|
|
27
|
+
WarehouseAssetGroup.ROLE: (WarehouseAsset.USER,),
|
|
33
28
|
WarehouseAssetGroup.SNOWFLAKE_LINEAGE: (WarehouseAsset.COLUMN_LINEAGE,),
|
|
34
29
|
WarehouseAssetGroup.EXTERNAL_LINEAGE: EXTERNAL_LINEAGE_ASSETS,
|
|
35
30
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from collections.abc import Iterator
|
|
3
|
+
from typing import Optional
|
|
3
4
|
|
|
4
|
-
from sqlalchemy import text
|
|
5
|
+
from sqlalchemy import create_engine, text
|
|
5
6
|
|
|
6
7
|
from ...utils import ExtractionQuery, SqlalchemyClient, uri_encode
|
|
7
8
|
|
|
@@ -63,6 +64,18 @@ class MSSQLClient(SqlalchemyClient):
|
|
|
63
64
|
finally:
|
|
64
65
|
self.close()
|
|
65
66
|
|
|
67
|
+
def set_database(self, database: Optional[str]) -> None:
|
|
68
|
+
"""
|
|
69
|
+
To support SQL Server running on Azure, we must change the engine's
|
|
70
|
+
URI for each database-scoped query
|
|
71
|
+
https://chatgpt.com/share/68de93c3-9550-8001-9d54-c5da86faa43c
|
|
72
|
+
"""
|
|
73
|
+
if not database:
|
|
74
|
+
return
|
|
75
|
+
self.close()
|
|
76
|
+
database_uri = f"{self._uri}/{database}"
|
|
77
|
+
self._engine = create_engine(database_uri, **self._options)
|
|
78
|
+
|
|
66
79
|
def get_databases(self) -> list[str]:
|
|
67
80
|
result = self.execute(
|
|
68
81
|
ExtractionQuery("SELECT name FROM sys.databases", {})
|
|
@@ -40,10 +40,14 @@ class MSSQLQueryBuilder(AbstractQueryBuilder):
|
|
|
40
40
|
self._databases = databases
|
|
41
41
|
|
|
42
42
|
@staticmethod
|
|
43
|
-
def _format(
|
|
43
|
+
def _format(
|
|
44
|
+
query: ExtractionQuery,
|
|
45
|
+
database: str,
|
|
46
|
+
) -> ExtractionQuery:
|
|
44
47
|
return ExtractionQuery(
|
|
45
|
-
statement=query.statement.format(
|
|
48
|
+
statement=query.statement.format(database=database),
|
|
46
49
|
params=query.params,
|
|
50
|
+
database=database,
|
|
47
51
|
)
|
|
48
52
|
|
|
49
53
|
def build(self, asset: WarehouseAsset) -> list[ExtractionQuery]:
|
|
@@ -58,7 +62,4 @@ class MSSQLQueryBuilder(AbstractQueryBuilder):
|
|
|
58
62
|
logger.info(
|
|
59
63
|
f"\tWill run queries with following database params: {self._databases}",
|
|
60
64
|
)
|
|
61
|
-
return [
|
|
62
|
-
self._format(query, {"database": database})
|
|
63
|
-
for database in self._databases
|
|
64
|
-
]
|
|
65
|
+
return [self._format(query, database) for database in self._databases]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: castor-extractor
|
|
3
|
-
Version: 0.25.
|
|
3
|
+
Version: 0.25.6
|
|
4
4
|
Summary: Extract your metadata assets.
|
|
5
5
|
Home-page: https://www.castordoc.com/
|
|
6
6
|
License: EULA
|
|
@@ -216,6 +216,22 @@ For any questions or bug report, contact us at [support@coalesce.io](mailto:supp
|
|
|
216
216
|
|
|
217
217
|
# Changelog
|
|
218
218
|
|
|
219
|
+
## 0.25.6 - 2025-10-06
|
|
220
|
+
|
|
221
|
+
* PowerBi: Support additional authentication methods
|
|
222
|
+
|
|
223
|
+
## 0.25.5 - 2025-10-06
|
|
224
|
+
|
|
225
|
+
* Snowflake: remove extraction of roles and grants
|
|
226
|
+
|
|
227
|
+
## 0.25.4 - 2025-10-02
|
|
228
|
+
|
|
229
|
+
* SqlServer: switch database to support clients running their instance on Azure
|
|
230
|
+
|
|
231
|
+
## 0.25.3 - 2025-10-01
|
|
232
|
+
|
|
233
|
+
* Sigma: sleep between sources requests to avoid rate limit errors
|
|
234
|
+
|
|
219
235
|
## 0.25.2 - 2025-09-30
|
|
220
236
|
|
|
221
237
|
* PowerBi: Support auth with private_key
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
CHANGELOG.md,sha256=
|
|
1
|
+
CHANGELOG.md,sha256=_zH2Mm-Bn_xdVUaseScAbBos3i0Ae_MspceXsG-5vjc,21437
|
|
2
2
|
Dockerfile,sha256=xQ05-CFfGShT3oUqaiumaldwA288dj9Yb_pxofQpufg,301
|
|
3
3
|
DockerfileUsage.md,sha256=2hkJQF-5JuuzfPZ7IOxgM6QgIQW7l-9oRMFVwyXC4gE,998
|
|
4
4
|
LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
|
|
@@ -18,7 +18,7 @@ castor_extractor/commands/extract_mode.py,sha256=Q4iO-VAKMg4zFPejhAO-foZibL5Ht3j
|
|
|
18
18
|
castor_extractor/commands/extract_mysql.py,sha256=7AH5qMzeLTsENCOeJwtesrWg8Vo8MCEq8fx2YT74Mcw,1034
|
|
19
19
|
castor_extractor/commands/extract_notion.py,sha256=uaxcF3_bT7D_-JxnIW0F7VVDphI_ZgOfQQxZzoLXo_M,504
|
|
20
20
|
castor_extractor/commands/extract_postgres.py,sha256=pX0RnCPi4nw6QQ6wiAuZ_Xt3ZbDuMUG9aQKuqFgJtAU,1154
|
|
21
|
-
castor_extractor/commands/extract_powerbi.py,sha256=
|
|
21
|
+
castor_extractor/commands/extract_powerbi.py,sha256=4q_brV5hEG8RINCquvZCtQ9G2v4nzqQClIUlP0Pdef4,1402
|
|
22
22
|
castor_extractor/commands/extract_qlik.py,sha256=VBe_xFKh_nR0QSFFIncAaC8yDqBeMa6VunBAga7AeGg,891
|
|
23
23
|
castor_extractor/commands/extract_redshift.py,sha256=zRBg2D_ft4GLdPSdmetRcgQVAA80DXtdRSYsQhAWIik,1334
|
|
24
24
|
castor_extractor/commands/extract_salesforce.py,sha256=3j3YTmMkPAwocR-B1ozJQai0UIZPtpmAyWj-hHvdWn4,1226
|
|
@@ -102,13 +102,13 @@ castor_extractor/utils/argument_parser_test.py,sha256=wnyLFJ74iEiPxxLSbwFtckR7FI
|
|
|
102
102
|
castor_extractor/utils/batch.py,sha256=SFlLmJgVjV2nVhIrjVIEp8wJ9du4dKKHq8YVYubnwQQ,448
|
|
103
103
|
castor_extractor/utils/batch_test.py,sha256=84JYXOxiTkZFAceVh0mzN6VtKxcqoFPbxkZfIDyLGlg,606
|
|
104
104
|
castor_extractor/utils/client/__init__.py,sha256=h5gm8UNNCCkAqhjYK5f6BY7k0cHFOyAvkmlktqwpir0,392
|
|
105
|
-
castor_extractor/utils/client/abstract.py,sha256=
|
|
105
|
+
castor_extractor/utils/client/abstract.py,sha256=OyTpb_SBgxaZd-4QFUV3n7yTzszAbyxY89fHsdAGKS8,2410
|
|
106
106
|
castor_extractor/utils/client/api/__init__.py,sha256=vlG7WXznYgLTn3XyMGsyUkgRkup8FbKM14EXJ8mv-b0,264
|
|
107
107
|
castor_extractor/utils/client/api/auth.py,sha256=lq0K3UEl1vwIIa_vKTdlpIQPdE5K1-5DXmCwO4dKzng,1890
|
|
108
108
|
castor_extractor/utils/client/api/auth_test.py,sha256=LlyXytnatg6ZzR4Zkvzk0BH99FYhHX7qn_nyr2MSnDI,1305
|
|
109
109
|
castor_extractor/utils/client/api/client.py,sha256=qmj7KoNqt6F-cmpdaMiz_aVxzwMCgbDNcgzXSbCdu1Y,5183
|
|
110
110
|
castor_extractor/utils/client/api/client_test.py,sha256=FM3ZxsLLfMOBn44cXX6FIgnA31-5TTNIyp9D4LBwtXE,1222
|
|
111
|
-
castor_extractor/utils/client/api/pagination.py,sha256=
|
|
111
|
+
castor_extractor/utils/client/api/pagination.py,sha256=SFO841ItRxPrQzhusx9JZiX5V394VujaB69YQJN1z2M,2501
|
|
112
112
|
castor_extractor/utils/client/api/pagination_test.py,sha256=jCOgXFXrH-jrCxe2dfk80ZksJF-EtmpJPU11BGabsqk,1385
|
|
113
113
|
castor_extractor/utils/client/api/safe_request.py,sha256=5pvI2WPRDtitX9F1aYcXTIMPNmDikRK9dKTD3ctoeoQ,1774
|
|
114
114
|
castor_extractor/utils/client/api/safe_request_test.py,sha256=LqS5FBxs6lLLcTkcgxIoLb6OinxShHXR5y4CWZpwmwg,2005
|
|
@@ -253,7 +253,7 @@ castor_extractor/visualization/powerbi/client/authentication.py,sha256=1pST-w7ce
|
|
|
253
253
|
castor_extractor/visualization/powerbi/client/client.py,sha256=Q_WHYGFpHT4wJ6nZvJa96nBVcpUGv7E2WnyZHBftsJM,8340
|
|
254
254
|
castor_extractor/visualization/powerbi/client/client_test.py,sha256=zWgfc8fOHSRn3hxiX8ujJysmNHeypIoKin9h8_h178k,6668
|
|
255
255
|
castor_extractor/visualization/powerbi/client/constants.py,sha256=88R_aGachNNUZh6OSH2fkDwZtY4KTStzKm_g7HNCqqo,387
|
|
256
|
-
castor_extractor/visualization/powerbi/client/credentials.py,sha256=
|
|
256
|
+
castor_extractor/visualization/powerbi/client/credentials.py,sha256=Z6wJkevG3MvqTK54p3lxKnw7aUZ1mxPZqwuG44cOB_Q,1907
|
|
257
257
|
castor_extractor/visualization/powerbi/client/credentials_test.py,sha256=TzFqxsWVQ3sXR_n0bJsexK9Uz7ceXCEPVqDGWTJzW60,993
|
|
258
258
|
castor_extractor/visualization/powerbi/client/endpoints.py,sha256=38ZETzSSnNq3vA9O6nLZQ8T1BVE01R9CjMC03-PRXsM,1911
|
|
259
259
|
castor_extractor/visualization/powerbi/client/pagination.py,sha256=OZMjoDQPRGMoWd9QcKKrPh3aErJR20SHlrTqY_siLkk,755
|
|
@@ -290,7 +290,7 @@ castor_extractor/visualization/sigma/client/client_test.py,sha256=ae0ZOvKutCm44j
|
|
|
290
290
|
castor_extractor/visualization/sigma/client/credentials.py,sha256=XddAuQSmCKpxJ70TQgRnOj0vMPYVtiStk_lMMQ1AiNM,693
|
|
291
291
|
castor_extractor/visualization/sigma/client/endpoints.py,sha256=by9VIFml2whlzQT66f2m56RYBsqPrWdAmIP4JkTaBV4,1799
|
|
292
292
|
castor_extractor/visualization/sigma/client/pagination.py,sha256=9kCYQpO7hAH2qvYmnVjnGVUDLkpkEM6BgYlv-JTY8AE,1241
|
|
293
|
-
castor_extractor/visualization/sigma/client/sources_transformer.py,sha256=
|
|
293
|
+
castor_extractor/visualization/sigma/client/sources_transformer.py,sha256=ofjBVxeaTDnawB_PoblLQ2Q_b5FdbqPEHk8arVEyx_o,5086
|
|
294
294
|
castor_extractor/visualization/sigma/client/sources_transformer_test.py,sha256=06yUHXyv65amXLKXhix6K3kkVc1kpBqSjIYcxbyMI4Y,2766
|
|
295
295
|
castor_extractor/visualization/sigma/extract.py,sha256=iRmRUzSnq_ObG9fxpOI5Rs07EKKT-VRLcyiti5-8D4c,2986
|
|
296
296
|
castor_extractor/visualization/strategy/__init__.py,sha256=HOMv4JxqF5ZmViWi-pDE-PSXJRLTdXal_jtpHG_rlR8,123
|
|
@@ -326,8 +326,8 @@ castor_extractor/warehouse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
|
|
|
326
326
|
castor_extractor/warehouse/abstract/__init__.py,sha256=Fdfa026tgOo64MvzVRLHM_F2G-JmcehrF0mh3dHgb7s,419
|
|
327
327
|
castor_extractor/warehouse/abstract/asset.py,sha256=wR5mJxAHBcqJ86HRb_Y8x3mDN4uUgSg8jMToLNu0jTM,2740
|
|
328
328
|
castor_extractor/warehouse/abstract/asset_test.py,sha256=_kd4ybNlWSAdSdEgJKC-jhJTa1nMRa9i8RO3YbqKLM4,758
|
|
329
|
-
castor_extractor/warehouse/abstract/extract.py,sha256=
|
|
330
|
-
castor_extractor/warehouse/abstract/query.py,sha256=
|
|
329
|
+
castor_extractor/warehouse/abstract/extract.py,sha256=T_GwXO4_IFSVdBuMmnKvsftl549y43nzE5uN4He4G80,2974
|
|
330
|
+
castor_extractor/warehouse/abstract/query.py,sha256=MSOou0F5BlTths1TsAxv9tcyOB013aJc1TegN4q7jfM,2852
|
|
331
331
|
castor_extractor/warehouse/abstract/time_filter.py,sha256=bggIONfMmUxffkA6TwM3BsjfS2l9WFxPq8krfsau5pw,935
|
|
332
332
|
castor_extractor/warehouse/abstract/time_filter_test.py,sha256=PIkegB7KOKBdpc6zIvmyl_CeQyADeFDplyQ8HTNU5LA,448
|
|
333
333
|
castor_extractor/warehouse/bigquery/__init__.py,sha256=PCGNYdi7dHv-SyanUWzRuBp-ypuQ01PkDaQjVnaNhbM,170
|
|
@@ -418,23 +418,20 @@ castor_extractor/warehouse/snowflake/client.py,sha256=RB72bbl_k91wDU76yrggPK6oeE
|
|
|
418
418
|
castor_extractor/warehouse/snowflake/client_test.py,sha256=ihWtOOAQfh8pu5JTr_EWfqefKOVIaJXznACURzaU1Qs,1432
|
|
419
419
|
castor_extractor/warehouse/snowflake/credentials.py,sha256=u0sZ6xPtcZmmvnUsAejJk-YxGl8BTzX_BlRjRk92BYU,932
|
|
420
420
|
castor_extractor/warehouse/snowflake/credentials_test.py,sha256=Lkc-DHXOvr50KrqAW4nt_x0IA0Mu_CsBVu6ATnzQB6I,673
|
|
421
|
-
castor_extractor/warehouse/snowflake/extract.py,sha256=
|
|
421
|
+
castor_extractor/warehouse/snowflake/extract.py,sha256=eGtIqW5kKJl-e36viqYQzkXn39CJkmMBR4oSt-B0ud4,3082
|
|
422
422
|
castor_extractor/warehouse/snowflake/queries/.sqlfluff,sha256=vttrwcr64JVIuvc7WIg9C54cbOkjg_VjXNR7YnTGOPE,31
|
|
423
423
|
castor_extractor/warehouse/snowflake/queries/column.sql,sha256=Ru-yC0s76I9LehOA4aCZ--xz6D9H1Hyr3OZdILOBHAw,1882
|
|
424
424
|
castor_extractor/warehouse/snowflake/queries/column_lineage.sql,sha256=YKBiZ6zySSNcXLDXwm31EjGIIkkkZc0-S6hI1SRM80o,1179
|
|
425
425
|
castor_extractor/warehouse/snowflake/queries/database.sql,sha256=yxHzV2oQfW0bo2dJVqJkyZy-GruudTi6ObmLaJ505hE,559
|
|
426
426
|
castor_extractor/warehouse/snowflake/queries/function.sql,sha256=8LRh0ybhd-RldJ8UZspWUm3yv52evq11O2uqIO4KqeQ,372
|
|
427
|
-
castor_extractor/warehouse/snowflake/queries/grant_to_role.sql,sha256=O7AJ1LzoXGDFmiVvQ8EMJ5x8FSAnaxRPdmRyAlEmkUM,272
|
|
428
|
-
castor_extractor/warehouse/snowflake/queries/grant_to_user.sql,sha256=7AalVajU5vRRpIiys1igSwmDXirbwpMTvJr2ihSz2NE,143
|
|
429
427
|
castor_extractor/warehouse/snowflake/queries/query.sql,sha256=w4T6-TgwUozDgaF3Fk-qex7bDdEIHLkkB5XEe2VJXZQ,1992
|
|
430
|
-
castor_extractor/warehouse/snowflake/queries/role.sql,sha256=D0VvGxLZMwug2SvefhAsNR9YIun0fZvcDWkz891xSYM,96
|
|
431
428
|
castor_extractor/warehouse/snowflake/queries/schema.sql,sha256=iLn6_y5rn63KigjE4GEAMp8ZuZZofhMXYGb8saPDGUc,776
|
|
432
429
|
castor_extractor/warehouse/snowflake/queries/table.sql,sha256=CbSLfJAylyyyD3mkGPSLLE7BHrGjlY499kzO9RN0e4Y,1473
|
|
433
430
|
castor_extractor/warehouse/snowflake/queries/user.sql,sha256=88V8eRj1NDaD_ufclsKOHHlqCtBMQHOV54yy6RKJaXk,570
|
|
434
431
|
castor_extractor/warehouse/snowflake/queries/view_ddl.sql,sha256=eWsci_50cxiYIv3N7BKkbXVM3RoIzqSDtohqRnE5kg4,673
|
|
435
432
|
castor_extractor/warehouse/snowflake/query.py,sha256=C2LTdPwBzMQ_zMncg0Kq4_WkoY7K9as5tvxBDrIOlwI,1763
|
|
436
433
|
castor_extractor/warehouse/sqlserver/__init__.py,sha256=PdOuYznmvKAbfWAm8UdN47MfEsd9jqPi_dDi3WEo1KY,116
|
|
437
|
-
castor_extractor/warehouse/sqlserver/client.py,sha256=
|
|
434
|
+
castor_extractor/warehouse/sqlserver/client.py,sha256=umxTNZ92S2ImtxkPwzXdTzGvym-bjv5xSNK29vawL-8,5549
|
|
438
435
|
castor_extractor/warehouse/sqlserver/extract.py,sha256=HEJFDM1a4OeQH7OWhYhCOjhkHfGW6qf_qvjFAeMGPYg,2623
|
|
439
436
|
castor_extractor/warehouse/sqlserver/queries/.sqlfluff,sha256=yy0KQdz8I_67vnXyX8eeWwOWkxTXvHyVKSVwhURktd8,48
|
|
440
437
|
castor_extractor/warehouse/sqlserver/queries/column.sql,sha256=ojiUQQnHXdWMbgaYOcxKBiwfi7rtu_tyamK6r4t4IBM,2929
|
|
@@ -444,10 +441,10 @@ castor_extractor/warehouse/sqlserver/queries/schema.sql,sha256=Fq_8-tCnArayON3fj
|
|
|
444
441
|
castor_extractor/warehouse/sqlserver/queries/table.sql,sha256=ggzatJOlOfGkMG1NS-hD-n1-3WLbV9Yh8IsQrEFO5X4,2831
|
|
445
442
|
castor_extractor/warehouse/sqlserver/queries/user.sql,sha256=MAlnTis43E3Amu1e1Oz_qhaX8Bz-iN0Lrbf9RiohX7Y,99
|
|
446
443
|
castor_extractor/warehouse/sqlserver/queries/view_ddl.sql,sha256=9rynvx6MWg3iZzrWPB7haZfVKEPkxulzryE2g19x804,315
|
|
447
|
-
castor_extractor/warehouse/sqlserver/query.py,sha256=
|
|
444
|
+
castor_extractor/warehouse/sqlserver/query.py,sha256=gr5lnZSUm-wSYuVnJlg6fc7jXWirbL-sCiQN9RnAiPQ,1789
|
|
448
445
|
castor_extractor/warehouse/synapse/queries/column.sql,sha256=lNcFoIW3Y0PFOqoOzJEXmPvZvfAsY0AP63Mu2LuPzPo,1351
|
|
449
|
-
castor_extractor-0.25.
|
|
450
|
-
castor_extractor-0.25.
|
|
451
|
-
castor_extractor-0.25.
|
|
452
|
-
castor_extractor-0.25.
|
|
453
|
-
castor_extractor-0.25.
|
|
446
|
+
castor_extractor-0.25.6.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
|
|
447
|
+
castor_extractor-0.25.6.dist-info/METADATA,sha256=ayaVswDaw-D2Zele6ewtVK5inUm9fBOuDik-AGY7yAY,28939
|
|
448
|
+
castor_extractor-0.25.6.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
449
|
+
castor_extractor-0.25.6.dist-info/entry_points.txt,sha256=qyTrKNByoq2HYi1xbA79OU7qxg-OWPvle8VwDqt-KnE,1869
|
|
450
|
+
castor_extractor-0.25.6.dist-info/RECORD,,
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
SELECT
|
|
2
|
-
created_on,
|
|
3
|
-
modified_on,
|
|
4
|
-
privilege,
|
|
5
|
-
granted_on,
|
|
6
|
-
name,
|
|
7
|
-
table_catalog AS "database",
|
|
8
|
-
table_schema AS "schema",
|
|
9
|
-
granted_to,
|
|
10
|
-
grantee_name,
|
|
11
|
-
grant_option,
|
|
12
|
-
granted_by,
|
|
13
|
-
deleted_on
|
|
14
|
-
FROM snowflake.account_usage.grants_to_roles
|
|
File without changes
|
|
File without changes
|
|
File without changes
|