From 541f17afb8b869f4f71781e47276cc77c4448330 Mon Sep 17 00:00:00 2001 From: Jayaram Kancherla Date: Thu, 25 Jun 2026 09:00:35 -0700 Subject: [PATCH 1/2] Implement save_rds for NumPy scalars --- CHANGELOG.md | 1 + src/rds2py/save_atomic.py | 6 ++++++ tests/test_atomics.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7854479..cc25e22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Read `symbols` registered in RDS objects. - Fixed an issue with S4 classes not properly saved as RDS files. - Implement `save_rds` generic for sparse matrix formats (csc, csr and coo). +- Implement `save_rds` for NumPy scalars. ## Version 0.9.0 - 0.9.1 diff --git a/src/rds2py/save_atomic.py b/src/rds2py/save_atomic.py index 1ecd09b..0d1f0ff 100644 --- a/src/rds2py/save_atomic.py +++ b/src/rds2py/save_atomic.py @@ -26,6 +26,12 @@ def _save_rds_primitives(x, path: Optional[str] = None): return x +@save_rds.register(np.generic) +def _save_rds_numpy_scalars(x: np.generic, path: Optional[str] = None): + return save_rds(x.item(), path=path) + + + @save_rds.register(BooleanList) def _save_rds_booleanlist(x: BooleanList, path: Optional[str] = None): from .lib_rds_parser import write_rds as _write_rds_native diff --git a/tests/test_atomics.py b/tests/test_atomics.py index a4a31c2..e28da78 100644 --- a/tests/test_atomics.py +++ b/tests/test_atomics.py @@ -119,3 +119,33 @@ def test_save_names_directly(): finally: if os.path.exists(path): os.unlink(path) + + +def test_save_numpy_scalars(): + import numpy as np + from rds2py import save_rds + + # Test integer scalar + i_scalar = np.int32(42) + res_i = save_rds(i_scalar) + assert isinstance(res_i, int) + assert res_i == 42 + + # Test float scalar + f_scalar = np.float64(3.14) + res_f = save_rds(f_scalar) + assert isinstance(res_f, float) + assert res_f == 3.14 + + # Test bool scalar + b_scalar = np.bool_(True) + res_b = save_rds(b_scalar) + assert isinstance(res_b, bool) + assert res_b is True + + # Test string scalar + s_scalar = np.str_("hello") + res_s = save_rds(s_scalar) + assert isinstance(res_s, str) + assert res_s == "hello" + From 5f113577dc896afab613efd583e8d22a4adabe2d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 25 Jun 2026 16:01:03 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/rds2py/save_atomic.py | 1 - tests/test_atomics.py | 1 - 2 files changed, 2 deletions(-) diff --git a/src/rds2py/save_atomic.py b/src/rds2py/save_atomic.py index 0d1f0ff..5f0379f 100644 --- a/src/rds2py/save_atomic.py +++ b/src/rds2py/save_atomic.py @@ -31,7 +31,6 @@ def _save_rds_numpy_scalars(x: np.generic, path: Optional[str] = None): return save_rds(x.item(), path=path) - @save_rds.register(BooleanList) def _save_rds_booleanlist(x: BooleanList, path: Optional[str] = None): from .lib_rds_parser import write_rds as _write_rds_native diff --git a/tests/test_atomics.py b/tests/test_atomics.py index e28da78..57d9176 100644 --- a/tests/test_atomics.py +++ b/tests/test_atomics.py @@ -148,4 +148,3 @@ def test_save_numpy_scalars(): res_s = save_rds(s_scalar) assert isinstance(res_s, str) assert res_s == "hello" -