dcs-sdk 1.6.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.
Files changed (159) hide show
  1. data_diff/__init__.py +221 -0
  2. data_diff/__main__.py +517 -0
  3. data_diff/abcs/__init__.py +13 -0
  4. data_diff/abcs/compiler.py +27 -0
  5. data_diff/abcs/database_types.py +402 -0
  6. data_diff/config.py +141 -0
  7. data_diff/databases/__init__.py +38 -0
  8. data_diff/databases/_connect.py +323 -0
  9. data_diff/databases/base.py +1417 -0
  10. data_diff/databases/bigquery.py +376 -0
  11. data_diff/databases/clickhouse.py +217 -0
  12. data_diff/databases/databricks.py +262 -0
  13. data_diff/databases/duckdb.py +207 -0
  14. data_diff/databases/mssql.py +343 -0
  15. data_diff/databases/mysql.py +189 -0
  16. data_diff/databases/oracle.py +238 -0
  17. data_diff/databases/postgresql.py +293 -0
  18. data_diff/databases/presto.py +222 -0
  19. data_diff/databases/redis.py +93 -0
  20. data_diff/databases/redshift.py +233 -0
  21. data_diff/databases/snowflake.py +222 -0
  22. data_diff/databases/sybase.py +720 -0
  23. data_diff/databases/trino.py +73 -0
  24. data_diff/databases/vertica.py +174 -0
  25. data_diff/diff_tables.py +489 -0
  26. data_diff/errors.py +17 -0
  27. data_diff/format.py +369 -0
  28. data_diff/hashdiff_tables.py +1026 -0
  29. data_diff/info_tree.py +76 -0
  30. data_diff/joindiff_tables.py +434 -0
  31. data_diff/lexicographic_space.py +253 -0
  32. data_diff/parse_time.py +88 -0
  33. data_diff/py.typed +0 -0
  34. data_diff/queries/__init__.py +13 -0
  35. data_diff/queries/api.py +213 -0
  36. data_diff/queries/ast_classes.py +811 -0
  37. data_diff/queries/base.py +38 -0
  38. data_diff/queries/extras.py +43 -0
  39. data_diff/query_utils.py +70 -0
  40. data_diff/schema.py +67 -0
  41. data_diff/table_segment.py +583 -0
  42. data_diff/thread_utils.py +112 -0
  43. data_diff/utils.py +1022 -0
  44. data_diff/version.py +15 -0
  45. dcs_core/__init__.py +13 -0
  46. dcs_core/__main__.py +17 -0
  47. dcs_core/__version__.py +15 -0
  48. dcs_core/cli/__init__.py +13 -0
  49. dcs_core/cli/cli.py +165 -0
  50. dcs_core/core/__init__.py +19 -0
  51. dcs_core/core/common/__init__.py +13 -0
  52. dcs_core/core/common/errors.py +50 -0
  53. dcs_core/core/common/models/__init__.py +13 -0
  54. dcs_core/core/common/models/configuration.py +284 -0
  55. dcs_core/core/common/models/dashboard.py +24 -0
  56. dcs_core/core/common/models/data_source_resource.py +75 -0
  57. dcs_core/core/common/models/metric.py +160 -0
  58. dcs_core/core/common/models/profile.py +75 -0
  59. dcs_core/core/common/models/validation.py +216 -0
  60. dcs_core/core/common/models/widget.py +44 -0
  61. dcs_core/core/configuration/__init__.py +13 -0
  62. dcs_core/core/configuration/config_loader.py +139 -0
  63. dcs_core/core/configuration/configuration_parser.py +262 -0
  64. dcs_core/core/configuration/configuration_parser_arc.py +328 -0
  65. dcs_core/core/datasource/__init__.py +13 -0
  66. dcs_core/core/datasource/base.py +62 -0
  67. dcs_core/core/datasource/manager.py +112 -0
  68. dcs_core/core/datasource/search_datasource.py +421 -0
  69. dcs_core/core/datasource/sql_datasource.py +1094 -0
  70. dcs_core/core/inspect.py +163 -0
  71. dcs_core/core/logger/__init__.py +13 -0
  72. dcs_core/core/logger/base.py +32 -0
  73. dcs_core/core/logger/default_logger.py +94 -0
  74. dcs_core/core/metric/__init__.py +13 -0
  75. dcs_core/core/metric/base.py +220 -0
  76. dcs_core/core/metric/combined_metric.py +98 -0
  77. dcs_core/core/metric/custom_metric.py +34 -0
  78. dcs_core/core/metric/manager.py +137 -0
  79. dcs_core/core/metric/numeric_metric.py +403 -0
  80. dcs_core/core/metric/reliability_metric.py +90 -0
  81. dcs_core/core/profiling/__init__.py +13 -0
  82. dcs_core/core/profiling/datasource_profiling.py +136 -0
  83. dcs_core/core/profiling/numeric_field_profiling.py +72 -0
  84. dcs_core/core/profiling/text_field_profiling.py +67 -0
  85. dcs_core/core/repository/__init__.py +13 -0
  86. dcs_core/core/repository/metric_repository.py +77 -0
  87. dcs_core/core/utils/__init__.py +13 -0
  88. dcs_core/core/utils/log.py +29 -0
  89. dcs_core/core/utils/tracking.py +105 -0
  90. dcs_core/core/utils/utils.py +44 -0
  91. dcs_core/core/validation/__init__.py +13 -0
  92. dcs_core/core/validation/base.py +230 -0
  93. dcs_core/core/validation/completeness_validation.py +153 -0
  94. dcs_core/core/validation/custom_query_validation.py +24 -0
  95. dcs_core/core/validation/manager.py +282 -0
  96. dcs_core/core/validation/numeric_validation.py +276 -0
  97. dcs_core/core/validation/reliability_validation.py +91 -0
  98. dcs_core/core/validation/uniqueness_validation.py +61 -0
  99. dcs_core/core/validation/validity_validation.py +738 -0
  100. dcs_core/integrations/__init__.py +13 -0
  101. dcs_core/integrations/databases/__init__.py +13 -0
  102. dcs_core/integrations/databases/bigquery.py +187 -0
  103. dcs_core/integrations/databases/databricks.py +51 -0
  104. dcs_core/integrations/databases/db2.py +652 -0
  105. dcs_core/integrations/databases/elasticsearch.py +61 -0
  106. dcs_core/integrations/databases/mssql.py +829 -0
  107. dcs_core/integrations/databases/mysql.py +409 -0
  108. dcs_core/integrations/databases/opensearch.py +64 -0
  109. dcs_core/integrations/databases/oracle.py +719 -0
  110. dcs_core/integrations/databases/postgres.py +482 -0
  111. dcs_core/integrations/databases/redshift.py +53 -0
  112. dcs_core/integrations/databases/snowflake.py +48 -0
  113. dcs_core/integrations/databases/spark_df.py +111 -0
  114. dcs_core/integrations/databases/sybase.py +1069 -0
  115. dcs_core/integrations/storage/__init__.py +13 -0
  116. dcs_core/integrations/storage/local_file.py +149 -0
  117. dcs_core/integrations/utils/__init__.py +13 -0
  118. dcs_core/integrations/utils/utils.py +36 -0
  119. dcs_core/report/__init__.py +13 -0
  120. dcs_core/report/dashboard.py +211 -0
  121. dcs_core/report/models.py +88 -0
  122. dcs_core/report/static/assets/fonts/DMSans-Bold.ttf +0 -0
  123. dcs_core/report/static/assets/fonts/DMSans-Medium.ttf +0 -0
  124. dcs_core/report/static/assets/fonts/DMSans-Regular.ttf +0 -0
  125. dcs_core/report/static/assets/fonts/DMSans-SemiBold.ttf +0 -0
  126. dcs_core/report/static/assets/images/docs.svg +6 -0
  127. dcs_core/report/static/assets/images/github.svg +4 -0
  128. dcs_core/report/static/assets/images/logo.svg +7 -0
  129. dcs_core/report/static/assets/images/slack.svg +13 -0
  130. dcs_core/report/static/index.js +2 -0
  131. dcs_core/report/static/index.js.LICENSE.txt +3971 -0
  132. dcs_sdk/__init__.py +13 -0
  133. dcs_sdk/__main__.py +18 -0
  134. dcs_sdk/__version__.py +15 -0
  135. dcs_sdk/cli/__init__.py +13 -0
  136. dcs_sdk/cli/cli.py +163 -0
  137. dcs_sdk/sdk/__init__.py +58 -0
  138. dcs_sdk/sdk/config/__init__.py +13 -0
  139. dcs_sdk/sdk/config/config_loader.py +491 -0
  140. dcs_sdk/sdk/data_diff/__init__.py +13 -0
  141. dcs_sdk/sdk/data_diff/data_differ.py +821 -0
  142. dcs_sdk/sdk/rules/__init__.py +15 -0
  143. dcs_sdk/sdk/rules/rules_mappping.py +31 -0
  144. dcs_sdk/sdk/rules/rules_repository.py +214 -0
  145. dcs_sdk/sdk/rules/schema_rules.py +65 -0
  146. dcs_sdk/sdk/utils/__init__.py +13 -0
  147. dcs_sdk/sdk/utils/serializer.py +25 -0
  148. dcs_sdk/sdk/utils/similarity_score/__init__.py +13 -0
  149. dcs_sdk/sdk/utils/similarity_score/base_provider.py +153 -0
  150. dcs_sdk/sdk/utils/similarity_score/cosine_similarity_provider.py +39 -0
  151. dcs_sdk/sdk/utils/similarity_score/jaccard_provider.py +24 -0
  152. dcs_sdk/sdk/utils/similarity_score/levenshtein_distance_provider.py +31 -0
  153. dcs_sdk/sdk/utils/table.py +475 -0
  154. dcs_sdk/sdk/utils/themes.py +40 -0
  155. dcs_sdk/sdk/utils/utils.py +349 -0
  156. dcs_sdk-1.6.5.dist-info/METADATA +150 -0
  157. dcs_sdk-1.6.5.dist-info/RECORD +159 -0
  158. dcs_sdk-1.6.5.dist-info/WHEEL +4 -0
  159. dcs_sdk-1.6.5.dist-info/entry_points.txt +4 -0
