Skip to content

Listable V3 Stores - #1634

Merged
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store
Feb 7, 2024
Merged

Listable V3 Stores#1634
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store

Conversation

@jhamman

@jhammanjhamman commented Jan 16, 2024

Copy link
Copy Markdown
Member

This goes on top of #1590

The core of this PR is to add list_* methods to the v3 stores. The Store interface is very much still in flux but this should be enough to pick up #1590 again.

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)

@pep8speaks

pep8speaks commented Jan 16, 2024

Copy link
Copy Markdown

Hello @jhamman! Thanks for updating this PR. We checked the lines you've touched for PEP 8 issues, and found:

Line 34:44: E203 whitespace before ':'
Line 56:30: E203 whitespace before ':'

Comment last updated at 2024-02-07 04:46:23 UTC

@jhammanjhamman changed the title V3 list storeListable V3 StoresJan 16, 2024

@jhammanjhamman left a comment

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.

A few comments on the state of things here.

Comment threadzarr/v3/abc/store.py
async def get(self, key: str) -> bytes:
async def get(
self, key: str, byte_range: Optional[Tuple[int, Optional[int]]] = None
) -> Optional[bytes]:

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.

Question for discussion. Do we want to have the byte_range parameter in the single key get method or just in get_partial_values? I lean toward this API but it is somewhat duplicative and goes against the suggestion in the spec:

get - Retrieve the value associated with a given key.
Parameters: key
Output: value

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.

My instinct would be to ignore the abstract store interface and just do what makes sense locally.

I don't understand why the spec describes both get(key) -> valueandget_partial_values(key_range) -> List[Optional[value]], as opposed to get(key, range) -> Optional[value] and letting clients handle iteration themselves.

@jhammanjhammanFeb 3, 2024

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.

Thinking about this more, we are definitely going to want to be able to pass the store a batch of values keys/ranges to the store. This will let us push optimizations down to lower level code or let us do optimizations like coalescing requests.

I still feel like its worth supporting single partial requests though so I'm going to include that in the abc.

Comment on lines +79 to +80
except (FileNotFoundError, IsADirectoryError, NotADirectoryError):
return None

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.

I found this behavior in Zarrita to be surprising. @normanrz - can you comment on the motivation here? In V2 we would have just raised a KeyError.

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.

I opted for using None as non-existent. Raising and catching a KeyError would also work.

@@ -0,0 +1,95 @@
from __future__ import annotations

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.

I have not really worked on this store yet.

@@ -1,87 +1,96 @@
import array

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.

Big diff in this file as I decided to comment everything out and bring it back piece by piece. Here's the current test run:

=================================================================================== 13 passed in 0.08s ===================================================================================
❯ pytest zarr/tests/test_storage.py -vvv
================================================================================== test session starts ===================================================================================
platform darwin -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0 -- /Users/jhamman/miniforge3/envs/zarr-dev/bin/python3.11
cachedir: .pytest_cache
rootdir: /Users/jhamman/Library/CloudStorage/Dropbox/src/zarr-python
configfile: pyproject.toml
plugins: anyio-4.0.0, asyncio-0.23.3
asyncio: mode=Mode.STRICT
collected 13 items zarr/tests/test_storage.py::test_kvstore_repr PASSED [ 7%]
zarr/tests/test_storage.py::test_ensure_store PASSED [ 15%]
zarr/tests/test_storage.py::test_capabilities PASSED [ 23%]
zarr/tests/test_storage.py::TestMappingStore::test_get_set_del_contains PASSED [ 30%]
zarr/tests/test_storage.py::TestMappingStore::test_set_invalid_content PASSED [ 38%]
zarr/tests/test_storage.py::TestMappingStore::test_writeable_values PASSED [ 46%]
zarr/tests/test_storage.py::TestMappingStore::test_pickle PASSED [ 53%]
zarr/tests/test_storage.py::TestMappingStore::test_hierarchy PASSED [ 61%]
zarr/tests/test_storage.py::TestDirectoryStore::test_get_set_del_contains PASSED [ 69%]
zarr/tests/test_storage.py::TestDirectoryStore::test_set_invalid_content PASSED [ 76%]
zarr/tests/test_storage.py::TestDirectoryStore::test_writeable_values PASSED [ 84%]
zarr/tests/test_storage.py::TestDirectoryStore::test_pickle PASSED [ 92%]
zarr/tests/test_storage.py::TestDirectoryStore::test_hierarchy PASSED 

- removed abcs for groups/arrays
- improved return types in group.py
- warn (temporarily) when an implicit group is found
- add attributes.py with Attributes class
add test file
wip
fixes after rebas
e
make all tests pass
@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm going to merge this into the V3 branch to make way for tomorrow's sprint. I expect at least one more major rev on the store interface in the coming weeks.

@jhamman
jhamman merged commit 3bc305e into zarr-developers:v3Feb 7, 2024
@jhammanjhamman mentioned this pull request Feb 7, 2024
@jhammanjhamman mentioned this pull request Mar 30, 2024
6 tasks
@jhammanjhamman added this to the 3.0.0.alpha milestone Apr 22, 2024
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.

4 participants

