Skip to content

Add downloadable cells dataset via scverse-misc - #1149

Merged
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset
Aug 18, 2026
Merged

Add downloadable cells dataset via scverse-misc#1149
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset

Conversation

@timtreis

@timtreistimtreis commented Jun 19, 2026

Copy link
Copy Markdown
Member

Summary

Exposes spatialdata.datasets.cells() alongside blobs/raccoon. It downloads the cells example dataset and loads it as a SpatialData object.

Dataset fetching is delegated to scverse-misc[datasets] (>=0.1.0, the first released version with the datasets feature). The registry shipped in src/spatialdata/datasets.yaml is parsed and fetched (downloaded, hash-verified, cached, loaded) at call time.

The actual download is exercised by test_cells_download, marked slow; the network-free test_cells_registry validates the shipped registry on every run.

timtreisand others added 2 commits June 22, 2026 10:54
Expose spatialdata.datasets.cells() alongside blobs/raccoon. It downloads
the cells example dataset and loads it as a SpatialData object, reusing the
scverse-misc datasets infrastructure (parse_registry + fetch with the
built-in spatialdata loader) rather than reimplementing a downloader.
- ship src/spatialdata/datasets.yaml registry (base_url + cells.zip sha256)
- add scverse-misc[datasets]>=0.0.10 dependency
- bump requires-python and ruff target to 3.12 (scverse-misc requires >=3.12)
- update CI matrix 3.11 -> 3.12
- docs + network-free registry test and a slow download test
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecovBot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.41%. Comparing base (2debe5f) to head (5451a53).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@ Coverage Diff @@## main #1149 +/- ##
==========================================
+ Coverage 92.40% 92.41% +0.01% 
==========================================
Files 52 52 Lines 7858 7874 +16 ==========================================
+ Hits 7261 7277 +16 
Misses 597 597 
Files with missing linesCoverage Δ
src/spatialdata/datasets.py100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

timtreisand others added 2 commits June 22, 2026 12:17
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@LucaMarconato

LucaMarconato commented Jun 27, 2026

Copy link
Copy Markdown
Member

Didn't dive deep but this looks great. One important thing is missing, for each dataset we must list the license, and if the license requires attribution, we need to list that. Could you please add this?

timtreisand others added 2 commits July 6, 2026 15:04
The cells dataset is derived from the 10x Genomics Xenium Prime Cervical
Cancer FFPE sample, released under CC BY 4.0 (attribution required). Record
the license and attribution in the registry and document the expectation
that every dataset lists its license.
@timtreis

Copy link
Copy Markdown
MemberAuthor

@LucaMarconato added the license info 👌

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, here are some suggestions for improvements:

  1. Please add a link to the associated PR in spatialdata-notebooks. Please also add a couple of lines describing the motivation for this PR along which what value it adds. I see the assocated PR in spatialdata-notebooks already has a couple of good lines in this direction.

Comment threadtests/datasets/test_datasets.py
Comment threadsrc/spatialdata/datasets.py
Comment threadsrc/spatialdata/datasets.py Outdated
import pooch
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

please also cover the "else" case here in tests.

Comment threadsrc/spatialdata/datasets.py Outdated
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))
registry = importlib.resources.files("spatialdata").joinpath("datasets.yaml")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I see the three lines here are also used in the unit test for this function. Would it make sense to make this into a separate function. Maybe it will be reused if we add more datasets that use this pattern from spatialdata-misc

timtreisand others added 4 commits August 14, 2026 19:12
Extract _shipped_registry() and _cache_dir() helpers, shared between
cells() and the tests, removing the duplicated registry-parsing block.
_cache_dir() isolates the path-vs-default branch so both sides are
covered without a network call.
Describe the dataset contents in the docstring, and assert the concrete
element counts and shapes in test_cells_download.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parse_registry is untyped in the mypy env, so returning its result
directly tripped no-any-return; assign through annotated locals.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadtests/datasets/test_datasets.py Outdated
Comment on lines +55 to +57
@pytest.mark.slow
def test_cells_download(tmp_path) -> None:
# Downloads ~3 MB from the scverse example data bucket; opt out with `-m "not slow"`.

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.

Rather than opt-out, I'll try turning this into opt-in and skip the test by default.

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.

Done, made opt-in and opting in in the GitHub CI.

It's a small dataset here and not a big deal, but later when we test cloud support it's good that we differentiate between tests require a network and tests that do not.

LucaMarconatoand others added 2 commits August 18, 2026 14:05
Rename the `slow` marker to `network` and flip it from opt-out
(`-m "not slow"`) to opt-in: tests marked `network` are skipped
unless `--run-network` is passed. Enable the flag in CI so
`test_cells_download` runs there, and document the `license_url`
convention for CC-BY-style datasets in datasets.yaml.
@LucaMarconato

Copy link
Copy Markdown
Member

Thanks both @timtreis and @ajkswamy. The new dataset downloader works great!

Made only some minor changes, auto-merging now.

@LucaMarconato
LucaMarconato enabled auto-merge (squash) August 18, 2026 12:06
@LucaMarconato
LucaMarconato merged commit f31ff45 into mainAug 18, 2026
10 checks passed
@LucaMarconato
LucaMarconato deleted the add-cells-dataset branch August 18, 2026 12:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, '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" + '
Add downloadable cells dataset via scverse-misc by timtreis · Pull Request #1149 · scverse/spatialdata · GitHub
Skip to content

