This is an automated email from the ASF dual-hosted git repository.
fokko pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg-python.git
The following commit(s) were added to refs/heads/main by this push:
new 84ab9791 `strtobool` support for Python 3.12 (#880)
84ab9791 is described below
commit 84ab9791a65dc60a38f886193c93519b5bce5d5f
Author: Mehul Batra <[email protected]>
AuthorDate: Tue Jul 2 17:09:42 2024 +0530
`strtobool` support for Python 3.12 (#880)
* pyiceberg strtobool function to replace distutil strtobool function
* unit_test for strtobool
* Update pyiceberg/types.py
Co-authored-by: Fokko Driesprong <[email protected]>
* revamp unit_test
* revamp unit_test
---------
Co-authored-by: Fokko Driesprong <[email protected]>
---
pyiceberg/types.py | 16 ++++++++++++++++
pyiceberg/utils/config.py | 2 +-
tests/test_types.py | 19 +++++++++++++++++++
3 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/pyiceberg/types.py b/pyiceberg/types.py
index e92056e0..cd662c73 100644
--- a/pyiceberg/types.py
+++ b/pyiceberg/types.py
@@ -92,6 +92,22 @@ def _parse_fixed_type(fixed: Any) -> int:
return fixed
+def strtobool(val: str) -> bool:
+ """Convert a string representation of truth to true (1) or false (0).
+
+ True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
+ are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if
+ 'val' is anything else.
+ """
+ val = val.lower()
+ if val in ("y", "yes", "t", "true", "on", "1"):
+ return True
+ elif val in ("n", "no", "f", "false", "off", "0"):
+ return False
+ else:
+ raise ValueError(f"Invalid truth value: {val!r}")
+
+
class IcebergType(IcebergBaseModel):
"""Base type for all Iceberg Types.
diff --git a/pyiceberg/utils/config.py b/pyiceberg/utils/config.py
index 5eb9cfaa..51ab200e 100644
--- a/pyiceberg/utils/config.py
+++ b/pyiceberg/utils/config.py
@@ -16,12 +16,12 @@
# under the License.
import logging
import os
-from distutils.util import strtobool
from typing import List, Optional
import strictyaml
from pyiceberg.typedef import UTF8, FrozenDict, RecursiveDict
+from pyiceberg.types import strtobool
PYICEBERG = "pyiceberg_"
DEFAULT = "default"
diff --git a/tests/test_types.py b/tests/test_types.py
index 0ffb1d07..1e386bb7 100644
--- a/tests/test_types.py
+++ b/tests/test_types.py
@@ -43,6 +43,7 @@ from pyiceberg.types import (
TimestamptzType,
TimeType,
UUIDType,
+ strtobool,
)
non_parameterized_types = [
@@ -630,3 +631,21 @@ def test_deepcopy_of_singleton_fixed_type() -> None:
for lhs, rhs in zip(list_of_fixed_types, copied_list):
assert id(lhs) == id(rhs)
+
+
+def test_strtobool() -> None:
+ # Values that should return True
+ true_values = ["y", "yes", "t", "true", "on", "1"]
+ for val in true_values:
+ assert strtobool(val) is True, f"Expected True for value: {val}"
+
+ # Values that should return False
+ false_values = ["n", "no", "f", "false", "off", "0"]
+ for val in false_values:
+ assert strtobool(val) is False, f"Expected False for value: {val}"
+
+ # Values that should raise ValueError
+ invalid_values = ["maybe", "2", "trueish", "falseish", "", " "]
+ for val in invalid_values:
+ with pytest.raises(ValueError, match=f"Invalid truth value: {val!r}"):
+ strtobool(val)