@jhamman@pep8speaks@normanrz@d-v-b
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Listable V3 Stores by jhamman · Pull Request #1634 · zarr-developers/zarr-python · GitHub
Skip to content

Listable V3 Stores - #1634

Merged
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store
Feb 7, 2024
Merged

Listable V3 Stores#1634
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store

Conversation

@jhamman

@jhammanjhamman commented Jan 16, 2024

Copy link
Copy Markdown
Member

This goes on top of #1590

The core of this PR is to add list_* methods to the v3 stores. The Store interface is very much still in flux but this should be enough to pick up #1590 again.

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)

@pep8speaks

pep8speaks commented Jan 16, 2024

Copy link
Copy Markdown

Hello @jhamman! Thanks for updating this PR. We checked the lines you've touched for PEP 8 issues, and found:

Line 34:44: E203 whitespace before ':'
Line 56:30: E203 whitespace before ':'

Comment last updated at 2024-02-07 04:46:23 UTC

@jhammanjhamman changed the title V3 list storeListable V3 StoresJan 16, 2024

@jhammanjhamman left a comment

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.

A few comments on the state of things here.

Comment threadzarr/v3/abc/store.py
async def get(self, key: str) -> bytes:
async def get(
self, key: str, byte_range: Optional[Tuple[int, Optional[int]]] = None
) -> Optional[bytes]:

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.

Question for discussion. Do we want to have the byte_range parameter in the single key get method or just in get_partial_values? I lean toward this API but it is somewhat duplicative and goes against the suggestion in the spec:

get - Retrieve the value associated with a given key.
Parameters: key
Output: value

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.

My instinct would be to ignore the abstract store interface and just do what makes sense locally.

I don't understand why the spec describes both get(key) -> valueandget_partial_values(key_range) -> List[Optional[value]], as opposed to get(key, range) -> Optional[value] and letting clients handle iteration themselves.

@jhammanjhammanFeb 3, 2024

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.

Thinking about this more, we are definitely going to want to be able to pass the store a batch of values keys/ranges to the store. This will let us push optimizations down to lower level code or let us do optimizations like coalescing requests.

I still feel like its worth supporting single partial requests though so I'm going to include that in the abc.

Comment on lines +79 to +80
except (FileNotFoundError, IsADirectoryError, NotADirectoryError):
return None

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.

I found this behavior in Zarrita to be surprising. @normanrz - can you comment on the motivation here? In V2 we would have just raised a KeyError.

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.

I opted for using None as non-existent. Raising and catching a KeyError would also work.

@@ -0,0 +1,95 @@
from __future__ import annotations

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.

I have not really worked on this store yet.

@@ -1,87 +1,96 @@
import array

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.

Big diff in this file as I decided to comment everything out and bring it back piece by piece. Here's the current test run:

=================================================================================== 13 passed in 0.08s ===================================================================================
❯ pytest zarr/tests/test_storage.py -vvv
================================================================================== test session starts ===================================================================================
platform darwin -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0 -- /Users/jhamman/miniforge3/envs/zarr-dev/bin/python3.11
cachedir: .pytest_cache
rootdir: /Users/jhamman/Library/CloudStorage/Dropbox/src/zarr-python
configfile: pyproject.toml
plugins: anyio-4.0.0, asyncio-0.23.3
asyncio: mode=Mode.STRICT
collected 13 items zarr/tests/test_storage.py::test_kvstore_repr PASSED [ 7%]
zarr/tests/test_storage.py::test_ensure_store PASSED [ 15%]
zarr/tests/test_storage.py::test_capabilities PASSED [ 23%]
zarr/tests/test_storage.py::TestMappingStore::test_get_set_del_contains PASSED [ 30%]
zarr/tests/test_storage.py::TestMappingStore::test_set_invalid_content PASSED [ 38%]
zarr/tests/test_storage.py::TestMappingStore::test_writeable_values PASSED [ 46%]
zarr/tests/test_storage.py::TestMappingStore::test_pickle PASSED [ 53%]
zarr/tests/test_storage.py::TestMappingStore::test_hierarchy PASSED [ 61%]
zarr/tests/test_storage.py::TestDirectoryStore::test_get_set_del_contains PASSED [ 69%]
zarr/tests/test_storage.py::TestDirectoryStore::test_set_invalid_content PASSED [ 76%]
zarr/tests/test_storage.py::TestDirectoryStore::test_writeable_values PASSED [ 84%]
zarr/tests/test_storage.py::TestDirectoryStore::test_pickle PASSED [ 92%]
zarr/tests/test_storage.py::TestDirectoryStore::test_hierarchy PASSED 

- removed abcs for groups/arrays
- improved return types in group.py
- warn (temporarily) when an implicit group is found
- add attributes.py with Attributes class
add test file
wip
fixes after rebas
e
make all tests pass
@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm going to merge this into the V3 branch to make way for tomorrow's sprint. I expect at least one more major rev on the store interface in the coming weeks.

@jhamman
jhamman merged commit 3bc305e into zarr-developers:v3Feb 7, 2024
@jhammanjhamman mentioned this pull request Feb 7, 2024
@jhammanjhamman mentioned this pull request Mar 30, 2024
6 tasks
@jhammanjhamman added this to the 3.0.0.alpha milestone Apr 22, 2024
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.