Add downloadable cells dataset via scverse-misc - #1149

Merged
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset
Aug 18, 2026
Merged

Add downloadable cells dataset via scverse-misc#1149
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset

Conversation

@timtreis

@timtreistimtreis commented Jun 19, 2026

Copy link
Copy Markdown
Member

Summary

Exposes spatialdata.datasets.cells() alongside blobs/raccoon. It downloads the cells example dataset and loads it as a SpatialData object.

Dataset fetching is delegated to scverse-misc[datasets] (>=0.1.0, the first released version with the datasets feature). The registry shipped in src/spatialdata/datasets.yaml is parsed and fetched (downloaded, hash-verified, cached, loaded) at call time.

The actual download is exercised by test_cells_download, marked slow; the network-free test_cells_registry validates the shipped registry on every run.

timtreisand others added 2 commits June 22, 2026 10:54
Expose spatialdata.datasets.cells() alongside blobs/raccoon. It downloads
the cells example dataset and loads it as a SpatialData object, reusing the
scverse-misc datasets infrastructure (parse_registry + fetch with the
built-in spatialdata loader) rather than reimplementing a downloader.
- ship src/spatialdata/datasets.yaml registry (base_url + cells.zip sha256)
- add scverse-misc[datasets]>=0.0.10 dependency
- bump requires-python and ruff target to 3.12 (scverse-misc requires >=3.12)
- update CI matrix 3.11 -> 3.12
- docs + network-free registry test and a slow download test
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecovBot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.41%. Comparing base (2debe5f) to head (5451a53).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@ Coverage Diff @@## main #1149 +/- ##
==========================================
+ Coverage 92.40% 92.41% +0.01% 
==========================================
Files 52 52 Lines 7858 7874 +16 ==========================================
+ Hits 7261 7277 +16 
Misses 597 597 
Files with missing linesCoverage Δ
src/spatialdata/datasets.py100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

timtreisand others added 2 commits June 22, 2026 12:17
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@LucaMarconato

LucaMarconato commented Jun 27, 2026

Copy link
Copy Markdown
Member

Didn't dive deep but this looks great. One important thing is missing, for each dataset we must list the license, and if the license requires attribution, we need to list that. Could you please add this?

timtreisand others added 2 commits July 6, 2026 15:04
The cells dataset is derived from the 10x Genomics Xenium Prime Cervical
Cancer FFPE sample, released under CC BY 4.0 (attribution required). Record
the license and attribution in the registry and document the expectation
that every dataset lists its license.
@timtreis

Copy link
Copy Markdown
MemberAuthor

@LucaMarconato added the license info 👌

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, here are some suggestions for improvements:

  1. Please add a link to the associated PR in spatialdata-notebooks. Please also add a couple of lines describing the motivation for this PR along which what value it adds. I see the assocated PR in spatialdata-notebooks already has a couple of good lines in this direction.

Comment threadtests/datasets/test_datasets.py
Comment threadsrc/spatialdata/datasets.py
Comment threadsrc/spatialdata/datasets.py Outdated
import pooch
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

please also cover the "else" case here in tests.

Comment threadsrc/spatialdata/datasets.py Outdated
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))
registry = importlib.resources.files("spatialdata").joinpath("datasets.yaml")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I see the three lines here are also used in the unit test for this function. Would it make sense to make this into a separate function. Maybe it will be reused if we add more datasets that use this pattern from spatialdata-misc

timtreisand others added 4 commits August 14, 2026 19:12
Extract _shipped_registry() and _cache_dir() helpers, shared between
cells() and the tests, removing the duplicated registry-parsing block.
_cache_dir() isolates the path-vs-default branch so both sides are
covered without a network call.
Describe the dataset contents in the docstring, and assert the concrete
element counts and shapes in test_cells_download.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parse_registry is untyped in the mypy env, so returning its result
directly tripped no-any-return; assign through annotated locals.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadtests/datasets/test_datasets.py Outdated
Comment on lines +55 to +57
@pytest.mark.slow
def test_cells_download(tmp_path) -> None:
# Downloads ~3 MB from the scverse example data bucket; opt out with `-m "not slow"`.

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.

Rather than opt-out, I'll try turning this into opt-in and skip the test by default.

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.

Done, made opt-in and opting in in the GitHub CI.

It's a small dataset here and not a big deal, but later when we test cloud support it's good that we differentiate between tests require a network and tests that do not.

LucaMarconatoand others added 2 commits August 18, 2026 14:05
Rename the `slow` marker to `network` and flip it from opt-out
(`-m "not slow"`) to opt-in: tests marked `network` are skipped
unless `--run-network` is passed. Enable the flag in CI so
`test_cells_download` runs there, and document the `license_url`
convention for CC-BY-style datasets in datasets.yaml.
@LucaMarconato

Copy link
Copy Markdown
Member

Thanks both @timtreis and @ajkswamy. The new dataset downloader works great!

Made only some minor changes, auto-merging now.

@LucaMarconato
LucaMarconato enabled auto-merge (squash) August 18, 2026 12:06
@LucaMarconato
LucaMarconato merged commit f31ff45 into mainAug 18, 2026
10 checks passed
@LucaMarconato
LucaMarconato deleted the add-cells-dataset branch August 18, 2026 12:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, '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('^' + ".*" + ' Add downloadable cells dataset via scverse-misc by timtreis · Pull Request #1149 · scverse/spatialdata · GitHub
Skip to content

Add downloadable cells dataset via scverse-misc - #1149

