castor-extractor 0.19.8__py3-none-any.whl → 0.20.4__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 (46) hide show
  1. CHANGELOG.md +24 -0
  2. castor_extractor/commands/extract_tableau.py +8 -22
  3. castor_extractor/commands/extract_thoughtspot.py +18 -0
  4. castor_extractor/utils/__init__.py +1 -1
  5. castor_extractor/utils/client/api/client.py +14 -9
  6. castor_extractor/utils/client/api/pagination.py +2 -2
  7. castor_extractor/utils/client/api/safe_request.py +6 -3
  8. castor_extractor/utils/write.py +1 -1
  9. castor_extractor/visualization/looker/api/constants.py +0 -4
  10. castor_extractor/visualization/powerbi/__init__.py +1 -1
  11. castor_extractor/visualization/powerbi/assets.py +7 -1
  12. castor_extractor/visualization/powerbi/client/__init__.py +2 -3
  13. castor_extractor/visualization/powerbi/client/authentication.py +27 -0
  14. castor_extractor/visualization/powerbi/client/client.py +207 -0
  15. castor_extractor/visualization/powerbi/client/client_test.py +173 -0
  16. castor_extractor/visualization/powerbi/client/constants.py +0 -67
  17. castor_extractor/visualization/powerbi/client/credentials.py +3 -4
  18. castor_extractor/visualization/powerbi/client/credentials_test.py +3 -4
  19. castor_extractor/visualization/powerbi/client/endpoints.py +65 -0
  20. castor_extractor/visualization/powerbi/client/pagination.py +32 -0
  21. castor_extractor/visualization/powerbi/extract.py +14 -9
  22. castor_extractor/visualization/tableau_revamp/extract.py +10 -7
  23. castor_extractor/visualization/thoughtspot/__init__.py +3 -0
  24. castor_extractor/visualization/thoughtspot/assets.py +9 -0
  25. castor_extractor/visualization/thoughtspot/client/__init__.py +2 -0
  26. castor_extractor/visualization/thoughtspot/client/client.py +120 -0
  27. castor_extractor/visualization/thoughtspot/client/credentials.py +18 -0
  28. castor_extractor/visualization/thoughtspot/client/endpoints.py +12 -0
  29. castor_extractor/visualization/thoughtspot/client/utils.py +25 -0
  30. castor_extractor/visualization/thoughtspot/client/utils_test.py +57 -0
  31. castor_extractor/visualization/thoughtspot/extract.py +49 -0
  32. castor_extractor/warehouse/databricks/api_client.py +6 -0
  33. castor_extractor/warehouse/databricks/client.py +11 -5
  34. castor_extractor/warehouse/salesforce/client.py +1 -1
  35. castor_extractor/warehouse/salesforce/format.py +40 -30
  36. castor_extractor/warehouse/salesforce/format_test.py +61 -24
  37. castor_extractor/warehouse/sqlserver/client.py +2 -2
  38. {castor_extractor-0.19.8.dist-info → castor_extractor-0.20.4.dist-info}/METADATA +25 -1
  39. {castor_extractor-0.19.8.dist-info → castor_extractor-0.20.4.dist-info}/RECORD +42 -31
  40. {castor_extractor-0.19.8.dist-info → castor_extractor-0.20.4.dist-info}/entry_points.txt +1 -0
  41. castor_extractor/visualization/powerbi/client/rest.py +0 -305
  42. castor_extractor/visualization/powerbi/client/rest_test.py +0 -290
  43. castor_extractor/visualization/powerbi/client/utils.py +0 -19
  44. castor_extractor/visualization/powerbi/client/utils_test.py +0 -24
  45. {castor_extractor-0.19.8.dist-info → castor_extractor-0.20.4.dist-info}/LICENCE +0 -0
  46. {castor_extractor-0.19.8.dist-info → castor_extractor-0.20.4.dist-info}/WHEEL +0 -0
@@ -89,4 +89,4 @@ class SalesforceClient(SalesforceBaseClient):
89
89
  ):
90
90
  fields = self.fetch_fields(api_name)
91
91
  sobject_fields[table_name] = fields
92
- return self.formatter.columns(sobject_fields)
92
+ return list(self.formatter.columns(sobject_fields))
@@ -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
@@ -12,8 +12,8 @@ _KEYS = ("user", "password", "host", "port", "database")
12
12
 
13
13
 
14
14
  def _check_key(credentials: dict) -> None:
15
- for key in credentials:
16
- if key not in _KEYS:
15
+ for key in _KEYS:
16
+ if key not in credentials:
17
17
  raise KeyError(f"Missing {key} in credentials")
18
18
 