4 participants

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

Listable V3 Stores - #1634

Merged
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store
Feb 7, 2024
Merged

Listable V3 Stores#1634
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store

Conversation

@jhamman

@jhammanjhamman commented Jan 16, 2024

Copy link
Copy Markdown
Member

This goes on top of #1590

The core of this PR is to add list_* methods to the v3 stores. The Store interface is very much still in flux but this should be enough to pick up #1590 again.

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)

@pep8speaks

pep8speaks commented Jan 16, 2024

Copy link
Copy Markdown

Hello @jhamman! Thanks for updating this PR. We checked the lines you've touched for PEP 8 issues, and found:

Line 34:44: E203 whitespace before ':'
Line 56:30: E203 whitespace before ':'

Comment last updated at 2024-02-07 04:46:23 UTC

@jhammanjhamman changed the title V3 list storeListable V3 StoresJan 16, 2024

@jhammanjhamman left a comment

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.

A few comments on the state of things here.

Comment threadzarr/v3/abc/store.py
async def get(self, key: str) -> bytes:
async def get(
self, key: str, byte_range: Optional[Tuple[int, Optional[int]]] = None
) -> Optional[bytes]:

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.

Question for discussion. Do we want to have the byte_range parameter in the single key get method or just in get_partial_values? I lean toward this API but it is somewhat duplicative and goes against the suggestion in the spec:

get - Retrieve the value associated with a given key.
Parameters: key
Output: value

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.

My instinct would be to ignore the abstract store interface and just do what makes sense locally.

I don't understand why the spec describes both get(key) -> valueandget_partial_values(key_range) -> List[Optional[value]], as opposed to get(key, range) -> Optional[value] and letting clients handle iteration themselves.

@jhammanjhammanFeb 3, 2024

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.

Thinking about this more, we are definitely going to want to be able to pass the store a batch of values keys/ranges to the store. This will let us push optimizations down to lower level code or let us do optimizations like coalescing requests.

I still feel like its worth supporting single partial requests though so I'm going to include that in the abc.

Comment on lines +79 to +80
except (FileNotFoundError, IsADirectoryError, NotADirectoryError):
return None

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.

I found this behavior in Zarrita to be surprising. @normanrz - can you comment on the motivation here? In V2 we would have just raised a KeyError.

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.

I opted for using None as non-existent. Raising and catching a KeyError would also work.

@@ -0,0 +1,95 @@
from __future__ import annotations

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.

I have not really worked on this store yet.

@@ -1,87 +1,96 @@
import array

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.

Big diff in this file as I decided to comment everything out and bring it back piece by piece. Here's the current test run:

=================================================================================== 13 passed in 0.08s ===================================================================================
❯ pytest zarr/tests/test_storage.py -vvv
================================================================================== test session starts ===================================================================================
platform darwin -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0 -- /Users/jhamman/miniforge3/envs/zarr-dev/bin/python3.11
cachedir: .pytest_cache
rootdir: /Users/jhamman/Library/CloudStorage/Dropbox/src/zarr-python
configfile: pyproject.toml
plugins: anyio-4.0.0, asyncio-0.23.3
asyncio: mode=Mode.STRICT
collected 13 items zarr/tests/test_storage.py::test_kvstore_repr PASSED [ 7%]
zarr/tests/test_storage.py::test_ensure_store PASSED [ 15%]
zarr/tests/test_storage.py::test_capabilities PASSED [ 23%]
zarr/tests/test_storage.py::TestMappingStore::test_get_set_del_contains PASSED [ 30%]
zarr/tests/test_storage.py::TestMappingStore::test_set_invalid_content PASSED [ 38%]
zarr/tests/test_storage.py::TestMappingStore::test_writeable_values PASSED [ 46%]
zarr/tests/test_storage.py::TestMappingStore::test_pickle PASSED [ 53%]
zarr/tests/test_storage.py::TestMappingStore::test_hierarchy PASSED [ 61%]
zarr/tests/test_storage.py::TestDirectoryStore::test_get_set_del_contains PASSED [ 69%]
zarr/tests/test_storage.py::TestDirectoryStore::test_set_invalid_content PASSED [ 76%]
zarr/tests/test_storage.py::TestDirectoryStore::test_writeable_values PASSED [ 84%]
zarr/tests/test_storage.py::TestDirectoryStore::test_pickle PASSED [ 92%]
zarr/tests/test_storage.py::TestDirectoryStore::test_hierarchy PASSED 

- removed abcs for groups/arrays
- improved return types in group.py
- warn (temporarily) when an implicit group is found
- add attributes.py with Attributes class
add test file
wip
fixes after rebas
e
make all tests pass
@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm going to merge this into the V3 branch to make way for tomorrow's sprint. I expect at least one more major rev on the store interface in the coming weeks.

@jhamman
jhamman merged commit 3bc305e into zarr-developers:v3Feb 7, 2024
@jhammanjhamman mentioned this pull request Feb 7, 2024
@jhammanjhamman mentioned this pull request Mar 30, 2024
6 tasks
@jhammanjhamman added this to the 3.0.0.alpha milestone Apr 22, 2024
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.

