castor-extractor 0.20.0__py3-none-any.whl → 0.20.5__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 +20 -0
- castor_extractor/commands/extract_redshift.py +6 -0
- castor_extractor/commands/extract_thoughtspot.py +18 -0
- castor_extractor/utils/client/api/client.py +7 -2
- castor_extractor/utils/client/api/safe_request.py +6 -3
- castor_extractor/visualization/looker/api/constants.py +0 -4
- castor_extractor/visualization/powerbi/__init__.py +1 -1
- castor_extractor/visualization/powerbi/assets.py +7 -1
- castor_extractor/visualization/powerbi/client/__init__.py +2 -3
- castor_extractor/visualization/powerbi/client/authentication.py +27 -0
- castor_extractor/visualization/powerbi/client/client.py +207 -0
- castor_extractor/visualization/powerbi/client/client_test.py +173 -0
- castor_extractor/visualization/powerbi/client/constants.py +0 -67
- castor_extractor/visualization/powerbi/client/credentials.py +3 -4
- castor_extractor/visualization/powerbi/client/credentials_test.py +3 -4
- castor_extractor/visualization/powerbi/client/endpoints.py +65 -0
- castor_extractor/visualization/powerbi/client/pagination.py +32 -0
- castor_extractor/visualization/powerbi/extract.py +14 -9
- castor_extractor/visualization/thoughtspot/__init__.py +3 -0
- castor_extractor/visualization/thoughtspot/assets.py +9 -0
- castor_extractor/visualization/thoughtspot/client/__init__.py +2 -0
- castor_extractor/visualization/thoughtspot/client/client.py +120 -0
- castor_extractor/visualization/thoughtspot/client/credentials.py +18 -0
- castor_extractor/visualization/thoughtspot/client/endpoints.py +12 -0
- castor_extractor/visualization/thoughtspot/client/utils.py +25 -0
- castor_extractor/visualization/thoughtspot/client/utils_test.py +57 -0
- castor_extractor/visualization/thoughtspot/extract.py +49 -0
- castor_extractor/warehouse/redshift/extract.py +10 -1
- castor_extractor/warehouse/redshift/extract_test.py +26 -0
- castor_extractor/warehouse/redshift/queries/query_serverless.sql +69 -0
- castor_extractor/warehouse/redshift/query.py +12 -1
- castor_extractor/warehouse/salesforce/client.py +1 -1
- castor_extractor/warehouse/salesforce/format.py +40 -30
- castor_extractor/warehouse/salesforce/format_test.py +61 -24
- {castor_extractor-0.20.0.dist-info → castor_extractor-0.20.5.dist-info}/METADATA +21 -1
- {castor_extractor-0.20.0.dist-info → castor_extractor-0.20.5.dist-info}/RECORD +39 -26
- {castor_extractor-0.20.0.dist-info → castor_extractor-0.20.5.dist-info}/entry_points.txt +1 -0
- castor_extractor/visualization/powerbi/client/rest.py +0 -305
- castor_extractor/visualization/powerbi/client/rest_test.py +0 -290
- castor_extractor/visualization/powerbi/client/utils.py +0 -19
- castor_extractor/visualization/powerbi/client/utils_test.py +0 -24
- {castor_extractor-0.20.0.dist-info → castor_extractor-0.20.5.dist-info}/LICENCE +0 -0
- {castor_extractor-0.20.0.dist-info → castor_extractor-0.20.5.dist-info}/WHEEL +0 -0
|
@@ -1,12 +1,30 @@
|
|
|
1
1
|
from typing import Any, Dict, Iterator, List
|
|
2
2
|
|
|
3
|
+
from ...utils import group_by
|
|
3
4
|
from .constants import SCHEMA_NAME
|
|
4
5
|
|
|
6
|
+
_HAS_DUPLICATE_KEY = "#has_duplicate"
|
|
7
|
+
|
|
5
8
|
|
|
6
9
|
def _clean(raw: str) -> str:
|
|
7
10
|
return raw.strip('"')
|
|
8
11
|
|
|
9
12
|
|
|
13
|
+
def _name(sobject: dict) -> str:
|
|
14
|
+
"""
|
|
15
|
+
compute name for table and columns
|
|
16
|
+
- when unique: label
|
|
17
|
+
- when label is empty or has duplicate: label (api_name)
|
|
18
|
+
"""
|
|
19
|
+
label = sobject["Label"]
|
|
20
|
+
api_name = sobject["QualifiedApiName"]
|
|
21
|
+
if not label:
|
|
22
|
+
return api_name
|
|
23
|
+
if not sobject[_HAS_DUPLICATE_KEY]:
|
|
24
|
+
return label
|
|
25
|
+
return f"{label} ({api_name})"
|
|
26
|
+
|
|
27
|
+
|
|
10
28
|
def _field_description(field: Dict[str, Any]) -> str:
|
|
11
29
|
context: Dict[str, str] = {}
|
|
12
30
|
|
|
@@ -24,7 +42,7 @@ def _field_description(field: Dict[str, Any]) -> str:
|
|
|
24
42
|
|
|
25
43
|
|
|
26
44
|
def _to_column_payload(field: dict, position: int, table_name: str) -> dict:
|
|
27
|
-
field_name = field
|
|
45
|
+
field_name = _name(field)
|
|
28
46
|
return {
|
|
29
47
|
"column_name": field_name,
|
|
30
48
|
"data_type": field.get("DataType"),
|
|
@@ -37,33 +55,31 @@ def _to_column_payload(field: dict, position: int, table_name: str) -> dict:
|
|
|
37
55
|
}
|
|
38
56
|
|
|
39
57
|
|
|
40
|
-
def _to_table_payload(sobject: dict
|
|
58
|
+
def _to_table_payload(sobject: dict) -> dict:
|
|
59
|
+
name = _name(sobject)
|
|
41
60
|
return {
|
|
42
|
-
"id":
|
|
61
|
+
"id": name,
|
|
43
62
|
"api_name": sobject["QualifiedApiName"],
|
|
44
63
|
"label": sobject["Label"],
|
|
45
64
|
"schema_id": SCHEMA_NAME,
|
|
46
|
-
"table_name":
|
|
65
|
+
"table_name": name,
|
|
47
66
|
"description": sobject.get("Description"),
|
|
48
67
|
"tags": [],
|
|
49
68
|
"type": "TABLE",
|
|
50
69
|
}
|
|
51
70
|
|
|
52
71
|
|
|
53
|
-
def
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def _by_label(sobjects: List[dict]) -> Dict[str, List[dict]]:
|
|
61
|
-
by_label: Dict[str, List[dict]] = dict()
|
|
72
|
+
def _detect_duplicates(sobjects: List[dict]) -> List[dict]:
|
|
73
|
+
"""
|
|
74
|
+
enrich the given data with "has_duplicate" flag:
|
|
75
|
+
- True when another asset has the same Label in the list
|
|
76
|
+
- False otherwise
|
|
77
|
+
"""
|
|
78
|
+
by_label = group_by("Label", sobjects)
|
|
62
79
|
for sobject in sobjects:
|
|
63
80
|
label = sobject["Label"]
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return by_label
|
|
81
|
+
sobject[_HAS_DUPLICATE_KEY] = len(by_label[label]) > 1
|
|
82
|
+
return sobjects
|
|
67
83
|
|
|
68
84
|
|
|
69
85
|
class SalesforceFormatter:
|
|
@@ -76,21 +92,15 @@ class SalesforceFormatter:
|
|
|
76
92
|
def tables(sobjects: List[dict]) -> Iterator[dict]:
|
|
77
93
|
"""
|
|
78
94
|
formats the raw list of sobjects to tables
|
|
79
|
-
if two tables share the same label, then we add the api name as well
|
|
80
95
|
"""
|
|
81
|
-
|
|
82
|
-
for
|
|
83
|
-
|
|
84
|
-
yield from [_merge_label_and_api_name(s) for s in similars]
|
|
85
|
-
else:
|
|
86
|
-
sobject = similars[0] # unique sobject on label
|
|
87
|
-
yield _to_table_payload(sobject, label)
|
|
96
|
+
sobjects = _detect_duplicates(sobjects)
|
|
97
|
+
for sobject in sobjects:
|
|
98
|
+
yield _to_table_payload(sobject)
|
|
88
99
|
|
|
89
100
|
@staticmethod
|
|
90
|
-
def columns(sobject_fields: Dict[str, List[dict]]) ->
|
|
101
|
+
def columns(sobject_fields: Dict[str, List[dict]]) -> Iterator[dict]:
|
|
91
102
|
"""formats the raw list of sobject fields to columns"""
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
for
|
|
95
|
-
|
|
96
|
-
]
|
|
103
|
+
for table_name, fields in sobject_fields.items():
|
|
104
|
+
fields = _detect_duplicates(fields)
|
|
105
|
+
for index, field in enumerate(fields):
|
|
106
|
+
yield _to_column_payload(field, index, table_name)
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
from typing import Dict, Tuple
|
|
1
|
+
from typing import Dict, List, Tuple
|
|
2
2
|
|
|
3
3
|
from .format import (
|
|
4
|
-
|
|
4
|
+
_HAS_DUPLICATE_KEY,
|
|
5
5
|
SalesforceFormatter,
|
|
6
|
-
|
|
6
|
+
_detect_duplicates,
|
|
7
7
|
_field_description,
|
|
8
|
-
|
|
8
|
+
_name,
|
|
9
9
|
)
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
def
|
|
12
|
+
def _tables_sobjects() -> Tuple[Dict[str, str], ...]:
|
|
13
13
|
"""Returns 4 sobjects with 2 sharing the same label"""
|
|
14
14
|
a = {"Label": "a", "QualifiedApiName": "a_one"}
|
|
15
15
|
b = {"Label": "b", "QualifiedApiName": "b"}
|
|
@@ -18,6 +18,16 @@ def _example_sobjects() -> Tuple[Dict[str, str], ...]:
|
|
|
18
18
|
return a, b, c, a_prime
|
|
19
19
|
|
|
20
20
|
|
|
21
|
+
def _columns_sobjects() -> Dict[str, List[dict]]:
|
|
22
|
+
a = {"Label": "First Name", "QualifiedApiName": "owner_name"}
|
|
23
|
+
b = {"Label": "First Name", "QualifiedApiName": "editor_name"}
|
|
24
|
+
c = {"Label": "Foo Bar", "QualifiedApiName": "foo_bar"}
|
|
25
|
+
return {
|
|
26
|
+
"table_1": [a, b],
|
|
27
|
+
"table_2": [c],
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
21
31
|
def test__field_description():
|
|
22
32
|
field = {}
|
|
23
33
|
assert _field_description(field) == ""
|
|
@@ -48,32 +58,59 @@ def test__field_description():
|
|
|
48
58
|
assert description == expected
|
|
49
59
|
|
|
50
60
|
|
|
51
|
-
def
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"id": expected_name,
|
|
57
|
-
"api_name": "bar",
|
|
58
|
-
"label": "foo",
|
|
59
|
-
"schema_id": SCHEMA_NAME,
|
|
60
|
-
"table_name": expected_name,
|
|
61
|
-
"description": None,
|
|
62
|
-
"tags": [],
|
|
63
|
-
"type": "TABLE",
|
|
61
|
+
def test__name():
|
|
62
|
+
unique_sobject = {
|
|
63
|
+
"Label": "First Name",
|
|
64
|
+
"QualifiedApiName": "first_name",
|
|
65
|
+
_HAS_DUPLICATE_KEY: False,
|
|
64
66
|
}
|
|
67
|
+
assert _name(unique_sobject) == "First Name"
|
|
65
68
|
|
|
69
|
+
duplicate_sobject = {
|
|
70
|
+
"Label": "First Name",
|
|
71
|
+
"QualifiedApiName": "first_name",
|
|
72
|
+
_HAS_DUPLICATE_KEY: True,
|
|
73
|
+
}
|
|
74
|
+
assert _name(duplicate_sobject) == "First Name (first_name)"
|
|
75
|
+
|
|
76
|
+
empty_label_sobject = {
|
|
77
|
+
"Label": "",
|
|
78
|
+
"QualifiedApiName": "empty_label",
|
|
79
|
+
_HAS_DUPLICATE_KEY: False,
|
|
80
|
+
}
|
|
81
|
+
assert _name(empty_label_sobject) == "empty_label"
|
|
66
82
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
83
|
+
|
|
84
|
+
def test__detect_duplicates():
|
|
85
|
+
objects = [
|
|
86
|
+
{"Label": "Foo"},
|
|
87
|
+
{"Label": "Bar"},
|
|
88
|
+
{"Label": "Foo"},
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
objects = _detect_duplicates(objects)
|
|
92
|
+
assert objects == [
|
|
93
|
+
{"Label": "Foo", _HAS_DUPLICATE_KEY: True},
|
|
94
|
+
{"Label": "Bar", _HAS_DUPLICATE_KEY: False},
|
|
95
|
+
{"Label": "Foo", _HAS_DUPLICATE_KEY: True},
|
|
96
|
+
]
|
|
72
97
|
|
|
73
98
|
|
|
74
99
|
def test_salesforce_formatter_tables():
|
|
75
|
-
sobjects = [*
|
|
100
|
+
sobjects = [*_tables_sobjects()]
|
|
76
101
|
tables = SalesforceFormatter.tables(sobjects)
|
|
77
102
|
expected_names = {"a (a_one)", "a (a_two)", "b", "c"}
|
|
78
103
|
payload_names = {t["table_name"] for t in tables}
|
|
79
104
|
assert payload_names == expected_names
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def test_salesforce_formatter_columns():
|
|
108
|
+
sobjects = _columns_sobjects()
|
|
109
|
+
columns = SalesforceFormatter.columns(sobjects)
|
|
110
|
+
column_ids = {c["id"] for c in columns}
|
|
111
|
+
expected_column_ids = {
|
|
112
|
+
"table_1.First Name (owner_name)",
|
|
113
|
+
"table_1.First Name (editor_name)",
|
|
114
|
+
"table_2.Foo Bar",
|
|
115
|
+
}
|
|
116
|
+
assert column_ids == expected_column_ids
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: castor-extractor
|
|
3
|
-
Version: 0.20.
|
|
3
|
+
Version: 0.20.5
|
|
4
4
|
Summary: Extract your metadata assets.
|
|
5
5
|
Home-page: https://www.castordoc.com/
|
|
6
6
|
License: EULA
|
|
@@ -208,6 +208,26 @@ For any questions or bug report, contact us at [support@castordoc.com](mailto:su
|
|
|
208
208
|
|
|
209
209
|
# Changelog
|
|
210
210
|
|
|
211
|
+
## 0.20.5 - 2024-10-09
|
|
212
|
+
|
|
213
|
+
* Redshift: enable extraction from a Redshift Serverless instance
|
|
214
|
+
|
|
215
|
+
## 0.20.4 - 2024-10-09
|
|
216
|
+
|
|
217
|
+
* Salesforce warehouse: `Labels` instead of `api_names` for columns
|
|
218
|
+
|
|
219
|
+
## 0.20.3 - 2024-10-03
|
|
220
|
+
|
|
221
|
+
* Looker: no longer extract `as_html` dashboard elements
|
|
222
|
+
|
|
223
|
+
## 0.20.2 - 2024-09-24
|
|
224
|
+
|
|
225
|
+
* Thoughtspot: Adding connector
|
|
226
|
+
|
|
227
|
+
## 0.20.1 - 2024-09-23
|
|
228
|
+
|
|
229
|
+
* Power BI: Improved client based on APIClient
|
|
230
|
+
|
|
211
231
|
## 0.20.0 - 2024-09-23
|
|
212
232
|
|
|
213
233
|
* Switch to Tableau revamped connector
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
CHANGELOG.md,sha256=
|
|
1
|
+
CHANGELOG.md,sha256=gqprCxUMpvdGZdxp3AxdsRKA3JK-Q9NM72m839G5CeQ,13996
|
|
2
2
|
Dockerfile,sha256=HcX5z8OpeSvkScQsN-Y7CNMUig_UB6vTMDl7uqzuLGE,303
|
|
3
3
|
DockerfileUsage.md,sha256=2hkJQF-5JuuzfPZ7IOxgM6QgIQW7l-9oRMFVwyXC4gE,998
|
|
4
4
|
LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
|
|
@@ -17,13 +17,14 @@ castor_extractor/commands/extract_notion.py,sha256=uaxcF3_bT7D_-JxnIW0F7VVDphI_Z
|
|
|
17
17
|
castor_extractor/commands/extract_postgres.py,sha256=pX0RnCPi4nw6QQ6wiAuZ_Xt3ZbDuMUG9aQKuqFgJtAU,1154
|
|
18
18
|
castor_extractor/commands/extract_powerbi.py,sha256=f0G5w61KXExJ6Sw39_mJIwqQNpLorE5-LKmZXlUqvKI,783
|
|
19
19
|
castor_extractor/commands/extract_qlik.py,sha256=VBe_xFKh_nR0QSFFIncAaC8yDqBeMa6VunBAga7AeGg,891
|
|
20
|
-
castor_extractor/commands/extract_redshift.py,sha256=
|
|
20
|
+
castor_extractor/commands/extract_redshift.py,sha256=zRBg2D_ft4GLdPSdmetRcgQVAA80DXtdRSYsQhAWIik,1334
|
|
21
21
|
castor_extractor/commands/extract_salesforce.py,sha256=3j3YTmMkPAwocR-B1ozJQai0UIZPtpmAyWj-hHvdWn4,1226
|
|
22
22
|
castor_extractor/commands/extract_salesforce_reporting.py,sha256=FdANTNiLkIPdm80XMYxWReHjdycLsIa61pyeCD-sUDk,962
|
|
23
23
|
castor_extractor/commands/extract_sigma.py,sha256=sxewHcZ1Doq35V2qnpX_zCKKXkrb1_9bYjUMg7BOW-k,643
|
|
24
24
|
castor_extractor/commands/extract_snowflake.py,sha256=vYiruxRoo--GeMemOGsSE1w9kcKTh_y4E165HtMVzkM,1982
|
|
25
25
|
castor_extractor/commands/extract_sqlserver.py,sha256=lwhbcNChaXHZgMgSOch3faVr7WJw-sDU6GHl3lzBt_0,1141
|
|
26
26
|
castor_extractor/commands/extract_tableau.py,sha256=VUb_1Y85EzfF1f9OaCQQt8kFYBdp0u31Mw1Wm2fkxWs,1221
|
|
27
|
+
castor_extractor/commands/extract_thoughtspot.py,sha256=caAYJlH-vK7u5IUB6OKXxcaWfLgc7d_XqnFDWK6YNS4,639
|
|
27
28
|
castor_extractor/commands/file_check.py,sha256=VSD84kpQKf7b0wJOhUgkJQ9n4mK3v52sjMWL7wkNYa0,2667
|
|
28
29
|
castor_extractor/commands/upload.py,sha256=WLDI3zDmK2CjtbxiMWX2mZGjxx8DozfCw6tLE3CAMcE,1833
|
|
29
30
|
castor_extractor/file_checker/__init__.py,sha256=OSt6YLhUT42U_Cp3LCLHMVruwDkksL75Ij13X2UPnVk,119
|
|
@@ -73,11 +74,11 @@ castor_extractor/utils/client/abstract.py,sha256=aA5Qcb9TwWDSMq8WpXbGkOB20hehwX2
|
|
|
73
74
|
castor_extractor/utils/client/api/__init__.py,sha256=vlG7WXznYgLTn3XyMGsyUkgRkup8FbKM14EXJ8mv-b0,264
|
|
74
75
|
castor_extractor/utils/client/api/auth.py,sha256=QDLM5h1zGibLaKyATxLF0gycg01SE92G-Y69f_YBClc,1896
|
|
75
76
|
castor_extractor/utils/client/api/auth_test.py,sha256=NoZYsz7bcCyWBZdMF1TaOuK-s1j09DhTRyM4GSUW_YQ,1311
|
|
76
|
-
castor_extractor/utils/client/api/client.py,sha256=
|
|
77
|
+
castor_extractor/utils/client/api/client.py,sha256=_XkOMbkit0_YYJ2tY1rYrEuoPTUP826CJPnI9OLgmuQ,4434
|
|
77
78
|
castor_extractor/utils/client/api/client_test.py,sha256=FM3ZxsLLfMOBn44cXX6FIgnA31-5TTNIyp9D4LBwtXE,1222
|
|
78
79
|
castor_extractor/utils/client/api/pagination.py,sha256=Efg3P9ct_U5rtgXijMGV05oQxSzjldEopECWjIFWerM,2439
|
|
79
80
|
castor_extractor/utils/client/api/pagination_test.py,sha256=jCOgXFXrH-jrCxe2dfk80ZksJF-EtmpJPU11BGabsqk,1385
|
|
80
|
-
castor_extractor/utils/client/api/safe_request.py,sha256=
|
|
81
|
+
castor_extractor/utils/client/api/safe_request.py,sha256=dh69Uv9LMUGKDnxDnBYEYMEdTWq2GHLWD3ZwXtQP3So,1787
|
|
81
82
|
castor_extractor/utils/client/api/safe_request_test.py,sha256=LqS5FBxs6lLLcTkcgxIoLb6OinxShHXR5y4CWZpwmwg,2005
|
|
82
83
|
castor_extractor/utils/client/api/utils.py,sha256=jr8CWf48cIp8QP1P7oZ1zg9WaGlDO3mqCWgQKdEcpyc,238
|
|
83
84
|
castor_extractor/utils/client/api/utils_test.py,sha256=a5aL-pCwa74C8Ne7OT169Bjp8WPDV5Fl8MxNxAllHJg,514
|
|
@@ -144,7 +145,7 @@ castor_extractor/visualization/looker/__init__.py,sha256=mem0020YeP4_5zDnqRXOW3g
|
|
|
144
145
|
castor_extractor/visualization/looker/api/__init__.py,sha256=HDLsLy3kDWHIplAzLl1_u_bvGlgY6cuplf8myJTdfTg,169
|
|
145
146
|
castor_extractor/visualization/looker/api/client.py,sha256=xp7wV59UsrXQXrkR-vB9YH78aPu2rAfwNRFxXegJluo,11283
|
|
146
147
|
castor_extractor/visualization/looker/api/client_test.py,sha256=a80DpBOorFumXEA3D_qHuRZJqR51-DUtbz65XSLuSHc,1977
|
|
147
|
-
castor_extractor/visualization/looker/api/constants.py,sha256=
|
|
148
|
+
castor_extractor/visualization/looker/api/constants.py,sha256=wnpEtZNbvTKEsLRCSdDUOru2Y6uIFyrBt1e5Hp9T7J4,4021
|
|
148
149
|
castor_extractor/visualization/looker/api/credentials.py,sha256=dnEMW-d-g4N_JJhkXd-CJcnKLA1zBNMbgnELL_-guNI,972
|
|
149
150
|
castor_extractor/visualization/looker/api/extraction_parameters.py,sha256=53tMtYHxlgALWuKr9w-lOE0xHIqKLvIQHl4w5wufjbU,1284
|
|
150
151
|
castor_extractor/visualization/looker/api/sdk.py,sha256=KEhVCpQ__K9yTxSoIDG5y1FFuAhmeHo65pvxh7g90Ts,1600
|
|
@@ -192,17 +193,18 @@ castor_extractor/visualization/mode/client/constants.py,sha256=_Si5AF6VnpoSfnNNg
|
|
|
192
193
|
castor_extractor/visualization/mode/client/credentials.py,sha256=ptIpCCpoNt06yYaWQgl3Xu78_jVMoqsqWAGqQXVFZlo,606
|
|
193
194
|
castor_extractor/visualization/mode/errors.py,sha256=SKpFT2AiLOuWx2VRLyO7jbAiKcGDFXXrsebpNEKtr0E,1495
|
|
194
195
|
castor_extractor/visualization/mode/extract.py,sha256=g_X7k8L8MldFPbuwOrnyNMF3BEH1r-IAAgNmi3KLF-U,1623
|
|
195
|
-
castor_extractor/visualization/powerbi/__init__.py,sha256=
|
|
196
|
-
castor_extractor/visualization/powerbi/assets.py,sha256=
|
|
197
|
-
castor_extractor/visualization/powerbi/client/__init__.py,sha256=
|
|
198
|
-
castor_extractor/visualization/powerbi/client/
|
|
199
|
-
castor_extractor/visualization/powerbi/client/
|
|
200
|
-
castor_extractor/visualization/powerbi/client/
|
|
201
|
-
castor_extractor/visualization/powerbi/client/
|
|
202
|
-
castor_extractor/visualization/powerbi/client/
|
|
203
|
-
castor_extractor/visualization/powerbi/client/
|
|
204
|
-
castor_extractor/visualization/powerbi/client/
|
|
205
|
-
castor_extractor/visualization/powerbi/
|
|
196
|
+
castor_extractor/visualization/powerbi/__init__.py,sha256=AJnmfdmm2mGaInWJkUfZxRqrI7dBkTUSebpow05g5zo,135
|
|
197
|
+
castor_extractor/visualization/powerbi/assets.py,sha256=4VtYLgY81yQ3WzOEDipyK4zkS4xrIY9wjJBO1CeLpb4,932
|
|
198
|
+
castor_extractor/visualization/powerbi/client/__init__.py,sha256=8Bzhd9Z0ebVg2gDchXCOPa80Yqlq_9oCjbGi8u1M6J0,93
|
|
199
|
+
castor_extractor/visualization/powerbi/client/authentication.py,sha256=fz0v9qxeADwA1jiS9UzAQN5mA5kmZT53onlcWon2RGw,892
|
|
200
|
+
castor_extractor/visualization/powerbi/client/client.py,sha256=BDV0m00baYJLK4AyAP-TJ7rp2iEOk0ZsrPSIoSviEHI,7188
|
|
201
|
+
castor_extractor/visualization/powerbi/client/client_test.py,sha256=6NtpcKZCxBWyJO3phnVgE70Wmunb6tWsdXikkReJ02E,5539
|
|
202
|
+
castor_extractor/visualization/powerbi/client/constants.py,sha256=88R_aGachNNUZh6OSH2fkDwZtY4KTStzKm_g7HNCqqo,387
|
|
203
|
+
castor_extractor/visualization/powerbi/client/credentials.py,sha256=ueJ6AySVuigwGxIeQ7tGD2nh0UV1PnhKIkCCqFDvGBw,801
|
|
204
|
+
castor_extractor/visualization/powerbi/client/credentials_test.py,sha256=TzFqxsWVQ3sXR_n0bJsexK9Uz7ceXCEPVqDGWTJzW60,993
|
|
205
|
+
castor_extractor/visualization/powerbi/client/endpoints.py,sha256=WG1JRJ4FznUOQaUCWzjBqRnHNxQKv1-b2ZAnQVwQEVg,2058
|
|
206
|
+
castor_extractor/visualization/powerbi/client/pagination.py,sha256=OZMjoDQPRGMoWd9QcKKrPh3aErJR20SHlrTqY_siLkk,755
|
|
207
|
+
castor_extractor/visualization/powerbi/extract.py,sha256=0YCNSeTqcXSBbrl9g5dJUv8oMm7r-NT8tcfB-IdgPo8,1333
|
|
206
208
|
castor_extractor/visualization/qlik/__init__.py,sha256=u6lIfm_WOykBwt6SlaB7C0Dtx37XBliUbM5oWv26gC8,177
|
|
207
209
|
castor_extractor/visualization/qlik/assets.py,sha256=cG3Cqrj2s4inAqfW6dOaxRape2RPiCeGSYjKsRJRLLo,1657
|
|
208
210
|
castor_extractor/visualization/qlik/client/__init__.py,sha256=5O5N9Jrt3d99agFEJ28lKWs2KkDaXK-lZ07IUtLj56M,130
|
|
@@ -282,6 +284,15 @@ castor_extractor/visualization/tableau_revamp/client/gql_queries.py,sha256=-V3To
|
|
|
282
284
|
castor_extractor/visualization/tableau_revamp/client/rest_fields.py,sha256=gx39X1zMfRVpjmFbgvbgbvtlE0QwxOtk8rZFsIqeGRI,978
|
|
283
285
|
castor_extractor/visualization/tableau_revamp/constants.py,sha256=thS935pJyuZkdciM2EFHbIuTqSFYfB3YGCJYJ_Ls294,55
|
|
284
286
|
castor_extractor/visualization/tableau_revamp/extract.py,sha256=BPy38rFjGG6Nh1eDFeCckE4RHaO-bWW2uhXh7wm8mKk,1368
|
|
287
|
+
castor_extractor/visualization/thoughtspot/__init__.py,sha256=NhTGUk5Kdt54oCjHYoAt0cLBmVLys5lFYiRANL6wCmI,150
|
|
288
|
+
castor_extractor/visualization/thoughtspot/assets.py,sha256=lPRvXk0PKybgLv1AcDVxg-ssf4XLTs0biRqLrqC2TzU,196
|
|
289
|
+
castor_extractor/visualization/thoughtspot/client/__init__.py,sha256=svrE2rMxR-OXctjPeAHMEPePlfcra-9KDevTMcHunAA,86
|
|
290
|
+
castor_extractor/visualization/thoughtspot/client/client.py,sha256=EaJ0x87Ci5-XaPF9x7Gko2efuOmvGvVp2ViLkqlmk1I,3698
|
|
291
|
+
castor_extractor/visualization/thoughtspot/client/credentials.py,sha256=fp4YHiZy-dstWiLr5c4kFU9SyPK5rd2nCeh8k5sVRpM,462
|
|
292
|
+
castor_extractor/visualization/thoughtspot/client/endpoints.py,sha256=u3FRkmG6j5OIMEeXWZcgRObP8JeC4EutIJEeitNV44c,330
|
|
293
|
+
castor_extractor/visualization/thoughtspot/client/utils.py,sha256=54pC7t4-haWrJNPu4R7ef5dbd4zvMe3aep6bP61MglM,874
|
|
294
|
+
castor_extractor/visualization/thoughtspot/client/utils_test.py,sha256=-5ZaEYpQSrIp1-Sx-ViQOLPlv2LoOajEs2mE5YNi_tU,1887
|
|
295
|
+
castor_extractor/visualization/thoughtspot/extract.py,sha256=hpKUpwnAeu3_fPrtmAt6UhB04U8EKZgL7gJp0H7KZoM,1334
|
|
285
296
|
castor_extractor/warehouse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
286
297
|
castor_extractor/warehouse/abstract/__init__.py,sha256=Fdfa026tgOo64MvzVRLHM_F2G-JmcehrF0mh3dHgb7s,419
|
|
287
298
|
castor_extractor/warehouse/abstract/asset.py,sha256=Qs7T2Iw7KHgWVT2aAoBfCQ8tB143cUZY-DRUSkpgvGU,2689
|
|
@@ -351,24 +362,26 @@ castor_extractor/warehouse/postgres/query.py,sha256=5QmI79BP_EjqxeABNg56rxuM9Xuu
|
|
|
351
362
|
castor_extractor/warehouse/redshift/__init__.py,sha256=CC82SejYDlwYhZhhn40ln-oTsRx7AJ1Km61cxPkymjE,125
|
|
352
363
|
castor_extractor/warehouse/redshift/client.py,sha256=My7003HGBhTpS6X5NgYcKwntR7h45scLaGr-LSY0tIc,2172
|
|
353
364
|
castor_extractor/warehouse/redshift/client_test.py,sha256=74lZfna71qs80EKAuitJ8_ZjAGtpYHf5tChySinVPoQ,1023
|
|
354
|
-
castor_extractor/warehouse/redshift/extract.py,sha256=
|
|
365
|
+
castor_extractor/warehouse/redshift/extract.py,sha256=pblUQ2XafVTpyHrDLrmwFKy55mUNF03dZvgPweihYUc,2723
|
|
366
|
+
castor_extractor/warehouse/redshift/extract_test.py,sha256=-8eWOsFEv4DFvBmalaE_TzQD6YdgwnGRPCkKsycJuxg,653
|
|
355
367
|
castor_extractor/warehouse/redshift/queries/.sqlfluff,sha256=W4pFQiY8KMtXwn3WguYQJA8cj78VR7K-iokPoZoy5aM,30
|
|
356
368
|
castor_extractor/warehouse/redshift/queries/column.sql,sha256=ZXdurmaJRD2fejDksU5eh37Q4srmnVrEjSzsrtg_il8,6840
|
|
357
369
|
castor_extractor/warehouse/redshift/queries/database.sql,sha256=_C0knW159YDfReGuWLjIdvxHzefo1Xg2xw2dJKJzNk8,299
|
|
358
370
|
castor_extractor/warehouse/redshift/queries/group.sql,sha256=8p0wlqllnwOTiAgiV237DvFYHGOEcYwaHdyqVQg3F6E,101
|
|
359
371
|
castor_extractor/warehouse/redshift/queries/query.sql,sha256=yZNGnUdebvvDx0J0KMSJ2hNgkK4gPduyOfPM_7-DIfo,3465
|
|
372
|
+
castor_extractor/warehouse/redshift/queries/query_serverless.sql,sha256=QlYYFLJ2gInVczuXDxTGColM3-_zLSpPD0tBuLVFMyQ,1925
|
|
360
373
|
castor_extractor/warehouse/redshift/queries/schema.sql,sha256=Mf6nooi2w2PhGxM2_kDAf3oQ8QnR-hpT5Y0AmUzghGg,585
|
|
361
374
|
castor_extractor/warehouse/redshift/queries/table.sql,sha256=y8CGOwPHH_Mr8g1Zvuz2U5ldL8zuPm5v3M5RPZqIhsE,2645
|
|
362
375
|
castor_extractor/warehouse/redshift/queries/table_freshness.sql,sha256=l61_ysmTEtuMwK9RmYmD5cu0HmD1RXwTEhX0ytBeyxg,726
|
|
363
376
|
castor_extractor/warehouse/redshift/queries/user.sql,sha256=sEXveJAuNvZacvpI6WfwsX6VavoMb2VqYA32f6Dt-_Y,170
|
|
364
377
|
castor_extractor/warehouse/redshift/queries/view_ddl.sql,sha256=Pkyh_QT6d4rhTeyiVcqw6O8CRl7NEhk2p7eM5YIn5kg,719
|
|
365
|
-
castor_extractor/warehouse/redshift/query.py,sha256=
|
|
378
|
+
castor_extractor/warehouse/redshift/query.py,sha256=F2MiFqPRNGfBrCtkXNRs28Q_i9DfIEKh93yDUVb8Yjw,1060
|
|
366
379
|
castor_extractor/warehouse/salesforce/__init__.py,sha256=NR4aNea5jeE1xYqeZ_29deeN84CkN0_D_Z7CLQdJvFY,137
|
|
367
|
-
castor_extractor/warehouse/salesforce/client.py,sha256
|
|
380
|
+
castor_extractor/warehouse/salesforce/client.py,sha256=-9WHcQwEMrpGRQ9CN-bsRSR2Tnx9d-f_FtV4ntsf71w,3287
|
|
368
381
|
castor_extractor/warehouse/salesforce/constants.py,sha256=GusduVBCPvwpk_Im6F3bDvXeNQ7hRnCMdIAjIg65RnE,52
|
|
369
382
|
castor_extractor/warehouse/salesforce/extract.py,sha256=GaxkGWhdksDT_rlT24KX8DMpWnhKlhDMAUvBPGalli0,3454
|
|
370
|
-
castor_extractor/warehouse/salesforce/format.py,sha256=
|
|
371
|
-
castor_extractor/warehouse/salesforce/format_test.py,sha256=
|
|
383
|
+
castor_extractor/warehouse/salesforce/format.py,sha256=DlPD4BQax2RmdDDucw1QbDUTUm2N0CzI7Gc9GymNOYA,3370
|
|
384
|
+
castor_extractor/warehouse/salesforce/format_test.py,sha256=3_OzI0GB3YVEw33ldXCcLG5NwIRZziQaCrAawT4_0g0,3266
|
|
372
385
|
castor_extractor/warehouse/salesforce/pagination.py,sha256=m1S9JRNf6Oe-6dDghYUY5wwTzGzKW5H9pE60PCXMha0,920
|
|
373
386
|
castor_extractor/warehouse/salesforce/soql.py,sha256=XB8ohKwHFfC4Xger7Y84DXLW17IJDye_bZ3FL6DCcOI,1188
|
|
374
387
|
castor_extractor/warehouse/snowflake/__init__.py,sha256=TEGXTyxWp4Tr9gIHb-UFVTRKj6YWmrRtqHruiKSZGiY,174
|
|
@@ -402,8 +415,8 @@ castor_extractor/warehouse/sqlserver/queries/table.sql,sha256=kbBQP-TdG5px1IVgyx
|
|
|
402
415
|
castor_extractor/warehouse/sqlserver/queries/user.sql,sha256=gOrZsMVypusR2dc4vwVs4E1a-CliRsr_UjnD2EbXs-A,94
|
|
403
416
|
castor_extractor/warehouse/sqlserver/query.py,sha256=j_d5-HMnzBouwGfywVZMRSSwbXzPvzDWlFCZmvxcoGQ,539
|
|
404
417
|
castor_extractor/warehouse/synapse/queries/column.sql,sha256=lNcFoIW3Y0PFOqoOzJEXmPvZvfAsY0AP63Mu2LuPzPo,1351
|
|
405
|
-
castor_extractor-0.20.
|
|
406
|
-
castor_extractor-0.20.
|
|
407
|
-
castor_extractor-0.20.
|
|
408
|
-
castor_extractor-0.20.
|
|
409
|
-
castor_extractor-0.20.
|
|
418
|
+
castor_extractor-0.20.5.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
|
|
419
|
+
castor_extractor-0.20.5.dist-info/METADATA,sha256=wmQH2GPtnBGHq8a5CdjKZ6yPMNIrS4gkYrTpbV0T9yg,21214
|
|
420
|
+
castor_extractor-0.20.5.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
421
|
+
castor_extractor-0.20.5.dist-info/entry_points.txt,sha256=IVGy_oM8VjzADMAxzmiNJTYYidTCsI98MpO_mkXjkqE,1573
|
|
422
|
+
castor_extractor-0.20.5.dist-info/RECORD,,
|
|
@@ -18,6 +18,7 @@ castor-extract-sigma=castor_extractor.commands.extract_sigma:main
|
|
|
18
18
|
castor-extract-snowflake=castor_extractor.commands.extract_snowflake:main
|
|
19
19
|
castor-extract-sqlserver=castor_extractor.commands.extract_sqlserver:main
|
|
20
20
|
castor-extract-tableau=castor_extractor.commands.extract_tableau:main
|
|
21
|
+
castor-extract-thoughtspot=castor_extractor.commands.extract_thoughtspot:main
|
|
21
22
|
castor-file-check=castor_extractor.commands.file_check:main
|
|
22
23
|
castor-upload=castor_extractor.commands.upload:main
|
|
23
24
|
|