petl v1.7.20 - None Capture Semantics


petl v1.7.20 was published on July 21, 2026, with a focused correction to capture: cells containing None are now treated as non matching. That change matters for extraction pipelines where a missing value must not pass through the same path as a successful match. This is a regular release, not a prerelease.

The full release notes and downloads are on the GitHub release page.

The functional change in this release is narrow. Under pull request 701, capture treats a cell with the Python value None as non matching. The notes do not claim broader changes to capture expressions, table iteration, or conversion behavior.

That distinction is useful in ETL work because None commonly represents a missing source field, a nullable join result, or a value that a parser could not produce. A missing cell should not be confused with text that actually satisfies a capture rule. The new behavior makes that boundary explicit for this operation.

Pipeline owners should still test the change against representative nullable data. The release notes do not mention a compatibility flag or a migration setting. Jobs that happened to depend on the earlier handling may produce different rows or captured values after the upgrade. A small fixture containing matched text, unmatched text, and None cells is enough to expose that difference before a scheduled job moves to the new tag.

Keep that validation close to the affected operation. Rerun transformations that call capture, then compare their row counts and captured fields with the current production result. Include direct None values as well as tables assembled from sources that can yield missing cells. If a job does not call capture, the release notes describe no other data path change that calls for special output validation.

The release notes call this a fix, not a general redesign. There is no stated new API and no stated performance change. The practical reason to upgrade is correctness when capture receives missing values, not throughput or a wider transformation feature.

Two maintainer facing changes accompany the capture fix. Pull request 702 modernizes the project CI and petl dependencies. The notes do not identify individual package pins, runner versions, or changes to the supported Python matrix, so consumers should not infer a new runtime requirement from that summary alone.

Pull request 696 removes the Codacy scan and improves test handling. This changes the project validation setup rather than the public transformation API. Removing one scan also does not establish a change in application security or package behavior. It only tells operators that this particular CI check is no longer part of the repository workflow described by the release.

Source build users should inspect the linked changes before copying the revised workflow or dependency setup. The short release summary does not provide enough detail to make a claim about reproducibility, supported environments, or dependency compatibility. Record the resolved dependency set used by the existing build, then compare it with the result from the new tag if those details matter to the deployment process.

Together, these items make most of v1.7.20 a maintenance release around one observable data semantics fix. Teams that vendor petl or mirror its build process may want to inspect the CI changes. Teams that only install the package should focus their acceptance tests on nullable input passed to capture.