google-pso-data-validator 7.5.0__tar.gz → 7.5.2__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 (89) hide show
  1. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/PKG-INFO +3 -3
  2. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/google_pso_data_validator.egg-info/PKG-INFO +3 -3
  3. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/google_pso_data_validator.egg-info/requires.txt +2 -2
  4. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/setup.py +3 -3
  5. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_addon/operations.py +13 -4
  6. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_postgres/client.py +4 -2
  7. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_teradata/registry.py +15 -0
  8. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/LICENSE +0 -0
  9. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/README.md +0 -0
  10. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/__init__.py +0 -0
  11. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/__main__.py +0 -0
  12. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/app.py +0 -0
  13. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/cli_tools.py +0 -0
  14. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/client_info.py +0 -0
  15. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/clients.py +0 -0
  16. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/combiner.py +0 -0
  17. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/config_manager.py +0 -0
  18. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/consts.py +0 -0
  19. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/data_validation.py +0 -0
  20. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/exceptions.py +0 -0
  21. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/find_tables.py +0 -0
  22. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/gcs_helper.py +0 -0
  23. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/jellyfish_distance.py +0 -0
  24. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/metadata.py +0 -0
  25. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/partition_builder.py +0 -0
  26. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/query_builder/__init__.py +0 -0
  27. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/query_builder/partition_row_builder.py +0 -0
  28. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/query_builder/query_builder.py +0 -0
  29. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/query_builder/random_row_builder.py +0 -0
  30. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/raw_query.py +0 -0
  31. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/result_handlers/__init__.py +0 -0
  32. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/result_handlers/bigquery.py +0 -0
  33. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/result_handlers/text.py +0 -0
  34. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/schema_validation.py +0 -0
  35. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/secret_manager.py +0 -0
  36. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/state_manager.py +0 -0
  37. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/util.py +0 -0
  38. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/data_validation/validation_builder.py +0 -0
  39. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/google_pso_data_validator.egg-info/SOURCES.txt +0 -0
  40. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/google_pso_data_validator.egg-info/dependency_links.txt +0 -0
  41. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/google_pso_data_validator.egg-info/entry_points.txt +0 -0
  42. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/google_pso_data_validator.egg-info/top_level.txt +0 -0
  43. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/setup.cfg +0 -0
  44. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_addon/__init__.py +0 -0
  45. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_addon/api.py +0 -0
  46. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_biquery/__init__.py +0 -0
  47. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_biquery/api.py +0 -0
  48. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_cloud_spanner/__init__.py +0 -0
  49. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_cloud_spanner/api.py +0 -0
  50. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_cloud_spanner/client.py +0 -0
  51. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_cloud_spanner/compiler.py +0 -0
  52. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_cloud_spanner/datatypes.py +0 -0
  53. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_cloud_spanner/registry.py +0 -0
  54. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_cloud_spanner/tests/__init__.py +0 -0
  55. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_cloud_spanner/tests/conftest.py +0 -0
  56. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_cloud_spanner/to_pandas.py +0 -0
  57. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_db2/__init__.py +0 -0
  58. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_db2/api.py +0 -0
  59. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_db2/compiler.py +0 -0
  60. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_db2/datatypes.py +0 -0
  61. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_db2/registry.py +0 -0
  62. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_impala/__init__.py +0 -0
  63. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_impala/api.py +0 -0
  64. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_mssql/__init__.py +0 -0
  65. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_mssql/api.py +0 -0
  66. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_mssql/datatypes.py +0 -0
  67. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_mssql/registry.py +0 -0
  68. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_mysql/__init__.py +0 -0
  69. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_mysql/base_sql_compiler/__init__.py +0 -0
  70. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_mysql/base_sql_compiler/select_builder.py +0 -0
  71. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_mysql/compiler.py +0 -0
  72. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_oracle/__init__.py +0 -0
  73. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_oracle/api.py +0 -0
  74. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_oracle/compiler.py +0 -0
  75. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_oracle/datatypes.py +0 -0
  76. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_oracle/registry.py +0 -0
  77. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_postgres/__init__.py +0 -0
  78. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_postgres/datatypes.py +0 -0
  79. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_postgres/registry.py +0 -0
  80. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_redshift/__init__.py +0 -0
  81. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_redshift/api.py +0 -0
  82. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_redshift/compiler.py +0 -0
  83. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_snowflake/__init__.py +0 -0
  84. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_snowflake/api.py +0 -0
  85. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_snowflake/datatypes.py +0 -0
  86. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_teradata/__init__.py +0 -0
  87. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_teradata/api.py +0 -0
  88. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_teradata/compiler.py +0 -0
  89. {google_pso_data_validator-7.5.0 → google_pso_data_validator-7.5.2}/third_party/ibis/ibis_teradata/datatypes.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-pso-data-validator
