Skip to main content

The Python licenser is aimed at distilling down the appropriate license for one or many pip "requirements" files into a single file; it supports Python2.7 and Python3.

Project description

Python licenser

The Python licenser is aimed at distilling down the appropriate license for one or many pip "requirements" files into a single file; it supports Python2.7 and Python3.

How do I install it?

$ pip install python-licenser

How do I use it?

$ python -m python-licenser -h

How does it work?

With no arguments (other than a pip "requirements" file and a Python executable path that has those requirements installed), the process is as follows:

  • walk the given Python executable's site-packages folder and build up package metadata (and license files, if present)
  • filter down by packages that are listed in the pip "requirements" file (and those packages dependencies, and their dependencies, and their dependencies... you get the gist)
    • note: it follows "-r some_file.txt" references found in the pip "requirements" files
  • if a license name could not be secured for a package, try to gather that from the package's PyPI web page
    • if a license name has still not been secured and the package lists a GitHub home page, try to find a license from there
      • otherwise, assume the package to be commercially licensed (as it is legally understood that is the case)
  • if a license file could not be secured for a package and the package lists a GitHub home page, try to find a license from there
    • otherwise, create a license (for the known license name) from a local collection of licenses (within the Python Third Party License Generator)
  • show a summary of packages against licenses to the user
  • build a THIRDPARTYLICENSES file in the current folder
  • give a return code of zero for success or non-zero for failures (e.g. GPL-licensed packages detected when specified to not permit GPL)

It's worth noting that information learned about packages is cached- so if you have to build one third party licenses file for a large project that has many components with many dependencies (but some overlap) then it's best to specify all those pip "requirements" files and Python executable paths in a single call to the Python third_party_license_file_generator as it will take less time overall.

You can specify a number of command line options (check syntax with -h) to do things like the following:

  • handle multiple pip "requirements" files
  • handle multiple Python executable paths
  • whether or not to permit GPL-licensed packages (default no)
  • specific GPL-licensed package exceptions (e.g. if a package lists exceptions to the GPL that may suit your needs but is still GPL-licensed)
  • whether or not to permit comercially-licensed packages (default no)
  • specific comercially-licensed package exceptions (e.g. if you have a license for a package or if you own a package)
  • a "skip prefix" (e.g. if you want to skip all packages starting with a certain string)
  • disable internet lookups (if you don't want to pull data from PyPI and GitHub)

Examples

Two different pip "requirements" files, two different Python paths (Virtualenvs) and a skip prefix:

python -m third_party_license_file_generator \
    -r requirements-py.txt \
    -p ~/.virtualenvs/backend_py/bin/python \
    -r requirements-pypy.txt \
    -p ~/.virtualenvs/backend_pypy/bin/python \
    -s ims-

Please note that pip "requirements" files and Python executable paths are paired together in the order they're specified.

Three different pip "requirements" files, two different Python paths (need to repeat), a GPL exception and a custom output file:

python -m third_party_license_file_generator \
    -r requirements.txt \
    -p ~/.virtualenvs/api_pypy/bin/python \
    -r pypy_requirements.txt \
    -p ~/.virtualenvs/api_pypy/bin/python \
    -r cpython_requirements.txt \
    -p ~/.virtualenvs/api_py/bin/python \
    -x uWSGI \ 
    -o ThirdPartyLicenses.txt

Three different pip "requirements" files, two different Python paths (need to repeat), a GPL exception, a custom output file and a license override file:

# contents of license_override_file.yml
uWSGI: 
    license_name: GPL-2.0 w/ linking exception
    license_file: https://raw.githubusercontent.com/unbit/uwsgi/master/LICENSE

python -m third_party_license_file_generator \
    -r requirements.txt \
    -p ~/.virtualenvs/api_pypy/bin/python \
    -r pypy_requirements.txt \
    -p ~/.virtualenvs/api_pypy/bin/python \
    -r cpython_requirements.txt \
    -p ~/.virtualenvs/api_py/bin/python \
    -x uWSGI \ 
    -o ThirdPartyLicenses.txt \
    -l license_override_file.yml

An example of the structure of the generated third party license file is as follows:

Start of 'ThirdPartyLicenses.txt' generated by Python third_party_license_generator at 2018-04-19 12:36:58.627421

----------------------------------------

Package: Django
License: BSD-3-clause
Requires: pytz
Author: Django Software Foundation <foundation@djangoproject.com>
Home page: https://www.djangoproject.com/

(license content appears here in full)

----------------------------------------

End of 'ThirdPartyLicenses.txt' generated by Python third_party_license_generator at 2018-04-19 12:36:58.627825

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python-licenser-2020.7.tar.gz (56.8 kB view details)

Uploaded Source

Built Distribution

python_licenser-2020.7-py3-none-any.whl (76.1 kB view details)

Uploaded Python 3

File details

Details for the file python-licenser-2020.7.tar.gz.

File metadata

  • Download URL: python-licenser-2020.7.tar.gz
  • Upload date:
  • Size: 56.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.8.5

File hashes

Hashes for python-licenser-2020.7.tar.gz
Algorithm Hash digest
SHA256 fde5eb77d5ab296ab3042fe656305b0b3e033534a75c9310caec2b88ab862c56
MD5 5c3d3080f8f1de73d9f2f5ab0bcefd2b
BLAKE2b-256 8d4afe361ed8c9a71fdc156ab07a03f95530b0284d8813e30b035a6c1b615d71

See more details on using hashes here.

File details

Details for the file python_licenser-2020.7-py3-none-any.whl.

File metadata

  • Download URL: python_licenser-2020.7-py3-none-any.whl
  • Upload date:
  • Size: 76.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.2.0 requests-toolbelt/0.9.1 tqdm/4.48.0 CPython/3.8.5

File hashes

Hashes for python_licenser-2020.7-py3-none-any.whl
Algorithm Hash digest
SHA256 ef9b6d6c2fc0c2c25dc39456cd2c95efc2cac5356c15dcaf3ab6a9135527fb7f
MD5 13d95e7ce224feb5d76bf3cdfe6212ab
BLAKE2b-256 621775d89967d460b939c1f93586e21a4e589fcaf6576d07b32efdcbd44e85ee

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page