4 participants

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

Listable V3 Stores - #1634

Merged
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store
Feb 7, 2024
Merged

Listable V3 Stores#1634
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store

Conversation

@jhamman

@jhammanjhamman commented Jan 16, 2024

Copy link
Copy Markdown
Member

This goes on top of #1590

The core of this PR is to add list_* methods to the v3 stores. The Store interface is very much still in flux but this should be enough to pick up #1590 again.

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)

@pep8speaks

pep8speaks commented Jan 16, 2024

Copy link
Copy Markdown

Hello @jhamman! Thanks for updating this PR. We checked the lines you've touched for PEP 8 issues, and found:

Line 34:44: E203 whitespace before ':'
Line 56:30: E203 whitespace before ':'

Comment last updated at 2024-02-07 04:46:23 UTC

@jhammanjhamman changed the title V3 list storeListable V3 StoresJan 16, 2024

@jhammanjhamman left a comment

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.

A few comments on the state of things here.

Comment threadzarr/v3/abc/store.py
async def get(self, key: str) -> bytes:
async def get(
self, key: str, byte_range: Optional[Tuple[int, Optional[int]]] = None
) -> Optional[bytes]:

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.

Question for discussion. Do we want to have the byte_range parameter in the single key get method or just in get_partial_values? I lean toward this API but it is somewhat duplicative and goes against the suggestion in the spec:

get - Retrieve the value associated with a given key.
Parameters: key
Output: value

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.

My instinct would be to ignore the abstract store interface and just do what makes sense locally.

I don't understand why the spec describes both get(key) -> valueandget_partial_values(key_range) -> List[Optional[value]], as opposed to get(key, range) -> Optional[value] and letting clients handle iteration themselves.

@jhammanjhammanFeb 3, 2024

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.

Thinking about this more, we are definitely going to want to be able to pass the store a batch of values keys/ranges to the store. This will let us push optimizations down to lower level code or let us do optimizations like coalescing requests.

I still feel like its worth supporting single partial requests though so I'm going to include that in the abc.

Comment on lines +79 to +80
except (FileNotFoundError, IsADirectoryError, NotADirectoryError):
return None

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.

I found this behavior in Zarrita to be surprising. @normanrz - can you comment on the motivation here? In V2 we would have just raised a KeyError.

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.

I opted for using None as non-existent. Raising and catching a KeyError would also work.

@@ -0,0 +1,95 @@
from __future__ import annotations

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.

I have not really worked on this store yet.

@@ -1,87 +1,96 @@
import array

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.

Big diff in this file as I decided to comment everything out and bring it back piece by piece. Here's the current test run:

=================================================================================== 13 passed in 0.08s ===================================================================================
❯ pytest zarr/tests/test_storage.py -vvv
================================================================================== test session starts ===================================================================================
platform darwin -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0 -- /Users/jhamman/miniforge3/envs/zarr-dev/bin/python3.11
cachedir: .pytest_cache
rootdir: /Users/jhamman/Library/CloudStorage/Dropbox/src/zarr-python
configfile: pyproject.toml
plugins: anyio-4.0.0, asyncio-0.23.3
asyncio: mode=Mode.STRICT
collected 13 items zarr/tests/test_storage.py::test_kvstore_repr PASSED [ 7%]
zarr/tests/test_storage.py::test_ensure_store PASSED [ 15%]
zarr/tests/test_storage.py::test_capabilities PASSED [ 23%]
zarr/tests/test_storage.py::TestMappingStore::test_get_set_del_contains PASSED [ 30%]
zarr/tests/test_storage.py::TestMappingStore::test_set_invalid_content PASSED [ 38%]
zarr/tests/test_storage.py::TestMappingStore::test_writeable_values PASSED [ 46%]
zarr/tests/test_storage.py::TestMappingStore::test_pickle PASSED [ 53%]
zarr/tests/test_storage.py::TestMappingStore::test_hierarchy PASSED [ 61%]
zarr/tests/test_storage.py::TestDirectoryStore::test_get_set_del_contains PASSED [ 69%]
zarr/tests/test_storage.py::TestDirectoryStore::test_set_invalid_content PASSED [ 76%]
zarr/tests/test_storage.py::TestDirectoryStore::test_writeable_values PASSED [ 84%]
zarr/tests/test_storage.py::TestDirectoryStore::test_pickle PASSED [ 92%]
zarr/tests/test_storage.py::TestDirectoryStore::test_hierarchy PASSED 

- removed abcs for groups/arrays
- improved return types in group.py
- warn (temporarily) when an implicit group is found
- add attributes.py with Attributes class
add test file
wip
fixes after rebas
e
make all tests pass
@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm going to merge this into the V3 branch to make way for tomorrow's sprint. I expect at least one more major rev on the store interface in the coming weeks.

@jhamman
jhamman merged commit 3bc305e into zarr-developers:v3Feb 7, 2024
@jhammanjhamman mentioned this pull request Feb 7, 2024
@jhammanjhamman mentioned this pull request Mar 30, 2024
6 tasks
@jhammanjhamman added this to the 3.0.0.alpha milestone Apr 22, 2024
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.

4 participants

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

Listable V3 Stores - #1634

