Skip to content

Prevent update_attributes from erasing all prior attributes #2870

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 27, 2025

Conversation

moradology
Copy link
Contributor

@moradology moradology commented Feb 26, 2025

This PR fixes attribute updating logic by clearing in calls to put and removing clear calls from all update_attributes methods. It also fixes an apparent oversight in the JSON type (advise if I'm wrong) which didn't allow lists. Sequence should handle both tuple and list

closes: #2867

TODO:

  • Add unit tests and/or doctests in docstrings
  • Add docstrings and API docs for any new/modified user-facing classes and functions
  • New/modified features documented in docs/user-guide/*.rst
  • Changes documented as a new file in changes/
  • GitHub Actions have all passed
  • Test coverage is 100% (Codecov passes)

@github-actions github-actions bot added the needs release notes Automatically applied to PRs which haven't added release notes label Feb 26, 2025
@github-actions github-actions bot removed the needs release notes Automatically applied to PRs which haven't added release notes label Feb 26, 2025
@moradology moradology marked this pull request as ready for review February 26, 2025 21:16
@@ -1609,8 +1609,6 @@ async def update_attributes(self, new_attributes: dict[str, JSON]) -> Self:
- The updated attributes will be merged with existing attributes, and any conflicts will be
overwritten by the new values.
"""
# metadata.attributes is "frozen" so we simply clear and update the dict
self.metadata.attributes.clear()
self.metadata.attributes.update(new_attributes)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in principle we do want the metadata documents to be immutable, but as long as we are using plain python dicts for the attributes, immutability is not realistic. so updating in-place is fine.

Copy link
Contributor

@dcherian dcherian left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. thanks

@@ -50,6 +50,7 @@ def put(self, d: dict[str, JSON]) -> None:
>>> attrs
{'a': 3, 'c': 4}
"""
self._obj.metadata.attributes.clear()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this a separate bug fix to the change in zarr/core/array.py? If so, it should get it's own changelog entry, and test.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to keep put (which formerly was using the undesired behavior in update_attributes) working as expected rather than a new feature or bugfix

@dstansby dstansby merged commit 7520870 into zarr-developers:main Feb 27, 2025
30 checks passed
@ianhi ianhi mentioned this pull request Mar 12, 2025
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

update_attributes deletes existing attributes
4 participants