@@ -0,0 +1,349 @@
1
+ # Copyright 2022-present, the Waterdip Labs Pvt. Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import glob
16
+ import os
17
+ import uuid
18
+ from typing import List, Optional, Union
19
+
20
+ import duckdb
21
+ import requests
22
+
23
+ from dcs_sdk.sdk.config.config_loader import Comparison
24
+ from dcs_sdk.sdk.rules.rules_repository import RulesRepository
25
+
26
+
27
+ def generate_table_name(file_path, is_table: bool = True):
28
+ base_name = os.path.basename(file_path)
29
+ if is_table:
30
+ table_name = os.path.splitext(base_name)[0]
31
+ else:
32
+ table_name = base_name
33
+ return table_name
34
+
35
+
36
+ def calculate_column_differences(source_columns, target_columns, columns_mappings):
37
+ rules_repo = RulesRepository.get_instance()
38
+ columns_with_unmatched_data_type = []
39
+ columns_not_compared = []
40
+ processed_cols = set()
41
+
42
+ source_column_dict = {col["column_name"]: col for col in source_columns}
43
+ target_column_dict = {col["column_name"]: col for col in target_columns}
44
+
45
+ mapped_source_columns = {mapping["source_column"] for mapping in columns_mappings}
46
+ mapped_target_columns = {mapping["target_column"] for mapping in columns_mappings}
47
+
48
+ for mapping in columns_mappings:
49
+ source_col_name = mapping["source_column"]
50
+ target_col_name = mapping["target_column"]
51
+
52
+ processed_cols.add(source_col_name)
53
+ processed_cols.add(target_col_name)
54
+
55
+ source_col = source_column_dict[source_col_name]
56
+ target_col = target_column_dict[target_col_name]
57
+ match, reason = rules_repo.apply_schema_rules(src_col=source_col, tgt_col=target_col)
58
+ if not match:
59
+ columns_with_unmatched_data_type.append(
60
+ {
61
+ "source": {
62
+ "column_name": source_col_name,
63
+ "data_type": source_col["data_type"],
64
+ "character_maximum_length": source_col.get("character_maximum_length"),
65
+ "mismatch_reason": reason,
66
+ },
67
+ "target": {
68
+ "column_name": target_col_name,
69
+ "data_type": target_col["data_type"],
70
+ "character_maximum_length": target_col.get("character_maximum_length"),
71
+ "mismatch_reason": reason,
72
+ },
73
+ }
74
+ )
75
+
76
+ # Check auto-matched common columns not in mapping
77
+ common_column_names = set(source_column_dict.keys()) & set(target_column_dict.keys())
78
+
79
+ for col_name in common_column_names:
80
+ if col_name in mapped_source_columns or col_name in mapped_target_columns:
81
+ continue
82
+
83
+ source_col = source_column_dict[col_name]
84
+ target_col = target_column_dict[col_name]
85
+ processed_cols.add(col_name)
86
+
87
+ match, reason = rules_repo.apply_schema_rules(src_col=source_col, tgt_col=target_col)
88
+ if not match:
89
+ columns_with_unmatched_data_type.append(
90
+ {
91
+ "source": {
92
+ "column_name": col_name,
93
+ "data_type": source_col["data_type"],
94
+ "character_maximum_length": source_col.get("character_maximum_length"),
95
+ "mismatch_reason": reason,
96
+ },
97
+ "target": {
98
+ "column_name": col_name,
99
+ "data_type": target_col["data_type"],
100
+ "character_maximum_length": target_col.get("character_maximum_length"),
101
+ "mismatch_reason": reason,
102
+ },
103
+ }
104
+ )
105
+
106
+ for source_col_name in source_column_dict:
107
+ if source_col_name not in mapped_source_columns:
108
+ columns_not_compared.append(
109
+ {
110
+ "column_name": source_col_name,
111
+ "data_type": source_column_dict[source_col_name]["data_type"],
112
+ "origin": "source",
113
+ }
114
+ )
115
+
116
+ for target_col_name in target_column_dict:
117
+ if target_col_name not in mapped_target_columns:
118
+ columns_not_compared.append(
119
+ {
120
+ "column_name": target_col_name,
121
+ "data_type": target_column_dict[target_col_name]["data_type"],
122
+ "origin": "target",
123
+ }
124
+ )
125
+
126
+ source_col_names = set(source_column_dict.keys())
127
+ target_col_names = set(target_column_dict.keys())
128
+
129
+ exclusive_to_source = source_col_names - processed_cols
130
+ exclusive_to_target = target_col_names - processed_cols
131
+
132
+ return (
133
+ columns_with_unmatched_data_type,
134
+ columns_not_compared,
135
+ exclusive_to_source,
136
+ exclusive_to_target,
137
+ )
138
+
139
+
140
+ def duck_db_load_csv_to_table(config: Comparison, path, is_source: bool = False) -> bool:
141
+ dir_name = "tmp"
142
+ if not os.path.exists(dir_name):
143
+ os.makedirs(dir_name)
144
+ csv_files = glob.glob(path)
145
+
146
+ if is_source:
147
+ pk_cols = config.primary_keys_source
148
+ else:
149
+ pk_cols = config.primary_keys_target
150
+
151
+ duck_db_file_name = f"{dir_name}/{uuid.uuid4()}.duckdb"
152
+ create_view = False
153
+ query = None
154
+ table_name = None
155
+ if is_source and config.source_query:
156
+ create_view = True
157
+ query = config.source_query
158
+ elif not is_source and config.target_query:
159
+ create_view = True
160
+ query = config.target_query
161
+
162
+ for csv_file in csv_files:
163
+ try:
164
+ table_name = generate_table_name(csv_file)
165
+ conn = duckdb.connect(database=duck_db_file_name, read_only=False)
166
+ conn.execute(
167
+ """
168
+ CREATE OR REPLACE TABLE {} AS SELECT * FROM read_csv('{}',HEADER=True, UNION_BY_NAME=True, nullstr='NULL', all_varchar=True, IGNORE_ERRORS=TRUE);
169
+ """.format(
170
+ table_name, csv_file
171
+ )
172
+ )
173
+
174
+ if pk_cols and len(pk_cols) > 0:
175
+ pk_cols_str = ", ".join(pk_cols)
176
+ conn.execute(
177
+ """
178
+ CREATE INDEX idx_{} ON {} ({});
179
+ """.format(
180
+ table_name,
181
+ table_name,
182
+ pk_cols_str,
183
+ )
184
+ )
185
+
186
+ if create_view:
187
+ table_name = f"{table_name}_query"
188
+ conn.execute(
189
+ """
190
+ CREATE VIEW {} AS {};
191
+ """.format(
192
+ table_name, query
193
+ )
194
+ )
195
+ conn.close()
196
+ except Exception as e:
197
+ print(f"Error in loading CSV to DuckDB: {e}")
198
+ return False
199
+
200
+ if is_source:
201
+ config.source.filepath = duck_db_file_name
202
+ config.source.table = table_name
203
+ else:
204
+ config.target.filepath = duck_db_file_name
205
+ config.target.table = table_name
206
+ return True
207
+
208
+
209
+ def find_identical_columns(source, target):
210
+ identical_columns = []
211
+ rules_repo = RulesRepository.get_instance()
212
+
213
+ for s_col in source:
214
+ for t_col in target:
215
+ if s_col["column_name"] != t_col["column_name"]:
216
+ continue
217
+
218
+ match, reason = rules_repo.apply_schema_rules(src_col=s_col, tgt_col=t_col)
219
+ if match:
220
+ identical_columns.append(
221
+ {
222
+ "column_name": s_col["column_name"],
223
+ "data_type": s_col["data_type"],
224
+ "character_maximum_length": s_col.get("character_maximum_length"),
225
+ }
226
+ )
227
+
228
+ return identical_columns
229
+
230
+
231
+ def post_comparison_results(comparison_data, url, is_cli=True):
232
+ try:
233
+ comparison_data["is_cli"] = is_cli
234
+ response = requests.post(url, json=comparison_data)
235
+ try:
236
+ print(response.json())
237
+ except Exception as e:
238
+ print(f"Error in parsing response: {e}")
239
+ if response.ok:
240
+ print(f"Comparison results posted successfully")
241
+ except Exception as e:
242
+ print(f"Error in posting comparison results: {e}")
243
+
244
+
245
+ def _obfuscate_value(value: Optional[Union[str, int]]) -> Optional[str]:
246
+ if not value or not isinstance(value, (str, int)):
247
+ return value
248
+
249
+ str_value = str(value)[:10]
250
+ if len(str_value) > 2:
251
+ return str_value[0] + "*" * (len(str_value) - 2) + str_value[-1]
252
+ return "*" * len(str_value)
253
+
254
+
255
+ def obfuscate_sensitive_data(configuration: dict) -> dict:
256
+ sensitive_keys = {
257
+ "role",
258
+ "account",
259
+ "username",
260
+ "password",
261
+ "http_path",
262
+ "access_token",
263
+ "host",
264
+ "port",
265
+ "server",
266
+ "keyfile",
267
+ "bigquery_credentials",
268
+ }
269
+ return {key: _obfuscate_value(value) if key in sensitive_keys else value for key, value in configuration.items()}
270
+
271
+
272
+ def apply_masking(obj: dict, masking_columns: List[str], mask_char: str = "*") -> dict:
273
+ masked_obj = obj.copy()
274
+ for col in masking_columns:
275
+ if col in masked_obj and masked_obj[col] is not None:
276
+ masked_obj[col] = mask_char * len(str(masked_obj[col]))
277
+ return masked_obj
278
+
279
+
280
+ def safe_str(value) -> str:
281
+ """Safely convert value to string, handling None and exceptions"""
282
+ if value is None:
283
+ return None
284
+ try:
285
+ return str(value)
286
+ except Exception:
287
+ return "[unconvertible_value]"
288
+
289
+
290
+ def apply_custom_masking(
291
+ source: Optional[dict],
292
+ target: Optional[dict],
293
+ source_masking_cols: List[str],
294
+ target_masking_cols: List[str],
295
+ mask_char: str = "*",
296
+ ):
297
+ source = source or {}
298
+ target = target or {}
299
+ masked_source = source.copy()
300
+ masked_target = target.copy()
301
+
302
+ common_masking_cols = set(source_masking_cols).intersection(set(target_masking_cols))
303
+
304
+ # common masking columns
305
+ for col in common_masking_cols:
306
+ src_val = str(source.get(col, ""))
307
+ tgt_val = str(target.get(col, ""))
308
+
309
+ src_len, tgt_len = len(src_val), len(tgt_val)
310
+ if src_len == tgt_len and src_val != tgt_val:
311
+ masked_source[col] = mask_char * (src_len + 1)
312
+ masked_target[col] = mask_char * tgt_len
313
+ else:
314
+ masked_source[col] = mask_char * src_len
315
+ masked_target[col] = mask_char * tgt_len
316
+
317
+ # Non-common columns
318
+ for col in source_masking_cols:
319
+ if col not in common_masking_cols:
320
+ val = source.get(col, "")
321
+ masked_source[col] = mask_char * len(val)
322
+
323
+ for col in target_masking_cols:
324
+ if col not in common_masking_cols:
325
+ val = target.get(col, "")
326
+ masked_target[col] = mask_char * len(val)
327
+
328
+ return masked_source, masked_target
329
+
330
+
331
+ def convert_to_masked_if_required(
332
+ table_sample_data: list, masking_character: str, masking_columns: list, columns_order_wise: list
333
+ ):
334
+ idxs_to_mask = []
335
+ for i, val in enumerate(columns_order_wise):
336
+ if val in masking_columns:
337
+ idxs_to_mask.append(i)
338
+
339
+ new_table_sample_data = []
340
+ for row in table_sample_data:
341
+ curr_sample_row = []
342
+ for i, val in enumerate(row):
343
+ if i in idxs_to_mask:
344
+ curr_sample_row.append(masking_character * len(str(val)))
345
+ else:
346
+ curr_sample_row.append(val)
347
+ new_table_sample_data.append(tuple(curr_sample_row))
348
+
349
+ return new_table_sample_data
@@ -0,0 +1,150 @@
1
+ Metadata-Version: 2.4
2
+ Name: dcs-sdk
3
+ Version: 1.6.5
4
+ Summary: SDK for DataChecks
5
+ Author: Waterdip Labs
6
+ Author-email: hello@waterdip.ai
7
+ Requires-Python: >=3.10,<3.13
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Provides-Extra: all-dbs
13
+ Provides-Extra: bigquery
14
+ Provides-Extra: clickhouse
15
+ Provides-Extra: databricks
16
+ Provides-Extra: db2
17
+ Provides-Extra: elasticsearch
18
+ Provides-Extra: impyla
19
+ Provides-Extra: mssql
20
+ Provides-Extra: mysql
21
+ Provides-Extra: opensearch
22
+ Provides-Extra: oracle
23
+ Provides-Extra: postgresql
24
+ Provides-Extra: preql
25
+ Provides-Extra: presto
26
+ Provides-Extra: redshift
27
+ Provides-Extra: snowflake
28
+ Provides-Extra: spark
29
+ Provides-Extra: sybase
30
+ Provides-Extra: trino
31
+ Provides-Extra: vertica
32
+ Requires-Dist: attrs (>=23.1.0)
33
+ Requires-Dist: click (>=8.1)
34
+ Requires-Dist: clickhouse-driver (>=0.2.9) ; extra == "clickhouse" or extra == "all-dbs"
35
+ Requires-Dist: cryptography (>=44.0.1) ; extra == "snowflake" or extra == "all-dbs"
36
+ Requires-Dist: databricks-sql-connector (>=3.3.0,<4.0.0) ; extra == "databricks" or extra == "all-dbs"
37
+ Requires-Dist: dsnparse (<0.2.0)
38
+ Requires-Dist: duckdb (>=0.9.0)
39
+ Requires-Dist: elasticsearch (>=9.1.0,<10.0.0) ; extra == "elasticsearch" or extra == "all-dbs"
40
+ Requires-Dist: google-cloud-bigquery (>=3.31.0,<4.0.0) ; extra == "bigquery" or extra == "all-dbs"
41
+ Requires-Dist: h11 (>=0.16.0,<0.17.0)
42
+ Requires-Dist: ibm-db (>=3.2.3,<4.0.0) ; extra == "db2" or extra == "all-dbs"
43
+ Requires-Dist: ibm-db-sa (>=0.4.1,<0.5.0) ; extra == "db2" or extra == "all-dbs"
44
+ Requires-Dist: impyla (>=0.20.0,<0.21.0) ; extra == "impyla" or extra == "all-dbs"
45
+ Requires-Dist: jinja2 (>=3.1.6,<4.0.0)
46
+ Requires-Dist: keyring (>=25.3.0)
47
+ Requires-Dist: loguru (==0.7.2)
48
+ Requires-Dist: mashumaro[msgpack] (>=2.9,<3.11.0)
49
+ Requires-Dist: mysql-connector-python (>=9.0.1) ; extra == "mysql" or extra == "all-dbs"
50
+ Requires-Dist: nltk (>=3.9.1,<4.0.0)
51
+ Requires-Dist: numpy (==1.26.4)
52
+ Requires-Dist: opensearch-py (>=2.2.0,<3.0.0) ; extra == "opensearch" or extra == "all-dbs"
53
+ Requires-Dist: oracledb (>=2.4.1) ; extra == "oracle" or extra == "all-dbs"
54
+ Requires-Dist: packaging (>=24.1,<25.0)
55
+ Requires-Dist: preql (>=0.2.19) ; extra == "preql" or extra == "all-dbs"
56
+ Requires-Dist: presto-python-client (>=0.8.4) ; extra == "presto" or extra == "all-dbs"
57
+ Requires-Dist: protobuf (>=5.29.5,<6.0.0)
58
+ Requires-Dist: psycopg2-binary (>=2.9.9,<3.0.0) ; extra == "postgresql" or extra == "redshift" or extra == "all-dbs"
59
+ Requires-Dist: pydantic (>=1.10.12)
60
+ Requires-Dist: pymysql[rsa] (>=1.1.0,<2.0.0) ; extra == "mysql" or extra == "all-dbs"
61
+ Requires-Dist: pyodbc (>=4.0.39) ; extra == "mssql" or extra == "sybase" or extra == "all-dbs"
62
+ Requires-Dist: pyparsing (>=3.1.1,<4.0.0)
63
+ Requires-Dist: pyspark (>=3.2.1,<4.0.0) ; extra == "spark" or extra == "all-dbs"
64
+ Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
65
+ Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
66
+ Requires-Dist: pytz (>=2024.1)
67
+ Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
68
+ Requires-Dist: redis[hiredis] (>=5.2.1,<6.0.0)
69
+ Requires-Dist: requests (>=2.32.4,<3.0.0)
70
+ Requires-Dist: rich (>=13.8.0)
71
+ Requires-Dist: setuptools (>=78.1.1)
72
+ Requires-Dist: snowflake-connector-python (>=3.17.2) ; extra == "snowflake" or extra == "all-dbs"
73
+ Requires-Dist: snowflake-sqlalchemy (>=1.5.3,<2.0.0) ; extra == "snowflake" or extra == "all-dbs"
74
+ Requires-Dist: sqlalchemy (>=2.0.14,<2.1.0)
75
+ Requires-Dist: sqlalchemy-bigquery (>=1.8.0,<2.0.0) ; extra == "bigquery" or extra == "all-dbs"
76
+ Requires-Dist: sqlalchemy-sybase (>=2.0.0,<3.0.0) ; extra == "sybase" or extra == "all-dbs"
77
+ Requires-Dist: tabulate (>=0.9.0)
78
+ Requires-Dist: toml (>=0.10.2)
79
+ Requires-Dist: tornado (>=6.5,<7.0)
80
+ Requires-Dist: trino (>=0.314.0) ; extra == "trino" or extra == "all-dbs"
81
+ Requires-Dist: typing-extensions (>=4.0.1)
82
+ Requires-Dist: urllib3 (>=2.5.0,<3.0.0)
83
+ Requires-Dist: vertica-python (>=1.4.0) ; extra == "vertica" or extra == "all-dbs"
84
+ Description-Content-Type: text/markdown
85
+
86
+ <h1 align="center">
87
+ DCS SDK v1.6.4
88
+ </h1>
89
+
90
+ > SDK for DataChecks
91
+
92
+
93
+ ## Installation
94
+
95
+ > Python version `>=3.10,<3.13`
96
+
97
+ ```bash
98
+
99
+ $ pip install dcs-sdk[all-dbs]
100
+
101
+ ```
102
+
103
+ ## Supported Databases
104
+
105
+ > Availability Status
106
+
107
+ | Database | Code Name | Supported |
108
+ | ----------------- | ------------ | --------- |
109
+ | PostgreSQL | `postgres` | ✅ |
110
+ | Snowflake | `snowflake` | ✅ |
111
+ | Trino | `trino` | ✅ |
112
+ | Databricks | `databricks` | ✅ |
113
+ | Oracle | `oracle` | ✅ |
114
+ | MSSQL | `mssql` | ✅ |
115
+ | MySQL | `mysql` | ✅ |
116
+ | SAP Sybase IQ/ASE | `sybase` | ✅ |
117
+ | File | `file` | ✅ |
118
+ | BigQuery | `bigquery` | ✅ |
119
+
120
+
121
+
122
+
123
+ ## Available Commands
124
+
125
+
126
+
127
+ | Option | Short Option | Required | Default | Description | Example |
128
+ | :-----------: | :----------: | :------: | :-------------: | :------------------------------------------------: | :------------------------------------------------------------------------------------------------------: |
129
+ | --config-path | -C | **Yes** | None | Specify the file path for the configuration | dcs-sdk run --config-path config.yaml --compare comp_name |
130
+ | --compare | | **Yes** | None | Run only specific comparison using comparison name | dcs-sdk run --config-path config.yaml --compare comp_name |
131
+ | --save-json | -j | No | False | Save the data into a JSON file | dcs-sdk run --config-path config.yaml --compare comp_name --save-json |
132
+ | --json-path | -jp | No | dcs_report.json | Specify the file path for JSON file | dcs-sdk run --config-path config.yaml --compare comp_name --save-json --json-path ouput.json |
133
+ | --stats | | No | False | Print stats about data diff | dcs-sdk run --config-path config.yaml --compare comp_name --stats |
134
+ | --url | | No | None | Specify url to send data to server | dcs-sdk run --config-path config.yaml --compare comp_name --url=https://comapre/send/data |
135
+ | --html-report | | No | False | Save table as HTML | dcs-sdk run --config-path config.yaml --compare comp_name --html-report |
136
+ | --report-path | | No | dcs_report.html | Specify the file path for HTML report | dcs-sdk run --config-path config.yaml --compare comp_name --html-report --report-path table.html |
137
+ | --table | | No | False | Display Comparison in table format | dcs-sdk run --config-path config.yaml --compare comp_name --html-report --report-path table.html --table |
138
+
139
+
140
+
141
+ ### Example Command [CLI]
142
+
143
+ ```sh
144
+ $ dcs-sdk --version
145
+
146
+ $ dcs-sdk --help
147
+
148
+ $ dcs-sdk run -C example.yaml --compare comparison_one --stats -j -jp output.json --html-report --report-path result.html --table --url=https://comapre/send/data
149
+ ```
150
+
@@ -0,0 +1,159 @@
1
+ data_diff/__init__.py,sha256=QrrQt6GxG5gzVRlvFjJmfOzhR14fqKLrQs186KBWryY,10413
2
+ data_diff/__main__.py,sha256=UvFvBKU74202bfRcIO_Wk-SU8WmnNuDK_1YVJpueMlc,16969
3
+ data_diff/abcs/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
4
+ data_diff/abcs/compiler.py,sha256=RuGhGlLTQuCzOJfYxa4gjcADsyvbZ9yZPuDuY6XH8Rk,785
5
+ data_diff/abcs/database_types.py,sha256=MKnWM9QBgeo-hjhgHhHWezd5i7HjozZ4ujsnzQ7ALOs,11326
6
+ data_diff/config.py,sha256=uRcoVVhPjVZqgQNwr18v6sPq06cGXDLemTUyitU57zA,4998
7
+ data_diff/databases/__init__.py,sha256=NrBm1Paj7jkHZ_hQCD-4-Q1eeDdh3v9_bz1DkPDOv9g,1680
8
+ data_diff/databases/_connect.py,sha256=nGsmtzDSKN8CK8zMkdcGZz0iExzkJDYw-PGebIkmQgc,11151
9
+ data_diff/databases/base.py,sha256=3UPNVmG6XLVPMLmA3cGFZH-B2JIRGW--hiotkJEIh4k,53196
10
+ data_diff/databases/bigquery.py,sha256=PDwSkmWRW26gUl2SMOyIsiYtgrqghptYqG8_SaaiXb4,14709
11
+ data_diff/databases/clickhouse.py,sha256=5DsW8UpyYsWI8I3AlPUvHWYdWdWpqzRsvsVwgqEyaLw,7554
12
+ data_diff/databases/databricks.py,sha256=6cdwfAspg1GIgWFlQByvFcW_Hz1mnJeI9_2kZhOP8b4,9334
13
+ data_diff/databases/duckdb.py,sha256=7r1PwPUpp61QN_ZorsBTyn6NTB1LcBKQofYl_wovm1U,7209
14
+ data_diff/databases/mssql.py,sha256=Emz5ReSZ_DBH-SRC0RCdJWlrQY2DyMeeB4DsWMVnIeM,11893
15
+ data_diff/databases/mysql.py,sha256=LTuLTkxac16y7w5_q1nEuKy6ZefqQUBQqV_tdnzjNT4,6148
16
+ data_diff/databases/oracle.py,sha256=GIczARg96lOlmgUpHd-hOFl8etFJmxWMy-KkA2COG74,8031
17
+ data_diff/databases/postgresql.py,sha256=dSZBUYbGwWnvCwTxSwMSiaElmQSpB2Q3chsmgvUeqQE,10787
18
+ data_diff/databases/presto.py,sha256=1Z8iDV2pc35Bu7DuUerFuFLbrwgSHSkBYmJ72JlZSZ8,7116
19
+ data_diff/databases/redis.py,sha256=gspPgUr7uFyZrqhIHBgYZo7-ecKNn8Wc_S8CVSQasLU,3501
20
+ data_diff/databases/redshift.py,sha256=-gFWs3NCcevO4s6c4zV3_LYihK24fUd5BADTKahubjw,8122
21
+ data_diff/databases/snowflake.py,sha256=7G6fvVJXOtTvXmSfWCxTslF4WohoscQoiqcmJIN684A,7910
22
+ data_diff/databases/sybase.py,sha256=RCZu2sqY08w8CN5NY0WN6QZFJBvQ3Ezk8OtfH8enxaY,31311
23
+ data_diff/databases/trino.py,sha256=VIN3gMJvT4oSYuXCJ1QnngVL2gjjEYMFw87QTHgjs8c,2328
24
+ data_diff/databases/vertica.py,sha256=2dSDZp6qOEvUVPldI5Tgn7Sm3dCpC3vNXJL3qb3FDvQ,5529
25
+ data_diff/diff_tables.py,sha256=AyFJF6oaam06AH4ZPI8pj63BiYojHoZTykjrdJCX2fI,20899
26
+ data_diff/errors.py,sha256=4Yru8yOwyuDuBlTABnGCvJMSpe6-rbLJpNnVHeTTyHU,745
27
+ data_diff/format.py,sha256=QFDjdZaBVf_N-jfKiX4ppOUdpXTPZXmv1j0pc1RiOoc,10245
28
+ data_diff/hashdiff_tables.py,sha256=c-YOOkjUGUok_MJpvkwVOxfJPIQdvtJkW686kPLUYsM,43252
29
+ data_diff/info_tree.py,sha256=yHtFSoXuu6oBafLYOYQjUSKlB-DnAAd08U9HOEAdTPI,2799
30
+ data_diff/joindiff_tables.py,sha256=fyrEYjyh2BX1vGibwVZLYM1V6JJTOY-uGXY-KInvMkw,17612
31
+ data_diff/lexicographic_space.py,sha256=bBoCbbH1Mla9jNOq1b5RuwjAxSVU7gWkra673tPBwXQ,8305
32
+ data_diff/parse_time.py,sha256=HQ9Vq08Bq15KlzVn95b1hOTrsc1XTpRLyF03qXcf8tM,2438
33
+ data_diff/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
+ data_diff/queries/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
35
+ data_diff/queries/api.py,sha256=zwSb5PT1m_L79g3OaPV1IfnAxBjhcmMyVBW2o6wNiqs,6096
36
+ data_diff/queries/ast_classes.py,sha256=nY-yOnC_WKNjyz6urnryOSKEEM0qsAbmonwPWMlWLE0,23972
37
+ data_diff/queries/base.py,sha256=pT-iaII7Nlu-w-Cuq9fhoNKX7-GSxkQ3Fk8K-tMkk60,964
38
+ data_diff/queries/extras.py,sha256=aUm-ifj3BMlz4o4bbuHtmnvHZuptYAKGS5yWTHmNpvc,1270
39
+ data_diff/query_utils.py,sha256=R7ZfRwcvv9Zf4zWXNln4tr_OxLmDI7CPmmCahYfHxlo,2101
40
+ data_diff/schema.py,sha256=QoYSSB3k-svLXz680uRgsI4qjii8BFKOOQvheqtgEbs,2413
41
+ data_diff/table_segment.py,sha256=pGSrTmtVt4ioDj06U47XBlJf_p5EtwO2QVXR9iunkZM,24491
42
+ data_diff/thread_utils.py,sha256=_692ERjnWfHKaZsLdg7CNfkKiRd66y7_kpgDwzntp44,3831
43
+ data_diff/utils.py,sha256=A0ZoxIngdU-uiiFp1uXcNx1XlEsLWgXr8J36my_ViSw,33627
44
+ data_diff/version.py,sha256=Wk0ovyBlLEF2UaWLWEcVBLFElREtIxi7TU1hD3CuTFI,634
45
+ dcs_core/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
46
+ dcs_core/__main__.py,sha256=hUrawwyavxYgUsllAaNi_PMVLKUWXLBwRTh_ta4r_C0,683
47
+ dcs_core/__version__.py,sha256=C9FtoqNTXGSNOIm1teVCveKkDFqlmmlteuswjfxRGa8,633
48
+ dcs_core/cli/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
49
+ dcs_core/cli/cli.py,sha256=dSr3D62XhjCEn4G5Jb0O4q05G1_YAMJgaOnLqciMAmI,6020
50
+ dcs_core/core/__init__.py,sha256=8XyOIsx-uCpaEZUgfOrb0DCdvmz1TipNQdz01h7mun0,761
51
+ dcs_core/core/common/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
52
+ dcs_core/core/common/errors.py,sha256=P66w4O9E8lFVeB8EtQrCkHKk034fAHkshvrxYDV_ZtE,1737
53
+ dcs_core/core/common/models/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
54
+ dcs_core/core/common/models/configuration.py,sha256=2_gGVm0z71A84XMSBok0C4yzRe-_bFhKBYtZKWF5hhw,9165
55
+ dcs_core/core/common/models/dashboard.py,sha256=_WV1kbs4cKlFZ5QcXyMdTmDSZLYxhvZWWWQzvHReMxM,814
56
+ dcs_core/core/common/models/data_source_resource.py,sha256=rNvj5NjvEQi2irHYjClKBFZbp70LTX9oGCPDeFURlAI,1559
57
+ dcs_core/core/common/models/metric.py,sha256=0Oxp7YvWZVy7zbmi4u_opBDeknsuzXmnOrK01pP2fQw,4843
58
+ dcs_core/core/common/models/profile.py,sha256=IAiz1HijGM_8pbbfdAwMxzd-uselGJLeMmYgIhJ46lY,2440
59
+ dcs_core/core/common/models/validation.py,sha256=yGSL-hZgvKqSgj0nqNIqUm_DmNVlKblxlnlcm3YqjVk,6487
60
+ dcs_core/core/common/models/widget.py,sha256=-IaZ5dAmPPZwMvpzJDQfEINfIPUsqS5rufBak1c7Y6A,1083
61
+ dcs_core/core/configuration/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
62
+ dcs_core/core/configuration/config_loader.py,sha256=xySV5DIJC7a1VioE2sq5X8rSInW-4qF4hm5bT-wxVlc,5637
63
+ dcs_core/core/configuration/configuration_parser.py,sha256=KGOJqWbOWhTacuMwM1N55Kh6Ug-WrrjYLAaH9a8ynRk,11347
64
+ dcs_core/core/configuration/configuration_parser_arc.py,sha256=TOoPf12pEXLdkjEGJEGV6rJOMR8yqLedla6T1x6g-Xw,14057
65
+ dcs_core/core/datasource/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
66
+ dcs_core/core/datasource/base.py,sha256=YD_UuGuoORFJNX30IQMk6aitiiTCHaiAddSNgUBmRtA,1935
67
+ dcs_core/core/datasource/manager.py,sha256=uIwr9N_rcSn7P1X496of7433kj97W0w-PLlo6FVHeCw,4132
68
+ dcs_core/core/datasource/search_datasource.py,sha256=_conk1Q_kywJhKHYyEScoKlVt_yRd05zuAISvDmXqjw,15014
69
+ dcs_core/core/datasource/sql_datasource.py,sha256=dlX-E--hadl2q8XpMNRyZmLGC35tltBsGDzlyZqzqtw,40730
70
+ dcs_core/core/inspect.py,sha256=QICJKcEpQClLacsfNClFoiF08M01QnJh_U2VsXRh1iA,6427
71
+ dcs_core/core/logger/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
72
+ dcs_core/core/logger/base.py,sha256=dbW48Y1t6okXy1dx8GSH3KpE5HX6pebHGuKqacJWF0E,1024
73
+ dcs_core/core/logger/default_logger.py,sha256=7yieM99xnepxq5FSlu0TEhVd55X_kUGRqjiio5loQuU,4097
74
+ dcs_core/core/metric/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
75
+ dcs_core/core/metric/base.py,sha256=IG8DkEde2Je3h6L6yiEA6ExAzJsFb-CEQGcv1OvJTiA,8258
76
+ dcs_core/core/metric/combined_metric.py,sha256=dqlgvVLD1c05LvfdWEl7H-vz0oGNaN7lMRpbDvdNAvE,3836
77
+ dcs_core/core/metric/custom_metric.py,sha256=OzSWzgfptQFUj34NY0UcWMlwFxdjz6hvL1xSf6IaJzY,1342
78
+ dcs_core/core/metric/manager.py,sha256=UIy7GuxFDDejzGbMQz--oNmn-0oBWlL5UR-Hg3aYC4o,6052
79
+ dcs_core/core/metric/numeric_metric.py,sha256=smMolI8GdlmEnlzax_pAg-_CN1v4ab1q-lKAZl07Hzg,15608
80
+ dcs_core/core/metric/reliability_metric.py,sha256=A1UKmm6C9GHkkp-JE8MkVV2I1OLnX6F7HXNzleT2M30,3454
81
+ dcs_core/core/profiling/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
82
+ dcs_core/core/profiling/datasource_profiling.py,sha256=xkyS06h19de5q1MdE897TKoNKXV3PdaT89Aafu__bgg,5661
83
+ dcs_core/core/profiling/numeric_field_profiling.py,sha256=87pxagFfX-W_-jSuVvIc29YA2uihB2t2fsLFCIAulfU,2667
84
+ dcs_core/core/profiling/text_field_profiling.py,sha256=-1VQDb55OVZ--WIvDMt1jNH8y3hewQcLg7Kr9BEqS60,2543
85
+ dcs_core/core/repository/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
86
+ dcs_core/core/repository/metric_repository.py,sha256=LBO_0DA8eJoxl0Sw5vhUzmMQHrifVF6NbNVyn3F9GOk,3463
87
+ dcs_core/core/utils/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
88
+ dcs_core/core/utils/log.py,sha256=VWNIcSqzCsK8iB9j3wJdkfUNEr8gM1BT1mZhPZRn-Bs,898
89
+ dcs_core/core/utils/tracking.py,sha256=xbnKspX9SEe7hzcIDPByJYFdCy5lvry8s12uwaOiyh8,3354
90
+ dcs_core/core/utils/utils.py,sha256=7SfmNdaOLiAOuJJ6jvRb1Wx9qEq0Ratwpht-cr5aSQ8,1376
91
+ dcs_core/core/validation/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
92
+ dcs_core/core/validation/base.py,sha256=7N-2u8oNFxEUTsl7MMabxkgicXmcnrRAuub4LVL5KOo,8395
93
+ dcs_core/core/validation/completeness_validation.py,sha256=pZOTm7ExzITCBxflJNOeoy3PRV7HpzogFI6lsnBt-SI,7245
94
+ dcs_core/core/validation/custom_query_validation.py,sha256=OPBUQOxNUM4nm8feOUrM6_c3y4r8B3pEe3zqGJ7xUAo,1011
95
+ dcs_core/core/validation/manager.py,sha256=RhlvwXvHniOS8cMgJLGEn0RSx2qwElT0qZsgsB7OqQo,13601
96
+ dcs_core/core/validation/numeric_validation.py,sha256=JKTSKd4FmlYtzb7j5fMfVoniyb7obdm-FHjdM9boz8I,14065
97
+ dcs_core/core/validation/reliability_validation.py,sha256=Y0eM5P91OmBjrMki8CwDqOykhQhH9qmxffAzzaVlq_Q,3674
98
+ dcs_core/core/validation/uniqueness_validation.py,sha256=a6zm0_omiULKbQcDit8J913cg8WJMdqmtX4RPC10k48,3016
99
+ dcs_core/core/validation/validity_validation.py,sha256=358oAGH112oVxyPhDnfT-ypVaMAkpZ8pM73qogtdh9w,35297
100
+ dcs_core/integrations/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
101
+ dcs_core/integrations/databases/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
102
+ dcs_core/integrations/databases/bigquery.py,sha256=26RuypLMmiARZIWkV_mxtnNL2yCs94YWerSGH5Nr10Q,7337
103
+ dcs_core/integrations/databases/databricks.py,sha256=n4fm5m_mtRCdtjLGDvbNW18u7Ev234vDBjq_lxuOxns,1978
104
+ dcs_core/integrations/databases/db2.py,sha256=hNGivvYCitp88ouZlCxp7iRQ-vnPiK1kL8x85NyGotk,26492
105
+ dcs_core/integrations/databases/elasticsearch.py,sha256=6CTGs1WGrfgdDRNVt9DpOB0_z_znT6YoVj10E1WY-wQ,2152
106
+ dcs_core/integrations/databases/mssql.py,sha256=3Gpy1UIclwYRF5_dbogbb5MgHlg35ZKcEczCNqlCh3o,33258
107
+ dcs_core/integrations/databases/mysql.py,sha256=mUFLIGdbF_ktIlA19P7kq7holp5ZkRezGgN6TL_uiJ4,15815
108
+ dcs_core/integrations/databases/opensearch.py,sha256=XeDaHRLLym3wFeA_N6RzQEHmQCI3DjD8A86Y9UKwFEM,2190
109
+ dcs_core/integrations/databases/oracle.py,sha256=7g8Vs958tDx1v2CWFulCvuje0cLxWgU5-PVJTc1IluE,29194
110
+ dcs_core/integrations/databases/postgres.py,sha256=gXWVPSMJQdWo2ZWpzrnc1bONRyqdiX0osdRtvJLWPSE,18133
111
+ dcs_core/integrations/databases/redshift.py,sha256=R9eYxpD1Ve3ChZb-gyClJ6suSljG53O6Wez2GzUW0k0,2043
112
+ dcs_core/integrations/databases/snowflake.py,sha256=NI6sgL9iakyCbIxtj0DiqeOpF5F9ybuhtG_IwvT86Ws,1942
113
+ dcs_core/integrations/databases/spark_df.py,sha256=pO9hSENLdrRaPvPa66yCrKS2iv5JWJBsU9XB13BBasY,3659
114
+ dcs_core/integrations/databases/sybase.py,sha256=WQfLCHo9ykPYY8KisspNYToQvc2wDkoAhLluvRo23Dg,45803
115
+ dcs_core/integrations/storage/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
116
+ dcs_core/integrations/storage/local_file.py,sha256=nLhxaUMi97gIfea2Ktl8ehsm_VkKXAB4QUlFP6XeeSA,6244
117
+ dcs_core/integrations/utils/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
118
+ dcs_core/integrations/utils/utils.py,sha256=81BwXG73WQ8F4dsk5GQuVHhkHteFpzON7Bi-_NJ62W4,1346
119
+ dcs_core/report/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
120
+ dcs_core/report/dashboard.py,sha256=gOcUYb67O1ZPlTXWizgq6qpPA-dhkg7r44Q0n9xmsaE,8296
121
+ dcs_core/report/models.py,sha256=kOgmDfuM1v5cLK6VFxlmsN_0u3wrvBCvh75v9Rvph_c,2507
122
+ dcs_core/report/static/assets/fonts/DMSans-Bold.ttf,sha256=f1uEY-TIjlHryAMQW5CZ3vgWN1TzpEU7tm-CKHhHFJk,56272
123
+ dcs_core/report/static/assets/fonts/DMSans-Medium.ttf,sha256=Msj-GHRDO9NGdO8bWAN_230bJF1YRAdsdsbzosadaEA,56380
124
+ dcs_core/report/static/assets/fonts/DMSans-Regular.ttf,sha256=enPmqoEH4ARurl3XE79HUtk-aJ9X1RxFsVRazd_XG-M,56352
125
+ dcs_core/report/static/assets/fonts/DMSans-SemiBold.ttf,sha256=zU97AnvI5xoZNgpCbNaU6xlfb61BQkNwR_M7MSqMTpQ,56340
126
+ dcs_core/report/static/assets/images/docs.svg,sha256=zDUSZoC8_nEx3d0LXxQ1kaN78ZMZrFtRQHVQl9Q4eJY,839
127
+ dcs_core/report/static/assets/images/github.svg,sha256=lKygm-T8O19WvKnFG7i1Pl4kqk-IYQ7NwBUEnkiMJXY,2768
128
+ dcs_core/report/static/assets/images/logo.svg,sha256=dWKkS79J0rgrIeYmwd0-EBs8g544U1HR6KOMrhfZyQg,9605
129
+ dcs_core/report/static/assets/images/slack.svg,sha256=pk4h_yc6FdYqFJPjs7cJVis4KsAHoSRKu20qXti1m_o,1868
130
+ dcs_core/report/static/index.js,sha256=p4wvku-zlXi0y4gWeSzV1amY0s4mjtUq2QsezARLVh0,5490969
131
+ dcs_core/report/static/index.js.LICENSE.txt,sha256=bBDZBJVEDrqjCi7sfoF8CchjFn3hdcbNkP7ub7kbcXQ,201041
132
+ dcs_sdk/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
133
+ dcs_sdk/__main__.py,sha256=Qn8stIaQGrdLjHQ-H7xO0T-brtq5RWZoWU9QvqoarV8,683
134
+ dcs_sdk/__version__.py,sha256=0MZwU2M7klH43EtQxpbFKior602GfMQYbBVWxSs857c,633
135
+ dcs_sdk/cli/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
136
+ dcs_sdk/cli/cli.py,sha256=jaO52UrMWLafcF_yhqllPkmYSTuO2sksFi30fYFdAB4,4406
137
+ dcs_sdk/sdk/__init__.py,sha256=skrZcgWWJBL6NXTUERywJ3qRJRemgpDXyW7lPg1FJk8,2107
138
+ dcs_sdk/sdk/config/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
139
+ dcs_sdk/sdk/config/config_loader.py,sha256=oooSTV6QjbXKpCkwpl6vcBdjABGT-h99vBbWTbIkmjc,21683
140
+ dcs_sdk/sdk/data_diff/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
141
+ dcs_sdk/sdk/data_diff/data_differ.py,sha256=zxWa-mYAdfZepNuXz1h_xxFQBC4tdhBqlbZCVEfb8Y8,36378
142
+ dcs_sdk/sdk/rules/__init__.py,sha256=_BkKcE_jfdDQI_ECdOamJaefMKEXrKpYjPpnBQXl_Xs,657
143
+ dcs_sdk/sdk/rules/rules_mappping.py,sha256=fxakVkf7B2cVkYSO946LTim_HmMsl6lBDBqZjTTsSPI,1292
144
+ dcs_sdk/sdk/rules/rules_repository.py,sha256=x0Rli-wdnHAmXm5526go_qC3P-eFRt-4L7fs4hNqC-g,7564
145
+ dcs_sdk/sdk/rules/schema_rules.py,sha256=ndbT2ujvnblEKPR5h3Tx5D_GjnsMF4lq2zjYTMikcIA,1959
146
+ dcs_sdk/sdk/utils/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
147
+ dcs_sdk/sdk/utils/serializer.py,sha256=4-OJqFJo9-xCs-SAvvrXpSF7fsdcUwsX3Kkc9V2nM5Q,1018
148
+ dcs_sdk/sdk/utils/similarity_score/__init__.py,sha256=RkfhRKLXEForLCs4rZkTf0qc_b0TokSggSAcKI4yfZg,610
149
+ dcs_sdk/sdk/utils/similarity_score/base_provider.py,sha256=PGfJ3W3pa0RHx3FgTf2qTmTLubbQhfpWFBLbvblPibk,6226
150
+ dcs_sdk/sdk/utils/similarity_score/cosine_similarity_provider.py,sha256=d0uCnk0_tA_HlK6IknjS03sGM0DaSxLjC5X2Fl4pyXA,1491
151
+ dcs_sdk/sdk/utils/similarity_score/jaccard_provider.py,sha256=Jd0TvIGOULNTsiCL_FTB8V7XlNNAqqP8UL_4WzFUmEk,1021
152
+ dcs_sdk/sdk/utils/similarity_score/levenshtein_distance_provider.py,sha256=puAWPnoWfNo4BN4-kXIUHrtrt5jLv3Vkw_NfHvjYrn4,1185
153
+ dcs_sdk/sdk/utils/table.py,sha256=X8HxdYTWyx_oVrBWPsXlmA-xJKXXDBW9RrhlWNqA1As,18224
154
+ dcs_sdk/sdk/utils/themes.py,sha256=Meo2Yldv4uyPpEqI7qdA28Aa6sxtwUU1dLKKm4QavjM,1403
155
+ dcs_sdk/sdk/utils/utils.py,sha256=vF2zAvgt__Y8limicWTEWRyn41SBVJN81ZCTBRy6hQg,11907
156
+ dcs_sdk-1.6.5.dist-info/METADATA,sha256=A_zRG4BkxZt8pO_JwxTTL-6Sw1jOSQ93yG8bigJCnTc,7568
157
+ dcs_sdk-1.6.5.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
158
+ dcs_sdk-1.6.5.dist-info/entry_points.txt,sha256=XhODNz7UccgPOyklXgp7pIfTTXArd6-V0mImjhnhwto,80
159
+ dcs_sdk-1.6.5.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 2.2.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ dcs-core=dcs_core.cli.cli:main
3
+ dcs-sdk=dcs_sdk.__main__:main
4
+