Merged
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store
Feb 7, 2024
Merged

Listable V3 Stores#1634
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store

Conversation

@jhamman

@jhammanjhamman commented Jan 16, 2024

Copy link
Copy Markdown
Member

This goes on top of #1590

The core of this PR is to add list_* methods to the v3 stores. The Store interface is very much still in flux but this should be enough to pick up #1590 again.

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)

@pep8speaks

pep8speaks commented Jan 16, 2024

Copy link
Copy Markdown

Hello @jhamman! Thanks for updating this PR. We checked the lines you've touched for PEP 8 issues, and found:

Line 34:44: E203 whitespace before ':'
Line 56:30: E203 whitespace before ':'

Comment last updated at 2024-02-07 04:46:23 UTC

@jhammanjhamman changed the title V3 list storeListable V3 StoresJan 16, 2024

@jhammanjhamman left a comment

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.

A few comments on the state of things here.

Comment threadzarr/v3/abc/store.py
async def get(self, key: str) -> bytes:
async def get(
self, key: str, byte_range: Optional[Tuple[int, Optional[int]]] = None
) -> Optional[bytes]:

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.

Question for discussion. Do we want to have the byte_range parameter in the single key get method or just in get_partial_values? I lean toward this API but it is somewhat duplicative and goes against the suggestion in the spec:

get - Retrieve the value associated with a given key.
Parameters: key
Output: value

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.

My instinct would be to ignore the abstract store interface and just do what makes sense locally.

I don't understand why the spec describes both get(key) -> valueandget_partial_values(key_range) -> List[Optional[value]], as opposed to get(key, range) -> Optional[value] and letting clients handle iteration themselves.

@jhammanjhammanFeb 3, 2024

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.

Thinking about this more, we are definitely going to want to be able to pass the store a batch of values keys/ranges to the store. This will let us push optimizations down to lower level code or let us do optimizations like coalescing requests.

I still feel like its worth supporting single partial requests though so I'm going to include that in the abc.

Comment on lines +79 to +80
except (FileNotFoundError, IsADirectoryError, NotADirectoryError):
return None

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.

I found this behavior in Zarrita to be surprising. @normanrz - can you comment on the motivation here? In V2 we would have just raised a KeyError.

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.

I opted for using None as non-existent. Raising and catching a KeyError would also work.

@@ -0,0 +1,95 @@
from __future__ import annotations

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.

I have not really worked on this store yet.

@@ -1,87 +1,96 @@
import array

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.

Big diff in this file as I decided to comment everything out and bring it back piece by piece. Here's the current test run:

=================================================================================== 13 passed in 0.08s ===================================================================================
❯ pytest zarr/tests/test_storage.py -vvv
================================================================================== test session starts ===================================================================================
platform darwin -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0 -- /Users/jhamman/miniforge3/envs/zarr-dev/bin/python3.11
cachedir: .pytest_cache
rootdir: /Users/jhamman/Library/CloudStorage/Dropbox/src/zarr-python
configfile: pyproject.toml
plugins: anyio-4.0.0, asyncio-0.23.3
asyncio: mode=Mode.STRICT
collected 13 items zarr/tests/test_storage.py::test_kvstore_repr PASSED [ 7%]
zarr/tests/test_storage.py::test_ensure_store PASSED [ 15%]
zarr/tests/test_storage.py::test_capabilities PASSED [ 23%]
zarr/tests/test_storage.py::TestMappingStore::test_get_set_del_contains PASSED [ 30%]
zarr/tests/test_storage.py::TestMappingStore::test_set_invalid_content PASSED [ 38%]
zarr/tests/test_storage.py::TestMappingStore::test_writeable_values PASSED [ 46%]
zarr/tests/test_storage.py::TestMappingStore::test_pickle PASSED [ 53%]
zarr/tests/test_storage.py::TestMappingStore::test_hierarchy PASSED [ 61%]
zarr/tests/test_storage.py::TestDirectoryStore::test_get_set_del_contains PASSED [ 69%]
zarr/tests/test_storage.py::TestDirectoryStore::test_set_invalid_content PASSED [ 76%]
zarr/tests/test_storage.py::TestDirectoryStore::test_writeable_values PASSED [ 84%]
zarr/tests/test_storage.py::TestDirectoryStore::test_pickle PASSED [ 92%]
zarr/tests/test_storage.py::TestDirectoryStore::test_hierarchy PASSED 

- removed abcs for groups/arrays
- improved return types in group.py
- warn (temporarily) when an implicit group is found
- add attributes.py with Attributes class
add test file
wip
fixes after rebas
e
make all tests pass
@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm going to merge this into the V3 branch to make way for tomorrow's sprint. I expect at least one more major rev on the store interface in the coming weeks.

@jhamman
jhamman merged commit 3bc305e into zarr-developers:v3Feb 7, 2024
@jhammanjhamman mentioned this pull request Feb 7, 2024
@jhammanjhamman mentioned this pull request Mar 30, 2024
6 tasks
@jhammanjhamman added this to the 3.0.0.alpha milestone Apr 22, 2024
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.

4 participants

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

Listable V3 Stores - #1634

Merged
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store
Feb 7, 2024
Merged

