google-pso-data-validator 8.9.2__tar.gz → 8.9.3__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.
Files changed (108) hide show
  1. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/PKG-INFO +2 -1
  2. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/google_pso_data_validator.egg-info/PKG-INFO +2 -1
  3. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/setup.py +2 -1
  4. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_oracle/__init__.py +69 -3
  5. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_teradata/__init__.py +8 -6
  6. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_teradata/api.py +3 -3
  7. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/LICENSE +0 -0
  8. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/README.md +0 -0
  9. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/__init__.py +0 -0
  10. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/__main__.py +0 -0
  11. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/app.py +0 -0
  12. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/cli_tools.py +0 -0
  13. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/client_info.py +0 -0
  14. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/clients.py +0 -0
  15. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/combiner.py +0 -0
  16. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/config_manager.py +0 -0
  17. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/consts.py +0 -0
  18. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/data_validation.py +0 -0
  19. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/exceptions.py +0 -0
  20. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/find_tables.py +0 -0
  21. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/gcs_helper.py +0 -0
  22. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/jellyfish_distance.py +0 -0
  23. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/metadata.py +0 -0
  24. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/partition_builder.py +0 -0
  25. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/query_builder/__init__.py +0 -0
  26. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/query_builder/partition_row_builder.py +0 -0
  27. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/query_builder/query_builder.py +0 -0
  28. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/query_builder/random_row_builder.py +0 -0
  29. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/raw_query.py +0 -0
  30. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/result_handlers/__init__.py +0 -0
  31. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/result_handlers/base_backend.py +0 -0
  32. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/result_handlers/bigquery.py +0 -0
  33. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/result_handlers/factory.py +0 -0
  34. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/result_handlers/postgres.py +0 -0
  35. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/result_handlers/text.py +0 -0
  36. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/schema_validation.py +0 -0
  37. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/secret_manager.py +0 -0
  38. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/state_manager.py +0 -0
  39. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/util.py +0 -0
  40. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/data_validation/validation_builder.py +0 -0
  41. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/google_pso_data_validator.egg-info/SOURCES.txt +0 -0
  42. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/google_pso_data_validator.egg-info/dependency_links.txt +0 -0
  43. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/google_pso_data_validator.egg-info/entry_points.txt +0 -0
  44. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/google_pso_data_validator.egg-info/requires.txt +0 -0
  45. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/google_pso_data_validator.egg-info/top_level.txt +0 -0
  46. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/setup.cfg +0 -0
  47. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_addon/__init__.py +0 -0
  48. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_addon/api.py +0 -0
  49. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_addon/operations.py +0 -0
  50. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_bigquery/__init__.py +0 -0
  51. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_bigquery/api.py +0 -0
  52. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_bigquery/datatypes.py +0 -0
  53. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_bigquery/registry.py +0 -0
  54. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_cloud_spanner/__init__.py +0 -0
  55. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_cloud_spanner/api.py +0 -0
  56. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_cloud_spanner/client.py +0 -0
  57. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_cloud_spanner/compiler.py +0 -0
  58. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_cloud_spanner/datatypes.py +0 -0
  59. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_cloud_spanner/registry.py +0 -0
  60. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_cloud_spanner/tests/__init__.py +0 -0
  61. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_cloud_spanner/tests/conftest.py +0 -0
  62. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_cloud_spanner/to_pandas.py +0 -0
  63. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_db2/__init__.py +0 -0
  64. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_db2/api.py +0 -0
  65. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_db2/compiler.py +0 -0
  66. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_db2/datatypes.py +0 -0
  67. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_db2/registry.py +0 -0
  68. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_db2_zos/__init__.py +0 -0
  69. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_db2_zos/api.py +0 -0
  70. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_db2_zos/compiler.py +0 -0
  71. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_db2_zos/registry.py +0 -0
  72. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_impala/__init__.py +0 -0
  73. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_impala/api.py +0 -0
  74. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_impala/registry.py +0 -0
  75. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_mssql/__init__.py +0 -0
  76. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_mssql/api.py +0 -0
  77. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_mssql/datatypes.py +0 -0
  78. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_mssql/registry.py +0 -0
  79. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_mysql/__init__.py +0 -0
  80. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_mysql/base_sql_compiler/__init__.py +0 -0
  81. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_mysql/base_sql_compiler/select_builder.py +0 -0
  82. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_mysql/compiler.py +0 -0
  83. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_mysql/datatypes.py +0 -0
  84. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_oracle/api.py +0 -0
  85. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_oracle/compiler.py +0 -0
  86. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_oracle/datatypes.py +0 -0
  87. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_oracle/registry.py +0 -0
  88. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_pandas/__init__.py +0 -0
  89. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_pandas/execution.py +0 -0
  90. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_postgres/__init__.py +0 -0
  91. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_postgres/client.py +0 -0
  92. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_postgres/datatypes.py +0 -0
  93. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_postgres/registry.py +0 -0
  94. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_redshift/__init__.py +0 -0
  95. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_redshift/api.py +0 -0
  96. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_redshift/compiler.py +0 -0
  97. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_snowflake/__init__.py +0 -0
  98. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_snowflake/api.py +0 -0
  99. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_snowflake/datatypes.py +0 -0
  100. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_snowflake/registry.py +0 -0
  101. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_sybase/__init__.py +0 -0
  102. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_sybase/api.py +0 -0
  103. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_sybase/compiler.py +0 -0
  104. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_sybase/datatypes.py +0 -0
  105. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_sybase/registry.py +0 -0
  106. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_teradata/compiler.py +0 -0
  107. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_teradata/datatypes.py +0 -0
  108. {google_pso_data_validator-8.9.2 → google_pso_data_validator-8.9.3}/third_party/ibis/ibis_teradata/registry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-pso-data-validator