Merged
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset
Aug 18, 2026
Merged

Add downloadable cells dataset via scverse-misc#1149
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset

Conversation

@timtreis

@timtreistimtreis commented Jun 19, 2026

Copy link
Copy Markdown
Member

Summary

Exposes spatialdata.datasets.cells() alongside blobs/raccoon. It downloads the cells example dataset and loads it as a SpatialData object.

Dataset fetching is delegated to scverse-misc[datasets] (>=0.1.0, the first released version with the datasets feature). The registry shipped in src/spatialdata/datasets.yaml is parsed and fetched (downloaded, hash-verified, cached, loaded) at call time.

The actual download is exercised by test_cells_download, marked slow; the network-free test_cells_registry validates the shipped registry on every run.

timtreisand others added 2 commits June 22, 2026 10:54
Expose spatialdata.datasets.cells() alongside blobs/raccoon. It downloads
the cells example dataset and loads it as a SpatialData object, reusing the
scverse-misc datasets infrastructure (parse_registry + fetch with the
built-in spatialdata loader) rather than reimplementing a downloader.
- ship src/spatialdata/datasets.yaml registry (base_url + cells.zip sha256)
- add scverse-misc[datasets]>=0.0.10 dependency
- bump requires-python and ruff target to 3.12 (scverse-misc requires >=3.12)
- update CI matrix 3.11 -> 3.12
- docs + network-free registry test and a slow download test
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecovBot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.41%. Comparing base (2debe5f) to head (5451a53).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@ Coverage Diff @@## main #1149 +/- ##
==========================================
+ Coverage 92.40% 92.41% +0.01% 
==========================================
Files 52 52 Lines 7858 7874 +16 ==========================================
+ Hits 7261 7277 +16 
Misses 597 597 
Files with missing linesCoverage Δ
src/spatialdata/datasets.py100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

timtreisand others added 2 commits June 22, 2026 12:17
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@LucaMarconato

LucaMarconato commented Jun 27, 2026

Copy link
Copy Markdown
Member

Didn't dive deep but this looks great. One important thing is missing, for each dataset we must list the license, and if the license requires attribution, we need to list that. Could you please add this?

timtreisand others added 2 commits July 6, 2026 15:04
The cells dataset is derived from the 10x Genomics Xenium Prime Cervical
Cancer FFPE sample, released under CC BY 4.0 (attribution required). Record
the license and attribution in the registry and document the expectation
that every dataset lists its license.
@timtreis

Copy link
Copy Markdown
MemberAuthor

@LucaMarconato added the license info 👌

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, here are some suggestions for improvements:

  1. Please add a link to the associated PR in spatialdata-notebooks. Please also add a couple of lines describing the motivation for this PR along which what value it adds. I see the assocated PR in spatialdata-notebooks already has a couple of good lines in this direction.

Comment threadtests/datasets/test_datasets.py
Comment threadsrc/spatialdata/datasets.py
Comment threadsrc/spatialdata/datasets.py Outdated
import pooch
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

please also cover the "else" case here in tests.

Comment threadsrc/spatialdata/datasets.py Outdated
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))
registry = importlib.resources.files("spatialdata").joinpath("datasets.yaml")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I see the three lines here are also used in the unit test for this function. Would it make sense to make this into a separate function. Maybe it will be reused if we add more datasets that use this pattern from spatialdata-misc

timtreisand others added 4 commits August 14, 2026 19:12
Extract _shipped_registry() and _cache_dir() helpers, shared between
cells() and the tests, removing the duplicated registry-parsing block.
_cache_dir() isolates the path-vs-default branch so both sides are
covered without a network call.
Describe the dataset contents in the docstring, and assert the concrete
element counts and shapes in test_cells_download.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parse_registry is untyped in the mypy env, so returning its result
directly tripped no-any-return; assign through annotated locals.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadtests/datasets/test_datasets.py Outdated
Comment on lines +55 to +57
@pytest.mark.slow
def test_cells_download(tmp_path) -> None:
# Downloads ~3 MB from the scverse example data bucket; opt out with `-m "not slow"`.

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.

Rather than opt-out, I'll try turning this into opt-in and skip the test by default.

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.

Done, made opt-in and opting in in the GitHub CI.

It's a small dataset here and not a big deal, but later when we test cloud support it's good that we differentiate between tests require a network and tests that do not.

LucaMarconatoand others added 2 commits August 18, 2026 14:05
Rename the `slow` marker to `network` and flip it from opt-out
(`-m "not slow"`) to opt-in: tests marked `network` are skipped
unless `--run-network` is passed. Enable the flag in CI so
`test_cells_download` runs there, and document the `license_url`
convention for CC-BY-style datasets in datasets.yaml.
@LucaMarconato

Copy link
Copy Markdown
Member

Thanks both @timtreis and @ajkswamy. The new dataset downloader works great!

Made only some minor changes, auto-merging now.

@LucaMarconato
LucaMarconato enabled auto-merge (squash) August 18, 2026 12:06
@LucaMarconato
LucaMarconato merged commit f31ff45 into mainAug 18, 2026
10 checks passed
@LucaMarconato
LucaMarconato deleted the add-cells-dataset branch August 18, 2026 12:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, '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('^' + ".*" + ' Add downloadable cells dataset via scverse-misc by timtreis · Pull Request #1149 · scverse/spatialdata · GitHub
Skip to content

Add downloadable cells dataset via scverse-misc - #1149

