Skip to main content

Automatically check for semver compliance based on type hints

Project description

Judgement as a Service.

Typejudge will automatically check for semver compliance based on type hints. If the type signature for a function changes, it will judge this to be an API change and recommend a major version bump.

This is largely inspired by Elm’s package manager, which also enforces semver.

https://asciinema.org/a/81244.png

Installation

Note: typejudge only works on python 3.5 and higher.

Install with pip:

$ pip install typejudge

Usage

$ typejudge --help
usage: typejudge [-h] [-o OUT] [-f FILE] MODULE [VERSION]

judge your types

positional arguments:
  MODULE                module to import and check
  VERSION               current version of the package

optional arguments:
  -h, --help            show this help message and exit
  -o OUT, --out OUT     save current type definitions to this file
  -f FILE, --file FILE  load type definitions from this file

Example usage

Suppose we’ve got a module that contains some type annotations on the publicly exported API, testmodule.py:

def greeting(name: str) -> str:
    return 'Hello ' + name

Save the types somewhere:

$ typejudge -o testmodule.json testmodule

Make some small change to testmodule.py, add a new function:

def greeting2(name: str, name2: str) -> str:
    return 'Hello ' + name + ' and ' name2

Typejudge will recommend this is a minor release:

$ typejudge -f testmodule.json testmodule
minor

The same, but with a known current version number:

$ typejudge -f testmodule.json testmodule 0.3.2
0.4.0

Make a change to existing type signatures:

from typing import List

def greeting(names: List[str]) -> str:
    return 'Hello ' + ' '.join(names)

Typejudge will now recommend this is a major release:

$ typejudge -f testmodule.json testmodule
major

With no changes to the API’s types, typejudge will recommend a patch release.

Example usage with bumpversion

Typejudge works quite well with bumpversion. Doing this is probably inadvisable, but you can entirely automate releases.

Assuming similar files as in the previous section, set up a config file for bumpversion, something like:

$ cat .bumpversion.cfg
[bumpversion]
current_version = 2.0.3
commit = True
tag = True

[bumpversion:file:setup.py]

And a setup.py:

$ cat setup.py
import setuptools

setuptools.setup(
    name="testpackage",
    version="2.0.3",
    description="Test stuff",
)

Then run something along these lines to cut a new release:

$ bumpversion $(typejudge -f testmodule.json testmodule)

You’ll also want to save the state of the API at this point, so you can compare it at the next release:

$ typejudge -o testmodule.json testmodule

Obviously use some discretion when releasing in this way. Just because the types of your API remain the same, it doesn’t necessarily mean that your code is backwards compatible. Typejudge suggests the smallest version increment you should make.

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

typejudge-0.3.0.tar.gz (3.8 kB view details)

Uploaded Source

File details

Details for the file typejudge-0.3.0.tar.gz.

File metadata

  • Download URL: typejudge-0.3.0.tar.gz
  • Upload date:
  • Size: 3.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for typejudge-0.3.0.tar.gz
Algorithm Hash digest
SHA256 1341004b94af1d445085f31aa2813e14d79aeabdaf4e677cfeec3cdcdcceabd7
MD5 1b2d92a8225ce2c497dc90bcdabc8b79
BLAKE2b-256 54387562013bb3bdfa69d1c03c0d770defcedab1d4cbc599e74b4c78c6e14f61

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