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.

Files changed (43) hide show
  1. CHANGELOG.md +20 -0
  2. castor_extractor/commands/extract_redshift.py +6 -0
  3. castor_extractor/commands/extract_thoughtspot.py +18 -0
  4. castor_extractor/utils/client/api/client.py +7 -2
  5. castor_extractor/utils/client/api/safe_request.py +6 -3
  6. castor_extractor/visualization/looker/api/constants.py +0 -4
  7. castor_extractor/visualization/powerbi/__init__.py +1 -1
  8. castor_extractor/visualization/powerbi/assets.py +7 -1
  9. castor_extractor/visualization/powerbi/client/__init__.py +2 -3
  10. castor_extractor/visualization/powerbi/client/authentication.py +27 -0
  11. castor_extractor/visualization/powerbi/client/client.py +207 -0
  12. castor_extractor/visualization/powerbi/client/client_test.py +173 -0
  13. castor_extractor/visualization/powerbi/client/constants.py +0 -67
  14. castor_extractor/visualization/powerbi/client/credentials.py +3 -4
  15. castor_extractor/visualization/powerbi/client/credentials_test.py +3 -4
  16. castor_extractor/visualization/powerbi/client/endpoints.py +65 -0
  17. castor_extractor/visualization/powerbi/client/pagination.py +32 -0
  18. castor_extractor/visualization/powerbi/extract.py +14 -9
  19. castor_extractor/visualization/thoughtspot/__init__.py +3 -0
  20. castor_extractor/visualization/thoughtspot/assets.py +9 -0
  21. castor_extractor/visualization/thoughtspot/client/__init__.py +2 -0
  22. castor_extractor/visualization/thoughtspot/client/client.py +120 -0
  23. castor_extractor/visualization/thoughtspot/client/credentials.py +18 -0
  24. castor_extractor/visualization/thoughtspot/client/endpoints.py +12 -0
  25. castor_extractor/visualization/thoughtspot/client/utils.py +25 -0
  26. castor_extractor/visualization/thoughtspot/client/utils_test.py +57 -0
  27. castor_extractor/visualization/thoughtspot/extract.py +49 -0
  28. castor_extractor/warehouse/redshift/extract.py +10 -1
  29. castor_extractor/warehouse/redshift/extract_test.py +26 -0
  30. castor_extractor/warehouse/redshift/queries/query_serverless.sql +69 -0
  31. castor_extractor/warehouse/redshift/query.py +12 -1
  32. castor_extractor/warehouse/salesforce/client.py +1 -1
  33. castor_extractor/warehouse/salesforce/format.py +40 -30
  34. castor_extractor/warehouse/salesforce/format_test.py +61 -24
  35. {castor_extractor-0.20.0.dist-info → castor_extractor-0.20.5.dist-info}/METADATA +21 -1
  36. {castor_extractor-0.20.0.dist-info → castor_extractor-0.20.5.dist-info}/RECORD +39 -26
  37. {castor_extractor-0.20.0.dist-info → castor_extractor-0.20.5.dist-info}/entry_points.txt +1 -0
  38. castor_extractor/visualization/powerbi/client/rest.py +0 -305
  39. castor_extractor/visualization/powerbi/client/rest_test.py +0 -290
  40. castor_extractor/visualization/powerbi/client/utils.py +0 -19
  41. castor_extractor/visualization/powerbi/client/utils_test.py +0 -24
  42. {castor_extractor-0.20.0.dist-info → castor_extractor-0.20.5.dist-info}/LICENCE +0 -0
  43. {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["QualifiedApiName"]
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, table_name: str) -> dict:
58
+ def _to_table_payload(sobject: dict) -> dict:
59
+ name = _name(sobject)
41
60
  return {
42
- "id": table_name,
61
+ "id": name,
43
62
  "api_name": sobject["QualifiedApiName"],
44
63
  "label": sobject["Label"],
45
64
  "schema_id": SCHEMA_NAME,
46
- "table_name": 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 _merge_label_and_api_name(sobject: dict) -> dict:
54
- label = sobject["Label"]
55
- api_name = sobject["QualifiedApiName"]
56
- table_name = f"{label} ({api_name})"
57
- return _to_table_payload(sobject, table_name)
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
- similar_sobjects = by_label.setdefault(label, [])
65
- similar_sobjects.append(sobject)
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
- by_label = _by_label(sobjects)
82
- for label, similars in by_label.items():
83
- if len(similars) > 1:
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]]) -> 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
- return [
93
- _to_column_payload(field, idx, table_name)
94
- for table_name, fields in sobject_fields.items()
95
- for idx, field in enumerate(fields)
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
- SCHEMA_NAME,
4
+ _HAS_DUPLICATE_KEY,
5
5
  SalesforceFormatter,
6
- _by_label,
6
+ _detect_duplicates,
7
7
  _field_description,
8
- _merge_label_and_api_name,
8
+ _name,
9
9
  )