Merged
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset
Aug 18, 2026
Merged

Add downloadable cells dataset via scverse-misc#1149
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset

Conversation

@timtreis

@timtreistimtreis commented Jun 19, 2026

Copy link
Copy Markdown
Member

Summary

Exposes spatialdata.datasets.cells() alongside blobs/raccoon. It downloads the cells example dataset and loads it as a SpatialData object.

Dataset fetching is delegated to scverse-misc[datasets] (>=0.1.0, the first released version with the datasets feature). The registry shipped in src/spatialdata/datasets.yaml is parsed and fetched (downloaded, hash-verified, cached, loaded) at call time.

The actual download is exercised by test_cells_download, marked slow; the network-free test_cells_registry validates the shipped registry on every run.

timtreisand others added 2 commits June 22, 2026 10:54
Expose spatialdata.datasets.cells() alongside blobs/raccoon. It downloads
the cells example dataset and loads it as a SpatialData object, reusing the
scverse-misc datasets infrastructure (parse_registry + fetch with the
built-in spatialdata loader) rather than reimplementing a downloader.
- ship src/spatialdata/datasets.yaml registry (base_url + cells.zip sha256)
- add scverse-misc[datasets]>=0.0.10 dependency
- bump requires-python and ruff target to 3.12 (scverse-misc requires >=3.12)
- update CI matrix 3.11 -> 3.12
- docs + network-free registry test and a slow download test
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecovBot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.41%. Comparing base (2debe5f) to head (5451a53).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@ Coverage Diff @@## main #1149 +/- ##
==========================================
+ Coverage 92.40% 92.41% +0.01% 
==========================================
Files 52 52 Lines 7858 7874 +16 ==========================================
+ Hits 7261 7277 +16 
Misses 597 597 
Files with missing linesCoverage Δ
src/spatialdata/datasets.py100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

timtreisand others added 2 commits June 22, 2026 12:17
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@LucaMarconato

LucaMarconato commented Jun 27, 2026

Copy link
Copy Markdown
Member

Didn't dive deep but this looks great. One important thing is missing, for each dataset we must list the license, and if the license requires attribution, we need to list that. Could you please add this?

timtreisand others added 2 commits July 6, 2026 15:04
The cells dataset is derived from the 10x Genomics Xenium Prime Cervical
Cancer FFPE sample, released under CC BY 4.0 (attribution required). Record
the license and attribution in the registry and document the expectation
that every dataset lists its license.
@timtreis

Copy link
Copy Markdown
MemberAuthor

@LucaMarconato added the license info 👌

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, here are some suggestions for improvements:

  1. Please add a link to the associated PR in spatialdata-notebooks. Please also add a couple of lines describing the motivation for this PR along which what value it adds. I see the assocated PR in spatialdata-notebooks already has a couple of good lines in this direction.

Comment threadtests/datasets/test_datasets.py
Comment threadsrc/spatialdata/datasets.py
Comment threadsrc/spatialdata/datasets.py Outdated
import pooch
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

please also cover the "else" case here in tests.

Comment threadsrc/spatialdata/datasets.py Outdated
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))
registry = importlib.resources.files("spatialdata").joinpath("datasets.yaml")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I see the three lines here are also used in the unit test for this function. Would it make sense to make this into a separate function. Maybe it will be reused if we add more datasets that use this pattern from spatialdata-misc

timtreisand others added 4 commits August 14, 2026 19:12
Extract _shipped_registry() and _cache_dir() helpers, shared between
cells() and the tests, removing the duplicated registry-parsing block.
_cache_dir() isolates the path-vs-default branch so both sides are
covered without a network call.
Describe the dataset contents in the docstring, and assert the concrete
element counts and shapes in test_cells_download.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parse_registry is untyped in the mypy env, so returning its result
directly tripped no-any-return; assign through annotated locals.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadtests/datasets/test_datasets.py Outdated
Comment on lines +55 to +57
@pytest.mark.slow
def test_cells_download(tmp_path) -> None:
# Downloads ~3 MB from the scverse example data bucket; opt out with `-m "not slow"`.

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.

Rather than opt-out, I'll try turning this into opt-in and skip the test by default.

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.

Done, made opt-in and opting in in the GitHub CI.

It's a small dataset here and not a big deal, but later when we test cloud support it's good that we differentiate between tests require a network and tests that do not.

LucaMarconatoand others added 2 commits August 18, 2026 14:05
Rename the `slow` marker to `network` and flip it from opt-out
(`-m "not slow"`) to opt-in: tests marked `network` are skipped
unless `--run-network` is passed. Enable the flag in CI so
`test_cells_download` runs there, and document the `license_url`
convention for CC-BY-style datasets in datasets.yaml.
@LucaMarconato

Copy link
Copy Markdown
Member

Thanks both @timtreis and @ajkswamy. The new dataset downloader works great!

Made only some minor changes, auto-merging now.

@LucaMarconato
LucaMarconato enabled auto-merge (squash) August 18, 2026 12:06
@LucaMarconato
LucaMarconato merged commit f31ff45 into mainAug 18, 2026
10 checks passed
@LucaMarconato
LucaMarconato deleted the add-cells-dataset branch August 18, 2026 12:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, '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" + ' Add downloadable cells dataset via scverse-misc by timtreis · Pull Request #1149 · scverse/spatialdata · GitHub
Skip to content

Add downloadable cells dataset via scverse-misc - #1149

Merged
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset
Aug 18, 2026
Merged

