Feature: Top level V3 API - #1884

Merged
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api
Jun 7, 2024
Merged

Feature: Top level V3 API#1884
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api

Conversation

@jhamman

@jhammanjhamman commented May 16, 2024

Copy link
Copy Markdown
Member

Marking as Work In Progress for now. Currently waiting on #1670 to merge.

Closes#1598
Fixes#1019

Open questions I could use feedback on:

  1. I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?
  2. I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

More soon.

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)

cc @d-v-b, @aldenks

@jhammanjhamman mentioned this pull request May 16, 2024
4 tasks
@jhamman
jhamman marked this pull request as ready for review May 30, 2024 06:55
@jhamman
jhamman requested a review from d-v-bJune 1, 2024 05:46
@jhamman

Copy link
Copy Markdown
MemberAuthor

This is ready for an initial review. To set expectations, I don't plan to address the following optional arguments in this PR:

  • chunk_store
  • cache_attrs
  • synchronizer
  • meta_array
  • storage_options
  • dimension_separator
  • write_empty_chunks

These will need to be handled in later PRs.

Comment threadsrc/zarr/common.py Outdated
Selection = slice | SliceSelection
ZarrFormat = Literal[2, 3]
JSON = None | str | int | float | Enum | dict[str, "JSON"] | list["JSON"] | tuple["JSON", ...]
MEMORY_ORDER = Literal["C", "F"]

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.

Suggested change
MEMORY_ORDER=Literal["C", "F"]
MemoryOrder=Literal["C", "F"]

Comment threadsrc/zarr/api/asynchronous.py Outdated
make_store_path,
)

ShapeLike = tuple[int, ...] # TODO: support int for shape

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.

Can we use ChunkCoords here?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes, but maybe not for long. I went ahead and changed it but ShapeLike was intended to be int | tuple[int, ...]... Perhaps that will work for ChunkCoords too?

Comment threadsrc/zarr/api/asynchronous.py
Comment threadsrc/zarr/api/asynchronous.py Outdated
return shape, chunks


def _like_args(a: ArrayLike, kwargs: dict[str, Any]) -> None:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

instead of mutating kwargs, can we copy it, and make changes to the copy, and return it?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Good call. This function was coped from v2 but is now refactored along the lines of what you were suggesting.

@d-v-b

d-v-b commented Jun 4, 2024

Copy link
Copy Markdown
Contributor

I added a few minor comments, none of which are blockers. A few high-level thoughts:

A lot of the routines zarr.convenience seem strange to me, e.g. save has a very weird function signature that we should probably give a second thought when the dust settles from the v3 release. But changes like that are out of scope for this work.

I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?

This works for me.

I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

Definitely prefer what we have here over async_ones. I don't see any drawbacks to this organization, since presumably we want everything to rest on the async foundation, but I don't have much experience with libraries that expose async and sync apis.

@will-moore

Copy link
Copy Markdown
Contributor

Hi, thanks for all the work on this.
I'm looking at using this from https://github.com/ome/ome-zarr-py and seeing this error when accessing via Dask:

 File "/Users/wmoore/Desktop/ZARR/ome-zarr-py/ome_zarr/io.py", line 177, in load
return da.from_zarr(self.__store, subpath)
File "/Users/wmoore/opt/anaconda3/envs/zarr_v3/lib/python3.10/site-packages/dask/array/core.py", line 3597, in from_zarr
z = zarr.Array(url, read_only=True, path=component, **kwargs)
TypeError: Array.__init__() got an unexpected keyword argument 'read_only'

Is read_only another argument to add to the list above at #1884 (comment) ?

@jhamman

Copy link
Copy Markdown
MemberAuthor

Hi @will-moore -- interesting to find out that Dask is using the array constructor directly. I would have expected to see zarr.array(...). This PR is covering the API methods formerly found in zarr.convenience and zarr.creation. We'll have to do a bit of work to handle the case you've shown here.

btw, zarr.array(url, read_only_true, path=component) should work with this PR.

@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm planning to merge this in the morning unless I get further reviews.