3
- Version: 7.5.0
3
+ Version: 7.5.2
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
@@ -15,7 +15,7 @@ Requires-Python: >=3.8
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
17
  Requires-Dist: Flask>=2.2
18
- Requires-Dist: fsspec>=2024.9.0
18
+ Requires-Dist: fsspec!=2025.3.1
19
19
  Requires-Dist: google-api-python-client>=2.144.0
20
20
  Requires-Dist: google-cloud-bigquery>=3.25.0
21
21
  Requires-Dist: google-cloud-bigquery-storage>=2.26.0
@@ -42,7 +42,7 @@ Provides-Extra: develop
42
42
  Requires-Dist: black==22.3.0; extra == "develop"
43
43
  Requires-Dist: flake8; extra == "develop"
44
44
  Requires-Dist: freezegun; extra == "develop"
45
- Requires-Dist: pyfakefs==4.6.2; extra == "develop"
45
+ Requires-Dist: pyfakefs; extra == "develop"
46
46
  Requires-Dist: pytest; extra == "develop"
47
47
  Requires-Dist: pytest-cov; extra == "develop"
48
48
  Requires-Dist: pytest-timeout; extra == "develop"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-pso-data-validator
3
- Version: 7.5.0
3
+ Version: 7.5.2
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
@@ -15,7 +15,7 @@ Requires-Python: >=3.8
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
17
  Requires-Dist: Flask>=2.2
18
- Requires-Dist: fsspec>=2024.9.0
18
+ Requires-Dist: fsspec!=2025.3.1
19
19
  Requires-Dist: google-api-python-client>=2.144.0
20
20
  Requires-Dist: google-cloud-bigquery>=3.25.0
21
21
  Requires-Dist: google-cloud-bigquery-storage>=2.26.0
@@ -42,7 +42,7 @@ Provides-Extra: develop
42
42
  Requires-Dist: black==22.3.0; extra == "develop"
43
43
  Requires-Dist: flake8; extra == "develop"
44
44
  Requires-Dist: freezegun; extra == "develop"
45
- Requires-Dist: pyfakefs==4.6.2; extra == "develop"
45
+ Requires-Dist: pyfakefs; extra == "develop"
46
46
  Requires-Dist: pytest; extra == "develop"
47
47
  Requires-Dist: pytest-cov; extra == "develop"
48
48
  Requires-Dist: pytest-timeout; extra == "develop"
@@ -1,5 +1,5 @@
1
1
  Flask>=2.2
2
- fsspec>=2024.9.0
2
+ fsspec!=2025.3.1
3
3
  google-api-python-client>=2.144.0
4
4
  google-cloud-bigquery>=3.25.0
5
5
  google-cloud-bigquery-storage>=2.26.0
@@ -26,7 +26,7 @@ tabulate>=0.9.0
26
26
  black==22.3.0
27
27
  flake8
28
28
  freezegun
29
- pyfakefs==4.6.2
29
+ pyfakefs
30
30
  pytest
31
31
  pytest-cov
32
32
  pytest-timeout
@@ -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 = "7.5.0"
21
+ version = "7.5.2"
22
22
  release_status = "Development Status :: 4 - Beta"
23
23
 
24
24
  with open("README.md", "r") as fh:
@@ -26,7 +26,7 @@ with open("README.md", "r") as fh:
26
26
 