Add downloadable cells dataset via scverse-misc#1149
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset

Conversation

@timtreis

@timtreistimtreis commented Jun 19, 2026

Copy link
Copy Markdown
Member

Summary

Exposes spatialdata.datasets.cells() alongside blobs/raccoon. It downloads the cells example dataset and loads it as a SpatialData object.

Dataset fetching is delegated to scverse-misc[datasets] (>=0.1.0, the first released version with the datasets feature). The registry shipped in src/spatialdata/datasets.yaml is parsed and fetched (downloaded, hash-verified, cached, loaded) at call time.

The actual download is exercised by test_cells_download, marked slow; the network-free test_cells_registry validates the shipped registry on every run.

timtreisand others added 2 commits June 22, 2026 10:54
Expose spatialdata.datasets.cells() alongside blobs/raccoon. It downloads
the cells example dataset and loads it as a SpatialData object, reusing the
scverse-misc datasets infrastructure (parse_registry + fetch with the
built-in spatialdata loader) rather than reimplementing a downloader.
- ship src/spatialdata/datasets.yaml registry (base_url + cells.zip sha256)
- add scverse-misc[datasets]>=0.0.10 dependency
- bump requires-python and ruff target to 3.12 (scverse-misc requires >=3.12)
- update CI matrix 3.11 -> 3.12
- docs + network-free registry test and a slow download test
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecovBot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.41%. Comparing base (2debe5f) to head (5451a53).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@ Coverage Diff @@## main #1149 +/- ##
==========================================
+ Coverage 92.40% 92.41% +0.01% 
==========================================
Files 52 52 Lines 7858 7874 +16 ==========================================
+ Hits 7261 7277 +16 
Misses 597 597 
Files with missing linesCoverage Δ
src/spatialdata/datasets.py100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

timtreisand others added 2 commits June 22, 2026 12:17
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@LucaMarconato

LucaMarconato commented Jun 27, 2026

Copy link
Copy Markdown
Member

Didn't dive deep but this looks great. One important thing is missing, for each dataset we must list the license, and if the license requires attribution, we need to list that. Could you please add this?

timtreisand others added 2 commits July 6, 2026 15:04
The cells dataset is derived from the 10x Genomics Xenium Prime Cervical
Cancer FFPE sample, released under CC BY 4.0 (attribution required). Record
the license and attribution in the registry and document the expectation
that every dataset lists its license.
@timtreis

Copy link
Copy Markdown
MemberAuthor

@LucaMarconato added the license info 👌

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, here are some suggestions for improvements:

  1. Please add a link to the associated PR in spatialdata-notebooks. Please also add a couple of lines describing the motivation for this PR along which what value it adds. I see the assocated PR in spatialdata-notebooks already has a couple of good lines in this direction.

Comment threadtests/datasets/test_datasets.py
Comment threadsrc/spatialdata/datasets.py
Comment threadsrc/spatialdata/datasets.py Outdated
import pooch
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

please also cover the "else" case here in tests.

Comment threadsrc/spatialdata/datasets.py Outdated
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))
registry = importlib.resources.files("spatialdata").joinpath("datasets.yaml")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I see the three lines here are also used in the unit test for this function. Would it make sense to make this into a separate function. Maybe it will be reused if we add more datasets that use this pattern from spatialdata-misc

timtreisand others added 4 commits August 14, 2026 19:12
Extract _shipped_registry() and _cache_dir() helpers, shared between
cells() and the tests, removing the duplicated registry-parsing block.
_cache_dir() isolates the path-vs-default branch so both sides are
covered without a network call.
Describe the dataset contents in the docstring, and assert the concrete
element counts and shapes in test_cells_download.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parse_registry is untyped in the mypy env, so returning its result
directly tripped no-any-return; assign through annotated locals.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadtests/datasets/test_datasets.py Outdated
Comment on lines +55 to +57
@pytest.mark.slow
def test_cells_download(tmp_path) -> None:
# Downloads ~3 MB from the scverse example data bucket; opt out with `-m "not slow"`.

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.

Rather than opt-out, I'll try turning this into opt-in and skip the test by default.

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.

Done, made opt-in and opting in in the GitHub CI.

It's a small dataset here and not a big deal, but later when we test cloud support it's good that we differentiate between tests require a network and tests that do not.

LucaMarconatoand others added 2 commits August 18, 2026 14:05
Rename the `slow` marker to `network` and flip it from opt-out
(`-m "not slow"`) to opt-in: tests marked `network` are skipped
unless `--run-network` is passed. Enable the flag in CI so
`test_cells_download` runs there, and document the `license_url`
convention for CC-BY-style datasets in datasets.yaml.
@LucaMarconato

Copy link
Copy Markdown
Member

Thanks both @timtreis and @ajkswamy. The new dataset downloader works great!

Made only some minor changes, auto-merging now.

@LucaMarconato
LucaMarconato enabled auto-merge (squash) August 18, 2026 12:06
@LucaMarconato
LucaMarconato merged commit f31ff45 into mainAug 18, 2026
10 checks passed
@LucaMarconato
LucaMarconato deleted the add-cells-dataset branch August 18, 2026 12:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, '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('^' + ".*" + ' Add downloadable cells dataset via scverse-misc by timtreis · Pull Request #1149 · scverse/spatialdata · GitHub
Skip to content

Add downloadable cells dataset via scverse-misc - #1149

Merged
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset
Aug 18, 2026
Merged

