icsDataValidation 1.0.438__tar.gz → 1.0.441__tar.gz
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.
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/PKG-INFO +1 -1
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/database_services/snowflake_service.py +1 -1
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/database_services/sqlserver_service.py +1 -1
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation.egg-info/PKG-INFO +1 -1
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/snowflake_service/test_create_checksums.py +27 -29
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/sqlserver_service/test_create_checksums.py +15 -15
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/MANIFEST.in +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/configuration.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/connection_setups/__init__.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/connection_setups/azure_connection_setup.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/connection_setups/databricks_connection_setup.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/connection_setups/exasol_connection_setup.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/connection_setups/oracle_connection_setup.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/connection_setups/snowflake_connection_setup.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/connection_setups/sqlserver_connection_setup.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/connection_setups/teradata_connection_setup.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/core/__init__.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/core/database_objects.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/core/object_comparison.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/input_parameters/__init__.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/input_parameters/testing_tool_params.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/main.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/output_parameters/__init__.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/output_parameters/result_params.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/__init__.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/comparison_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/database_services/__init__.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/database_services/azure_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/database_services/databricks_hive_metastore_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/database_services/databricks_unity_catalog_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/database_services/exasol_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/database_services/oracle_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/database_services/teradata_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/initialization_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/result_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/system_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/testset_service.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/utils/__init__.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/utils/file_util.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/utils/logger_util.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/utils/pandas_util.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/utils/parallelization_util.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/utils/sql_util.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation.egg-info/SOURCES.txt +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation.egg-info/dependency_links.txt +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation.egg-info/not-zip-safe +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation.egg-info/requires.txt +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation.egg-info/top_level.txt +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/pyproject.toml +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/setup.cfg +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/setup.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/snowflake_service/test_create_pandas_df_from_group_by.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/snowflake_service/test_create_pandas_df_from_sample.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/snowflake_service/test_get_checksum_statement.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/snowflake_service/test_get_column_clause.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/snowflake_service/test_get_countnulls_statement.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/snowflake_service/test_get_in_clause.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/sqlserver_service/test_create_pandas_df_from_group_by.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/sqlserver_service/test_create_pandas_df_from_sample.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/sqlserver_service/test_get_checksum_statement.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/sqlserver_service/test_get_column_clause.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/sqlserver_service/test_get_countnulls_statement.py +0 -0
- {icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/tests/sqlserver_service/test_get_in_clause.py +0 -0
|
@@ -524,7 +524,7 @@ class SnowflakeService:
|
|
|
524
524
|
|
|
525
525
|
if 'Arithmetic overflow' in err_msg[2]:
|
|
526
526
|
# re-calculate queries with bool_cast_before_sum=True in case of error
|
|
527
|
-
query_checksums = self.
|
|
527
|
+
query_checksums = self._get_checksum_statement(
|
|
528
528
|
object=object,
|
|
529
529
|
column_intersections=column_intersections,
|
|
530
530
|
where_clause=where_clause,
|
|
@@ -587,7 +587,7 @@ class SQLServerService:
|
|
|
587
587
|
|
|
588
588
|
if 'Arithmetic overflow' in err_msg[2]:
|
|
589
589
|
# re-calculate queries with bool_cast_before_sum=True in case of error
|
|
590
|
-
query_checksums = self.
|
|
590
|
+
query_checksums = self._get_checksum_statement(
|
|
591
591
|
object=object,
|
|
592
592
|
column_intersections=column_intersections,
|
|
593
593
|
where_clause=where_clause,
|
|
@@ -29,7 +29,7 @@ class TestCreateChecksumsParametrized:
|
|
|
29
29
|
|
|
30
30
|
@pytest.mark.parametrize(
|
|
31
31
|
"column_intersections,where_clause,numeric_scale,execute_behavior," \
|
|
32
|
-
"expected_columns,expected_errors,expect_retry
|
|
32
|
+
"expected_columns,expected_errors,expect_retry",
|
|
33
33
|
[
|
|
34
34
|
( # success path
|
|
35
35
|
['amount', 'name'],
|
|
@@ -46,8 +46,7 @@ class TestCreateChecksumsParametrized:
|
|
|
46
46
|
'NAME': ['COUNTDISTINCT', 3, 0]
|
|
47
47
|
},
|
|
48
48
|
[],
|
|
49
|
-
False
|
|
50
|
-
1
|
|
49
|
+
False
|
|
51
50
|
),
|
|
52
51
|
( # arithmetic overflow triggers retry
|
|
53
52
|
['amount'],
|
|
@@ -63,8 +62,7 @@ class TestCreateChecksumsParametrized:
|
|
|
63
62
|
'AMOUNT': ['SUM', 5, 0]
|
|
64
63
|
},
|
|
65
64
|
[],
|
|
66
|
-
True
|
|
67
|
-
2
|
|
65
|
+
True
|
|
68
66
|
),
|
|
69
67
|
( # non-overflow error surfaces in TESTATM_ERRORS
|
|
70
68
|
['amount'],
|
|
@@ -75,8 +73,7 @@ class TestCreateChecksumsParametrized:
|
|
|
75
73
|
},
|
|
76
74
|
{},
|
|
77
75
|
[['ERROR', 'checksum_sql', 'Some other error']],
|
|
78
|
-
False
|
|
79
|
-
1
|
|
76
|
+
False
|
|
80
77
|
),
|
|
81
78
|
],
|
|
82
79
|
)
|
|
@@ -90,20 +87,20 @@ class TestCreateChecksumsParametrized:
|
|
|
90
87
|
execute_behavior,
|
|
91
88
|
expected_columns,
|
|
92
89
|
expected_errors,
|
|
93
|
-
expect_retry
|
|
94
|
-
expected_execute_calls
|
|
90
|
+
expect_retry
|
|
95
91
|
):
|
|
96
92
|
"""Test create_checksums behavior across success, retry, and error scenarios."""
|
|
97
|
-
snowflake_service.create_checksum_statement = MagicMock(return_value='checksum_retry_sql')
|
|
98
|
-
|
|
99
93
|
with patch.object(snowflake_service, '_get_checksum_statement', return_value='checksum_sql') as mock_checksum_stmt, \
|
|
100
94
|
patch.object(snowflake_service, '_get_countnulls_statement', return_value='countnulls_sql') as mock_countnulls_stmt, \
|
|
101
95
|
patch.object(snowflake_service, 'execute_queries') as mock_execute:
|
|
102
96
|
|
|
103
|
-
|
|
104
|
-
|
|
97
|
+
side_effect = execute_behavior.get('side_effect')
|
|
98
|
+
if side_effect is not None:
|
|
99
|
+
mock_execute.side_effect = side_effect
|
|
100
|
+
expected_call_count = len(side_effect) if isinstance(side_effect, list) else 1
|
|
105
101
|
else:
|
|
106
102
|
mock_execute.return_value = execute_behavior['return_value']
|
|
103
|
+
expected_call_count = 1
|
|
107
104
|
|
|
108
105
|
result = snowflake_service.create_checksums(
|
|
109
106
|
object=mock_database_object,
|
|
@@ -114,14 +111,22 @@ class TestCreateChecksumsParametrized:
|
|
|
114
111
|
enclose_column_by_double_quotes=False
|
|
115
112
|
)
|
|
116
113
|
|
|
117
|
-
mock_checksum_stmt.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
114
|
+
checksum_calls = mock_checksum_stmt.call_args_list
|
|
115
|
+
base_kwargs = {
|
|
116
|
+
'object': mock_database_object,
|
|
117
|
+
'column_intersections': column_intersections,
|
|
118
|
+
'where_clause': where_clause,
|
|
119
|
+
'exclude_columns': [],
|
|
120
|
+
'numeric_scale': numeric_scale,
|
|
121
|
+
'enclose_column_by_double_quotes': False
|
|
122
|
+
}
|
|
123
|
+
assert checksum_calls[0].kwargs == base_kwargs
|
|
124
|
+
if expect_retry:
|
|
125
|
+
assert len(checksum_calls) == 2
|
|
126
|
+
retry_kwargs = {**base_kwargs, 'bool_cast_before_sum': True}
|
|
127
|
+
assert checksum_calls[1].kwargs == retry_kwargs
|
|
128
|
+
else:
|
|
129
|
+
assert len(checksum_calls) == 1
|
|
125
130
|
mock_countnulls_stmt.assert_called_once_with(
|
|
126
131
|
object=mock_database_object,
|
|
127
132
|
column_intersections=column_intersections,
|
|
@@ -129,14 +134,7 @@ class TestCreateChecksumsParametrized:
|
|
|
129
134
|
exclude_columns=[],
|
|
130
135
|
enclose_column_by_double_quotes=False
|
|
131
136
|
)
|
|
132
|
-
assert mock_execute.call_count ==
|
|
133
|
-
|
|
134
|
-
if expect_retry:
|
|
135
|
-
snowflake_service.create_checksum_statement.assert_called_once()
|
|
136
|
-
retry_kwargs = snowflake_service.create_checksum_statement.call_args.kwargs
|
|
137
|
-
assert retry_kwargs['bool_cast_before_sum'] is True
|
|
138
|
-
else:
|
|
139
|
-
snowflake_service.create_checksum_statement.assert_not_called()
|
|
137
|
+
assert mock_execute.call_count == expected_call_count
|
|
140
138
|
|
|
141
139
|
for column, expected in expected_columns.items():
|
|
142
140
|
assert result[column] == expected
|
|
@@ -103,7 +103,6 @@ class TestCreateChecksumsParametrized:
|
|
|
103
103
|
expected_execute_calls
|
|
104
104
|
):
|
|
105
105
|
"""Test create_checksums behavior across success, retry, and error scenarios."""
|
|
106
|
-
sqlserver_service.create_checksum_statement = MagicMock(return_value='checksum_retry_sql')
|
|
107
106
|
|
|
108
107
|
with patch.object(sqlserver_service, '_get_checksum_statement', return_value='checksum_sql') as mock_checksum_stmt, \
|
|
109
108
|
patch.object(sqlserver_service, '_get_countnulls_statement', return_value='countnulls_sql') as mock_countnulls_stmt, \
|
|
@@ -123,13 +122,21 @@ class TestCreateChecksumsParametrized:
|
|
|
123
122
|
enclose_column_by_double_quotes=False
|
|
124
123
|
)
|
|
125
124
|
|
|
126
|
-
mock_checksum_stmt.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
125
|
+
checksum_calls = mock_checksum_stmt.call_args_list
|
|
126
|
+
base_kwargs = {
|
|
127
|
+
'object': mock_database_object,
|
|
128
|
+
'column_intersections': column_intersections,
|
|
129
|
+
'where_clause': where_clause,
|
|
130
|
+
'exclude_columns': [],
|
|
131
|
+
'numeric_scale': numeric_scale
|
|
132
|
+
}
|
|
133
|
+
assert checksum_calls[0].kwargs == base_kwargs
|
|
134
|
+
if expect_retry:
|
|
135
|
+
assert len(checksum_calls) == 2
|
|
136
|
+
retry_kwargs = {**base_kwargs, 'bool_cast_before_sum': True}
|
|
137
|
+
assert checksum_calls[1].kwargs == retry_kwargs
|
|
138
|
+
else:
|
|
139
|
+
assert len(checksum_calls) == 1
|
|
133
140
|
mock_countnulls_stmt.assert_called_once_with(
|
|
134
141
|
object=mock_database_object,
|
|
135
142
|
column_intersections=column_intersections,
|
|
@@ -138,13 +145,6 @@ class TestCreateChecksumsParametrized:
|
|
|
138
145
|
)
|
|
139
146
|
assert mock_execute.call_count == expected_execute_calls
|
|
140
147
|
|
|
141
|
-
if expect_retry:
|
|
142
|
-
sqlserver_service.create_checksum_statement.assert_called_once()
|
|
143
|
-
retry_kwargs = sqlserver_service.create_checksum_statement.call_args.kwargs
|
|
144
|
-
assert retry_kwargs['bool_cast_before_sum'] is True
|
|
145
|
-
else:
|
|
146
|
-
sqlserver_service.create_checksum_statement.assert_not_called()
|
|
147
|
-
|
|
148
148
|
for column, expected in expected_columns.items():
|
|
149
149
|
assert result[column] == expected
|
|
150
150
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/core/database_objects.py
RENAMED
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/core/object_comparison.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/result_service.py
RENAMED
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/services/system_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/utils/file_util.py
RENAMED
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/utils/logger_util.py
RENAMED
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation/utils/pandas_util.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation.egg-info/not-zip-safe
RENAMED
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation.egg-info/requires.txt
RENAMED
|
File without changes
|
{icsdatavalidation-1.0.438 → icsdatavalidation-1.0.441}/icsDataValidation.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|