From b8d4c21c7fcc5ba4887343fc2928434a6ac80051 Mon Sep 17 00:00:00 2001 From: Jayaram Kancherla Date: Fri, 16 Jan 2026 22:41:08 -0800 Subject: [PATCH 1/3] sanitize metadata and accept a list as well --- CHANGELOG.md | 3 +-- src/biocutils/biocobject.py | 10 ++++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e881ea3..8f80ed5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,8 @@ # Changelog -## Version 0.3.0 - 0.3.2 +## Version 0.3.0 - 0.3.4 - Provide a base `BiocObject` class similar to the `Annotated` class in Bioconductor. The class provides `metadata` slot, accessors and validation functions. -- Renaming code files to follow pep guidelines - Update Github actions and workflow to the new biocsetup versions - Changes to improve `NamedList`, `Names` classes - get name at index diff --git a/src/biocutils/biocobject.py b/src/biocutils/biocobject.py index fba245c..8a1881c 100644 --- a/src/biocutils/biocobject.py +++ b/src/biocutils/biocobject.py @@ -15,10 +15,15 @@ def sanitize_metadata(metadata: Any) -> NamedList: """Sanitize metadata input to a NamedList.""" if metadata is None: return NamedList() + if isinstance(metadata, NamedList): return metadata + if isinstance(metadata, dict): return NamedList.from_dict(metadata) + + if isinstance(metadata, list): + return NamedList.from_list(metadata) raise TypeError(f"`metadata` must be a dictionary or NamedList, provided {type(metadata).__name__}.") @@ -45,10 +50,11 @@ def __init__(self, metadata: Optional[Union[Dict[str, Any], NamedList]] = None, _validate: Whether to validate the input. Defaults to True. """ + _meta = sanitize_metadata(metadata) if _validate and metadata is not None: - _validate_metadata(metadata) + _validate_metadata(_meta) - self._metadata = sanitize_metadata(metadata) + self._metadata = _meta def _define_output(self, in_place: bool = False) -> BiocObject: """Internal utility to handle in-place vs copy-on-modify.""" From d357fa2d177c0a732fe261cddbb64a2712f13d8e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 17 Jan 2026 06:44:22 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/biocutils/biocobject.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/biocutils/biocobject.py b/src/biocutils/biocobject.py index 8a1881c..422b7a6 100644 --- a/src/biocutils/biocobject.py +++ b/src/biocutils/biocobject.py @@ -15,13 +15,13 @@ def sanitize_metadata(metadata: Any) -> NamedList: """Sanitize metadata input to a NamedList.""" if metadata is None: return NamedList() - + if isinstance(metadata, NamedList): return metadata - + if isinstance(metadata, dict): return NamedList.from_dict(metadata) - + if isinstance(metadata, list): return NamedList.from_list(metadata) From 967cf88beb3d1396c464b11228d62901f1f0ec83 Mon Sep 17 00:00:00 2001 From: Jayaram Kancherla Date: Fri, 16 Jan 2026 22:49:20 -0800 Subject: [PATCH 3/3] add tests --- tests/test_biocobject.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_biocobject.py b/tests/test_biocobject.py index d502666..08e36b9 100644 --- a/tests/test_biocobject.py +++ b/tests/test_biocobject.py @@ -18,6 +18,14 @@ def test_init_with_dict(): assert isinstance(obj.metadata, NamedList) assert len(obj.metadata) == 2 +def test_init_with_list(): + """Test initialization with a list.""" + meta = ["jkanche", 1] + obj = BiocObject(metadata=meta) + + assert isinstance(obj.metadata, NamedList) + assert len(obj.metadata) == 2 + def test_init_validation(): """Test that invalid metadata raises TypeError.""" with pytest.raises(TypeError, match="must be a dictionary or NamedList"):