10
10
 
11
11
 
12
- def _example_sobjects() -> Tuple[Dict[str, str], ...]:
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 test__merge_label_and_api_name():
52
- sobject = {"Label": "foo", "QualifiedApiName": "bar"}
53
- payload = _merge_label_and_api_name(sobject)
54
- expected_name = "foo (bar)"
55
- assert payload == {
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
- def test__by_label():
68
- a, b, c, a_prime = _example_sobjects()
69
- sobjects = [a, b, c, a_prime]
70
- by_label = _by_label(sobjects)
71
- assert by_label == {"a": [a, a_prime], "b": [b], "c": [c]}
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 = [*_example_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.0
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=_iTzy8VrdNYmYKWXfGfPMIlSenr4M7LCvoE1K0H96co,13601
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=bdLp7d7ImZoKCkWc3f3NXF1imIzMVT43_KPI-x4UVac,1155
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=0E5GG5Yxk-J5B11YdeIcccYk7jAfuQoWJIz5ljMGYUE,4275
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=SeBteAK8KhBjXldIdyUpkZphf9ktjzbvBM49AXrvD0g,1686
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=pZpq09tqcGi2Vh8orXxn9eil8ewfPUOLKfVuqgV2W-A,4126
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=VylJP6kw4yd2zGj31V-U9UXdhnPS9MK2Fz7Sd9KTkKI,119
196
- castor_extractor/visualization/powerbi/assets.py,sha256=SASUjxtoOMag3NAlZfhpCy0sLap7WfENEMaEZuBrw6o,801
197
- castor_extractor/visualization/powerbi/client/__init__.py,sha256=ewaEKS_shQlBbCpf-12J-bx3aUIpxbFZRJUL4eNOOno,97
198
- castor_extractor/visualization/powerbi/client/constants.py,sha256=gW2OdZwPvK_VjzNSZpFYKXW4dyYlSu9h4bIhYnIpXB4,2352
199
- castor_extractor/visualization/powerbi/client/credentials.py,sha256=z2p3KbA095LFV8XCGV6xLdHuPgOy5sQwCIAjkPgl5n8,772
200
- castor_extractor/visualization/powerbi/client/credentials_test.py,sha256=Zp7upzTUoGSArg-ujP0d9dGx31OMubIuA3S8X5Flv9Y,1016
201
- castor_extractor/visualization/powerbi/client/rest.py,sha256=YvDa-jnYVtONibRq6ifw26iphLaHZfGLz5qEmvPNnXI,9782
202
- castor_extractor/visualization/powerbi/client/rest_test.py,sha256=WMd8042r0nbUZECCVVC9JpJuNica2qlQBBbM8QuYfcQ,8528
203
- castor_extractor/visualization/powerbi/client/utils.py,sha256=0RcoWcKOdvIGH4f3lYDvufmiMo4tr_ABFlITSrvXjTs,541
204
- castor_extractor/visualization/powerbi/client/utils_test.py,sha256=ULHL2JLrcv0xjW2r7QF_ce2OaGeeSzajkMDywJ8ZdVA,719
205
- castor_extractor/visualization/powerbi/extract.py,sha256=OPF2QxP44iruQWARmpAx1HSDj7NLadPApIWVl1yRVZI,1101
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=XnAnBSapzXYUWVQKMhVaLlloA-uXEqseOhSt9flVsdw,2331
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=0C81rkt2cpkWrJIxxwALDyqr-49vlqQM04y_N6wwStc,540
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=NbbXTi_eX0ge815FgsiWh4uUnvZMOAl9_mXA_e172_0,3281
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=eiPM_4i_m3FEg_2jkMYlhaRBg3gTvV-9xQuk8ghJZiM,3289
371
- castor_extractor/warehouse/salesforce/format_test.py,sha256=6xDtCxNqvLo5JeHCtXyAun62WMzfVaVsvvMGXXfGgmA,2254
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.0.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
406
- castor_extractor-0.20.0.dist-info/METADATA,sha256=u6XUIwUCR1lLswRR_mMI9sm9zXrqIbE05MGVnAPLOBA,20819
407
- castor_extractor-0.20.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
408
- castor_extractor-0.20.0.dist-info/entry_points.txt,sha256=X_pDYOmhUUMbiAD9h2GZveuGdT8UgL38KJqP44xkvqo,1495
409
- castor_extractor-0.20.0.dist-info/RECORD,,
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