Skip to content

release: v0.9.1 - #13

Merged
alexdobin merged 1 commit into
mainfrom
release/v0.9.1
Aug 20, 2026
Merged

alexdobin merged 1 commit into
mainfrom
release/v0.9.1

Conversation

@alexdobin

Copy link
Copy Markdown
Collaborator

Publishes v0.9.1. Full notes in CHANGELOG.md.

Changed — de(archive=…, layout='cell') reads cellstream's public CellStore.group_spans() instead of a private accessor. Behaviour is unchanged: same group table, same guards, verified on real archives in both reference modes.

Added — AUTHORS, a curated credit record. It credits the GPU fork of pdex that demonstrated the idea gpudge is built on, and records a production evaluation by someone other than this library's author.

Removed — docs/THIRD_PARTY_LICENSES.md. gpudge redistributes no third-party code — the wheel carries only the gpudge/ package, which the release workflow asserts on every publish — so the file had no notice obligation to discharge, and it had gone materially stale. SECURITY.md now states the actual situation.

Fixed

  • CITATION.cff named the previous release, so citing this library from its own metadata cited the wrong version.
  • Two pip install gpudge[fast] hints were unquoted; zsh, the macOS default shell, treats that as a glob and fails rather than installing.
  • The streaming extra's missing-dependency error still told callers to install from a checkout, which stopped being necessary when gpudge reached PyPI.
  • The publishing workflow now asserts that every file carrying the release version agrees with the tag — the check that would have caught the citation metadata. Its YAML inputs are parsed rather than pattern-matched, after several rounds of review produced file contents that passed a text-matching draft while publishing the wrong thing.

Verification

All four release gates pass against this exact tree and its built artifacts: the sdist allow-list, wheel containment, tag-versus-version, and version parity. Test suite 633 passed / 202 skipped on a CPU runner; the full suite passes on an H100 (971/1) and on a fresh unpinned resolve on an L4 (818/10) that had moved to newer torch, numba and scanpy than the pinned development environment.

Reads cellstream's public `group_spans()` instead of a private accessor, adds
`AUTHORS`, and removes a third-party licence audit that carried no notice
obligation -- gpudge redistributes no third-party code, and the wheel contains
only the package.

Also fixes metadata and messages that had gone stale: `CITATION.cff` named the
previous release, so citing this library from its own metadata cited the wrong
version; two `pip install gpudge[fast]` hints were unquoted, which zsh treats as
a glob and refuses; and the streaming extra's missing-dependency error still told
callers to install from a checkout, which stopped being necessary when gpudge
reached PyPI.

The publishing workflow now asserts that every file carrying the release version
agrees with the tag, which is what would have caught the citation metadata. Full
notes in CHANGELOG.md.
@alexdobin
alexdobin merged commit 6623279 into main Aug 20, 2026
4 checks passed

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Code Review

This pull request updates gpudge to version 0.9.1, migrating from cellstream's private _load_groups() API to the public group_spans() API and manifest properties. It introduces a centralized label_str helper to safely decode bytes labels, removes the stale third-party license documentation, adds an AUTHORS file, and updates install hints and error messages to reflect the PyPI release of cellstream. The review feedback correctly identifies that the type check isinstance(ref, list) when parsing reference labels is too restrictive and fragile, and suggests supporting other iterable types like tuples, sets, or numpy arrays to prevent malformed label strings.

if ref is None:
return None, ranges
ref_labels = [str(x) for x in (ref if isinstance(ref, list) else [ref])]
ref_labels = [label_str(x) for x in (ref if isinstance(ref, list) else [ref])]

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Checking strictly for list using isinstance(ref, list) is fragile and non-idiomatic. If ref is a tuple, set, or numpy.ndarray of reference labels, it will be wrapped in a list as a single element (e.g., [('ntc', 'safe')]), causing label_str to stringify the entire sequence into a single malformed label string like "('ntc', 'safe')".

Consider checking for a broader set of sequence/iterable types, or checking if ref is a string/bytes first and treating it as an iterable otherwise, to align with how validate_archive_reference handles reference sequences.

ref_labels = [label_str(x) for x in (ref if isinstance(ref, (list, tuple, set, np.ndarray)) else [ref])]

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Code Review

This pull request bumps the version of gpudge to 0.9.1 and migrates the streaming path from using cellstream's private _load_groups() API to the public group_spans() API. It introduces robust validation of group spans, decodes bytes labels via a new label_str helper, and improves missing-dependency error messages. Additionally, the PR adds an AUTHORS file, removes the stale THIRD_PARTY_LICENSES.md file, quotes install hints to prevent shell globbing issues, and updates documentation and tests to reflect the shardad to cellstream rename. As there were no review comments provided, I have no feedback to provide on reviewer comments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant