feat: metadata-only support for storage transformers metadata - #2180

Merged
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers
Sep 27, 2024
Merged

feat: metadata-only support for storage transformers metadata#2180
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers

Conversation

@d-v-b

Copy link
Copy Markdown
Contributor

Addresses #2178

This adds metadata-only support for the storage_transformers key in array metadata. By "metadata only" I mean that creating an array metadata document from JSON or a dict with a storage_transformers keyword will not error, and some very mild validation will be run (just ensuring that the value is an iterable or None), but the value is not used for any storage transforming, because we don't have any code for that yet.

But at least the metadata can be constructed and the storage_transformer value should round-trip through metadata properly. This should resolve#2178.

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/tutorial.rst
  • Changes documented in docs/release.rst
  • GitHub Actions have all passed
  • Test coverage is 100% (Codecov passes)

@zoj613

Copy link
Copy Markdown

If creating a metadata object from a JSON file that specifies a storage transformer list, then this implies reading from or writing to that array hinges on applying the transformer pipeline since it may modify the keys and/or values of that array node. I think ignoring it and issuing a warning is not enough since reading from said array using the metadata would potentially result in the wrong byte sequence being passed to its codec pipeline (as a result of skipping the transformation pipeline).

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

The case where a storage_transformer field could be safely ignored when parsing a JSON is when it is an empty list, as indicated by the spec

@d-v-b

Copy link
Copy Markdown
ContributorAuthor

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

I think this is valid, but we should raise when constructing an Array from metadata that references a storage transformer, rather than when constructing the array metadata itself. I will implement this.

Comment threadsrc/zarr/core/metadata/v3.py Outdated
"The storage transformer(s) will be retained in array metadata but will not "
"influence storage routines"
)
warnings.warn(msg, UserWarning, stacklevel=1)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

after thinking about this some more, I believe we should raise an error here instead of warning.

We allow:

  • metadata w/o the storage_transformers key
  • metadata with storage_transformers == [] or None

We error for:

  • metadata w/ len(storage_transformers) > 0

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

why not error when a user tries to create an array with the metadata? I'm thinking about how someone would develop a storage transformer with zarr-python as a dependency. If the metadata parsing functionality supports storage transformers, then they can use that immediately, and then subclass / implement their own array class that can use the storage transformer. Seems like a better workflow than forcing them to also subclass the metadata class?

@jhammanjhamman added this to the 3.0.0 milestone Sep 13, 2024
@jhammanjhamman added the V3 label Sep 13, 2024
@d-v-b

Copy link
Copy Markdown
ContributorAuthor

The changes in this PR now result in errors if an AsyncArray is created from ArrayV3Metadata that contains a non-zero number of storage transformers. However, you can create metadata with storage transformers without any error or warnings.

@d-v-b
d-v-b requested a review from jhammanSeptember 25, 2024 19:59
@d-v-bd-v-b changed the title feat: meager support for storage transformers metadatafeat: metadata-only support for storage transformers metadataSep 25, 2024

@jhammanjhamman left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks @d-v-b