Add downloadable cells dataset via scverse-misc#1149
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset

Conversation

@timtreis

@timtreistimtreis commented Jun 19, 2026

Copy link
Copy Markdown
Member

Summary

Exposes spatialdata.datasets.cells() alongside blobs/raccoon. It downloads the cells example dataset and loads it as a SpatialData object.

Dataset fetching is delegated to scverse-misc[datasets] (>=0.1.0, the first released version with the datasets feature). The registry shipped in src/spatialdata/datasets.yaml is parsed and fetched (downloaded, hash-verified, cached, loaded) at call time.

The actual download is exercised by test_cells_download, marked slow; the network-free test_cells_registry validates the shipped registry on every run.

timtreisand others added 2 commits June 22, 2026 10:54
Expose spatialdata.datasets.cells() alongside blobs/raccoon. It downloads
the cells example dataset and loads it as a SpatialData object, reusing the
scverse-misc datasets infrastructure (parse_registry + fetch with the
built-in spatialdata loader) rather than reimplementing a downloader.
- ship src/spatialdata/datasets.yaml registry (base_url + cells.zip sha256)
- add scverse-misc[datasets]>=0.0.10 dependency
- bump requires-python and ruff target to 3.12 (scverse-misc requires >=3.12)
- update CI matrix 3.11 -> 3.12
- docs + network-free registry test and a slow download test
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecovBot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.41%. Comparing base (2debe5f) to head (5451a53).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@ Coverage Diff @@## main #1149 +/- ##
==========================================
+ Coverage 92.40% 92.41% +0.01% 
==========================================
Files 52 52 Lines 7858 7874 +16 ==========================================
+ Hits 7261 7277 +16 
Misses 597 597 
Files with missing linesCoverage Δ
src/spatialdata/datasets.py100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

timtreisand others added 2 commits June 22, 2026 12:17
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@LucaMarconato

LucaMarconato commented Jun 27, 2026

Copy link
Copy Markdown
Member

Didn't dive deep but this looks great. One important thing is missing, for each dataset we must list the license, and if the license requires attribution, we need to list that. Could you please add this?

timtreisand others added 2 commits July 6, 2026 15:04
The cells dataset is derived from the 10x Genomics Xenium Prime Cervical
Cancer FFPE sample, released under CC BY 4.0 (attribution required). Record
the license and attribution in the registry and document the expectation
that every dataset lists its license.
@timtreis

Copy link
Copy Markdown
MemberAuthor

@LucaMarconato added the license info 👌

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, here are some suggestions for improvements:

  1. Please add a link to the associated PR in spatialdata-notebooks. Please also add a couple of lines describing the motivation for this PR along which what value it adds. I see the assocated PR in spatialdata-notebooks already has a couple of good lines in this direction.

Comment threadtests/datasets/test_datasets.py
Comment threadsrc/spatialdata/datasets.py
Comment threadsrc/spatialdata/datasets.py Outdated
import pooch
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

please also cover the "else" case here in tests.

Comment threadsrc/spatialdata/datasets.py Outdated
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))
registry = importlib.resources.files("spatialdata").joinpath("datasets.yaml")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I see the three lines here are also used in the unit test for this function. Would it make sense to make this into a separate function. Maybe it will be reused if we add more datasets that use this pattern from spatialdata-misc

timtreisand others added 4 commits August 14, 2026 19:12
Extract _shipped_registry() and _cache_dir() helpers, shared between
cells() and the tests, removing the duplicated registry-parsing block.
_cache_dir() isolates the path-vs-default branch so both sides are
covered without a network call.
Describe the dataset contents in the docstring, and assert the concrete
element counts and shapes in test_cells_download.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parse_registry is untyped in the mypy env, so returning its result
directly tripped no-any-return; assign through annotated locals.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadtests/datasets/test_datasets.py Outdated
Comment on lines +55 to +57
@pytest.mark.slow
def test_cells_download(tmp_path) -> None:
# Downloads ~3 MB from the scverse example data bucket; opt out with `-m "not slow"`.

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.

Rather than opt-out, I'll try turning this into opt-in and skip the test by default.

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.

Done, made opt-in and opting in in the GitHub CI.

It's a small dataset here and not a big deal, but later when we test cloud support it's good that we differentiate between tests require a network and tests that do not.

LucaMarconatoand others added 2 commits August 18, 2026 14:05
Rename the `slow` marker to `network` and flip it from opt-out
(`-m "not slow"`) to opt-in: tests marked `network` are skipped
unless `--run-network` is passed. Enable the flag in CI so
`test_cells_download` runs there, and document the `license_url`
convention for CC-BY-style datasets in datasets.yaml.
@LucaMarconato

Copy link
Copy Markdown
Member

Thanks both @timtreis and @ajkswamy. The new dataset downloader works great!

Made only some minor changes, auto-merging now.

@LucaMarconato
LucaMarconato enabled auto-merge (squash) August 18, 2026 12:06
@LucaMarconato
LucaMarconato merged commit f31ff45 into mainAug 18, 2026
10 checks passed
@LucaMarconato
LucaMarconato deleted the add-cells-dataset branch August 18, 2026 12:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, '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('^' + ".*" + ' Add downloadable cells dataset via scverse-misc by timtreis · Pull Request #1149 · scverse/spatialdata · GitHub
Skip to content

Add downloadable cells dataset via scverse-misc - #1149

Merged
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset
Aug 18, 2026
Merged