Listable V3 Stores#1634
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store

Conversation

@jhamman

@jhammanjhamman commented Jan 16, 2024

Copy link
Copy Markdown
Member

This goes on top of #1590

The core of this PR is to add list_* methods to the v3 stores. The Store interface is very much still in flux but this should be enough to pick up #1590 again.

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)

@pep8speaks

pep8speaks commented Jan 16, 2024

Copy link
Copy Markdown

Hello @jhamman! Thanks for updating this PR. We checked the lines you've touched for PEP 8 issues, and found:

Line 34:44: E203 whitespace before ':'
Line 56:30: E203 whitespace before ':'

Comment last updated at 2024-02-07 04:46:23 UTC

@jhammanjhamman changed the title V3 list storeListable V3 StoresJan 16, 2024

@jhammanjhamman left a comment

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.

A few comments on the state of things here.

Comment threadzarr/v3/abc/store.py
async def get(self, key: str) -> bytes:
async def get(
self, key: str, byte_range: Optional[Tuple[int, Optional[int]]] = None
) -> Optional[bytes]:

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.

Question for discussion. Do we want to have the byte_range parameter in the single key get method or just in get_partial_values? I lean toward this API but it is somewhat duplicative and goes against the suggestion in the spec:

get - Retrieve the value associated with a given key.
Parameters: key
Output: value

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.

My instinct would be to ignore the abstract store interface and just do what makes sense locally.

I don't understand why the spec describes both get(key) -> valueandget_partial_values(key_range) -> List[Optional[value]], as opposed to get(key, range) -> Optional[value] and letting clients handle iteration themselves.

@jhammanjhammanFeb 3, 2024

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.

Thinking about this more, we are definitely going to want to be able to pass the store a batch of values keys/ranges to the store. This will let us push optimizations down to lower level code or let us do optimizations like coalescing requests.

I still feel like its worth supporting single partial requests though so I'm going to include that in the abc.

Comment on lines +79 to +80
except (FileNotFoundError, IsADirectoryError, NotADirectoryError):
return None

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.

I found this behavior in Zarrita to be surprising. @normanrz - can you comment on the motivation here? In V2 we would have just raised a KeyError.

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.

I opted for using None as non-existent. Raising and catching a KeyError would also work.

@@ -0,0 +1,95 @@
from __future__ import annotations

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.

I have not really worked on this store yet.

@@ -1,87 +1,96 @@
import array

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.

Big diff in this file as I decided to comment everything out and bring it back piece by piece. Here's the current test run:

=================================================================================== 13 passed in 0.08s ===================================================================================
❯ pytest zarr/tests/test_storage.py -vvv
================================================================================== test session starts ===================================================================================
platform darwin -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0 -- /Users/jhamman/miniforge3/envs/zarr-dev/bin/python3.11
cachedir: .pytest_cache
rootdir: /Users/jhamman/Library/CloudStorage/Dropbox/src/zarr-python
configfile: pyproject.toml
plugins: anyio-4.0.0, asyncio-0.23.3
asyncio: mode=Mode.STRICT
collected 13 items zarr/tests/test_storage.py::test_kvstore_repr PASSED [ 7%]
zarr/tests/test_storage.py::test_ensure_store PASSED [ 15%]
zarr/tests/test_storage.py::test_capabilities PASSED [ 23%]
zarr/tests/test_storage.py::TestMappingStore::test_get_set_del_contains PASSED [ 30%]
zarr/tests/test_storage.py::TestMappingStore::test_set_invalid_content PASSED [ 38%]
zarr/tests/test_storage.py::TestMappingStore::test_writeable_values PASSED [ 46%]
zarr/tests/test_storage.py::TestMappingStore::test_pickle PASSED [ 53%]
zarr/tests/test_storage.py::TestMappingStore::test_hierarchy PASSED [ 61%]
zarr/tests/test_storage.py::TestDirectoryStore::test_get_set_del_contains PASSED [ 69%]
zarr/tests/test_storage.py::TestDirectoryStore::test_set_invalid_content PASSED [ 76%]
zarr/tests/test_storage.py::TestDirectoryStore::test_writeable_values PASSED [ 84%]
zarr/tests/test_storage.py::TestDirectoryStore::test_pickle PASSED [ 92%]
zarr/tests/test_storage.py::TestDirectoryStore::test_hierarchy PASSED 

- removed abcs for groups/arrays
- improved return types in group.py
- warn (temporarily) when an implicit group is found
- add attributes.py with Attributes class
add test file
wip
fixes after rebas
e
make all tests pass
@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm going to merge this into the V3 branch to make way for tomorrow's sprint. I expect at least one more major rev on the store interface in the coming weeks.

@jhamman
jhamman merged commit 3bc305e into zarr-developers:v3Feb 7, 2024
@jhammanjhamman mentioned this pull request Feb 7, 2024
@jhammanjhamman mentioned this pull request Mar 30, 2024
6 tasks
@jhammanjhamman added this to the 3.0.0.alpha milestone Apr 22, 2024
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.

4 participants

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

Listable V3 Stores - #1634

Merged
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store
Feb 7, 2024
Merged

Listable V3 Stores#1634
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store

Conversation

@jhamman

