From 9016d6fd988a7c42f9e33d601a9d4d6b1d2df5f8 Mon Sep 17 00:00:00 2001 From: Alex Rubinsteyn Date: Tue, 29 Sep 2026 11:38:49 -0400 Subject: [PATCH] Fix source distribution tests and modernize license metadata --- .github/workflows/tests.yml | 35 +++++++++-- .gitignore | 1 + .../unicode_data/13.0.0/charmap.json.gz | Bin 20988 -> 0 bytes MANIFEST.in | 3 + gtfparse/__init__.py | 2 +- gtfparse/read_gtf.py | 8 +-- gtfparse/write_gtf.py | 3 +- pyproject.toml | 11 ++-- tasks/todo.md | 55 ++++++++++++++++++ test.sh | 3 +- .../unicode_data/13.0.0/charmap.json.gz | Bin 20988 -> 0 bytes tests/data.py | 3 +- tests/test_expand_attribute_column_false.py | 5 +- tests/test_gencode_gtf.py | 8 +-- 14 files changed, 108 insertions(+), 29 deletions(-) delete mode 100644 .hypothesis/unicode_data/13.0.0/charmap.json.gz create mode 100644 MANIFEST.in delete mode 100644 tests/.hypothesis/unicode_data/13.0.0/charmap.json.gz diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index adf2660..aff6f1f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,15 +1,40 @@ # This workflow will install Python dependencies, run tests and lint with a variety of Python versions # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python -# TODO: -# - cache this directory $HOME/.cache/pyensembl/ -# - update coveralls -# - get a badge for tests passing -# - download binary dependencies from conda name: Tests on: [push, pull_request] jobs: + packaging: + runs-on: ubuntu-latest + strategy: + matrix: + include: + - python-version: "3.9" + setuptools: "setuptools==77.0.3" + - python-version: "3.11" + setuptools: "setuptools" + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install build and test dependencies + run: | + python -m pip install --upgrade pip + python -m pip install --upgrade build twine wheel ruff pytest pytest-cov '${{ matrix.setuptools }}' -r requirements.txt + - name: Build and validate distributions + run: | + python -m build --no-isolation + python -m twine check --strict dist/* + - name: Run lint and tests from the source distribution + run: | + archive_dir=$(mktemp -d) + tar -xzf dist/gtfparse-*.tar.gz -C "$archive_dir" + cd "$archive_dir"/gtfparse-* + ./lint.sh + ./test.sh -W error::DeprecationWarning + build: runs-on: ubuntu-latest strategy: diff --git a/.gitignore b/.gitignore index ba74660..65637cb 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ htmlcov/ .coverage .coverage.* .cache +.hypothesis/ nosetests.xml coverage.xml *,cover diff --git a/.hypothesis/unicode_data/13.0.0/charmap.json.gz b/.hypothesis/unicode_data/13.0.0/charmap.json.gz deleted file mode 100644 index 67b0e0b6122cfb995ebc7ff6edc4768da028d68b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20988 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%0AoPQH-PAd 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 diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..ba435b8 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +include lint.sh test.sh +recursive-include tests *.py +recursive-include tests/data *.gtf *.gtf.gz diff --git a/gtfparse/__init__.py b/gtfparse/__init__.py index a3dfadd..b0b9c25 100644 --- a/gtfparse/__init__.py +++ b/gtfparse/__init__.py @@ -24,7 +24,7 @@ ) from .write_gtf import write_gtf -__version__ = "2.9.0" +__version__ = "2.9.1" __all__ = [ "GENCODE_BIOTYPE_ALIASES", diff --git a/gtfparse/read_gtf.py b/gtfparse/read_gtf.py index 6b1f12c..eef49ac 100644 --- a/gtfparse/read_gtf.py +++ b/gtfparse/read_gtf.py @@ -197,11 +197,11 @@ def parse_gtf_and_expand_attributes( filepath_or_buffer, restrict_attribute_columns=None, features=None, *, progress_callback=None ): """ - Parse lines into column->values dictionary and then expand + Parse a GTF into a Polars DataFrame and then expand the 'attribute' column into multiple columns. This expansion happens by replacing strings of semi-colon separated key-value values in the 'attribute' column with one column per distinct key, with a list of - values for each row (using None for rows where key didn't occur). + values for each row (using empty strings for rows where the key didn't occur). Parameters ---------- @@ -324,7 +324,7 @@ def read_gtf( expand_attribute_column : bool Replace strings of semi-colon separated key-value values in the 'attribute' column with one column per distinct key, with a list of - values for each row (using None for rows where key didn't occur). + values for each row (using empty strings for rows where the key didn't occur). infer_biotype_column : bool Due to the annoying ambiguity of the second GTF column across multiple @@ -338,7 +338,7 @@ def read_gtf( column_cast_types : dict, optional Dictionary mapping column names to dtypes. Will cast columns to given - Polars types. + pandas-compatible types. usecols : list of str or None Restrict which columns are loaded to the give set. If None, then diff --git a/gtfparse/write_gtf.py b/gtfparse/write_gtf.py index a404740..af7a62e 100644 --- a/gtfparse/write_gtf.py +++ b/gtfparse/write_gtf.py @@ -59,8 +59,7 @@ def _attribute_expr(attribute_columns: list[str]) -> polars.Expr: empty string (string columns) and cannot distinguish absent from present-but-empty, so we treat both null and "" as absent. Values that are merely falsy but non-empty -- notably the string "0" -- are written and - survive a round trip (this is the regression that the naive ``if value:`` - check in earlier drafts got wrong). + survive a round trip. """ if not attribute_columns: return polars.lit("") diff --git a/pyproject.toml b/pyproject.toml index 3f10af2..f9c5c1b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools>=61.0", "wheel"] +requires = ["setuptools>=77.0.3", "wheel"] build-backend = "setuptools.build_meta" [project] @@ -7,12 +7,13 @@ name = "gtfparse" requires-python = ">=3.9" authors = [ {name="Alex Rubinsteyn", email="alex.rubinsteyn@unc.edu" } ] description = "Parsing library for extracting data frames of genomic features from GTF files" +license = "Apache-2.0" +license-files = ["LICENSE"] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "Operating System :: OS Independent", "Intended Audience :: Science/Research", - "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", @@ -71,13 +72,13 @@ select = [ ] ignore = [ "E501", # line too long (handled by formatter) - "E741", # ambiguous variable name (pre-existing in codebase) - "B006", # mutable default args (pre-existing; behavior-risky to change) + "E741", # ambiguous variable names + "B006", # mutable default arguments "B008", # do not perform function calls in argument defaults "B905", # zip() without explicit strict "SIM108", # use ternary operator instead of if-else "UP007", # use X | Y for type unions (need Python 3.10+) - "UP031", # %-format strings (pre-existing; out of scope for config PR) + "UP031", # %-format strings ] [tool.ruff.lint.per-file-ignores] diff --git a/tasks/todo.md b/tasks/todo.md index b5b2c81..7737ed7 100644 --- a/tasks/todo.md +++ b/tasks/todo.md @@ -137,3 +137,58 @@ file I/O and output conversion; see the PR validation record for its result. Release completion is recorded in the PR after CI, merge, and deployment so the deployment checkout remains clean. + +# Packaging and cleanup: #53, #76, #83 + +## Specification + +The 2.9.0 source distribution contains test modules but omits `tests/__init__.py`, +`tests/data.py`, and the GTF fixtures. Reproduced six collection errors from an +extracted release tarball. Add a manifest that ships all test Python modules, +GTF/gzip fixtures, and lint/test entry scripts in the source distribution. +Keep tests out of the runtime wheel and do not include generated caches or the +unused 10 MB parquet artifact. + +Use SPDX `Apache-2.0` project license metadata, explicitly include `LICENSE`, +and raise the setuptools build requirement to 77.0.3, which supports PEP 639. +Remove the deprecated license classifier. Validate wheel and sdist metadata +and the embedded license text with both the minimum and current build backend. + +Add a packaging CI job on Python 3.9/minimum setuptools and Python 3.11/current +setuptools. Build with the selected backend, check distributions with twine, +extract the tarball in a temporary directory, and run the shipped `lint.sh` and +`test.sh` there. The existing runtime test matrix and coverage aggregation stay +in place. No unit tests for comment-only edits; real archive execution guards +the packaging bug. + +Complete #76's remaining comment/docstring cleanup and remove the two tracked +Hypothesis cache files; ignore future Hypothesis caches. Preserve lint rules +and script behavior. Bump 2.9.0 to 2.9.1; leave the existing README PR #74 alone. + +## Plan + +- [x] Read issues, repository guidance, package contents, and setuptools docs. +- [x] Reproduce the release-tarball failure and create a feature branch. +- [x] Check in with the packaging fix and verification plan. +- [x] Apply packaging metadata, manifest, CI, and comment/cache changes. +- [x] Run `./lint.sh` and `./test.sh` with deprecations as errors. +- [x] Verify both build backends, distribution metadata, extracted-archive + lint/tests, and wheel contents. +- [ ] Open PR, pass CI, merge, run `./deploy.sh` from clean master, and verify + the published wheel and source archive. + +## Review + +`./lint.sh` and all 143 tests pass with deprecations treated as errors in the +checkout and in extracted source archives built by setuptools 77.0.3 and 84.0.0. +Both backends build wheels from their source archives successfully, and all +four distributions pass `twine check --strict`. Verified that source archives +contain the helper, initializer, GTF fixtures, and lint/test scripts, but no +Hypothesis/bytecode caches or unused parquet file. Wheels contain no tests. +Wheel and source metadata both declare `License-Expression: Apache-2.0` and +`License-File: LICENSE`; included license bytes match the repository file. +Neither build emits the old license-classifier warning. Workflow YAML parses, +and git ignores Hypothesis caches at both previously tracked paths. + +Release verification will be recorded on the PR after deployment, keeping the +master checkout clean. diff --git a/test.sh b/test.sh index 97556bc..e40eb95 100755 --- a/test.sh +++ b/test.sh @@ -1,7 +1,6 @@ #!/usr/bin/env bash # Run the gtfparse test suite with a memory- and CPU-aware pytest-xdist -# worker count. See ~/code/trufflepig/test.sh for the rationale: running -# several sibling repos' suites concurrently can fork-bomb the laptop, +# worker count. Running several test suites concurrently can exhaust resources, # so we cap workers at min(cpu_reserve, available_RAM / PER_WORKER_GB). # xdist is optional — fall back to serial pytest when it isn't installed. # diff --git a/tests/.hypothesis/unicode_data/13.0.0/charmap.json.gz b/tests/.hypothesis/unicode_data/13.0.0/charmap.json.gz deleted file mode 100644 index 414a3027b8763ce48dc03c07a40ac1e551b95052..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20988 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 diff --git a/tests/data.py b/tests/data.py index 23aaacb..bca618e 100644 --- a/tests/data.py +++ b/tests/data.py @@ -3,7 +3,6 @@ def data_path(name): """ - Return the absolute path to a file in the varcode/test/data directory. - The name specified should be relative to varcode/test/data. + Return the absolute path to a fixture relative to tests/data. """ return os.path.join(os.path.dirname(__file__), "data", name) diff --git a/tests/test_expand_attribute_column_false.py b/tests/test_expand_attribute_column_false.py index b06a206..ab74485 100644 --- a/tests/test_expand_attribute_column_false.py +++ b/tests/test_expand_attribute_column_false.py @@ -1,7 +1,4 @@ -"""Regression tests for #56: read_gtf(expand_attribute_column=False) -used to raise NameError because the else branch referenced `result_df` -before it had been assigned. -""" +"""Reading a GTF without expanding its raw attribute column.""" import pandas as pd diff --git a/tests/test_gencode_gtf.py b/tests/test_gencode_gtf.py index 061928a..a344847 100644 --- a/tests/test_gencode_gtf.py +++ b/tests/test_gencode_gtf.py @@ -1,4 +1,4 @@ -"""Tests for GENCODE attribute aliases (#63) and version-column casting (#64).""" +"""Tests for GENCODE attribute aliases and version-column casting.""" import gzip import logging @@ -14,7 +14,7 @@ # ----------------------------- -# attribute_aliases (#63) +# Attribute aliases # ----------------------------- @@ -99,7 +99,7 @@ def test_attribute_aliases_with_empty_dict_is_noop(): # ----------------------------- -# cast_version_columns (#64) +# Version-column casting # ----------------------------- @@ -157,7 +157,7 @@ def test_version_columns_missing_when_attribute_absent(): # ----------------------------- -# Interaction between #63 and #64 +# Interaction between aliases and version-column casting # -----------------------------