Skip to content

Patch multi-licenses workaround #242 - #346

Merged
reactive-firewall merged 154 commits into
dev-v6.0from
patch-multi-license-242
Jul 30, 2026
Merged

Patch multi-licenses workaround #242#346
reactive-firewall merged 154 commits into
dev-v6.0from
patch-multi-license-242

Conversation

@reactive-firewall

@reactive-firewall reactive-firewall commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

Patch Notes

Pre-GHI #316 work to mitigate GHI #242 (by introducing --with-license-files as workaround)

BREAKING CHANGES

Important

Moving forward all single file behavior is deprecated; Starting with v6.1 support for single license behavior will start shifting to always supporting multi licenses. The rationale is simple: pip-licenses does not intend to provide legal determinations and thus should always (while still allowing --from filtering, etc.) provide the more accurate state of multiple licenses when declared by a package.

Important

Due to fix in support of multiple license sources (metadata + file(s)) allow/fail logic differentiates between BSD License, BSD-2-Clause and BSD-3-Clause (where legacy classifier based logic may have previously treated both as "BSD License").

New CLI flags introduced in a dedicated license_file_options group:

--with-license-files: Multi-file variant (currently: JSON, PLAIN_VERTICAL formats only). Will eventually replace --with-license-file.
--no-file-paths: Suppresses all file path outputs
--with-notice-files: Multiple notice files. (will eventually replace deprecated --with-notice-file)
--with-other-files: Enables file discovery for unlisted: Authors, Copying, Legal files.
Validation in _verify_args() ensures these flags are only used with compatible combinations.

Impacted GHIs:

Included & Superseded PR/MRs