@jhammanjhamman commented Jan 16, 2024

Copy link
Copy Markdown
Member

This goes on top of #1590

The core of this PR is to add list_* methods to the v3 stores. The Store interface is very much still in flux but this should be enough to pick up #1590 again.

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)

@pep8speaks

pep8speaks commented Jan 16, 2024

Copy link
Copy Markdown

Hello @jhamman! Thanks for updating this PR. We checked the lines you've touched for PEP 8 issues, and found:

Line 34:44: E203 whitespace before ':'
Line 56:30: E203 whitespace before ':'

Comment last updated at 2024-02-07 04:46:23 UTC

@jhammanjhamman changed the title V3 list storeListable V3 StoresJan 16, 2024

@jhammanjhamman left a comment

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.

A few comments on the state of things here.

Comment threadzarr/v3/abc/store.py
async def get(self, key: str) -> bytes:
async def get(
self, key: str, byte_range: Optional[Tuple[int, Optional[int]]] = None
) -> Optional[bytes]:

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.

Question for discussion. Do we want to have the byte_range parameter in the single key get method or just in get_partial_values? I lean toward this API but it is somewhat duplicative and goes against the suggestion in the spec:

get - Retrieve the value associated with a given key.
Parameters: key
Output: value

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.

My instinct would be to ignore the abstract store interface and just do what makes sense locally.

I don't understand why the spec describes both get(key) -> valueandget_partial_values(key_range) -> List[Optional[value]], as opposed to get(key, range) -> Optional[value] and letting clients handle iteration themselves.

@jhammanjhammanFeb 3, 2024

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.

Thinking about this more, we are definitely going to want to be able to pass the store a batch of values keys/ranges to the store. This will let us push optimizations down to lower level code or let us do optimizations like coalescing requests.

I still feel like its worth supporting single partial requests though so I'm going to include that in the abc.

Comment on lines +79 to +80
except (FileNotFoundError, IsADirectoryError, NotADirectoryError):
return None

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.

I found this behavior in Zarrita to be surprising. @normanrz - can you comment on the motivation here? In V2 we would have just raised a KeyError.

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.

I opted for using None as non-existent. Raising and catching a KeyError would also work.

@@ -0,0 +1,95 @@
from __future__ import annotations

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.

I have not really worked on this store yet.

@@ -1,87 +1,96 @@
import array

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.

Big diff in this file as I decided to comment everything out and bring it back piece by piece. Here's the current test run:

=================================================================================== 13 passed in 0.08s ===================================================================================
❯ pytest zarr/tests/test_storage.py -vvv
================================================================================== test session starts ===================================================================================
platform darwin -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0 -- /Users/jhamman/miniforge3/envs/zarr-dev/bin/python3.11
cachedir: .pytest_cache
rootdir: /Users/jhamman/Library/CloudStorage/Dropbox/src/zarr-python
configfile: pyproject.toml
plugins: anyio-4.0.0, asyncio-0.23.3
asyncio: mode=Mode.STRICT
collected 13 items zarr/tests/test_storage.py::test_kvstore_repr PASSED [ 7%]
zarr/tests/test_storage.py::test_ensure_store PASSED [ 15%]
zarr/tests/test_storage.py::test_capabilities PASSED [ 23%]
zarr/tests/test_storage.py::TestMappingStore::test_get_set_del_contains PASSED [ 30%]
zarr/tests/test_storage.py::TestMappingStore::test_set_invalid_content PASSED [ 38%]
zarr/tests/test_storage.py::TestMappingStore::test_writeable_values PASSED [ 46%]
zarr/tests/test_storage.py::TestMappingStore::test_pickle PASSED [ 53%]
zarr/tests/test_storage.py::TestMappingStore::test_hierarchy PASSED [ 61%]
zarr/tests/test_storage.py::TestDirectoryStore::test_get_set_del_contains PASSED [ 69%]
zarr/tests/test_storage.py::TestDirectoryStore::test_set_invalid_content PASSED [ 76%]
zarr/tests/test_storage.py::TestDirectoryStore::test_writeable_values PASSED [ 84%]
zarr/tests/test_storage.py::TestDirectoryStore::test_pickle PASSED [ 92%]
zarr/tests/test_storage.py::TestDirectoryStore::test_hierarchy PASSED 

- removed abcs for groups/arrays
- improved return types in group.py
- warn (temporarily) when an implicit group is found
- add attributes.py with Attributes class
add test file
wip
fixes after rebas
e
make all tests pass
@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm going to merge this into the V3 branch to make way for tomorrow's sprint. I expect at least one more major rev on the store interface in the coming weeks.

@jhamman
jhamman merged commit 3bc305e into zarr-developers:v3Feb 7, 2024
@jhammanjhamman mentioned this pull request Feb 7, 2024
@jhammanjhamman mentioned this pull request Mar 30, 2024
6 tasks
@jhammanjhamman added this to the 3.0.0.alpha milestone Apr 22, 2024
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.

4 participants

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

Listable V3 Stores - #1634

Merged
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store
Feb 7, 2024
Merged

Listable V3 Stores#1634
jhamman merged 3 commits into
zarr-developers:v3from
jhamman:v3-list-store