@jhamman
jhamman merged commit ee30347 into zarr-developers:v3Jun 7, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Jun 25, 2024
* v3: (22 commits)
[v3] `Buffer` ensure correct subclass based on the `BufferPrototype` argument (zarr-developers#1974)
Fix doc build (zarr-developers#1987)
Fix doc build warnings (zarr-developers#1985)
Automatically generate API reference docs (zarr-developers#1918)
Update `RemoteStore.__str__` and add UPath tests (zarr-developers#1964)
[v3] Elevate codec pipeline (zarr-developers#1932)
0 dim arrays: indexing (zarr-developers#1980)
`parse_shapelike` allows 0 (zarr-developers#1979)
Clean up typing and docs for indexing (zarr-developers#1961)
add json indentation to config (zarr-developers#1952)
chore: update pre-commit hooks (zarr-developers#1973)
Bump pypa/gh-action-pypi-publish in the actions group (zarr-developers#1969)
chore: update pre-commit hooks (zarr-developers#1957)
Update release.rst (zarr-developers#1960)
doc: update release notes for 3.0.0.alpha (zarr-developers#1959)
Basic working FsspecStore (zarr-developers#1785)
Feature: Top level V3 API (zarr-developers#1884)
Buffer Prototype Argument (zarr-developers#1910)
Create issue-metrics.yml
fixes bug in transpose (zarr-developers#1949)
...
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.

port top level api to v3 branch. [v3] consider using position only and keyword only arguments

4 participants

@jhamman@d-v-b@will-moore@normanrz
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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

Feature: Top level V3 API - #1884

Merged
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api
Jun 7, 2024
Merged

Feature: Top level V3 API#1884
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api

Conversation

@jhamman

@jhammanjhamman commented May 16, 2024

Copy link
Copy Markdown
Member

Marking as Work In Progress for now. Currently waiting on #1670 to merge.

Closes#1598
Fixes#1019

Open questions I could use feedback on:

  1. I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?
  2. I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

More soon.

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)

cc @d-v-b, @aldenks

@jhammanjhamman mentioned this pull request May 16, 2024
4 tasks
@jhamman
jhamman marked this pull request as ready for review May 30, 2024 06:55
@jhamman
jhamman requested a review from d-v-bJune 1, 2024 05:46
@jhamman

Copy link
Copy Markdown
MemberAuthor

This is ready for an initial review. To set expectations, I don't plan to address the following optional arguments in this PR:

  • chunk_store
  • cache_attrs
  • synchronizer
  • meta_array
  • storage_options
  • dimension_separator
  • write_empty_chunks

These will need to be handled in later PRs.

Comment threadsrc/zarr/common.py Outdated
Selection = slice | SliceSelection
ZarrFormat = Literal[2, 3]
JSON = None | str | int | float | Enum | dict[str, "JSON"] | list["JSON"] | tuple["JSON", ...]
MEMORY_ORDER = Literal["C", "F"]

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.

Suggested change
MEMORY_ORDER=Literal["C", "F"]
MemoryOrder=Literal["C", "F"]

Comment threadsrc/zarr/api/asynchronous.py Outdated
make_store_path,
)

ShapeLike = tuple[int, ...] # TODO: support int for shape

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.

Can we use ChunkCoords here?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes, but maybe not for long. I went ahead and changed it but ShapeLike was intended to be int | tuple[int, ...]... Perhaps that will work for ChunkCoords too?

Comment threadsrc/zarr/api/asynchronous.py
Comment threadsrc/zarr/api/asynchronous.py Outdated
return shape, chunks


def _like_args(a: ArrayLike, kwargs: dict[str, Any]) -> None:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

instead of mutating kwargs, can we copy it, and make changes to the copy, and return it?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Good call. This function was coped from v2 but is now refactored along the lines of what you were suggesting.

@d-v-b

d-v-b commented Jun 4, 2024

Copy link
Copy Markdown
Contributor

I added a few minor comments, none of which are blockers. A few high-level thoughts:

A lot of the routines zarr.convenience seem strange to me, e.g. save has a very weird function signature that we should probably give a second thought when the dust settles from the v3 release. But changes like that are out of scope for this work.

I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?

This works for me.

I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

Definitely prefer what we have here over async_ones. I don't see any drawbacks to this organization, since presumably we want everything to rest on the async foundation, but I don't have much experience with libraries that expose async and sync apis.

@will-moore

Copy link
Copy Markdown
Contributor

Hi, thanks for all the work on this.
I'm looking at using this from https://github.com/ome/ome-zarr-py and seeing this error when accessing via Dask:

 File "/Users/wmoore/Desktop/ZARR/ome-zarr-py/ome_zarr/io.py", line 177, in load
return da.from_zarr(self.__store, subpath)
File "/Users/wmoore/opt/anaconda3/envs/zarr_v3/lib/python3.10/site-packages/dask/array/core.py", line 3597, in from_zarr
z = zarr.Array(url, read_only=True, path=component, **kwargs)
TypeError: Array.__init__() got an unexpected keyword argument 'read_only'

Is read_only another argument to add to the list above at #1884 (comment) ?

@jhamman

Copy link
Copy Markdown
MemberAuthor

Hi @will-moore -- interesting to find out that Dask is using the array constructor directly. I would have expected to see zarr.array(...). This PR is covering the API methods formerly found in zarr.convenience and zarr.creation. We'll have to do a bit of work to handle the case you've shown here.

btw, zarr.array(url, read_only_true, path=component) should work with this PR.

@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm planning to merge this in the morning unless I get further reviews.

@jhamman
jhamman merged commit ee30347 into zarr-developers:v3Jun 7, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Jun 25, 2024
* v3: (22 commits)
[v3] `Buffer` ensure correct subclass based on the `BufferPrototype` argument (zarr-developers#1974)
Fix doc build (zarr-developers#1987)
Fix doc build warnings (zarr-developers#1985)
Automatically generate API reference docs (zarr-developers#1918)
Update `RemoteStore.__str__` and add UPath tests (zarr-developers#1964)
[v3] Elevate codec pipeline (zarr-developers#1932)
0 dim arrays: indexing (zarr-developers#1980)
`parse_shapelike` allows 0 (zarr-developers#1979)
Clean up typing and docs for indexing (zarr-developers#1961)
add json indentation to config (zarr-developers#1952)
chore: update pre-commit hooks (zarr-developers#1973)
Bump pypa/gh-action-pypi-publish in the actions group (zarr-developers#1969)
chore: update pre-commit hooks (zarr-developers#1957)
Update release.rst (zarr-developers#1960)
doc: update release notes for 3.0.0.alpha (zarr-developers#1959)
Basic working FsspecStore (zarr-developers#1785)
Feature: Top level V3 API (zarr-developers#1884)
Buffer Prototype Argument (zarr-developers#1910)
Create issue-metrics.yml
fixes bug in transpose (zarr-developers#1949)
...
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.

port top level api to v3 branch. [v3] consider using position only and keyword only arguments

4 participants

@jhamman@d-v-b@will-moore@normanrz
, '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

Feature: Top level V3 API - #1884

Merged
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api
Jun 7, 2024
Merged

Feature: Top level V3 API#1884
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api

Conversation

@jhamman

@jhammanjhamman commented May 16, 2024

Copy link
Copy Markdown
Member

Marking as Work In Progress for now. Currently waiting on #1670 to merge.

Closes#1598
Fixes#1019

Open questions I could use feedback on:

  1. I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?
  2. I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

More soon.

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)

cc @d-v-b, @aldenks

@jhammanjhamman mentioned this pull request May 16, 2024
4 tasks
@jhamman
jhamman marked this pull request as ready for review May 30, 2024 06:55
@jhamman
jhamman requested a review from d-v-bJune 1, 2024 05:46
@jhamman

Copy link
Copy Markdown
MemberAuthor

This is ready for an initial review. To set expectations, I don't plan to address the following optional arguments in this PR:

  • chunk_store
  • cache_attrs
  • synchronizer
  • meta_array
  • storage_options
  • dimension_separator
  • write_empty_chunks

These will need to be handled in later PRs.

Comment threadsrc/zarr/common.py Outdated
Selection = slice | SliceSelection
ZarrFormat = Literal[2, 3]
JSON = None | str | int | float | Enum | dict[str, "JSON"] | list["JSON"] | tuple["JSON", ...]
MEMORY_ORDER = Literal["C", "F"]

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.

Suggested change
MEMORY_ORDER=Literal["C", "F"]
MemoryOrder=Literal["C", "F"]

Comment threadsrc/zarr/api/asynchronous.py Outdated
make_store_path,
)

ShapeLike = tuple[int, ...] # TODO: support int for shape

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.

Can we use ChunkCoords here?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes, but maybe not for long. I went ahead and changed it but ShapeLike was intended to be int | tuple[int, ...]... Perhaps that will work for ChunkCoords too?

Comment threadsrc/zarr/api/asynchronous.py
Comment threadsrc/zarr/api/asynchronous.py Outdated
return shape, chunks


def _like_args(a: ArrayLike, kwargs: dict[str, Any]) -> None:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

instead of mutating kwargs, can we copy it, and make changes to the copy, and return it?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Good call. This function was coped from v2 but is now refactored along the lines of what you were suggesting.

@d-v-b

d-v-b commented Jun 4, 2024

Copy link
Copy Markdown
Contributor

I added a few minor comments, none of which are blockers. A few high-level thoughts:

A lot of the routines zarr.convenience seem strange to me, e.g. save has a very weird function signature that we should probably give a second thought when the dust settles from the v3 release. But changes like that are out of scope for this work.

I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?

This works for me.

I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

Definitely prefer what we have here over async_ones. I don't see any drawbacks to this organization, since presumably we want everything to rest on the async foundation, but I don't have much experience with libraries that expose async and sync apis.

@will-moore

Copy link
Copy Markdown
Contributor

Hi, thanks for all the work on this.
I'm looking at using this from https://github.com/ome/ome-zarr-py and seeing this error when accessing via Dask:

 File "/Users/wmoore/Desktop/ZARR/ome-zarr-py/ome_zarr/io.py", line 177, in load
return da.from_zarr(self.__store, subpath)
File "/Users/wmoore/opt/anaconda3/envs/zarr_v3/lib/python3.10/site-packages/dask/array/core.py", line 3597, in from_zarr
z = zarr.Array(url, read_only=True, path=component, **kwargs)
TypeError: Array.__init__() got an unexpected keyword argument 'read_only'

Is read_only another argument to add to the list above at #1884 (comment) ?

@jhamman

Copy link
Copy Markdown
MemberAuthor

Hi @will-moore -- interesting to find out that Dask is using the array constructor directly. I would have expected to see zarr.array(...). This PR is covering the API methods formerly found in zarr.convenience and zarr.creation. We'll have to do a bit of work to handle the case you've shown here.

btw, zarr.array(url, read_only_true, path=component) should work with this PR.

@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm planning to merge this in the morning unless I get further reviews.

@jhamman
jhamman merged commit ee30347 into zarr-developers:v3Jun 7, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Jun 25, 2024
* v3: (22 commits)
[v3] `Buffer` ensure correct subclass based on the `BufferPrototype` argument (zarr-developers#1974)
Fix doc build (zarr-developers#1987)
Fix doc build warnings (zarr-developers#1985)
Automatically generate API reference docs (zarr-developers#1918)
Update `RemoteStore.__str__` and add UPath tests (zarr-developers#1964)
[v3] Elevate codec pipeline (zarr-developers#1932)
0 dim arrays: indexing (zarr-developers#1980)
`parse_shapelike` allows 0 (zarr-developers#1979)
Clean up typing and docs for indexing (zarr-developers#1961)
add json indentation to config (zarr-developers#1952)
chore: update pre-commit hooks (zarr-developers#1973)
Bump pypa/gh-action-pypi-publish in the actions group (zarr-developers#1969)
chore: update pre-commit hooks (zarr-developers#1957)
Update release.rst (zarr-developers#1960)
doc: update release notes for 3.0.0.alpha (zarr-developers#1959)
Basic working FsspecStore (zarr-developers#1785)
Feature: Top level V3 API (zarr-developers#1884)
Buffer Prototype Argument (zarr-developers#1910)
Create issue-metrics.yml
fixes bug in transpose (zarr-developers#1949)
...
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.

port top level api to v3 branch. [v3] consider using position only and keyword only arguments

4 participants

@jhamman@d-v-b@will-moore@normanrz
, '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 \u003e 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

Feature: Top level V3 API - #1884

Merged
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api
Jun 7, 2024
Merged

Feature: Top level V3 API#1884
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api

Conversation

@jhamman

@jhammanjhamman commented May 16, 2024

Copy link
Copy Markdown
Member

Marking as Work In Progress for now. Currently waiting on #1670 to merge.

Closes#1598
Fixes#1019

Open questions I could use feedback on:

  1. I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?
  2. I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

More soon.

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)

cc @d-v-b, @aldenks

@jhammanjhamman mentioned this pull request May 16, 2024
4 tasks
@jhamman
jhamman marked this pull request as ready for review May 30, 2024 06:55
@jhamman
jhamman requested a review from d-v-bJune 1, 2024 05:46
@jhamman

Copy link
Copy Markdown
MemberAuthor

This is ready for an initial review. To set expectations, I don't plan to address the following optional arguments in this PR:

  • chunk_store
  • cache_attrs
  • synchronizer
  • meta_array
  • storage_options
  • dimension_separator
  • write_empty_chunks

These will need to be handled in later PRs.

Comment threadsrc/zarr/common.py Outdated
Selection = slice | SliceSelection
ZarrFormat = Literal[2, 3]
JSON = None | str | int | float | Enum | dict[str, "JSON"] | list["JSON"] | tuple["JSON", ...]
MEMORY_ORDER = Literal["C", "F"]

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.

Suggested change
MEMORY_ORDER=Literal["C", "F"]
MemoryOrder=Literal["C", "F"]

Comment threadsrc/zarr/api/asynchronous.py Outdated
make_store_path,
)

ShapeLike = tuple[int, ...] # TODO: support int for shape

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.

Can we use ChunkCoords here?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes, but maybe not for long. I went ahead and changed it but ShapeLike was intended to be int | tuple[int, ...]... Perhaps that will work for ChunkCoords too?

Comment threadsrc/zarr/api/asynchronous.py
Comment threadsrc/zarr/api/asynchronous.py Outdated
return shape, chunks


def _like_args(a: ArrayLike, kwargs: dict[str, Any]) -> None:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

instead of mutating kwargs, can we copy it, and make changes to the copy, and return it?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Good call. This function was coped from v2 but is now refactored along the lines of what you were suggesting.

@d-v-b

d-v-b commented Jun 4, 2024

Copy link
Copy Markdown
Contributor

I added a few minor comments, none of which are blockers. A few high-level thoughts:

A lot of the routines zarr.convenience seem strange to me, e.g. save has a very weird function signature that we should probably give a second thought when the dust settles from the v3 release. But changes like that are out of scope for this work.

I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?

This works for me.

I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

Definitely prefer what we have here over async_ones. I don't see any drawbacks to this organization, since presumably we want everything to rest on the async foundation, but I don't have much experience with libraries that expose async and sync apis.

@will-moore

Copy link
Copy Markdown
Contributor

Hi, thanks for all the work on this.
I'm looking at using this from https://github.com/ome/ome-zarr-py and seeing this error when accessing via Dask:

 File "/Users/wmoore/Desktop/ZARR/ome-zarr-py/ome_zarr/io.py", line 177, in load
return da.from_zarr(self.__store, subpath)
File "/Users/wmoore/opt/anaconda3/envs/zarr_v3/lib/python3.10/site-packages/dask/array/core.py", line 3597, in from_zarr
z = zarr.Array(url, read_only=True, path=component, **kwargs)
TypeError: Array.__init__() got an unexpected keyword argument 'read_only'

Is read_only another argument to add to the list above at #1884 (comment) ?

@jhamman

Copy link
Copy Markdown
MemberAuthor

Hi @will-moore -- interesting to find out that Dask is using the array constructor directly. I would have expected to see zarr.array(...). This PR is covering the API methods formerly found in zarr.convenience and zarr.creation. We'll have to do a bit of work to handle the case you've shown here.

btw, zarr.array(url, read_only_true, path=component) should work with this PR.

@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm planning to merge this in the morning unless I get further reviews.

@jhamman
jhamman merged commit ee30347 into zarr-developers:v3Jun 7, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Jun 25, 2024
* v3: (22 commits)
[v3] `Buffer` ensure correct subclass based on the `BufferPrototype` argument (zarr-developers#1974)
Fix doc build (zarr-developers#1987)
Fix doc build warnings (zarr-developers#1985)
Automatically generate API reference docs (zarr-developers#1918)
Update `RemoteStore.__str__` and add UPath tests (zarr-developers#1964)
[v3] Elevate codec pipeline (zarr-developers#1932)
0 dim arrays: indexing (zarr-developers#1980)
`parse_shapelike` allows 0 (zarr-developers#1979)
Clean up typing and docs for indexing (zarr-developers#1961)
add json indentation to config (zarr-developers#1952)
chore: update pre-commit hooks (zarr-developers#1973)
Bump pypa/gh-action-pypi-publish in the actions group (zarr-developers#1969)
chore: update pre-commit hooks (zarr-developers#1957)
Update release.rst (zarr-developers#1960)
doc: update release notes for 3.0.0.alpha (zarr-developers#1959)
Basic working FsspecStore (zarr-developers#1785)
Feature: Top level V3 API (zarr-developers#1884)
Buffer Prototype Argument (zarr-developers#1910)
Create issue-metrics.yml
fixes bug in transpose (zarr-developers#1949)
...
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.

port top level api to v3 branch. [v3] consider using position only and keyword only arguments

4 participants

@jhamman@d-v-b@will-moore@normanrz
, '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

Feature: Top level V3 API - #1884

Merged
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api
Jun 7, 2024
Merged

Feature: Top level V3 API#1884
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api

Conversation

@jhamman

@jhammanjhamman commented May 16, 2024

Copy link
Copy Markdown
Member

Marking as Work In Progress for now. Currently waiting on #1670 to merge.

Closes#1598
Fixes#1019

Open questions I could use feedback on:

  1. I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?
  2. I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

More soon.

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)

cc @d-v-b, @aldenks

@jhammanjhamman mentioned this pull request May 16, 2024
4 tasks
@jhamman
jhamman marked this pull request as ready for review May 30, 2024 06:55
@jhamman
jhamman requested a review from d-v-bJune 1, 2024 05:46
@jhamman

Copy link
Copy Markdown
MemberAuthor

This is ready for an initial review. To set expectations, I don't plan to address the following optional arguments in this PR:

  • chunk_store
  • cache_attrs
  • synchronizer
  • meta_array
  • storage_options
  • dimension_separator
  • write_empty_chunks

These will need to be handled in later PRs.

Comment threadsrc/zarr/common.py Outdated
Selection = slice | SliceSelection
ZarrFormat = Literal[2, 3]
JSON = None | str | int | float | Enum | dict[str, "JSON"] | list["JSON"] | tuple["JSON", ...]
MEMORY_ORDER = Literal["C", "F"]

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.

Suggested change
MEMORY_ORDER=Literal["C", "F"]
MemoryOrder=Literal["C", "F"]

Comment threadsrc/zarr/api/asynchronous.py Outdated
make_store_path,
)

ShapeLike = tuple[int, ...] # TODO: support int for shape

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.

Can we use ChunkCoords here?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes, but maybe not for long. I went ahead and changed it but ShapeLike was intended to be int | tuple[int, ...]... Perhaps that will work for ChunkCoords too?

Comment threadsrc/zarr/api/asynchronous.py
Comment threadsrc/zarr/api/asynchronous.py Outdated
return shape, chunks


def _like_args(a: ArrayLike, kwargs: dict[str, Any]) -> None:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

instead of mutating kwargs, can we copy it, and make changes to the copy, and return it?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Good call. This function was coped from v2 but is now refactored along the lines of what you were suggesting.

@d-v-b

d-v-b commented Jun 4, 2024

Copy link
Copy Markdown
Contributor

I added a few minor comments, none of which are blockers. A few high-level thoughts:

A lot of the routines zarr.convenience seem strange to me, e.g. save has a very weird function signature that we should probably give a second thought when the dust settles from the v3 release. But changes like that are out of scope for this work.

I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?

This works for me.

I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

Definitely prefer what we have here over async_ones. I don't see any drawbacks to this organization, since presumably we want everything to rest on the async foundation, but I don't have much experience with libraries that expose async and sync apis.

@will-moore

Copy link
Copy Markdown
Contributor

Hi, thanks for all the work on this.
I'm looking at using this from https://github.com/ome/ome-zarr-py and seeing this error when accessing via Dask:

 File "/Users/wmoore/Desktop/ZARR/ome-zarr-py/ome_zarr/io.py", line 177, in load
return da.from_zarr(self.__store, subpath)
File "/Users/wmoore/opt/anaconda3/envs/zarr_v3/lib/python3.10/site-packages/dask/array/core.py", line 3597, in from_zarr
z = zarr.Array(url, read_only=True, path=component, **kwargs)
TypeError: Array.__init__() got an unexpected keyword argument 'read_only'

Is read_only another argument to add to the list above at #1884 (comment) ?

@jhamman

Copy link
Copy Markdown
MemberAuthor

Hi @will-moore -- interesting to find out that Dask is using the array constructor directly. I would have expected to see zarr.array(...). This PR is covering the API methods formerly found in zarr.convenience and zarr.creation. We'll have to do a bit of work to handle the case you've shown here.

btw, zarr.array(url, read_only_true, path=component) should work with this PR.

@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm planning to merge this in the morning unless I get further reviews.

@jhamman
jhamman merged commit ee30347 into zarr-developers:v3Jun 7, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Jun 25, 2024
* v3: (22 commits)
[v3] `Buffer` ensure correct subclass based on the `BufferPrototype` argument (zarr-developers#1974)
Fix doc build (zarr-developers#1987)
Fix doc build warnings (zarr-developers#1985)
Automatically generate API reference docs (zarr-developers#1918)
Update `RemoteStore.__str__` and add UPath tests (zarr-developers#1964)
[v3] Elevate codec pipeline (zarr-developers#1932)
0 dim arrays: indexing (zarr-developers#1980)
`parse_shapelike` allows 0 (zarr-developers#1979)
Clean up typing and docs for indexing (zarr-developers#1961)
add json indentation to config (zarr-developers#1952)
chore: update pre-commit hooks (zarr-developers#1973)
Bump pypa/gh-action-pypi-publish in the actions group (zarr-developers#1969)
chore: update pre-commit hooks (zarr-developers#1957)
Update release.rst (zarr-developers#1960)
doc: update release notes for 3.0.0.alpha (zarr-developers#1959)
Basic working FsspecStore (zarr-developers#1785)
Feature: Top level V3 API (zarr-developers#1884)
Buffer Prototype Argument (zarr-developers#1910)
Create issue-metrics.yml
fixes bug in transpose (zarr-developers#1949)
...
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.

port top level api to v3 branch. [v3] consider using position only and keyword only arguments

4 participants

@jhamman@d-v-b@will-moore@normanrz
, '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

Feature: Top level V3 API - #1884

Merged
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api
Jun 7, 2024
Merged

Feature: Top level V3 API#1884
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api

Conversation

@jhamman

@jhammanjhamman commented May 16, 2024

Copy link
Copy Markdown
Member

Marking as Work In Progress for now. Currently waiting on #1670 to merge.

Closes#1598
Fixes#1019

Open questions I could use feedback on:

  1. I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?
  2. I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

More soon.

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)

cc @d-v-b, @aldenks

@jhammanjhamman mentioned this pull request May 16, 2024
4 tasks
@jhamman
jhamman marked this pull request as ready for review May 30, 2024 06:55
@jhamman
jhamman requested a review from d-v-bJune 1, 2024 05:46
@jhamman

Copy link
Copy Markdown
MemberAuthor

This is ready for an initial review. To set expectations, I don't plan to address the following optional arguments in this PR:

  • chunk_store
  • cache_attrs
  • synchronizer
  • meta_array
  • storage_options
  • dimension_separator
  • write_empty_chunks

These will need to be handled in later PRs.

Comment threadsrc/zarr/common.py Outdated
Selection = slice | SliceSelection
ZarrFormat = Literal[2, 3]
JSON = None | str | int | float | Enum | dict[str, "JSON"] | list["JSON"] | tuple["JSON", ...]
MEMORY_ORDER = Literal["C", "F"]

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.

Suggested change
MEMORY_ORDER=Literal["C", "F"]
MemoryOrder=Literal["C", "F"]

Comment threadsrc/zarr/api/asynchronous.py Outdated
make_store_path,
)

ShapeLike = tuple[int, ...] # TODO: support int for shape

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.

Can we use ChunkCoords here?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes, but maybe not for long. I went ahead and changed it but ShapeLike was intended to be int | tuple[int, ...]... Perhaps that will work for ChunkCoords too?

Comment threadsrc/zarr/api/asynchronous.py
Comment threadsrc/zarr/api/asynchronous.py Outdated
return shape, chunks


def _like_args(a: ArrayLike, kwargs: dict[str, Any]) -> None:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

instead of mutating kwargs, can we copy it, and make changes to the copy, and return it?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Good call. This function was coped from v2 but is now refactored along the lines of what you were suggesting.

@d-v-b

d-v-b commented Jun 4, 2024

Copy link
Copy Markdown
Contributor

I added a few minor comments, none of which are blockers. A few high-level thoughts:

A lot of the routines zarr.convenience seem strange to me, e.g. save has a very weird function signature that we should probably give a second thought when the dust settles from the v3 release. But changes like that are out of scope for this work.

I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?

This works for me.

I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

Definitely prefer what we have here over async_ones. I don't see any drawbacks to this organization, since presumably we want everything to rest on the async foundation, but I don't have much experience with libraries that expose async and sync apis.

@will-moore

Copy link
Copy Markdown
Contributor

Hi, thanks for all the work on this.
I'm looking at using this from https://github.com/ome/ome-zarr-py and seeing this error when accessing via Dask:

 File "/Users/wmoore/Desktop/ZARR/ome-zarr-py/ome_zarr/io.py", line 177, in load
return da.from_zarr(self.__store, subpath)
File "/Users/wmoore/opt/anaconda3/envs/zarr_v3/lib/python3.10/site-packages/dask/array/core.py", line 3597, in from_zarr
z = zarr.Array(url, read_only=True, path=component, **kwargs)
TypeError: Array.__init__() got an unexpected keyword argument 'read_only'

Is read_only another argument to add to the list above at #1884 (comment) ?

@jhamman

Copy link
Copy Markdown
MemberAuthor

Hi @will-moore -- interesting to find out that Dask is using the array constructor directly. I would have expected to see zarr.array(...). This PR is covering the API methods formerly found in zarr.convenience and zarr.creation. We'll have to do a bit of work to handle the case you've shown here.

btw, zarr.array(url, read_only_true, path=component) should work with this PR.

@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm planning to merge this in the morning unless I get further reviews.

@jhamman
jhamman merged commit ee30347 into zarr-developers:v3Jun 7, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Jun 25, 2024
* v3: (22 commits)
[v3] `Buffer` ensure correct subclass based on the `BufferPrototype` argument (zarr-developers#1974)
Fix doc build (zarr-developers#1987)
Fix doc build warnings (zarr-developers#1985)
Automatically generate API reference docs (zarr-developers#1918)
Update `RemoteStore.__str__` and add UPath tests (zarr-developers#1964)
[v3] Elevate codec pipeline (zarr-developers#1932)
0 dim arrays: indexing (zarr-developers#1980)
`parse_shapelike` allows 0 (zarr-developers#1979)
Clean up typing and docs for indexing (zarr-developers#1961)
add json indentation to config (zarr-developers#1952)
chore: update pre-commit hooks (zarr-developers#1973)
Bump pypa/gh-action-pypi-publish in the actions group (zarr-developers#1969)
chore: update pre-commit hooks (zarr-developers#1957)
Update release.rst (zarr-developers#1960)
doc: update release notes for 3.0.0.alpha (zarr-developers#1959)
Basic working FsspecStore (zarr-developers#1785)
Feature: Top level V3 API (zarr-developers#1884)
Buffer Prototype Argument (zarr-developers#1910)
Create issue-metrics.yml
fixes bug in transpose (zarr-developers#1949)
...
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.

port top level api to v3 branch. [v3] consider using position only and keyword only arguments

4 participants

@jhamman@d-v-b@will-moore@normanrz
, '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

Feature: Top level V3 API - #1884

Merged
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api
Jun 7, 2024
Merged

Feature: Top level V3 API#1884
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api

Conversation

@jhamman

@jhammanjhamman commented May 16, 2024

Copy link
Copy Markdown
Member

Marking as Work In Progress for now. Currently waiting on #1670 to merge.

Closes#1598
Fixes#1019

Open questions I could use feedback on:

  1. I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?
  2. I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

More soon.

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)

cc @d-v-b, @aldenks

@jhammanjhamman mentioned this pull request May 16, 2024
4 tasks
@jhamman
jhamman marked this pull request as ready for review May 30, 2024 06:55
@jhamman
jhamman requested a review from d-v-bJune 1, 2024 05:46
@jhamman

Copy link
Copy Markdown
MemberAuthor

This is ready for an initial review. To set expectations, I don't plan to address the following optional arguments in this PR:

  • chunk_store
  • cache_attrs
  • synchronizer
  • meta_array
  • storage_options
  • dimension_separator
  • write_empty_chunks

These will need to be handled in later PRs.

Comment threadsrc/zarr/common.py Outdated
Selection = slice | SliceSelection
ZarrFormat = Literal[2, 3]
JSON = None | str | int | float | Enum | dict[str, "JSON"] | list["JSON"] | tuple["JSON", ...]
MEMORY_ORDER = Literal["C", "F"]

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.

Suggested change
MEMORY_ORDER=Literal["C", "F"]
MemoryOrder=Literal["C", "F"]

Comment threadsrc/zarr/api/asynchronous.py Outdated
make_store_path,
)

ShapeLike = tuple[int, ...] # TODO: support int for shape

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.

Can we use ChunkCoords here?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes, but maybe not for long. I went ahead and changed it but ShapeLike was intended to be int | tuple[int, ...]... Perhaps that will work for ChunkCoords too?

Comment threadsrc/zarr/api/asynchronous.py
Comment threadsrc/zarr/api/asynchronous.py Outdated
return shape, chunks


def _like_args(a: ArrayLike, kwargs: dict[str, Any]) -> None:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

instead of mutating kwargs, can we copy it, and make changes to the copy, and return it?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Good call. This function was coped from v2 but is now refactored along the lines of what you were suggesting.

@d-v-b

d-v-b commented Jun 4, 2024

Copy link
Copy Markdown
Contributor

I added a few minor comments, none of which are blockers. A few high-level thoughts:

A lot of the routines zarr.convenience seem strange to me, e.g. save has a very weird function signature that we should probably give a second thought when the dust settles from the v3 release. But changes like that are out of scope for this work.

I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?

This works for me.

I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

Definitely prefer what we have here over async_ones. I don't see any drawbacks to this organization, since presumably we want everything to rest on the async foundation, but I don't have much experience with libraries that expose async and sync apis.

@will-moore

Copy link
Copy Markdown
Contributor

Hi, thanks for all the work on this.
I'm looking at using this from https://github.com/ome/ome-zarr-py and seeing this error when accessing via Dask:

 File "/Users/wmoore/Desktop/ZARR/ome-zarr-py/ome_zarr/io.py", line 177, in load
return da.from_zarr(self.__store, subpath)
File "/Users/wmoore/opt/anaconda3/envs/zarr_v3/lib/python3.10/site-packages/dask/array/core.py", line 3597, in from_zarr
z = zarr.Array(url, read_only=True, path=component, **kwargs)
TypeError: Array.__init__() got an unexpected keyword argument 'read_only'

Is read_only another argument to add to the list above at #1884 (comment) ?

@jhamman

Copy link
Copy Markdown
MemberAuthor

Hi @will-moore -- interesting to find out that Dask is using the array constructor directly. I would have expected to see zarr.array(...). This PR is covering the API methods formerly found in zarr.convenience and zarr.creation. We'll have to do a bit of work to handle the case you've shown here.

btw, zarr.array(url, read_only_true, path=component) should work with this PR.

@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm planning to merge this in the morning unless I get further reviews.

@jhamman
jhamman merged commit ee30347 into zarr-developers:v3Jun 7, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Jun 25, 2024
* v3: (22 commits)
[v3] `Buffer` ensure correct subclass based on the `BufferPrototype` argument (zarr-developers#1974)
Fix doc build (zarr-developers#1987)
Fix doc build warnings (zarr-developers#1985)
Automatically generate API reference docs (zarr-developers#1918)
Update `RemoteStore.__str__` and add UPath tests (zarr-developers#1964)
[v3] Elevate codec pipeline (zarr-developers#1932)
0 dim arrays: indexing (zarr-developers#1980)
`parse_shapelike` allows 0 (zarr-developers#1979)
Clean up typing and docs for indexing (zarr-developers#1961)
add json indentation to config (zarr-developers#1952)
chore: update pre-commit hooks (zarr-developers#1973)
Bump pypa/gh-action-pypi-publish in the actions group (zarr-developers#1969)
chore: update pre-commit hooks (zarr-developers#1957)
Update release.rst (zarr-developers#1960)
doc: update release notes for 3.0.0.alpha (zarr-developers#1959)
Basic working FsspecStore (zarr-developers#1785)
Feature: Top level V3 API (zarr-developers#1884)
Buffer Prototype Argument (zarr-developers#1910)
Create issue-metrics.yml
fixes bug in transpose (zarr-developers#1949)
...
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.

port top level api to v3 branch. [v3] consider using position only and keyword only arguments

4 participants

@jhamman@d-v-b@will-moore@normanrz
, '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

Feature: Top level V3 API - #1884

Merged
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api
Jun 7, 2024
Merged

Feature: Top level V3 API#1884
jhamman merged 18 commits into
zarr-developers:v3from
jhamman:feature/top-level-api

Conversation

@jhamman

@jhammanjhamman commented May 16, 2024

Copy link
Copy Markdown
Member

Marking as Work In Progress for now. Currently waiting on #1670 to merge.

Closes#1598
Fixes#1019

Open questions I could use feedback on:

  1. I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?
  2. I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

More soon.

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)

cc @d-v-b, @aldenks

@jhammanjhamman mentioned this pull request May 16, 2024
4 tasks
@jhamman
jhamman marked this pull request as ready for review May 30, 2024 06:55
@jhamman
jhamman requested a review from d-v-bJune 1, 2024 05:46
@jhamman

Copy link
Copy Markdown
MemberAuthor

This is ready for an initial review. To set expectations, I don't plan to address the following optional arguments in this PR:

  • chunk_store
  • cache_attrs
  • synchronizer
  • meta_array
  • storage_options
  • dimension_separator
  • write_empty_chunks

These will need to be handled in later PRs.

Comment threadsrc/zarr/common.py Outdated
Selection = slice | SliceSelection
ZarrFormat = Literal[2, 3]
JSON = None | str | int | float | Enum | dict[str, "JSON"] | list["JSON"] | tuple["JSON", ...]
MEMORY_ORDER = Literal["C", "F"]

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.

Suggested change
MEMORY_ORDER=Literal["C", "F"]
MemoryOrder=Literal["C", "F"]

Comment threadsrc/zarr/api/asynchronous.py Outdated
make_store_path,
)

ShapeLike = tuple[int, ...] # TODO: support int for shape

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.

Can we use ChunkCoords here?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

yes, but maybe not for long. I went ahead and changed it but ShapeLike was intended to be int | tuple[int, ...]... Perhaps that will work for ChunkCoords too?

Comment threadsrc/zarr/api/asynchronous.py
Comment threadsrc/zarr/api/asynchronous.py Outdated
return shape, chunks


def _like_args(a: ArrayLike, kwargs: dict[str, Any]) -> None:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

instead of mutating kwargs, can we copy it, and make changes to the copy, and return it?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Good call. This function was coped from v2 but is now refactored along the lines of what you were suggesting.

@d-v-b

d-v-b commented Jun 4, 2024

Copy link
Copy Markdown
Contributor

I added a few minor comments, none of which are blockers. A few high-level thoughts:

A lot of the routines zarr.convenience seem strange to me, e.g. save has a very weird function signature that we should probably give a second thought when the dust settles from the v3 release. But changes like that are out of scope for this work.

I've combined zarr.creation and zarr.convenience into a common API module. This makes sense to me because they are all basically wrappers that help us construct Group/Array objects. What people think about this?

This works for me.

I've created parallel synchronous and asynchronous modules with basically identical APIs. All the synchronous functions simply call their asynchronous cousin. I like this much more than having two versions of each function (e.g. ones and async_ones). Thoughts?

Definitely prefer what we have here over async_ones. I don't see any drawbacks to this organization, since presumably we want everything to rest on the async foundation, but I don't have much experience with libraries that expose async and sync apis.

@will-moore

Copy link
Copy Markdown
Contributor

Hi, thanks for all the work on this.
I'm looking at using this from https://github.com/ome/ome-zarr-py and seeing this error when accessing via Dask:

 File "/Users/wmoore/Desktop/ZARR/ome-zarr-py/ome_zarr/io.py", line 177, in load
return da.from_zarr(self.__store, subpath)
File "/Users/wmoore/opt/anaconda3/envs/zarr_v3/lib/python3.10/site-packages/dask/array/core.py", line 3597, in from_zarr
z = zarr.Array(url, read_only=True, path=component, **kwargs)
TypeError: Array.__init__() got an unexpected keyword argument 'read_only'

Is read_only another argument to add to the list above at #1884 (comment) ?

@jhamman

Copy link
Copy Markdown
MemberAuthor

Hi @will-moore -- interesting to find out that Dask is using the array constructor directly. I would have expected to see zarr.array(...). This PR is covering the API methods formerly found in zarr.convenience and zarr.creation. We'll have to do a bit of work to handle the case you've shown here.

btw, zarr.array(url, read_only_true, path=component) should work with this PR.

@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm planning to merge this in the morning unless I get further reviews.

@jhamman
jhamman merged commit ee30347 into zarr-developers:v3Jun 7, 2024
dcherian added a commit to dcherian/zarr-python that referenced this pull request Jun 25, 2024
* v3: (22 commits)
[v3] `Buffer` ensure correct subclass based on the `BufferPrototype` argument (zarr-developers#1974)
Fix doc build (zarr-developers#1987)
Fix doc build warnings (zarr-developers#1985)
Automatically generate API reference docs (zarr-developers#1918)
Update `RemoteStore.__str__` and add UPath tests (zarr-developers#1964)
[v3] Elevate codec pipeline (zarr-developers#1932)
0 dim arrays: indexing (zarr-developers#1980)
`parse_shapelike` allows 0 (zarr-developers#1979)
Clean up typing and docs for indexing (zarr-developers#1961)
add json indentation to config (zarr-developers#1952)
chore: update pre-commit hooks (zarr-developers#1973)
Bump pypa/gh-action-pypi-publish in the actions group (zarr-developers#1969)
chore: update pre-commit hooks (zarr-developers#1957)
Update release.rst (zarr-developers#1960)
doc: update release notes for 3.0.0.alpha (zarr-developers#1959)
Basic working FsspecStore (zarr-developers#1785)
Feature: Top level V3 API (zarr-developers#1884)
Buffer Prototype Argument (zarr-developers#1910)
Create issue-metrics.yml
fixes bug in transpose (zarr-developers#1949)
...
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.

port top level api to v3 branch. [v3] consider using position only and keyword only arguments

4 participants

@jhamman@d-v-b@will-moore@normanrz