27
27
  dependencies = [
28
28
  "Flask>=2.2", # Some versions of airflow such as 2.9.1 depend on flask<2.3 and >=2.2
29
- "fsspec>=2024.9.0",
29
+ "fsspec!=2025.3.1", # Version 2025.3.1 was breaking Python 3.8 support.
30
30
  "google-api-python-client>=2.144.0",
31
31
  "google-cloud-bigquery>=3.25.0",
32
32
  "google-cloud-bigquery-storage>=2.26.0",
@@ -54,7 +54,7 @@ extras_require = {
54
54
  "black==22.3.0",
55
55
  "flake8",
56
56
  "freezegun",
57
- "pyfakefs==4.6.2",
57
+ "pyfakefs",
58
58
  "pytest",
59
59
  "pytest-cov",
60
60
  "pytest-timeout",
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- """ The Ibis Addons Operations are intended to help facilitate new expressions
15
+ """The Ibis Addons Operations are intended to help facilitate new expressions
16
16
  when required before they can be pushed upstream to Ibis.
17
17
 
18
18
  Raw SQL Filters:
@@ -24,6 +24,7 @@ non-textual languages.
24
24
  """
25
25
  import datetime
26
26
  import dateutil
27
+ import numpy as np
27
28
  import string
28
29
 
29
30
  import google.cloud.bigquery as bq
@@ -94,6 +95,11 @@ except Exception:
94
95
  SnowflakeExprTranslator = None
95
96
 
96
97
 
98
+ # Cast of datetime64 NaT to int64 and then in seconds results in the value below.
99
+ # We need to use this value in the datetime.date simulation of the datetime64 behaviour.
100
+ NAT_INT64_MIN_IN_SECONDS = np.iinfo(np.int64).min // 1_000_000_000
101
+
102
+
97
103
  class BinaryLength(ops.Value):
98
104
  arg = rlz.one_of([rlz.value(dt.Binary)])
99
105
  output_dtype = dt.int32
@@ -534,6 +540,10 @@ def _bigquery_field_to_ibis_dtype(field):
534
540
  def string_to_epoch(ts: str) -> int:
535
541
  """Function to convert string timestamp to epoch seconds"""
536
542
  try:
543
+ if pd.isna(ts):
544
+ # Casting datetime64 to int64 uses the minimum possible int64 when it
545
+ # encounters NaT. Simulating the same here for when auto cast fails.
546
+ return NAT_INT64_MIN_IN_SECONDS
537
547
  parsed_ts = dateutil.parser.isoparse(ts).astimezone(dateutil.tz.UTC)
538
548
  return (
539
549
  parsed_ts - datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc)
@@ -547,12 +557,11 @@ def string_to_epoch(ts: str) -> int:
547
557
 
548
558
  @execute_node.register(ops.ExtractEpochSeconds, (datetime.datetime, pd.Series))
549
559
  def execute_epoch_seconds_new(op, data, **kwargs):
550
- import numpy as np
551
-
552
560
  convert = getattr(data, "view", data.astype)
553
561
  try:
554
562
  series = convert(np.int64)
555
- return (series // 1_000_000_000).astype(np.int32)
563
+ # We need int64 below because NaT overflows int32.
564
+ return (series // 1_000_000_000).astype(np.int64)
556
565
  except TypeError:
557
566
  # Catch 'TypeError' for large timestamps beyond max datetime64[ns] as per Issue #1053
558
567
  # Cast to string instead to work around datetime64[ns] limitation
@@ -82,9 +82,11 @@ def _metadata(self, query: str) -> sch.Schema:
82
82
  )
83
83
  with self.begin() as con:
84
84
  cur = con.exec_driver_sql(f"SELECT * FROM {query} t0 LIMIT 0")
85
+ # Table OID below is cast to bigint because OID is based on
86
+ # an unsigned integer which can overflow integer data type.
85
87
  qry_cols = [
86
88
  f"('{column.name}'::text, {column.type_code},"
87
- + f"{column.table_oid if column.table_oid else 'NULL'}::int,"
89
+ + f"{column.table_oid if column.table_oid else 'NULL'}::bigint,"
88
90
  + f"{column.table_column if column.table_column else 'NULL'}::int, {idx})"
89
91
  for idx, column in enumerate(cur.cursor.description)
90
92
  ]
@@ -93,7 +95,7 @@ def _metadata(self, query: str) -> sch.Schema:
93
95
  THEN format_type(t0.type_code, NULL)
94
96
  ELSE format_type(t1.atttypid, t1.atttypmod) END AS type
95
97
  FROM UNNEST(array[{','.join(qry_cols)}])
96
- AS t0(name text, type_code int, attrelid int, attnum int, col_ord int)
98
+ AS t0(name text, type_code int, attrelid bigint, attnum int, col_ord int)
97
99
  LEFT JOIN pg_attribute t1 USING (attrelid, attnum) ORDER BY col_ord"""
98
100
  )
99
101
  yield from ((col, _get_type(typestr)) for col, typestr in type_info)
@@ -106,6 +106,21 @@ def teradata_cast_decimal_to_string(compiled_arg, from_, to):
106
106
  return "TO_CHAR({},'TM9')".format(compiled_arg)
107
107
 
108
108
 
109
+ @teradata_cast.register(str, dt.Int8, dt.String)
110
+ @teradata_cast.register(str, dt.Int16, dt.String)
111
+ @teradata_cast.register(str, dt.Int32, dt.String)
112
+ def teradata_cast_integer_to_string(compiled_arg, from_, to):
113
+ # INTEGER in a string cannot be longer than 10 characters (+1 for sign).
114
+ # Included smaller integers here too to minimize overloads.
115
+ return "CAST({} AS VARCHAR(11))".format(compiled_arg)
116
+
117
+
118
+ @teradata_cast.register(str, dt.Int64, dt.String)
119
+ def teradata_cast_bigint_to_string(compiled_arg, from_, to):
120
+ # BIGINT in a string cannot be longer than 20 characters (+1 for sign).
121
+ return "CAST({} AS VARCHAR(21))".format(compiled_arg)
122
+
123
+
109
124
  @teradata_cast.register(str, dt.Time, dt.String)
110
125
  def teradata_cast_time_to_string(compiled_arg, from_, to):
111
126
  # Time always has a time zone associated with it in Teradata