Add downloadable cells dataset via scverse-misc#1149
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset

Conversation

@timtreis

@timtreistimtreis commented Jun 19, 2026

Copy link
Copy Markdown
Member

Summary

Exposes spatialdata.datasets.cells() alongside blobs/raccoon. It downloads the cells example dataset and loads it as a SpatialData object.

Dataset fetching is delegated to scverse-misc[datasets] (>=0.1.0, the first released version with the datasets feature). The registry shipped in src/spatialdata/datasets.yaml is parsed and fetched (downloaded, hash-verified, cached, loaded) at call time.

The actual download is exercised by test_cells_download, marked slow; the network-free test_cells_registry validates the shipped registry on every run.

timtreisand others added 2 commits June 22, 2026 10:54
Expose spatialdata.datasets.cells() alongside blobs/raccoon. It downloads
the cells example dataset and loads it as a SpatialData object, reusing the
scverse-misc datasets infrastructure (parse_registry + fetch with the
built-in spatialdata loader) rather than reimplementing a downloader.
- ship src/spatialdata/datasets.yaml registry (base_url + cells.zip sha256)
- add scverse-misc[datasets]>=0.0.10 dependency
- bump requires-python and ruff target to 3.12 (scverse-misc requires >=3.12)
- update CI matrix 3.11 -> 3.12
- docs + network-free registry test and a slow download test
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecovBot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.41%. Comparing base (2debe5f) to head (5451a53).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@ Coverage Diff @@## main #1149 +/- ##
==========================================
+ Coverage 92.40% 92.41% +0.01% 
==========================================
Files 52 52 Lines 7858 7874 +16 ==========================================
+ Hits 7261 7277 +16 
Misses 597 597 
Files with missing linesCoverage Δ
src/spatialdata/datasets.py100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

timtreisand others added 2 commits June 22, 2026 12:17
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@LucaMarconato

LucaMarconato commented Jun 27, 2026

Copy link
Copy Markdown
Member

Didn't dive deep but this looks great. One important thing is missing, for each dataset we must list the license, and if the license requires attribution, we need to list that. Could you please add this?

timtreisand others added 2 commits July 6, 2026 15:04
The cells dataset is derived from the 10x Genomics Xenium Prime Cervical
Cancer FFPE sample, released under CC BY 4.0 (attribution required). Record
the license and attribution in the registry and document the expectation
that every dataset lists its license.
@timtreis

Copy link
Copy Markdown
MemberAuthor

@LucaMarconato added the license info 👌

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, here are some suggestions for improvements:

  1. Please add a link to the associated PR in spatialdata-notebooks. Please also add a couple of lines describing the motivation for this PR along which what value it adds. I see the assocated PR in spatialdata-notebooks already has a couple of good lines in this direction.

Comment threadtests/datasets/test_datasets.py
Comment threadsrc/spatialdata/datasets.py
Comment threadsrc/spatialdata/datasets.py Outdated
import pooch
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

please also cover the "else" case here in tests.

Comment threadsrc/spatialdata/datasets.py Outdated
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))
registry = importlib.resources.files("spatialdata").joinpath("datasets.yaml")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I see the three lines here are also used in the unit test for this function. Would it make sense to make this into a separate function. Maybe it will be reused if we add more datasets that use this pattern from spatialdata-misc

timtreisand others added 4 commits August 14, 2026 19:12
Extract _shipped_registry() and _cache_dir() helpers, shared between
cells() and the tests, removing the duplicated registry-parsing block.
_cache_dir() isolates the path-vs-default branch so both sides are
covered without a network call.
Describe the dataset contents in the docstring, and assert the concrete
element counts and shapes in test_cells_download.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parse_registry is untyped in the mypy env, so returning its result
directly tripped no-any-return; assign through annotated locals.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadtests/datasets/test_datasets.py Outdated
Comment on lines +55 to +57
@pytest.mark.slow
def test_cells_download(tmp_path) -> None:
# Downloads ~3 MB from the scverse example data bucket; opt out with `-m "not slow"`.

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.

Rather than opt-out, I'll try turning this into opt-in and skip the test by default.

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.

Done, made opt-in and opting in in the GitHub CI.

It's a small dataset here and not a big deal, but later when we test cloud support it's good that we differentiate between tests require a network and tests that do not.

LucaMarconatoand others added 2 commits August 18, 2026 14:05
Rename the `slow` marker to `network` and flip it from opt-out
(`-m "not slow"`) to opt-in: tests marked `network` are skipped
unless `--run-network` is passed. Enable the flag in CI so
`test_cells_download` runs there, and document the `license_url`
convention for CC-BY-style datasets in datasets.yaml.
@LucaMarconato

Copy link
Copy Markdown
Member

Thanks both @timtreis and @ajkswamy. The new dataset downloader works great!

Made only some minor changes, auto-merging now.

@LucaMarconato
LucaMarconato enabled auto-merge (squash) August 18, 2026 12:06
@LucaMarconato
LucaMarconato merged commit f31ff45 into mainAug 18, 2026
10 checks passed
@LucaMarconato
LucaMarconato deleted the add-cells-dataset branch August 18, 2026 12:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy
, '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); } })(); })(); Add downloadable cells dataset via scverse-misc by timtreis · Pull Request #1149 · scverse/spatialdata · GitHub
Skip to content

Add downloadable cells dataset via scverse-misc - #1149

Merged
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset
Aug 18, 2026
Merged