@d-v-b
d-v-b merged commit 5ca080d into zarr-developers:v3Sep 27, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Sep 27, 2024
* v3: (21 commits)
Default zarr.open to open_group if shape is not provided (zarr-developers#2158)
feat: metadata-only support for storage transformers metadata (zarr-developers#2180)
fix(async): set default concurrency to 10 tasks (zarr-developers#2256)
chore(deps): drop support for python 3.10 and numpy 1.24 (zarr-developers#2217)
feature(store): add LoggingStore wrapper (zarr-developers#2231)
Apply assorted ruff/flake8-simplify rules (SIM) (zarr-developers#2259)
Add array storage helpers (zarr-developers#2065)
Apply ruff/flake8-annotations rule ANN204 (zarr-developers#2258)
No need to run DeepSource any more - we use ruff (zarr-developers#2261)
Remove unnecessary lambda expression (zarr-developers#2260)
Enforce ruff/flake8-comprehensions rules (C4) (zarr-developers#2239)
Use `map(str, *)` in `test_accessed_chunks` (zarr-developers#2229)
Replace Gitter with Zulip (zarr-developers#2254)
Enforce ruff/flake8-pytest-style rules (PT) (zarr-developers#2236)
Fix multiple identical imports (zarr-developers#2241)
Enforce ruff/flake8-return rules (RET) (zarr-developers#2237)
Enforce ruff/flynt rules (FLY) (zarr-developers#2240)
Fix fill_value handling for complex dtypes (zarr-developers#2200)
Update V2 codec pipeline to use concrete classes (zarr-developers#2244)
Apply and enforce more ruff rules (zarr-developers#2053)
...
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

storage_transformers are not an accepted keyword for ArrayV3Metadata

3 participants

@d-v-b@zoj613@jhamman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: metadata-only support for storage transformers metadata - #2180

Merged
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers
Sep 27, 2024
Merged

feat: metadata-only support for storage transformers metadata#2180
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers

Conversation

@d-v-b

Copy link
Copy Markdown
Contributor

Addresses #2178

This adds metadata-only support for the storage_transformers key in array metadata. By "metadata only" I mean that creating an array metadata document from JSON or a dict with a storage_transformers keyword will not error, and some very mild validation will be run (just ensuring that the value is an iterable or None), but the value is not used for any storage transforming, because we don't have any code for that yet.

But at least the metadata can be constructed and the storage_transformer value should round-trip through metadata properly. This should resolve#2178.

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/tutorial.rst
  • Changes documented in docs/release.rst
  • GitHub Actions have all passed
  • Test coverage is 100% (Codecov passes)

@zoj613

Copy link
Copy Markdown

If creating a metadata object from a JSON file that specifies a storage transformer list, then this implies reading from or writing to that array hinges on applying the transformer pipeline since it may modify the keys and/or values of that array node. I think ignoring it and issuing a warning is not enough since reading from said array using the metadata would potentially result in the wrong byte sequence being passed to its codec pipeline (as a result of skipping the transformation pipeline).

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

The case where a storage_transformer field could be safely ignored when parsing a JSON is when it is an empty list, as indicated by the spec

@d-v-b

Copy link
Copy Markdown
ContributorAuthor

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

I think this is valid, but we should raise when constructing an Array from metadata that references a storage transformer, rather than when constructing the array metadata itself. I will implement this.

Comment threadsrc/zarr/core/metadata/v3.py Outdated
"The storage transformer(s) will be retained in array metadata but will not "
"influence storage routines"
)
warnings.warn(msg, UserWarning, stacklevel=1)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

after thinking about this some more, I believe we should raise an error here instead of warning.

We allow:

  • metadata w/o the storage_transformers key
  • metadata with storage_transformers == [] or None

We error for:

  • metadata w/ len(storage_transformers) > 0

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

why not error when a user tries to create an array with the metadata? I'm thinking about how someone would develop a storage transformer with zarr-python as a dependency. If the metadata parsing functionality supports storage transformers, then they can use that immediately, and then subclass / implement their own array class that can use the storage transformer. Seems like a better workflow than forcing them to also subclass the metadata class?

@jhammanjhamman added this to the 3.0.0 milestone Sep 13, 2024
@jhammanjhamman added the V3 label Sep 13, 2024
@d-v-b

Copy link
Copy Markdown
ContributorAuthor

The changes in this PR now result in errors if an AsyncArray is created from ArrayV3Metadata that contains a non-zero number of storage transformers. However, you can create metadata with storage transformers without any error or warnings.

@d-v-b
d-v-b requested a review from jhammanSeptember 25, 2024 19:59
@d-v-bd-v-b changed the title feat: meager support for storage transformers metadatafeat: metadata-only support for storage transformers metadataSep 25, 2024

@jhammanjhamman left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks @d-v-b

@d-v-b
d-v-b merged commit 5ca080d into zarr-developers:v3Sep 27, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Sep 27, 2024
* v3: (21 commits)
Default zarr.open to open_group if shape is not provided (zarr-developers#2158)
feat: metadata-only support for storage transformers metadata (zarr-developers#2180)
fix(async): set default concurrency to 10 tasks (zarr-developers#2256)
chore(deps): drop support for python 3.10 and numpy 1.24 (zarr-developers#2217)
feature(store): add LoggingStore wrapper (zarr-developers#2231)
Apply assorted ruff/flake8-simplify rules (SIM) (zarr-developers#2259)
Add array storage helpers (zarr-developers#2065)
Apply ruff/flake8-annotations rule ANN204 (zarr-developers#2258)
No need to run DeepSource any more - we use ruff (zarr-developers#2261)
Remove unnecessary lambda expression (zarr-developers#2260)
Enforce ruff/flake8-comprehensions rules (C4) (zarr-developers#2239)
Use `map(str, *)` in `test_accessed_chunks` (zarr-developers#2229)
Replace Gitter with Zulip (zarr-developers#2254)
Enforce ruff/flake8-pytest-style rules (PT) (zarr-developers#2236)
Fix multiple identical imports (zarr-developers#2241)
Enforce ruff/flake8-return rules (RET) (zarr-developers#2237)
Enforce ruff/flynt rules (FLY) (zarr-developers#2240)
Fix fill_value handling for complex dtypes (zarr-developers#2200)
Update V2 codec pipeline to use concrete classes (zarr-developers#2244)
Apply and enforce more ruff rules (zarr-developers#2053)
...
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

storage_transformers are not an accepted keyword for ArrayV3Metadata

3 participants

@d-v-b@zoj613@jhamman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: metadata-only support for storage transformers metadata - #2180

Merged
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers
Sep 27, 2024
Merged

feat: metadata-only support for storage transformers metadata#2180
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers

Conversation

@d-v-b

Copy link
Copy Markdown
Contributor

Addresses #2178

This adds metadata-only support for the storage_transformers key in array metadata. By "metadata only" I mean that creating an array metadata document from JSON or a dict with a storage_transformers keyword will not error, and some very mild validation will be run (just ensuring that the value is an iterable or None), but the value is not used for any storage transforming, because we don't have any code for that yet.

But at least the metadata can be constructed and the storage_transformer value should round-trip through metadata properly. This should resolve#2178.

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/tutorial.rst
  • Changes documented in docs/release.rst
  • GitHub Actions have all passed
  • Test coverage is 100% (Codecov passes)

@zoj613

Copy link
Copy Markdown

If creating a metadata object from a JSON file that specifies a storage transformer list, then this implies reading from or writing to that array hinges on applying the transformer pipeline since it may modify the keys and/or values of that array node. I think ignoring it and issuing a warning is not enough since reading from said array using the metadata would potentially result in the wrong byte sequence being passed to its codec pipeline (as a result of skipping the transformation pipeline).

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

The case where a storage_transformer field could be safely ignored when parsing a JSON is when it is an empty list, as indicated by the spec

@d-v-b

Copy link
Copy Markdown
ContributorAuthor

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

I think this is valid, but we should raise when constructing an Array from metadata that references a storage transformer, rather than when constructing the array metadata itself. I will implement this.

Comment threadsrc/zarr/core/metadata/v3.py Outdated
"The storage transformer(s) will be retained in array metadata but will not "
"influence storage routines"
)
warnings.warn(msg, UserWarning, stacklevel=1)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

after thinking about this some more, I believe we should raise an error here instead of warning.

We allow:

  • metadata w/o the storage_transformers key
  • metadata with storage_transformers == [] or None

We error for:

  • metadata w/ len(storage_transformers) > 0

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

why not error when a user tries to create an array with the metadata? I'm thinking about how someone would develop a storage transformer with zarr-python as a dependency. If the metadata parsing functionality supports storage transformers, then they can use that immediately, and then subclass / implement their own array class that can use the storage transformer. Seems like a better workflow than forcing them to also subclass the metadata class?

@jhammanjhamman added this to the 3.0.0 milestone Sep 13, 2024
@jhammanjhamman added the V3 label Sep 13, 2024
@d-v-b

Copy link
Copy Markdown
ContributorAuthor

The changes in this PR now result in errors if an AsyncArray is created from ArrayV3Metadata that contains a non-zero number of storage transformers. However, you can create metadata with storage transformers without any error or warnings.

@d-v-b
d-v-b requested a review from jhammanSeptember 25, 2024 19:59
@d-v-bd-v-b changed the title feat: meager support for storage transformers metadatafeat: metadata-only support for storage transformers metadataSep 25, 2024

@jhammanjhamman left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks @d-v-b

@d-v-b
d-v-b merged commit 5ca080d into zarr-developers:v3Sep 27, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Sep 27, 2024
* v3: (21 commits)
Default zarr.open to open_group if shape is not provided (zarr-developers#2158)
feat: metadata-only support for storage transformers metadata (zarr-developers#2180)
fix(async): set default concurrency to 10 tasks (zarr-developers#2256)
chore(deps): drop support for python 3.10 and numpy 1.24 (zarr-developers#2217)
feature(store): add LoggingStore wrapper (zarr-developers#2231)
Apply assorted ruff/flake8-simplify rules (SIM) (zarr-developers#2259)
Add array storage helpers (zarr-developers#2065)
Apply ruff/flake8-annotations rule ANN204 (zarr-developers#2258)
No need to run DeepSource any more - we use ruff (zarr-developers#2261)
Remove unnecessary lambda expression (zarr-developers#2260)
Enforce ruff/flake8-comprehensions rules (C4) (zarr-developers#2239)
Use `map(str, *)` in `test_accessed_chunks` (zarr-developers#2229)
Replace Gitter with Zulip (zarr-developers#2254)
Enforce ruff/flake8-pytest-style rules (PT) (zarr-developers#2236)
Fix multiple identical imports (zarr-developers#2241)
Enforce ruff/flake8-return rules (RET) (zarr-developers#2237)
Enforce ruff/flynt rules (FLY) (zarr-developers#2240)
Fix fill_value handling for complex dtypes (zarr-developers#2200)
Update V2 codec pipeline to use concrete classes (zarr-developers#2244)
Apply and enforce more ruff rules (zarr-developers#2053)
...
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

storage_transformers are not an accepted keyword for ArrayV3Metadata

3 participants

@d-v-b@zoj613@jhamman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: metadata-only support for storage transformers metadata - #2180

Merged
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers
Sep 27, 2024
Merged

feat: metadata-only support for storage transformers metadata#2180
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers

Conversation

@d-v-b

Copy link
Copy Markdown
Contributor

Addresses #2178

This adds metadata-only support for the storage_transformers key in array metadata. By "metadata only" I mean that creating an array metadata document from JSON or a dict with a storage_transformers keyword will not error, and some very mild validation will be run (just ensuring that the value is an iterable or None), but the value is not used for any storage transforming, because we don't have any code for that yet.

But at least the metadata can be constructed and the storage_transformer value should round-trip through metadata properly. This should resolve#2178.

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/tutorial.rst
  • Changes documented in docs/release.rst
  • GitHub Actions have all passed
  • Test coverage is 100% (Codecov passes)

@zoj613

Copy link
Copy Markdown

If creating a metadata object from a JSON file that specifies a storage transformer list, then this implies reading from or writing to that array hinges on applying the transformer pipeline since it may modify the keys and/or values of that array node. I think ignoring it and issuing a warning is not enough since reading from said array using the metadata would potentially result in the wrong byte sequence being passed to its codec pipeline (as a result of skipping the transformation pipeline).

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

The case where a storage_transformer field could be safely ignored when parsing a JSON is when it is an empty list, as indicated by the spec

@d-v-b

Copy link
Copy Markdown
ContributorAuthor

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

I think this is valid, but we should raise when constructing an Array from metadata that references a storage transformer, rather than when constructing the array metadata itself. I will implement this.

Comment threadsrc/zarr/core/metadata/v3.py Outdated
"The storage transformer(s) will be retained in array metadata but will not "
"influence storage routines"
)
warnings.warn(msg, UserWarning, stacklevel=1)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

after thinking about this some more, I believe we should raise an error here instead of warning.

We allow:

  • metadata w/o the storage_transformers key
  • metadata with storage_transformers == [] or None

We error for:

  • metadata w/ len(storage_transformers) > 0

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

why not error when a user tries to create an array with the metadata? I'm thinking about how someone would develop a storage transformer with zarr-python as a dependency. If the metadata parsing functionality supports storage transformers, then they can use that immediately, and then subclass / implement their own array class that can use the storage transformer. Seems like a better workflow than forcing them to also subclass the metadata class?

@jhammanjhamman added this to the 3.0.0 milestone Sep 13, 2024
@jhammanjhamman added the V3 label Sep 13, 2024
@d-v-b

Copy link
Copy Markdown
ContributorAuthor

The changes in this PR now result in errors if an AsyncArray is created from ArrayV3Metadata that contains a non-zero number of storage transformers. However, you can create metadata with storage transformers without any error or warnings.

@d-v-b
d-v-b requested a review from jhammanSeptember 25, 2024 19:59
@d-v-bd-v-b changed the title feat: meager support for storage transformers metadatafeat: metadata-only support for storage transformers metadataSep 25, 2024

@jhammanjhamman left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks @d-v-b

@d-v-b
d-v-b merged commit 5ca080d into zarr-developers:v3Sep 27, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Sep 27, 2024
* v3: (21 commits)
Default zarr.open to open_group if shape is not provided (zarr-developers#2158)
feat: metadata-only support for storage transformers metadata (zarr-developers#2180)
fix(async): set default concurrency to 10 tasks (zarr-developers#2256)
chore(deps): drop support for python 3.10 and numpy 1.24 (zarr-developers#2217)
feature(store): add LoggingStore wrapper (zarr-developers#2231)
Apply assorted ruff/flake8-simplify rules (SIM) (zarr-developers#2259)
Add array storage helpers (zarr-developers#2065)
Apply ruff/flake8-annotations rule ANN204 (zarr-developers#2258)
No need to run DeepSource any more - we use ruff (zarr-developers#2261)
Remove unnecessary lambda expression (zarr-developers#2260)
Enforce ruff/flake8-comprehensions rules (C4) (zarr-developers#2239)
Use `map(str, *)` in `test_accessed_chunks` (zarr-developers#2229)
Replace Gitter with Zulip (zarr-developers#2254)
Enforce ruff/flake8-pytest-style rules (PT) (zarr-developers#2236)
Fix multiple identical imports (zarr-developers#2241)
Enforce ruff/flake8-return rules (RET) (zarr-developers#2237)
Enforce ruff/flynt rules (FLY) (zarr-developers#2240)
Fix fill_value handling for complex dtypes (zarr-developers#2200)
Update V2 codec pipeline to use concrete classes (zarr-developers#2244)
Apply and enforce more ruff rules (zarr-developers#2053)
...
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

storage_transformers are not an accepted keyword for ArrayV3Metadata

3 participants

@d-v-b@zoj613@jhamman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: metadata-only support for storage transformers metadata - #2180

Merged
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers
Sep 27, 2024
Merged

feat: metadata-only support for storage transformers metadata#2180
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers

Conversation

@d-v-b

Copy link
Copy Markdown
Contributor

Addresses #2178

This adds metadata-only support for the storage_transformers key in array metadata. By "metadata only" I mean that creating an array metadata document from JSON or a dict with a storage_transformers keyword will not error, and some very mild validation will be run (just ensuring that the value is an iterable or None), but the value is not used for any storage transforming, because we don't have any code for that yet.

But at least the metadata can be constructed and the storage_transformer value should round-trip through metadata properly. This should resolve#2178.

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/tutorial.rst
  • Changes documented in docs/release.rst
  • GitHub Actions have all passed
  • Test coverage is 100% (Codecov passes)

@zoj613

Copy link
Copy Markdown

If creating a metadata object from a JSON file that specifies a storage transformer list, then this implies reading from or writing to that array hinges on applying the transformer pipeline since it may modify the keys and/or values of that array node. I think ignoring it and issuing a warning is not enough since reading from said array using the metadata would potentially result in the wrong byte sequence being passed to its codec pipeline (as a result of skipping the transformation pipeline).

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

The case where a storage_transformer field could be safely ignored when parsing a JSON is when it is an empty list, as indicated by the spec

@d-v-b

Copy link
Copy Markdown
ContributorAuthor

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

I think this is valid, but we should raise when constructing an Array from metadata that references a storage transformer, rather than when constructing the array metadata itself. I will implement this.

Comment threadsrc/zarr/core/metadata/v3.py Outdated
"The storage transformer(s) will be retained in array metadata but will not "
"influence storage routines"
)
warnings.warn(msg, UserWarning, stacklevel=1)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

after thinking about this some more, I believe we should raise an error here instead of warning.

We allow:

  • metadata w/o the storage_transformers key
  • metadata with storage_transformers == [] or None

We error for:

  • metadata w/ len(storage_transformers) > 0

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

why not error when a user tries to create an array with the metadata? I'm thinking about how someone would develop a storage transformer with zarr-python as a dependency. If the metadata parsing functionality supports storage transformers, then they can use that immediately, and then subclass / implement their own array class that can use the storage transformer. Seems like a better workflow than forcing them to also subclass the metadata class?

@jhammanjhamman added this to the 3.0.0 milestone Sep 13, 2024
@jhammanjhamman added the V3 label Sep 13, 2024
@d-v-b

Copy link
Copy Markdown
ContributorAuthor

The changes in this PR now result in errors if an AsyncArray is created from ArrayV3Metadata that contains a non-zero number of storage transformers. However, you can create metadata with storage transformers without any error or warnings.

@d-v-b
d-v-b requested a review from jhammanSeptember 25, 2024 19:59
@d-v-bd-v-b changed the title feat: meager support for storage transformers metadatafeat: metadata-only support for storage transformers metadataSep 25, 2024

@jhammanjhamman left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks @d-v-b

@d-v-b
d-v-b merged commit 5ca080d into zarr-developers:v3Sep 27, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Sep 27, 2024
* v3: (21 commits)
Default zarr.open to open_group if shape is not provided (zarr-developers#2158)
feat: metadata-only support for storage transformers metadata (zarr-developers#2180)
fix(async): set default concurrency to 10 tasks (zarr-developers#2256)
chore(deps): drop support for python 3.10 and numpy 1.24 (zarr-developers#2217)
feature(store): add LoggingStore wrapper (zarr-developers#2231)
Apply assorted ruff/flake8-simplify rules (SIM) (zarr-developers#2259)
Add array storage helpers (zarr-developers#2065)
Apply ruff/flake8-annotations rule ANN204 (zarr-developers#2258)
No need to run DeepSource any more - we use ruff (zarr-developers#2261)
Remove unnecessary lambda expression (zarr-developers#2260)
Enforce ruff/flake8-comprehensions rules (C4) (zarr-developers#2239)
Use `map(str, *)` in `test_accessed_chunks` (zarr-developers#2229)
Replace Gitter with Zulip (zarr-developers#2254)
Enforce ruff/flake8-pytest-style rules (PT) (zarr-developers#2236)
Fix multiple identical imports (zarr-developers#2241)
Enforce ruff/flake8-return rules (RET) (zarr-developers#2237)
Enforce ruff/flynt rules (FLY) (zarr-developers#2240)
Fix fill_value handling for complex dtypes (zarr-developers#2200)
Update V2 codec pipeline to use concrete classes (zarr-developers#2244)
Apply and enforce more ruff rules (zarr-developers#2053)
...
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

storage_transformers are not an accepted keyword for ArrayV3Metadata

3 participants

@d-v-b@zoj613@jhamman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: metadata-only support for storage transformers metadata - #2180

Merged
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers
Sep 27, 2024
Merged

feat: metadata-only support for storage transformers metadata#2180
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers

Conversation

@d-v-b

Copy link
Copy Markdown
Contributor

Addresses #2178

This adds metadata-only support for the storage_transformers key in array metadata. By "metadata only" I mean that creating an array metadata document from JSON or a dict with a storage_transformers keyword will not error, and some very mild validation will be run (just ensuring that the value is an iterable or None), but the value is not used for any storage transforming, because we don't have any code for that yet.

But at least the metadata can be constructed and the storage_transformer value should round-trip through metadata properly. This should resolve#2178.

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/tutorial.rst
  • Changes documented in docs/release.rst
  • GitHub Actions have all passed
  • Test coverage is 100% (Codecov passes)

@zoj613

Copy link
Copy Markdown

If creating a metadata object from a JSON file that specifies a storage transformer list, then this implies reading from or writing to that array hinges on applying the transformer pipeline since it may modify the keys and/or values of that array node. I think ignoring it and issuing a warning is not enough since reading from said array using the metadata would potentially result in the wrong byte sequence being passed to its codec pipeline (as a result of skipping the transformation pipeline).

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

The case where a storage_transformer field could be safely ignored when parsing a JSON is when it is an empty list, as indicated by the spec

@d-v-b

Copy link
Copy Markdown
ContributorAuthor

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

I think this is valid, but we should raise when constructing an Array from metadata that references a storage transformer, rather than when constructing the array metadata itself. I will implement this.

Comment threadsrc/zarr/core/metadata/v3.py Outdated
"The storage transformer(s) will be retained in array metadata but will not "
"influence storage routines"
)
warnings.warn(msg, UserWarning, stacklevel=1)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

after thinking about this some more, I believe we should raise an error here instead of warning.

We allow:

  • metadata w/o the storage_transformers key
  • metadata with storage_transformers == [] or None

We error for:

  • metadata w/ len(storage_transformers) > 0

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

why not error when a user tries to create an array with the metadata? I'm thinking about how someone would develop a storage transformer with zarr-python as a dependency. If the metadata parsing functionality supports storage transformers, then they can use that immediately, and then subclass / implement their own array class that can use the storage transformer. Seems like a better workflow than forcing them to also subclass the metadata class?

@jhammanjhamman added this to the 3.0.0 milestone Sep 13, 2024
@jhammanjhamman added the V3 label Sep 13, 2024
@d-v-b

Copy link
Copy Markdown
ContributorAuthor

The changes in this PR now result in errors if an AsyncArray is created from ArrayV3Metadata that contains a non-zero number of storage transformers. However, you can create metadata with storage transformers without any error or warnings.

@d-v-b
d-v-b requested a review from jhammanSeptember 25, 2024 19:59
@d-v-bd-v-b changed the title feat: meager support for storage transformers metadatafeat: metadata-only support for storage transformers metadataSep 25, 2024

@jhammanjhamman left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks @d-v-b

@d-v-b
d-v-b merged commit 5ca080d into zarr-developers:v3Sep 27, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Sep 27, 2024
* v3: (21 commits)
Default zarr.open to open_group if shape is not provided (zarr-developers#2158)
feat: metadata-only support for storage transformers metadata (zarr-developers#2180)
fix(async): set default concurrency to 10 tasks (zarr-developers#2256)
chore(deps): drop support for python 3.10 and numpy 1.24 (zarr-developers#2217)
feature(store): add LoggingStore wrapper (zarr-developers#2231)
Apply assorted ruff/flake8-simplify rules (SIM) (zarr-developers#2259)
Add array storage helpers (zarr-developers#2065)
Apply ruff/flake8-annotations rule ANN204 (zarr-developers#2258)
No need to run DeepSource any more - we use ruff (zarr-developers#2261)
Remove unnecessary lambda expression (zarr-developers#2260)
Enforce ruff/flake8-comprehensions rules (C4) (zarr-developers#2239)
Use `map(str, *)` in `test_accessed_chunks` (zarr-developers#2229)
Replace Gitter with Zulip (zarr-developers#2254)
Enforce ruff/flake8-pytest-style rules (PT) (zarr-developers#2236)
Fix multiple identical imports (zarr-developers#2241)
Enforce ruff/flake8-return rules (RET) (zarr-developers#2237)
Enforce ruff/flynt rules (FLY) (zarr-developers#2240)
Fix fill_value handling for complex dtypes (zarr-developers#2200)
Update V2 codec pipeline to use concrete classes (zarr-developers#2244)
Apply and enforce more ruff rules (zarr-developers#2053)
...
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

storage_transformers are not an accepted keyword for ArrayV3Metadata

3 participants

@d-v-b@zoj613@jhamman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: metadata-only support for storage transformers metadata - #2180

Merged
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers
Sep 27, 2024
Merged

feat: metadata-only support for storage transformers metadata#2180
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers

Conversation

@d-v-b

Copy link
Copy Markdown
Contributor

Addresses #2178

This adds metadata-only support for the storage_transformers key in array metadata. By "metadata only" I mean that creating an array metadata document from JSON or a dict with a storage_transformers keyword will not error, and some very mild validation will be run (just ensuring that the value is an iterable or None), but the value is not used for any storage transforming, because we don't have any code for that yet.

But at least the metadata can be constructed and the storage_transformer value should round-trip through metadata properly. This should resolve#2178.

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/tutorial.rst
  • Changes documented in docs/release.rst
  • GitHub Actions have all passed
  • Test coverage is 100% (Codecov passes)

@zoj613

Copy link
Copy Markdown

If creating a metadata object from a JSON file that specifies a storage transformer list, then this implies reading from or writing to that array hinges on applying the transformer pipeline since it may modify the keys and/or values of that array node. I think ignoring it and issuing a warning is not enough since reading from said array using the metadata would potentially result in the wrong byte sequence being passed to its codec pipeline (as a result of skipping the transformation pipeline).

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

The case where a storage_transformer field could be safely ignored when parsing a JSON is when it is an empty list, as indicated by the spec

@d-v-b

Copy link
Copy Markdown
ContributorAuthor

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

I think this is valid, but we should raise when constructing an Array from metadata that references a storage transformer, rather than when constructing the array metadata itself. I will implement this.

Comment threadsrc/zarr/core/metadata/v3.py Outdated
"The storage transformer(s) will be retained in array metadata but will not "
"influence storage routines"
)
warnings.warn(msg, UserWarning, stacklevel=1)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

after thinking about this some more, I believe we should raise an error here instead of warning.

We allow:

  • metadata w/o the storage_transformers key
  • metadata with storage_transformers == [] or None

We error for:

  • metadata w/ len(storage_transformers) > 0

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

why not error when a user tries to create an array with the metadata? I'm thinking about how someone would develop a storage transformer with zarr-python as a dependency. If the metadata parsing functionality supports storage transformers, then they can use that immediately, and then subclass / implement their own array class that can use the storage transformer. Seems like a better workflow than forcing them to also subclass the metadata class?

@jhammanjhamman added this to the 3.0.0 milestone Sep 13, 2024
@jhammanjhamman added the V3 label Sep 13, 2024
@d-v-b

Copy link
Copy Markdown
ContributorAuthor

The changes in this PR now result in errors if an AsyncArray is created from ArrayV3Metadata that contains a non-zero number of storage transformers. However, you can create metadata with storage transformers without any error or warnings.

@d-v-b
d-v-b requested a review from jhammanSeptember 25, 2024 19:59
@d-v-bd-v-b changed the title feat: meager support for storage transformers metadatafeat: metadata-only support for storage transformers metadataSep 25, 2024

@jhammanjhamman left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks @d-v-b

@d-v-b
d-v-b merged commit 5ca080d into zarr-developers:v3Sep 27, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Sep 27, 2024
* v3: (21 commits)
Default zarr.open to open_group if shape is not provided (zarr-developers#2158)
feat: metadata-only support for storage transformers metadata (zarr-developers#2180)
fix(async): set default concurrency to 10 tasks (zarr-developers#2256)
chore(deps): drop support for python 3.10 and numpy 1.24 (zarr-developers#2217)
feature(store): add LoggingStore wrapper (zarr-developers#2231)
Apply assorted ruff/flake8-simplify rules (SIM) (zarr-developers#2259)
Add array storage helpers (zarr-developers#2065)
Apply ruff/flake8-annotations rule ANN204 (zarr-developers#2258)
No need to run DeepSource any more - we use ruff (zarr-developers#2261)
Remove unnecessary lambda expression (zarr-developers#2260)
Enforce ruff/flake8-comprehensions rules (C4) (zarr-developers#2239)
Use `map(str, *)` in `test_accessed_chunks` (zarr-developers#2229)
Replace Gitter with Zulip (zarr-developers#2254)
Enforce ruff/flake8-pytest-style rules (PT) (zarr-developers#2236)
Fix multiple identical imports (zarr-developers#2241)
Enforce ruff/flake8-return rules (RET) (zarr-developers#2237)
Enforce ruff/flynt rules (FLY) (zarr-developers#2240)
Fix fill_value handling for complex dtypes (zarr-developers#2200)
Update V2 codec pipeline to use concrete classes (zarr-developers#2244)
Apply and enforce more ruff rules (zarr-developers#2053)
...
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

storage_transformers are not an accepted keyword for ArrayV3Metadata

3 participants

@d-v-b@zoj613@jhamman
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: metadata-only support for storage transformers metadata - #2180

Merged
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers
Sep 27, 2024
Merged

feat: metadata-only support for storage transformers metadata#2180
d-v-b merged 6 commits into
zarr-developers:v3from
d-v-b:feat/metadata-support-storage-transformers

Conversation

@d-v-b

Copy link
Copy Markdown
Contributor

Addresses #2178

This adds metadata-only support for the storage_transformers key in array metadata. By "metadata only" I mean that creating an array metadata document from JSON or a dict with a storage_transformers keyword will not error, and some very mild validation will be run (just ensuring that the value is an iterable or None), but the value is not used for any storage transforming, because we don't have any code for that yet.

But at least the metadata can be constructed and the storage_transformer value should round-trip through metadata properly. This should resolve#2178.

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/tutorial.rst
  • Changes documented in docs/release.rst
  • GitHub Actions have all passed
  • Test coverage is 100% (Codecov passes)

@zoj613

Copy link
Copy Markdown

If creating a metadata object from a JSON file that specifies a storage transformer list, then this implies reading from or writing to that array hinges on applying the transformer pipeline since it may modify the keys and/or values of that array node. I think ignoring it and issuing a warning is not enough since reading from said array using the metadata would potentially result in the wrong byte sequence being passed to its codec pipeline (as a result of skipping the transformation pipeline).

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

The case where a storage_transformer field could be safely ignored when parsing a JSON is when it is an empty list, as indicated by the spec

@d-v-b

Copy link
Copy Markdown
ContributorAuthor

To me this appears as a programming error. I think parsing a metadata document with a specified storage_transformers field should raise an exception to indicate that zarr-python cannot reliably read such an array node since it was clearly created by an implementation that used a storage transformer pipeline.

I think this is valid, but we should raise when constructing an Array from metadata that references a storage transformer, rather than when constructing the array metadata itself. I will implement this.

Comment threadsrc/zarr/core/metadata/v3.py Outdated
"The storage transformer(s) will be retained in array metadata but will not "
"influence storage routines"
)
warnings.warn(msg, UserWarning, stacklevel=1)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

after thinking about this some more, I believe we should raise an error here instead of warning.

We allow:

  • metadata w/o the storage_transformers key
  • metadata with storage_transformers == [] or None

We error for:

  • metadata w/ len(storage_transformers) > 0

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

why not error when a user tries to create an array with the metadata? I'm thinking about how someone would develop a storage transformer with zarr-python as a dependency. If the metadata parsing functionality supports storage transformers, then they can use that immediately, and then subclass / implement their own array class that can use the storage transformer. Seems like a better workflow than forcing them to also subclass the metadata class?

@jhammanjhamman added this to the 3.0.0 milestone Sep 13, 2024
@jhammanjhamman added the V3 label Sep 13, 2024
@d-v-b

Copy link
Copy Markdown
ContributorAuthor

The changes in this PR now result in errors if an AsyncArray is created from ArrayV3Metadata that contains a non-zero number of storage transformers. However, you can create metadata with storage transformers without any error or warnings.

@d-v-b
d-v-b requested a review from jhammanSeptember 25, 2024 19:59
@d-v-bd-v-b changed the title feat: meager support for storage transformers metadatafeat: metadata-only support for storage transformers metadataSep 25, 2024

@jhammanjhamman left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks @d-v-b

@d-v-b
d-v-b merged commit 5ca080d into zarr-developers:v3Sep 27, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Sep 27, 2024
* v3: (21 commits)
Default zarr.open to open_group if shape is not provided (zarr-developers#2158)
feat: metadata-only support for storage transformers metadata (zarr-developers#2180)
fix(async): set default concurrency to 10 tasks (zarr-developers#2256)
chore(deps): drop support for python 3.10 and numpy 1.24 (zarr-developers#2217)
feature(store): add LoggingStore wrapper (zarr-developers#2231)
Apply assorted ruff/flake8-simplify rules (SIM) (zarr-developers#2259)
Add array storage helpers (zarr-developers#2065)
Apply ruff/flake8-annotations rule ANN204 (zarr-developers#2258)
No need to run DeepSource any more - we use ruff (zarr-developers#2261)
Remove unnecessary lambda expression (zarr-developers#2260)
Enforce ruff/flake8-comprehensions rules (C4) (zarr-developers#2239)
Use `map(str, *)` in `test_accessed_chunks` (zarr-developers#2229)
Replace Gitter with Zulip (zarr-developers#2254)
Enforce ruff/flake8-pytest-style rules (PT) (zarr-developers#2236)
Fix multiple identical imports (zarr-developers#2241)
Enforce ruff/flake8-return rules (RET) (zarr-developers#2237)
Enforce ruff/flynt rules (FLY) (zarr-developers#2240)
Fix fill_value handling for complex dtypes (zarr-developers#2200)
Update V2 codec pipeline to use concrete classes (zarr-developers#2244)
Apply and enforce more ruff rules (zarr-developers#2053)
...
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

storage_transformers are not an accepted keyword for ArrayV3Metadata

3 participants

@d-v-b@zoj613@jhamman