Conversation

@jhamman

@jhammanjhamman commented Jan 16, 2024

Copy link
Copy Markdown
Member

This goes on top of #1590

The core of this PR is to add list_* methods to the v3 stores. The Store interface is very much still in flux but this should be enough to pick up #1590 again.

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)

@pep8speaks

pep8speaks commented Jan 16, 2024

Copy link
Copy Markdown

Hello @jhamman! Thanks for updating this PR. We checked the lines you've touched for PEP 8 issues, and found:

Line 34:44: E203 whitespace before ':'
Line 56:30: E203 whitespace before ':'

Comment last updated at 2024-02-07 04:46:23 UTC

@jhammanjhamman changed the title V3 list storeListable V3 StoresJan 16, 2024

@jhammanjhamman left a comment

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.

A few comments on the state of things here.

Comment threadzarr/v3/abc/store.py
async def get(self, key: str) -> bytes:
async def get(
self, key: str, byte_range: Optional[Tuple[int, Optional[int]]] = None
) -> Optional[bytes]:

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.

Question for discussion. Do we want to have the byte_range parameter in the single key get method or just in get_partial_values? I lean toward this API but it is somewhat duplicative and goes against the suggestion in the spec:

get - Retrieve the value associated with a given key.
Parameters: key
Output: value

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.

My instinct would be to ignore the abstract store interface and just do what makes sense locally.

I don't understand why the spec describes both get(key) -> valueandget_partial_values(key_range) -> List[Optional[value]], as opposed to get(key, range) -> Optional[value] and letting clients handle iteration themselves.

@jhammanjhammanFeb 3, 2024

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.

Thinking about this more, we are definitely going to want to be able to pass the store a batch of values keys/ranges to the store. This will let us push optimizations down to lower level code or let us do optimizations like coalescing requests.

I still feel like its worth supporting single partial requests though so I'm going to include that in the abc.

Comment on lines +79 to +80
except (FileNotFoundError, IsADirectoryError, NotADirectoryError):
return None

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.

I found this behavior in Zarrita to be surprising. @normanrz - can you comment on the motivation here? In V2 we would have just raised a KeyError.

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.

I opted for using None as non-existent. Raising and catching a KeyError would also work.

@@ -0,0 +1,95 @@
from __future__ import annotations

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.

I have not really worked on this store yet.

@@ -1,87 +1,96 @@
import array

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.

Big diff in this file as I decided to comment everything out and bring it back piece by piece. Here's the current test run:

=================================================================================== 13 passed in 0.08s ===================================================================================
❯ pytest zarr/tests/test_storage.py -vvv
================================================================================== test session starts ===================================================================================
platform darwin -- Python 3.11.6, pytest-7.4.3, pluggy-1.3.0 -- /Users/jhamman/miniforge3/envs/zarr-dev/bin/python3.11
cachedir: .pytest_cache
rootdir: /Users/jhamman/Library/CloudStorage/Dropbox/src/zarr-python
configfile: pyproject.toml
plugins: anyio-4.0.0, asyncio-0.23.3
asyncio: mode=Mode.STRICT
collected 13 items zarr/tests/test_storage.py::test_kvstore_repr PASSED [ 7%]
zarr/tests/test_storage.py::test_ensure_store PASSED [ 15%]
zarr/tests/test_storage.py::test_capabilities PASSED [ 23%]
zarr/tests/test_storage.py::TestMappingStore::test_get_set_del_contains PASSED [ 30%]
zarr/tests/test_storage.py::TestMappingStore::test_set_invalid_content PASSED [ 38%]
zarr/tests/test_storage.py::TestMappingStore::test_writeable_values PASSED [ 46%]
zarr/tests/test_storage.py::TestMappingStore::test_pickle PASSED [ 53%]
zarr/tests/test_storage.py::TestMappingStore::test_hierarchy PASSED [ 61%]
zarr/tests/test_storage.py::TestDirectoryStore::test_get_set_del_contains PASSED [ 69%]
zarr/tests/test_storage.py::TestDirectoryStore::test_set_invalid_content PASSED [ 76%]
zarr/tests/test_storage.py::TestDirectoryStore::test_writeable_values PASSED [ 84%]
zarr/tests/test_storage.py::TestDirectoryStore::test_pickle PASSED [ 92%]
zarr/tests/test_storage.py::TestDirectoryStore::test_hierarchy PASSED 

- removed abcs for groups/arrays
- improved return types in group.py
- warn (temporarily) when an implicit group is found
- add attributes.py with Attributes class
add test file
wip
fixes after rebas
e
make all tests pass
@jhamman

Copy link
Copy Markdown
MemberAuthor

I'm going to merge this into the V3 branch to make way for tomorrow's sprint. I expect at least one more major rev on the store interface in the coming weeks.

@jhamman
jhamman merged commit 3bc305e into zarr-developers:v3Feb 7, 2024
@jhammanjhamman mentioned this pull request Feb 7, 2024
@jhammanjhamman mentioned this pull request Mar 30, 2024
6 tasks
@jhammanjhamman added this to the 3.0.0.alpha milestone Apr 22, 2024
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.

4 participants

@jhamman@pep8speaks@normanrz@d-v-b