Skip to content

fix: audit-driven cleanup of packaging, CI, and silent failures#4

Merged
hutaobo merged 2 commits into
mainfrom
claude/review-package-defects-o4Jwo
May 20, 2026
Merged

fix: audit-driven cleanup of packaging, CI, and silent failures#4
hutaobo merged 2 commits into
mainfrom
claude/review-package-defects-o4Jwo

Conversation

@hutaobo

@hutaobo hutaobo commented May 20, 2026

Copy link
Copy Markdown
Owner

Summary

Audit of pyXenium on the 0.4.6 branch surfaced 9 high/medium-severity defects plus
15 silent except Exception: sites. All of them are fixed in this PR.

High-severity

  • Sync version across _version.py (0.4.6), README.md, docs/changelog.md
  • Stop shipping _vendor/Gmi/.github/** workflow files inside the wheel
  • Expand CI Python matrix to 3.10–3.13 and drop the duplicate test.yml workflow; narrow requires-python/classifiers to >=3.10 so claim and reality agree (scientific stack already excludes 3.8/3.9 in practice)
  • Fix the self-contradicting pyXenium.spatho row in the README features table (spatho is external; the in-repo helper is build_spatho_manifest)
  • Replace the only bare except: in src (multimodal/analysis/differential.py) with except AttributeError so non-toarray failures surface
  • Plug fsspec handle leaks in io.xenium_artifacts.open_text (release on TextIOWrapper/GzipFile construction error) and in read_cell_feature_matrix_h5 (close the fsspec fileobj when h5py.File(fileobj, ...) fails before falling back to a local re-open)
  • Seed np.random.random in the SCILD CCI adapter via SCILD_SEED env var so benchmark runs are reproducible

Medium / hygiene

  • Pin aiohttp>=3.9 (previously the only unpinned runtime dependency)
  • Add logger.warning(...) / logger.debug(...) to 15 silent except Exception: sites in multimodal/histoseg_lazyslide.py (×13), multimodal/immune_resistance.py, and _topology_core.safe_to_parquet — whole-slide / contour pipeline failures are now diagnosable

Defects NOT fixed (excluded by design)

  • tests/test_dataset_catalog.py:5 was flagged by audit as a "network call" — verified to be only a startswith string assertion, not actually a network call. No change needed.
  • XeniumOmeTiffSource.open_zarr_source was a candidate for context-manager conversion, but all 5 existing call sites in contour/loading.py, io/slide_store.py, io/backfill.py, and io/xenium_slide_builder.py already wrap usage in try/finally with store.close(). Changing the signature would touch 4 files for no real leak — skipped. The h5py interaction bug (D12) at xenium_artifacts.py:614-618 was a real leak and is fixed.
  • Other _vendor/Gmi/ R metadata (DESCRIPTION, NAMESPACE, LICENSE.md, etc.) remains in package-data because assert_vendored_gmi_complete() checks for them at runtime.

Test plan

  • pytest -q293 passed, 2 skipped, 0 failed locally
  • python -c "import pyXenium; assert pyXenium.__version__ == '0.4.6'"
  • python -c "from pyXenium.gmi import assert_vendored_gmi_complete; assert_vendored_gmi_complete()" — vendor completeness check still passes
  • python -m build — wheel builds cleanly; unzip -l dist/pyxenium-0.4.6-*.whl | grep _vendor/Gmi/.github returns no hits
  • python -c "import pyXenium; pyXenium.spatho" raises AttributeError as expected (README no longer misleads)
  • grep -rn 'except:\s*$' src/pyXenium → no hits
  • grep -rn 'np\.random\.random(' src/pyXenium → no hits
  • CI matrix on 3.10/3.11/3.12/3.13 green on this PR
  • sphinx-build docs job green on this PR

Generated by Claude Code

Summary by Sourcery

围绕 pyXenium 0.4.6 收紧打包、CI 和运行时行为,以提升可靠性、可诊断性和可复现性。

Bug 修复:

  • 确保在文本和 HDF5 读取器中,当失败时可以正确关闭基于 fsspec 的句柄,以避免资源泄漏。
  • 将 RNA 表达 dataframe 的转换逻辑限制为只捕获 AttributeError,从而不再静默吞掉其他类型的失败。
  • 通过可配置的随机种子环境变量,使 SCILD 基准测试初始化具有可复现性。

增强:

  • 在 histoseg、免疫耐受以及拓扑相关代码路径中,给此前静默的宽泛异常处理器添加调试和警告日志,以便流水线失败时可以被诊断。

构建:

  • 在元数据和分类器中将支持的 Python 最低版本提升到 3.11,将 aiohttp 固定为 >=3.9,并停止在 wheel 中包含自带的 Gmi GitHub workflow 文件。

CI:

  • 将 CI 整合为单一工作流,对 Python 3.11–3.13 进行测试,并新增专门的文档构建任务。

文档:

  • 更新 README 功能表,澄清空间病理学集成是通过外部 spatho 桥接加辅助工具实现;将文档中记录的版本和安装示例提升至 0.4.6,并在变更日志中记录打包和可靠性方面的更改。
Original summary in English

Summary by Sourcery

Tighten packaging, CI, and runtime behavior around pyXenium 0.4.6 to improve reliability, diagnostics, and reproducibility.

Bug Fixes:

  • Ensure fsspec-backed handles are properly closed on failure in text and HDF5 readers to avoid resource leaks.
  • Constrain RNA expression dataframe conversion to only catch AttributeError so other failures are no longer silently swallowed.
  • Make SCILD benchmarking initialization reproducible via a configurable random seed environment variable.

Enhancements:

  • Add debug and warning logs to previously silent broad exception handlers in histoseg, immune resistance, and topology code paths so pipeline failures become diagnosable.

Build:

  • Raise the supported Python version floor to 3.11 in metadata and classifiers, pin aiohttp to >=3.9, and stop including vendored Gmi GitHub workflow files in the wheel.

CI:

  • Consolidate CI into a single workflow that tests against Python 3.11–3.13 and adds a dedicated documentation build job.

Documentation:

  • Update the README feature table to clarify the spatial pathologist integration as an external spatho bridge plus helper, bump the documented version and install snippet to 0.4.6, and document packaging and reliability changes in the changelog.

Bug 修复:

  • 确保在 text 和 HDF5 readers 中,基于 fsspec 的文件句柄在出错时能够被正确关闭,以防止资源泄漏。
  • 收紧 RNA expression dataframe 转换逻辑,仅捕获 AttributeError,以便其他类型的失败能够暴露出来,而不是被静默吞掉。
  • 使 SCILD benchmarking adapter 的随机种子可通过环境变量配置,从而实现可复现的初始化。

增强改进:

  • 在 histoseg、immune resistance 和 topology 相关代码路径中,为之前使用宽泛异常捕获的逻辑添加 debug 和 warning 级别日志,以帮助定位流水线失败原因。
  • 在 README 的功能列表中进一步说明 spatial pathologist 集成是由一个外部 spatho bridge 加上仓库内的 helper 组成,并更新带版本号的安装示例。
  • 在 changelog 中记录 0.4.6 版本发布,补充有关打包、Python 支持范围以及可靠性改进的说明。

构建(Build):

  • pyproject 元数据和运行时 classifiers 中,将支持的 Python 版本限制为 3.10+,并将 aiohttp 固定为 >=3.9,以获得更可预期的依赖解析行为。
  • 精简内置的 Gmi 包数据,将内部 GitHub workflow 和元数据文件排除在生成的 wheel 之外。

CI:

  • 将 CI 合并为单一 workflow,在 Python 3.10–3.13 上进行测试,并新增独立的文档构建 job。
Original summary in English

Summary by Sourcery

围绕 pyXenium 0.4.6 收紧打包、CI 和运行时行为,以提升可靠性、可诊断性和可复现性。

Bug 修复:

  • 确保在文本和 HDF5 读取器中,当失败时可以正确关闭基于 fsspec 的句柄,以避免资源泄漏。
  • 将 RNA 表达 dataframe 的转换逻辑限制为只捕获 AttributeError,从而不再静默吞掉其他类型的失败。
  • 通过可配置的随机种子环境变量,使 SCILD 基准测试初始化具有可复现性。

增强:

  • 在 histoseg、免疫耐受以及拓扑相关代码路径中,给此前静默的宽泛异常处理器添加调试和警告日志,以便流水线失败时可以被诊断。

构建:

  • 在元数据和分类器中将支持的 Python 最低版本提升到 3.11,将 aiohttp 固定为 >=3.9,并停止在 wheel 中包含自带的 Gmi GitHub workflow 文件。

CI:

  • 将 CI 整合为单一工作流,对 Python 3.11–3.13 进行测试,并新增专门的文档构建任务。

文档:

  • 更新 README 功能表,澄清空间病理学集成是通过外部 spatho 桥接加辅助工具实现;将文档中记录的版本和安装示例提升至 0.4.6,并在变更日志中记录打包和可靠性方面的更改。
Original summary in English

Summary by Sourcery

Tighten packaging, CI, and runtime behavior around pyXenium 0.4.6 to improve reliability, diagnostics, and reproducibility.

Bug Fixes:

  • Ensure fsspec-backed handles are properly closed on failure in text and HDF5 readers to avoid resource leaks.
  • Constrain RNA expression dataframe conversion to only catch AttributeError so other failures are no longer silently swallowed.
  • Make SCILD benchmarking initialization reproducible via a configurable random seed environment variable.

Enhancements:

  • Add debug and warning logs to previously silent broad exception handlers in histoseg, immune resistance, and topology code paths so pipeline failures become diagnosable.

Build:

  • Raise the supported Python version floor to 3.11 in metadata and classifiers, pin aiohttp to >=3.9, and stop including vendored Gmi GitHub workflow files in the wheel.

CI:

  • Consolidate CI into a single workflow that tests against Python 3.11–3.13 and adds a dedicated documentation build job.

Documentation:

  • Update the README feature table to clarify the spatial pathologist integration as an external spatho bridge plus helper, bump the documented version and install snippet to 0.4.6, and document packaging and reliability changes in the changelog.

Sync 0.4.6 version across _version.py / README / changelog and stop the
README features table from advertising a non-existent pyXenium.spatho
namespace (the entry point is build_spatho_manifest + external spatho).

Stop shipping _vendor/Gmi/.github workflow files inside the wheel and
narrow requires-python / classifiers to >=3.10 (scientific stack already
excludes 3.8-3.9). Expand CI matrix to 3.10-3.13 and drop the duplicate
test.yml workflow. Pin aiohttp>=3.9 so it stops being the only unpinned
runtime dependency.

Replace the only bare except: in src (multimodal/analysis/differential.py)
with a precise AttributeError so non-toarray failures surface. Plug fsspec
handle leaks in io.xenium_artifacts.open_text (release on
TextIOWrapper/GzipFile construction error) and in read_cell_feature_matrix_h5
(close the fsspec fileobj when h5py.File(fileobj, ...) fails before falling
back to a local re-open). Seed np.random in the SCILD CCI adapter via
SCILD_SEED env var so benchmark runs are reproducible.

Add logger.warning / logger.debug to 13 silent except Exception sites in
multimodal/histoseg_lazyslide.py, 1 in multimodal/immune_resistance.py, and
1 in _topology_core.safe_to_parquet so whole-slide / contour pipeline
failures are diagnosable.
@sourcery-ai

sourcery-ai Bot commented May 20, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

基于审计的维护型发行版:收紧 Python/支持元数据与 CI,改善打包卫生,修复 fsspec/h5py 句柄泄漏和差异分析中的裸 except,用可配置随机种子保证 SCILD 基准测试可复现,并为此前静默的宽泛异常处理增加日志记录,同时更新文档和版本信息。

File-Level Changes

Change Details Files
为此前静默的宽泛异常处理增加日志记录,使多模态和拓扑相关失败可诊断。
  • 在 histoseg_lazyslide、immune_resistance 和 _topology_core 中实例化模块级 logger。
  • 包装现有宽泛的 try/except 代码块,捕获 Exception 到变量,并在其中输出带相关上下文的 debug 或 warning 日志。
  • 在让失败通过日志可见的同时,保留现有回退行为(返回值/默认值)。
src/pyXenium/multimodal/histoseg_lazyslide.py
src/pyXenium/multimodal/immune_resistance.py
src/pyXenium/_topology_core.py
修复 Xenium artifact 读取器中使用 fsspec 和 h5py 时的资源泄漏和错误处理问题。
  • 在 open_text 中用 try/except 包装 TextIOWrapper/GzipFile 的创建,并在构造失败重新抛出前确保底层 fsspec 句柄被关闭。
  • 在通过 h5py.File(fileobj, ...) 打开 HDF5 文件失败时,显式关闭 fsspec fileobj,然后再回退到通过路径打开。
  • 对调用方而言,成功路径上的行为保持不变。
src/pyXenium/io/xenium_artifacts.py
通过可配置随机种子使 SCILD CCI 基准测试适配器具备可复现性,并移除直接使用 np.random.random。
  • 从环境变量中读取 SCILD_SEED(默认 0),并同时为旧版 NumPy RNG 和新的 default_rng 实例设定随机种子。
  • 将用于 SCILD 初始化的 np.random.random 调用替换为 rng.random,以确保所有抽样都来自设好种子的 Generator。
  • 保持其他 SCILD 适配器行为不变,包括由环境控制的 NITER_MAX。
src/pyXenium/benchmarking/cci_adapters.py
收紧 Python 版本支持与依赖限制,并清理内置 Gmi 的打包元数据。
  • 将 requires-python 提升为 >=3.11,并移除 Python 3.8–3.10 的 classifier,确保元数据与实际运行时下限一致。
  • 将 aiohttp 固定为 >=3.9,而不是不设上界。
  • 将内置 Gmi 的 package-data 精简为运行时实际需要的 R 文件,从 wheel 中移除 .github 工作流路径和点文件。
pyproject.toml
使文档和 README 与 0.4.6 版本及行为变更保持一致。
  • 在更新日志中新增 0.4.6 章节,说明打包、CI、日志与可靠性相关的变更。
  • 更新 README 功能表,澄清空间病理学集成是通过外部 spatho 包加 build_spatho_manifest 实现的,而不是 pyXenium.spatho 模块。
  • 将文档中的当前版本号和 pip install 代码片段从 0.4.5 更新为 0.4.6。
docs/changelog.md
README.md
改进 CI 覆盖率和 Sphinx 文档校验,并整合工作流配置。
  • 扩展主 CI 工作流,通过矩阵策略在 Python 3.11–3.13 上运行测试,并禁用 fail-fast。
  • 新增专门的文档任务,安装项目并在 sphinx-build 中将警告视为错误。
  • 移除多余的 test.yml 工作流,使 CI 配置集中在单一文件中。
.github/workflows/ci.yml
.github/workflows/test.yml
通过将裸 except 收缩为 AttributeError,澄清在转换 RNA 表达数据时的差异表达行为。
  • 将 get_rna_expr_df 中 expr.toarray() 周围的裸 except 改为仅捕获 AttributeError,使非转换类错误能够向外传播而不是被吞掉。
  • 保持当前对 expr 同时接受稀疏和稠密输入的行为不变。
src/pyXenium/multimodal/analysis/differential.py

Tips and commands

Interacting with Sourcery

  • 触发新评审: 在 pull request 中评论 @sourcery-ai review
  • 继续讨论: 直接回复 Sourcery 的评审评论。
  • 从评审评论生成 GitHub issue: 在某条评审评论下回复,请求 Sourcery 从该评论创建 issue。你也可以在评审评论下回复 @sourcery-ai issue 来从该评论创建 issue。
  • 生成 pull request 标题: 在 pull request 标题的任意位置写上 @sourcery-ai,即可随时生成标题。也可以在 pull request 中评论 @sourcery-ai title 来(重新)生成标题。
  • 生成 pull request 摘要: 在 pull request 正文的任意位置写上 @sourcery-ai summary,即可在指定位置生成 PR 摘要。也可以在 pull request 中评论 @sourcery-ai summary 来(重新)生成摘要。
  • 生成评审者指南: 在 pull request 中评论 @sourcery-ai guide,即可随时(重新)生成评审者指南。
  • 批量解决所有 Sourcery 评论: 在 pull request 中评论 @sourcery-ai resolve,即可将所有 Sourcery 评论标记为已解决。如果你已经处理完所有评论且不再想看到它们,这会很有用。
  • 批量忽略所有 Sourcery 评审: 在 pull request 中评论 @sourcery-ai dismiss,即可忽略所有现有 Sourcery 评审。尤其适合想从头开始新一轮评审的情况——别忘了再评论 @sourcery-ai review 来触发新评审!

Customizing Your Experience

打开你的 dashboard 以:

  • 启用或禁用评审功能,比如 Sourcery 生成的 pull request 摘要、评审者指南等。
  • 更改评审语言。
  • 添加、移除或编辑自定义评审指令。
  • 调整其他评审设置。

Getting Help

Original review guide in English

Reviewer's Guide

Audit-driven maintenance release that tightens Python/support metadata and CI, improves packaging hygiene, fixes fsspec/h5py handle leaks and a bare except in differential analysis, seeds SCILD benchmarking for reproducibility, and adds logging around previously silent broad exception handlers plus documentation/version updates.

File-Level Changes

Change Details Files
Add logging to previously silent broad exception handlers so multimodal and topology failures are diagnosable.
  • Instantiate module-level loggers in histoseg_lazyslide, immune_resistance, and _topology_core.
  • Wrap existing broad try/except blocks to capture Exception as a variable and emit debug or warning logs with relevant context.
  • Preserve existing fallback behavior (returns/defaults) while making failures visible via logs.
src/pyXenium/multimodal/histoseg_lazyslide.py
src/pyXenium/multimodal/immune_resistance.py
src/pyXenium/_topology_core.py
Fix resource leaks and error handling in Xenium artifact readers using fsspec and h5py.
  • Wrap TextIOWrapper/GzipFile creation in open_text with try/except and ensure the underlying fsspec handle is closed on construction failure before re-raising.
  • On failure to open an HDF5 file via h5py.File(fileobj, ...), explicitly close the fsspec fileobj before falling back to opening by path.
  • Keep existing success path behavior unchanged for callers.
src/pyXenium/io/xenium_artifacts.py
Make SCILD CCI benchmarking adapter reproducible via configurable seeding and remove direct np.random.random usage.
  • Read SCILD_SEED from the environment (defaulting to 0) and seed both the legacy NumPy RNG and a new default_rng instance.
  • Replace np.random.random calls used for SCILD initialization with rng.random so all draws come from the seeded Generator.
  • Keep other SCILD adapter behavior intact, including environment-driven NITER_MAX.
src/pyXenium/benchmarking/cci_adapters.py
Tighten Python version support and dependency pinning, and clean up vendored Gmi packaging metadata.
  • Raise requires-python to >=3.11 and drop Python 3.8–3.10 classifiers, ensuring metadata matches the effective runtime floor.
  • Pin aiohttp to >=3.9 instead of leaving it unbounded.
  • Reduce vendored Gmi package-data to the R files actually needed at runtime, removing .github workflow paths and dotfiles from the wheel.
pyproject.toml
Align documentation and README with version 0.4.6 and behavior changes.
  • Add a 0.4.6 section to the changelog describing packaging, CI, logging, and reliability changes.
  • Update README feature table to clarify that the spatial pathologist integration is via the external spatho package plus build_spatho_manifest, not a pyXenium.spatho module.
  • Update documented current version and pip install snippet from 0.4.5 to 0.4.6.
docs/changelog.md
README.md
Improve CI coverage and Sphinx docs verification while consolidating workflows.
  • Expand the primary CI workflow to test against Python 3.11–3.13 using a matrix strategy and disable fail-fast.
  • Add a dedicated docs job that installs the project and runs sphinx-build with warnings treated as errors.
  • Remove the redundant test.yml workflow so CI configuration lives in a single file.
.github/workflows/ci.yml
.github/workflows/test.yml
Clarify differential expression behavior by narrowing a bare except to AttributeError when converting RNA expression data.
  • Change the bare except around expr.toarray() in get_rna_expr_df to catch AttributeError only, so non-conversion errors propagate rather than being masked.
  • Maintain the existing behavior of accepting both sparse and dense inputs for expr.
src/pyXenium/multimodal/analysis/differential.py

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

zarr 3.0+ has never shipped a wheel for Python 3.10 (its requires_python
is >=3.11), so the new CI matrix on 3.10 failed at pip install:
"No matching distribution found for zarr>=3.1". The package never actually
ran on 3.10 — the previous (3.11-only) CI just never exercised that claim.

Align requires-python, classifiers, and CI matrix to >=3.11.
@hutaobo hutaobo marked this pull request as ready for review May 20, 2026 18:54
Copilot AI review requested due to automatic review settings May 20, 2026 18:54
@hutaobo hutaobo merged commit 705fc7a into main May 20, 2026
11 checks passed

@sourcery-ai sourcery-ai Bot left a comment

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.

Hey - 我已经审核了你的更改,一切看起来都很棒!


Sourcery 对开源项目是免费的——如果你喜欢我们的代码审查,欢迎帮忙分享 ✨
帮我变得更有用!请在每条评论上点 👍 或 👎,我会根据你的反馈来改进后续的代码审查。
Original comment in English

Hey - I've reviewed your changes and they look great!


Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Copilot AI 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.

Pull request overview

This PR addresses an audit backlog by tightening packaging metadata, CI coverage, and runtime robustness—primarily by eliminating silent exception swallowing, fixing a couple of fsspec/h5py handle-leak paths, and aligning docs/metadata around what the project actually supports/ships.

Changes:

  • Replace/augment broad exception handlers with targeted exceptions or debug/warning logs to avoid silent failures in multimodal workflows.
  • Fix resource-management edge cases for fsspec-backed readers (open_text, read_cell_feature_matrix_h5) and add reproducible seeding for the SCILD adapter via SCILD_SEED.
  • Clean up packaging/CI/docs: exclude vendored workflow files from wheels, pin aiohttp>=3.9, remove duplicate workflow, and update README/changelog.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/pyXenium/multimodal/immune_resistance.py Add logger + debug logging for resolve_protein_column fallback instead of silent broad exception.
src/pyXenium/multimodal/histoseg_lazyslide.py Add logger and debug/warning logs to previously silent broad exception fallbacks.
src/pyXenium/multimodal/analysis/differential.py Replace bare except: with except AttributeError when calling toarray().
src/pyXenium/io/xenium_artifacts.py Close fsspec handles on wrapper-construction failures and close fileobj on h5py.File(fileobj, ...) failure path.
src/pyXenium/benchmarking/cci_adapters.py Make SCILD seeding reproducible via SCILD_SEED and use a seeded Generator for initialization.
src/pyXenium/_topology_core.py Add logger + warning on parquet write failure instead of silent failure.
README.md Update version/install snippet and clarify spatho integration entry point (but Python support line is now stale).
pyproject.toml Restrict Python support to >=3.11, pin aiohttp>=3.9, and narrow vendored Gmi package-data globs.
docs/changelog.md Add 0.4.6 notes (but one bullet mismatches the actual SCILD seeding mechanism).
.github/workflows/test.yml Remove duplicate workflow.
.github/workflows/ci.yml Add Python matrix + docs job (but packaging build step is no longer run in PR CI).
Comments suppressed due to low confidence (1)

README.md:65

  • README still lists “Supported Python: >=3.8”, but pyproject.toml now requires Python >=3.11 and CI only tests 3.11–3.13. Please update this README line so users don’t attempt unsupported installs.
- Current repository version: `0.4.6`
- Package index: [PyPI](https://pypi.org/project/pyXenium/)
- Documentation site: [pyxenium.readthedocs.io](https://pyxenium.readthedocs.io/en/latest/)
- Canonical build status: [GitHub Actions CI](https://github.com/hutaobo/pyXenium/actions/workflows/ci.yml)
- Supported Python: `>=3.8`
- License: [GNU AGPL v3.0 only](https://github.com/hutaobo/pyXenium/blob/main/LICENSE)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread docs/changelog.md
- Expand CI Python matrix to `3.11`–`3.13` and remove the duplicate `test.yml` workflow.
- Fix bare `except:` in `multimodal.analysis.differential.get_rna_expr_df` so non-`AttributeError` failures surface.
- Plug fsspec handle leaks in `io.xenium_artifacts.open_text` (release on TextIOWrapper/GzipFile construction error) and in `read_cell_feature_matrix_h5` (close the fsspec fileobj when `h5py.File(fileobj, ...)` fails before falling back to a local re-open).
- Seed `np.random.random` in the SCILD CCI adapter; benchmark runs are now reproducible via a `seed` kwarg.
Comment thread pyproject.toml
Comment on lines 8 to 12
description = "Xenium I/O, multimodal analysis, topology workflows, contour-native spatial profiling, GMI inference, mechanostress analysis, and optional external workflow bridges."
readme = "README.md"
requires-python = ">=3.8"
requires-python = ">=3.11"
license = "AGPL-3.0-only"
license-files = ["LICENSE"]
Comment thread .github/workflows/ci.yml

- run: python -m pip install --upgrade pip
- run: python -m pip install -e ".[dev,docs]"
- run: pytest -q
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.

3 participants