3
- Version: 8.9.2
3
+ Version: 8.9.3
4
4
  Summary: A package to enable easy data validation
5
5
  Author: PSO DVT Engineering team
6
6
  Author-email: data-validator-eng@google.com
@@ -10,6 +10,7 @@ Classifier: Programming Language :: Python
10
10
  Classifier: Programming Language :: Python :: 3.9
11
11
  Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
13
14
  Classifier: Operating System :: OS Independent
14
15
  Requires-Python: >=3.9
15
16
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-pso-data-validator
3
- Version: 8.9.2
3
+ Version: 8.9.3
4
4
  Summary: A package to enable easy data validation
5
5
  Author: PSO DVT Engineering team
6
6
  Author-email: data-validator-eng@google.com
@@ -10,6 +10,7 @@ Classifier: Programming Language :: Python
10
10
  Classifier: Programming Language :: Python :: 3.9
11
11
  Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
13
14
  Classifier: Operating System :: OS Independent
14
15
  Requires-Python: >=3.9
15
16
  Description-Content-Type: text/markdown
@@ -18,7 +18,7 @@ import setuptools
18
18
 
19
19
  name = "google-pso-data-validator"
20
20
  description = "A package to enable easy data validation"
21
- version = "8.9.2"
21
+ version = "8.9.3"
22
22
  release_status = "Development Status :: 4 - Beta"
23
23
 
24
24
  with open("README.md", "r") as fh:
@@ -90,6 +90,7 @@ setuptools.setup(
90
90
  "Programming Language :: Python :: 3.9",
91
91
  "Programming Language :: Python :: 3.10",
92
92
  "Programming Language :: Python :: 3.11",
93
+ "Programming Language :: Python :: 3.12",
93
94
  "Operating System :: OS Independent",
94
95
  ],
95
96
  python_requires=">=3.9",
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import re
15
16
  from typing import Iterable, Literal, Optional, Tuple, Dict, Any
16
17
 
17
18
  import sqlalchemy as sa
@@ -20,7 +21,6 @@ from sqlalchemy.dialects.oracle.base import (
20
21
  RESERVED_WORDS as ORACLE_RESERVED_WORDS,
21
22
  )
22
23
  from sqlalchemy.dialects.oracle.oracledb import OracleDialect_oracledb
23
- import re
24
24
 
25
25
  import ibis.expr.datatypes as dt
26
26
  from ibis.backends.base.sql.alchemy import BaseAlchemyBackend
@@ -37,6 +37,55 @@ EXTRA_RESERVED_WORDS = set(
37
37
  )
38
38
 
39
39
 
40
+ # We use a hardcoded list instead of checking the `oracle_maintained` column
41
+ # in `all_users` because we want more granular control over which schemas to ignore.
42
+ # For example, some customers use SYSTEM and DBSNMP for their own monitoring tables.
43
+ ORACLE_SYSTEM_SCHEMAS = {
44
+ "ANONYMOUS",
45
+ "APPQOSSYS",
46
+ "AUDSYS",
47
+ "CTXSYS",
48
+ "DBSFWUSER",
49
+ "DGPDB_INT",
50
+ "DIP",
51
+ "DVF",
52
+ "DVSYS",
53
+ "EXFSYS",
54
+ "FLOWS_FILES",
55
+ "GGSYS",
56
+ "GSMADMIN_INTERNAL",
57
+ "GSMCATUSER",
58
+ "GSMUSER",
59
+ "LBACSYS",
60
+ "MDDATA",
61
+ "MDSYS",
62
+ "MGMT_VIEW",
63
+ "OJVMSYS",
64
+ "OLAPSYS",
65
+ "ORACLE_OCM",
66
+ "ORDDATA",
67
+ "ORDPLUGINS",
68
+ "ORDSYS",
69
+ "OUTLN",
70
+ "PDBADMIN",
71
+ "REMOTE_SCHEDULER_AGENT",
72
+ "SI_INFORMTN_SCHEMA",
73
+ "SPATIAL_CSW_ADMIN_USR",
74
+ "SPATIAL_WFS_ADMIN_USR",
75
+ "SYS",
76
+ "SYS$UMF",
77
+ "SYSBACKUP",
78
+ "SYSDG",
79
+ "SYSKM",
80
+ "SYSMAN",
81
+ "SYSRAC",
82
+ "TSMSYS",
83
+ "WMSYS",
84
+ "XDB",
85
+ "XS$NULL",
86
+ }
87
+
88
+
40
89
  def _ora_denormalize_name(self, name):
41
90
  """Oracle specific version of sqlalchemy/engine/default.py.denormalize_name()
42
91
 
@@ -252,8 +301,25 @@ class Backend(BaseAlchemyBackend):
252
301
  padded values, which DVT may want to trim"""
253
302
  return char_type[0] in ["CHAR", "NCHAR"]
254
303
 
255
- def list_databases(self) -> list:
256
- return sa.inspect(self.con).get_schema_names()
304
+ def list_databases(self, like: Optional[str] = None) -> list[str]:
305
+ """Return a list of user schemas in the Oracle database.
306
+
307
+ Excludes Oracle-maintained system schemas to avoid performance bottlenecks
308
+ and permission errors during table discovery.
309
+
310
+ Args:
311
+ like: Optional pattern string to filter returned schema names.
312
+
313
+ Returns:
314
+ list[str]: Filtered list of schema names.
315
+ """
316
+ all_schemas = sa.inspect(self.con).get_schema_names()
317
+ schemas = [
318
+ schema
319
+ for schema in all_schemas
320
+ if schema.upper() not in ORACLE_SYSTEM_SCHEMAS
321
+ ]
322
+ return self._filter_with_like(schemas, like)
257
323
 
258
324
  def dvt_tuple_in_supported(self) -> bool:
259
325
  """Return True if backend client supports native SQL tuple/struct IN expressions."""
@@ -38,23 +38,25 @@ class Backend(BaseSQLBackend):
38
38
 
39
39
  def do_connect(
40
40
  self,
41
- host: str = "localhost",
41
+ host: str = None,
42
42
  user_name: str = None,
43
43
  password: str = None,
44
- port: int = 1025,
45
- logmech: str = "TD2",
44
+ port: int = None,
45
+ logmech: str = None,
46
46
  use_no_lock_tables: str = "False",
47
47
  json_params: Mapping[str, Any] = None,
48
48
  ) -> None:
49
- self.teradata_config = {
49
+ self.teradata_config = dict(json_params) if json_params else {}
50
+ explicit_config = {
50
51
  "host": host,
51
52
  "user": user_name,
52
53
  "password": password,
53
54
  "dbs_port": port,
54
55
  "logmech": logmech,
55
56
  }
56
- if json_params:
57
- self.teradata_config.update(json_params)
57
+ self.teradata_config.update(
58
+ {key: value for key, value in explicit_config.items() if value is not None}
59
+ )
58
60
 
59
61
  self.client = teradatasql.connect(**self.teradata_config)
60
62
  self.con = self.client.cursor()
@@ -18,11 +18,11 @@ from data_validation.util import dvt_config_string_to_dict
18
18
 
19
19
 
20
20
  def teradata_connect(
21
- host: str = "localhost",
21
+ host: str = None,
22
22
  user_name: str = None,
23
23
  password: str = None,
24
- port: int = 1025,
25
- logmech: str = "TD2",
24
+ port: int = None,
25
+ logmech: str = None,
26
26
  use_no_lock_tables: str = "False",
27
27
  json_params: str = None,
28
28
  ):