stefan6419846 and others added 30 commits May 16, 2025 07:48
Bumps [cryptography](https://github.com/pyca/cryptography) from 44.0.3 to 45.0.2.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](pyca/cryptography@44.0.3...45.0.2)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 45.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [coverage[toml]](https://github.com/nedbat/coveragepy) from 7.8.0 to 7.8.1.
- [Release notes](https://github.com/nedbat/coveragepy/releases)
- [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst)
- [Commits](coveragepy/coveragepy@7.8.0...7.8.1)

---
updated-dependencies:
- dependency-name: coverage[toml]
  dependency-version: 7.8.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [cryptography](https://github.com/pyca/cryptography) from 45.0.2 to 45.0.3.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](pyca/cryptography@45.0.2...45.0.3)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 45.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [coverage[toml]](https://github.com/nedbat/coveragepy) from 7.8.1 to 7.8.2.
- [Release notes](https://github.com/nedbat/coveragepy/releases)
- [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst)
- [Commits](coveragepy/coveragepy@7.8.1...7.8.2)

---
updated-dependencies:
- dependency-name: coverage[toml]
  dependency-version: 7.8.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [zipp](https://github.com/jaraco/zipp) from 3.21.0 to 3.22.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](jaraco/zipp@v3.21.0...v3.22.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-version: 3.22.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [mypy](https://github.com/python/mypy) from 1.15.0 to 1.16.0.
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](python/mypy@v1.15.0...v1.16.0)

---
updated-dependencies:
- dependency-name: mypy
  dependency-version: 1.16.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.3.5 to 8.4.0.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@8.3.5...8.4.0)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 8.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [types-docutils](https://github.com/typeshed-internal/stub_uploader) from 0.21.0.20250526 to 0.21.0.20250604.
- [Commits](https://github.com/typeshed-internal/stub_uploader/commits)

---
updated-dependencies:
- dependency-name: types-docutils
  dependency-version: 0.21.0.20250604
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Previously, we would run *pycodestyle* through *pytest*. This is not
ideal because it connects static analysis with actual testing. Additionally,
previous runs showed that *pycodestyle* would not discover violations
like unused imports or "bad" non-PEP8 names.

Now, the linting is mostly unified with the library version (except that we
are still missing strict typing for the CLI). I decided to raise the line length
from 79 to 160 characters in the same step to improve readability, especially
since most devices are large enough nowadays to still display this in one line
without soft wrapping.
Bumps [zipp](https://github.com/jaraco/zipp) from 3.22.0 to 3.23.0.
- [Release notes](https://github.com/jaraco/zipp/releases)
- [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst)
- [Commits](jaraco/zipp@v3.22.0...v3.23.0)

---
updated-dependencies:
- dependency-name: zipp
  dependency-version: 3.23.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [cryptography](https://github.com/pyca/cryptography) from 45.0.3 to 45.0.4.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](pyca/cryptography@45.0.3...45.0.4)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 45.0.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [requests](https://github.com/psf/requests) from 2.32.3 to 2.32.4.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](psf/requests@v2.32.3...v2.32.4)

---
updated-dependencies:
- dependency-name: requests
  dependency-version: 2.32.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [coverage[toml]](https://github.com/nedbat/coveragepy) from 7.8.2 to 7.9.0.
- [Release notes](https://github.com/nedbat/coveragepy/releases)
- [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst)
- [Commits](coveragepy/coveragepy@7.8.2...7.9.0)

---
updated-dependencies:
- dependency-name: coverage[toml]
  dependency-version: 7.9.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [pytest-cov](https://github.com/pytest-dev/pytest-cov) from 6.1.1 to 6.2.0.
- [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst)
- [Commits](pytest-dev/pytest-cov@v6.1.1...v6.2.0)

---
updated-dependencies:
- dependency-name: pytest-cov
  dependency-version: 6.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [typing-extensions](https://github.com/python/typing_extensions) from 4.13.2 to 4.14.0.
- [Release notes](https://github.com/python/typing_extensions/releases)
- [Changelog](https://github.com/python/typing_extensions/blob/main/CHANGELOG.md)
- [Commits](python/typing_extensions@4.13.2...4.14.0)

---
updated-dependencies:
- dependency-name: typing-extensions
  dependency-version: 4.14.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
@reactive-firewall
reactive-firewall force-pushed the patch-multi-license-242 branch from 0102803 to 9dfc692 Compare July 30, 2026 05:12
@reactive-firewall
reactive-firewall merged commit 141ede4 into dev-v6.0 Jul 30, 2026
10 checks passed
@johnthagen

johnthagen commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

@reactive-firewall Does this fix:

I see mentions of "contributes" to, so I was curious what parts are still left pending, if any.

And is the plan for this to be included in pip-licenses 6?

@reactive-firewall

Copy link
Copy Markdown
Collaborator Author

@reactive-firewall Does this fix:

I see mentions of "contributes" to, so I was curious what parts are still left pending, if any.

Not fully, no (I'd call this a workaround, not a fix), this does improve the situation; however only for some formats, namely --format=json and --format=plain-vertical. Notably HTML and CSV formats are unresolved / not implemented yet (and of-course the rest of GHI #242 enhancements are un-implemented still).

There is also a bunch of technical debt around documentation and functional testing for #71.

This workaround is something that I've had git stashed in my local repo for almost a year now (from September 2025), and needed to be merged before the WIP on #316 could be litmus tested) and fixes #309 in such a way that can be migrated.

And is the plan for this to be included in pip-licenses 6?

Kinda. This is a transitional step included in the Major updates planned for the pip-licenses 6 series. Although I categorized this as part of Initial Compliance with Python Standards.

Regarding

This is not set in stone yet. Honestly, the biggest factor is: I'll really don't care to maintain this fix (as-is) long-term, not until the maintainability improvements for #316 have landed (but I also didn't want regressions in the middle of that work).

The main goal of #352 is to land some documentation improvements that were specifically requested there; That will only be a pre-release for those interested in the latest cutting-edge.

hopefully that helps answers your questions @johnthagen

@reactive-firewall reactive-firewall linked an issue Aug 1, 2026 that may be closed by this pull request
reactive-firewall added a commit that referenced this pull request Aug 10, 2026
…n than in Alpha-v6 (SUPERSEDES PR #346) (- WIP #242 -).

Specifically, fix for multiple values (including licenses) in plain vertical format.

Note: **PRIOR** GHI #242 workarounds were initially explored by including work inspired by stefan6419846/pip-licenses-cli#32 (this targeted RE-FIX might be in-turn inspired in part by that work, as it avoids pitfalls from testing that workaround on the old codebase)

Supersedes PR #346 (as an alternative Fix from before that PR merged)
reactive-firewall added a commit that referenced this pull request Aug 10, 2026
* dev-v6-split-output-plain:
  Selectively Re-fixed PlainVerticalTable in simpler more direct fashion than in Alpha-v6 (SUPERSEDES PR #346) (- WIP #242 -).
  Minor fix for fragil types with python 3.9 (- WIP #316 -)
  Further split off the plain format as per GHI #316
reactive-firewall added a commit that referenced this pull request Aug 10, 2026
* lower:
  Further split off the plain format as per GHI #316
  Further split off tables factory for building outputs as per #316
  Add simple stubs for imports and public API for pip-licenses.output (part of GHI #316)
  Minor fix for fragil types with python 3.9 (- WIP #316 -)
  Minor refactoring for even more fragile types with python 3.9 (- WIP #316 -)
  Selectively Re-fixed PlainVerticalTable in simpler more direct fashion than in Alpha-v6 (SUPERSEDES PR #346) (- WIP #242 -).
reactive-firewall added a commit that referenced this pull request Aug 10, 2026
  Fixup more fragile types with Python3.9 (- WIP #316 -)
  Further split off the rest of the json stuff (- WIP #316 -)
  Futher split off JsonPrettyTable into own module (- WIP #316 -)
  Further split off CSV output stuff (- WIP #316 -)
  Minor refactoring for even more fragile types with python 3.9 (- WIP #316 -)
  Selectively Re-fixed PlainVerticalTable in simpler more direct fashion than in Alpha-v6 (SUPERSEDES PR #346) (- WIP #242 -).
  Minor fix for fragil types with python 3.9 (- WIP #316 -)
  Further split off the plain format as per GHI #316
  WIP -- Add simple stubs for imports and public API for pip-licenses.output (part of GHI #316)
  Further split off tables factory for building outputs as per #316
reactive-firewall added a commit that referenced this pull request Aug 10, 2026
…oin-output-316

* dev-v6-re-join-output-316:
  Minor refactoring for even more fragile types with python 3.9 (- WIP #316 -)
  Selectively Re-fixed PlainVerticalTable in simpler more direct fashion than in Alpha-v6 (SUPERSEDES PR #346) (- WIP #242 -).
  Minor fix for fragil types with python 3.9 (- WIP #316 -)
  Fixup more fragile types with Python3.9 (- WIP #316 -)
  Add simple stubs for imports and public API for pip-licenses.output (part of GHI #316)
  Further split off the rest of the json stuff (- WIP #316 -)
  Futher split off JsonPrettyTable into own module (- WIP #316 -)
  Further split off CSV output stuff (- WIP #316 -)
  Further split off the plain format as per GHI #316
  Further split off tables factory for building outputs as per #316
reactive-firewall added a commit that referenced this pull request Aug 10, 2026
…n-316 (- WIP #316 -)

* dev-v6-beta-re-join-output-316:
  Minor fixup after merge (- WIP #316 -)
  Minor refactoring for even more fragile types with python 3.9 (- WIP #316 -)
  Selectively Re-fixed PlainVerticalTable in simpler more direct fashion than in Alpha-v6 (SUPERSEDES PR #346) (- WIP #242 -).
  Minor fix for fragil types with python 3.9 (- WIP #316 -)
  Fixup more fragile types with Python3.9 (- WIP #316 -)
  Post-split tweaks to fix fragile type annotations with Python3.9 (- WIP #316 -)
  Further split off the rest of the json stuff (- WIP #316 -)
  Futher split off JsonPrettyTable into own module (- WIP #316 -)
  Further split off CSV output stuff (- WIP #316 -)
  Further split off the plain format as per GHI #316
  Add simple stubs for imports and public API for pip-licenses.output (part of GHI #316)
  Further split off tables factory for building outputs as per #316
  Split off just outputs for GHI #316
reactive-firewall added a commit that referenced this pull request Aug 10, 2026
…rom the Alpha-v6 branch (to-be Superseded)

Namely: this patch backports my opertunistic improvements and related changes from the old fix in PR #346 (pre-GHI-316 workaround) but this backport carfully excluds any changes directly related to the fix of #242 (and from closely related GHI #71)

This patch should thus create an improved base (more maintainable and closer to stable) upon which the workaround for #242 (or more likly a derivitive, so not to pull in **hundreds** of unfiltered history)

This branch will supersede previous v6 development branches (included, or otherwise).
reactive-firewall added a commit that referenced this pull request Aug 10, 2026
#346) (- WIP #71 & #242 -)

🎉 A big, heart-felt thank you to @stefan6419846 for their work on stefan6419846/pip-licenses-cli#32 and for also reviewing #346 (upon which this workaround is closely based)

Implements some upcoming flags (plural) and contributes to supporting for multiple licenses in a single package for JSON and plain-vertical formats (but not others, e.g., HTML, etc.)

**IMPORTANT**
This workaround for GHI-71 (and related GHI-242) is ported from the Alpha-v6.0.0 branch and includes portions of PR #346 that was inspired by stefan6419846/pip-licenses-cli#32 (and thus SHOULD NOT be included as is in a release)

See also: stefan6419846/pip-licenses-cli#32
@reactive-firewall

Copy link
Copy Markdown
Collaborator Author

Caution

PR Superseded

This transitional patch has now been mostly (except for test_piplicenses.py) superseded by work in #361 (circa development Beta 6.0.0b7)

@reactive-firewall reactive-firewall added resolved This is considered resolved and removed help wanted Extra attention is needed labels Aug 22, 2026
@reactive-firewall
reactive-firewall deleted the patch-multi-license-242 branch August 22, 2026 00:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working enhancement New feature or request github_actions Pull requests that update GitHub Actions code python Pull requests that update python code resolved This is considered resolved

Projects

None yet

8 participants