Add downloadable cells dataset via scverse-misc#1149
LucaMarconato merged 16 commits into
mainfrom
add-cells-dataset

Conversation

@timtreis

@timtreistimtreis commented Jun 19, 2026

Copy link
Copy Markdown
Member

Summary

Exposes spatialdata.datasets.cells() alongside blobs/raccoon. It downloads the cells example dataset and loads it as a SpatialData object.

Dataset fetching is delegated to scverse-misc[datasets] (>=0.1.0, the first released version with the datasets feature). The registry shipped in src/spatialdata/datasets.yaml is parsed and fetched (downloaded, hash-verified, cached, loaded) at call time.

The actual download is exercised by test_cells_download, marked slow; the network-free test_cells_registry validates the shipped registry on every run.

timtreisand others added 2 commits June 22, 2026 10:54
Expose spatialdata.datasets.cells() alongside blobs/raccoon. It downloads
the cells example dataset and loads it as a SpatialData object, reusing the
scverse-misc datasets infrastructure (parse_registry + fetch with the
built-in spatialdata loader) rather than reimplementing a downloader.
- ship src/spatialdata/datasets.yaml registry (base_url + cells.zip sha256)
- add scverse-misc[datasets]>=0.0.10 dependency
- bump requires-python and ruff target to 3.12 (scverse-misc requires >=3.12)
- update CI matrix 3.11 -> 3.12
- docs + network-free registry test and a slow download test
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecovBot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.41%. Comparing base (2debe5f) to head (5451a53).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@ Coverage Diff @@## main #1149 +/- ##
==========================================
+ Coverage 92.40% 92.41% +0.01% 
==========================================
Files 52 52 Lines 7858 7874 +16 ==========================================
+ Hits 7261 7277 +16 
Misses 597 597 
Files with missing linesCoverage Δ
src/spatialdata/datasets.py100.00% <100.00%> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

timtreisand others added 2 commits June 22, 2026 12:17
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@LucaMarconato

LucaMarconato commented Jun 27, 2026

Copy link
Copy Markdown
Member

Didn't dive deep but this looks great. One important thing is missing, for each dataset we must list the license, and if the license requires attribution, we need to list that. Could you please add this?

timtreisand others added 2 commits July 6, 2026 15:04
The cells dataset is derived from the 10x Genomics Xenium Prime Cervical
Cancer FFPE sample, released under CC BY 4.0 (attribution required). Record
the license and attribution in the registry and document the expectation
that every dataset lists its license.
@timtreis

Copy link
Copy Markdown
MemberAuthor

@LucaMarconato added the license info 👌

@ajkswamyajkswamy left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, here are some suggestions for improvements:

  1. Please add a link to the associated PR in spatialdata-notebooks. Please also add a couple of lines describing the motivation for this PR along which what value it adds. I see the assocated PR in spatialdata-notebooks already has a couple of good lines in this direction.

Comment threadtests/datasets/test_datasets.py
Comment threadsrc/spatialdata/datasets.py
Comment threadsrc/spatialdata/datasets.py Outdated
import pooch
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

please also cover the "else" case here in tests.

Comment threadsrc/spatialdata/datasets.py Outdated
from scverse_misc.datasets import fetch, parse_registry

cache_dir = Path(path) if path is not None else Path(pooch.os_cache("spatialdata"))
registry = importlib.resources.files("spatialdata").joinpath("datasets.yaml")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I see the three lines here are also used in the unit test for this function. Would it make sense to make this into a separate function. Maybe it will be reused if we add more datasets that use this pattern from spatialdata-misc

timtreisand others added 4 commits August 14, 2026 19:12
Extract _shipped_registry() and _cache_dir() helpers, shared between
cells() and the tests, removing the duplicated registry-parsing block.
_cache_dir() isolates the path-vs-default branch so both sides are
covered without a network call.
Describe the dataset contents in the docstring, and assert the concrete
element counts and shapes in test_cells_download.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
parse_registry is untyped in the mypy env, so returning its result
directly tripped no-any-return; assign through annotated locals.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment threadtests/datasets/test_datasets.py Outdated
Comment on lines +55 to +57
@pytest.mark.slow
def test_cells_download(tmp_path) -> None:
# Downloads ~3 MB from the scverse example data bucket; opt out with `-m "not slow"`.

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.

Rather than opt-out, I'll try turning this into opt-in and skip the test by default.

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.

Done, made opt-in and opting in in the GitHub CI.

It's a small dataset here and not a big deal, but later when we test cloud support it's good that we differentiate between tests require a network and tests that do not.

LucaMarconatoand others added 2 commits August 18, 2026 14:05
Rename the `slow` marker to `network` and flip it from opt-out
(`-m "not slow"`) to opt-in: tests marked `network` are skipped
unless `--run-network` is passed. Enable the flag in CI so
`test_cells_download` runs there, and document the `license_url`
convention for CC-BY-style datasets in datasets.yaml.
@LucaMarconato

Copy link
Copy Markdown
Member

Thanks both @timtreis and @ajkswamy. The new dataset downloader works great!

Made only some minor changes, auto-merging now.

@LucaMarconato
LucaMarconato enabled auto-merge (squash) August 18, 2026 12:06
@LucaMarconato
LucaMarconato merged commit f31ff45 into mainAug 18, 2026
10 checks passed
@LucaMarconato
LucaMarconato deleted the add-cells-dataset branch August 18, 2026 12:26
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@timtreis@LucaMarconato@ajkswamy