19
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: castor-extractor
3
- Version: 0.19.8
3
+ Version: 0.20.4
4
4
  Summary: Extract your metadata assets.
5
5
  Home-page: https://www.castordoc.com/
6
6
  License: EULA
@@ -208,6 +208,30 @@ For any questions or bug report, contact us at [support@castordoc.com](mailto:su
208
208
 
209
209
  # Changelog
210
210
 
211
+ ## 0.20.4 - 2024-10-09
212
+
213
+ * Salesforce warehouse: `Labels` instead of `api_names` for columns
214
+
215
+ ## 0.20.3 - 2024-10-03
216
+
217
+ * Looker: no longer extract `as_html` dashboard elements
218
+
219
+ ## 0.20.2 - 2024-09-24
220
+
221
+ * Thoughtspot: Adding connector
222
+
223
+ ## 0.20.1 - 2024-09-23
224
+
225
+ * Power BI: Improved client based on APIClient
226
+
227
+ ## 0.20.0 - 2024-09-23
228
+
229
+ * Switch to Tableau revamped connector
230
+
231
+ ## 0.19.9 - 2024-09-19
232
+
233
+ * Databricks: multithreading to retrieve column lineage
234
+
211
235
  ## 0.19.8 - 2024-09-18
212
236
 
213
237
  * Metabase: Handle duplicate dashboards
@@ -1,4 +1,4 @@
1
- CHANGELOG.md,sha256=5uXftRzGolo1ItaqsT8BA9ItULJemWj5yjHHygl-ePg,13456
1
+ CHANGELOG.md,sha256=CzVaQbFAS2hlZE2ak7DTYHWBNjMaC59e8UK7Q9p10tw,13905
2
2
  Dockerfile,sha256=HcX5z8OpeSvkScQsN-Y7CNMUig_UB6vTMDl7uqzuLGE,303
3
3
  DockerfileUsage.md,sha256=2hkJQF-5JuuzfPZ7IOxgM6QgIQW7l-9oRMFVwyXC4gE,998
4
4
  LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
@@ -23,7 +23,8 @@ castor_extractor/commands/extract_salesforce_reporting.py,sha256=FdANTNiLkIPdm80
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
- castor_extractor/commands/extract_tableau.py,sha256=u-6UCd-kfXwyhNWYxZusqtgTTYkf4gAJS1vRIYWsAVU,1415
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
@@ -65,7 +66,7 @@ castor_extractor/uploader/env_test.py,sha256=ClCWWtwd2N-5ClIDUxVMeKkWfhhOTxpppsX
65
66
  castor_extractor/uploader/upload.py,sha256=c86NP4ZxWnz3Hy1iWDYd9qjJSSjZ1bLq3fxVGBIU4Rc,3238
66
67
  castor_extractor/uploader/upload_test.py,sha256=7fwstdQe7FjuwGilsCdFpEQr1qLoR2WTRUzyy93fISw,402
67
68
  castor_extractor/uploader/utils.py,sha256=Tx_i875L2vJ8btOLV3-L0UMEFiyhH8E5n0XXRyLjO0Y,793
68
- castor_extractor/utils/__init__.py,sha256=MReSpH6I4AQZ5WTQp752P2sP4wVVZO8MyyglN0K0VKw,1509
69
+ castor_extractor/utils/__init__.py,sha256=jyYquzC2-R-UYl3VTP49ZDHB0IErGogTPMy3GfScbaA,1524
69
70
  castor_extractor/utils/argument_parser.py,sha256=S4EcIh3wNDjs3fOrQnttCcPsAmG8m_Txl7xvEh0Q37s,283
70
71
  castor_extractor/utils/argument_parser_test.py,sha256=wnyLFJ74iEiPxxLSbwFtckR7FIHxsFOVU38ljs9gqRA,633
71
72
  castor_extractor/utils/client/__init__.py,sha256=h5gm8UNNCCkAqhjYK5f6BY7k0cHFOyAvkmlktqwpir0,392
@@ -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=h8cQZ4CSD0LUuNv1VC5qa_p_jFbiOUbYztJnNmpJa2Q,4231
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
- castor_extractor/utils/client/api/pagination.py,sha256=Ne-4dqKrwEAETheBn14KPrGRzxsrkuCO96Z6gkCI-0Y,2437
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
@@ -129,7 +130,7 @@ castor_extractor/utils/time_test.py,sha256=pEwpcHI7wGPnfgwrH1DNHEbPz3HEAryNF5yPL
129
130
  castor_extractor/utils/type.py,sha256=87t32cTctEjX-_BqZLtPLWu-M9OVvw_lFU4DbaQ6V0U,313
130
131
  castor_extractor/utils/validation.py,sha256=NNMkdyvMzConslnyCM3gmciEtPPvefW0vAT2gNsMhvE,1909
131
132
  castor_extractor/utils/validation_test.py,sha256=aSetitOCkH_K-Wto9ISOVGso5jGfTUOBLm3AZnvavO8,1181
132
- castor_extractor/utils/write.py,sha256=CbLMz-mkUFduwogERwe69GXXVO65HEDirVm-kDJkRxg,2135
133
+ castor_extractor/utils/write.py,sha256=_7tNpu2p35E3GZnjsC_GWBbviR3pz3xsL7KAUahs8UE,2154
133
134
  castor_extractor/visualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
135
  castor_extractor/visualization/domo/__init__.py,sha256=1axOCPm4RpdIyUt9LQEvlMvbOPllW8rk63h6EjVgJ0Y,111
135
136
  castor_extractor/visualization/domo/assets.py,sha256=bK1urFR2tnlWkVkkhR32mAKMoKbESNlop-CNGx-65PY,206
@@ -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
@@ -281,7 +283,16 @@ castor_extractor/visualization/tableau_revamp/client/errors.py,sha256=dTe1shqmWm
281
283
  castor_extractor/visualization/tableau_revamp/client/gql_queries.py,sha256=-V3ToD5Gi7nmfVB2OxTOZw8dcOiF7_ciSWjjW2UdvvI,2270
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
- castor_extractor/visualization/tableau_revamp/extract.py,sha256=o8ZORM5OXtp51plmDNhk7o0egc0Vf2MOBysjJtRucBI,1289
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
@@ -308,9 +319,9 @@ castor_extractor/warehouse/bigquery/queries/view_ddl.sql,sha256=obCm-IN9V8_YSZTw
308
319
  castor_extractor/warehouse/bigquery/query.py,sha256=5Qc8PEa-kQKpTzguj4RNCAwKyvzWt20vAESYNB0lueo,4768
309
320
  castor_extractor/warehouse/bigquery/types.py,sha256=DHK3wUaaLyLMp7LP-7QkXTDYpYTZiPtvptAOkpxgp4g,88
310
321
  castor_extractor/warehouse/databricks/__init__.py,sha256=YG3YSIJgCFRjjI8eExy9T7qGnfnjWhMFh8c15KTs_BA,184
311
- castor_extractor/warehouse/databricks/api_client.py,sha256=lfS-DMLlTEsEMAEs7TeH8JmLX74l4Ai0k12nuP2fo2Y,8110
322
+ castor_extractor/warehouse/databricks/api_client.py,sha256=z9sIgZ4S3wZzUcVa_mlAW8s70sY8o7v19Kj_r6M0skM,8274
312
323
  castor_extractor/warehouse/databricks/api_client_test.py,sha256=YTWC-X7L-XAfK5b39TUgTmR1ifv0QrY5tvLNoSbpmjg,466
313
- castor_extractor/warehouse/databricks/client.py,sha256=neH-KnyWtxEMApbjIV2uhY7Me3tCpavd1NMnljrT05k,4768
324
+ castor_extractor/warehouse/databricks/client.py,sha256=7MtOvxhxRQOEGi9lmYWbi2W9baNQEDnuF3QTrycdzUw,5004
314
325
  castor_extractor/warehouse/databricks/client_test.py,sha256=UKr_D3M8mhqV1oL2_3y_6pEzAFLVE3FHDNZh4omFLK4,2286
315
326
  castor_extractor/warehouse/databricks/credentials.py,sha256=iphbVynVTQXMEbJy4QaT5fer-GpOi7QtbAlg8R7-Lj4,598
316
327
  castor_extractor/warehouse/databricks/endpoints.py,sha256=qPoL9CtPFJdwVuW9rJ37nmeMd-nChOBouEVYb4SlaUE,670
@@ -364,11 +375,11 @@ castor_extractor/warehouse/redshift/queries/user.sql,sha256=sEXveJAuNvZacvpI6Wfw
364
375
  castor_extractor/warehouse/redshift/queries/view_ddl.sql,sha256=Pkyh_QT6d4rhTeyiVcqw6O8CRl7NEhk2p7eM5YIn5kg,719
365
376
  castor_extractor/warehouse/redshift/query.py,sha256=0C81rkt2cpkWrJIxxwALDyqr-49vlqQM04y_N6wwStc,540
366
377
  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
378
+ castor_extractor/warehouse/salesforce/client.py,sha256=-9WHcQwEMrpGRQ9CN-bsRSR2Tnx9d-f_FtV4ntsf71w,3287
368
379
  castor_extractor/warehouse/salesforce/constants.py,sha256=GusduVBCPvwpk_Im6F3bDvXeNQ7hRnCMdIAjIg65RnE,52
369
380
  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
381
+ castor_extractor/warehouse/salesforce/format.py,sha256=DlPD4BQax2RmdDDucw1QbDUTUm2N0CzI7Gc9GymNOYA,3370
382
+ castor_extractor/warehouse/salesforce/format_test.py,sha256=3_OzI0GB3YVEw33ldXCcLG5NwIRZziQaCrAawT4_0g0,3266
372
383
  castor_extractor/warehouse/salesforce/pagination.py,sha256=m1S9JRNf6Oe-6dDghYUY5wwTzGzKW5H9pE60PCXMha0,920
373
384
  castor_extractor/warehouse/salesforce/soql.py,sha256=XB8ohKwHFfC4Xger7Y84DXLW17IJDye_bZ3FL6DCcOI,1188
374
385
  castor_extractor/warehouse/snowflake/__init__.py,sha256=TEGXTyxWp4Tr9gIHb-UFVTRKj6YWmrRtqHruiKSZGiY,174
@@ -392,7 +403,7 @@ castor_extractor/warehouse/snowflake/queries/user.sql,sha256=88V8eRj1NDaD_ufclsK
392
403
  castor_extractor/warehouse/snowflake/queries/view_ddl.sql,sha256=eWsci_50cxiYIv3N7BKkbXVM3RoIzqSDtohqRnE5kg4,673
393
404
  castor_extractor/warehouse/snowflake/query.py,sha256=yDpG4e23xtjEfAKNSAgL9wx17ChFSlvAbig2mJ5ZEC0,1769
394
405
  castor_extractor/warehouse/sqlserver/__init__.py,sha256=PdOuYznmvKAbfWAm8UdN47MfEsd9jqPi_dDi3WEo1KY,116
395
- castor_extractor/warehouse/sqlserver/client.py,sha256=l6O0OhAKtRqy0oTl9KDYDawgWKc4XCNOA-bVdnMdEjM,1592
406
+ castor_extractor/warehouse/sqlserver/client.py,sha256=8OCWD9Xv2M1pUAdWdcvChU5eLFIW565zyC0xmbtrZf0,1592
396
407
  castor_extractor/warehouse/sqlserver/extract.py,sha256=2mBNx9clyrhoiirD635BW-5u6pPoxHyIsB071XoZjho,2087
397
408
  castor_extractor/warehouse/sqlserver/queries/.sqlfluff,sha256=yy0KQdz8I_67vnXyX8eeWwOWkxTXvHyVKSVwhURktd8,48
398
409
  castor_extractor/warehouse/sqlserver/queries/column.sql,sha256=Szdf8hwcDffRTgtD6zf4ZuIyHIVijFgSDk1rZbKI3g8,2480
@@ -402,8 +413,8 @@ castor_extractor/warehouse/sqlserver/queries/table.sql,sha256=kbBQP-TdG5px1IVgyx
402
413
  castor_extractor/warehouse/sqlserver/queries/user.sql,sha256=gOrZsMVypusR2dc4vwVs4E1a-CliRsr_UjnD2EbXs-A,94
403
414
  castor_extractor/warehouse/sqlserver/query.py,sha256=j_d5-HMnzBouwGfywVZMRSSwbXzPvzDWlFCZmvxcoGQ,539
404
415
  castor_extractor/warehouse/synapse/queries/column.sql,sha256=lNcFoIW3Y0PFOqoOzJEXmPvZvfAsY0AP63Mu2LuPzPo,1351
405
- castor_extractor-0.19.8.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
406
- castor_extractor-0.19.8.dist-info/METADATA,sha256=aTfG24vormzYihCb2vjGUX2_EfOr9rDvmCyRABWhd10,20674
407
- castor_extractor-0.19.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
408
- castor_extractor-0.19.8.dist-info/entry_points.txt,sha256=X_pDYOmhUUMbiAD9h2GZveuGdT8UgL38KJqP44xkvqo,1495
409
- castor_extractor-0.19.8.dist-info/RECORD,,
416
+ castor_extractor-0.20.4.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
417
+ castor_extractor-0.20.4.dist-info/METADATA,sha256=YcFx5O-gccq_JevTWl9xfeE5LGf5baiUKHfPrG1QX28,21123
418
+ castor_extractor-0.20.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
419
+ castor_extractor-0.20.4.dist-info/entry_points.txt,sha256=IVGy_oM8VjzADMAxzmiNJTYYidTCsI98MpO_mkXjkqE,1573
420
+ castor_extractor-0.20.4.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