Skip to content

petr-muller/pyff

Repository files navigation

pyff: Python Diff

Python Diff compares two versions of Python code (modules, packages, directories containing Python modules and/or packages) and detects syntactical and semantical differences between them.

Build Status Maintainability Codacy Badge Coverage Status

Installation

You can install pyff from Python Package Index as pythodiff (unfortunately, a name pyff was taken already):

pip install pythondiff

Usage

You can run pyff to compare two Python modules:

pyff old.py new.py

For comparing Python packages, there is the pyff-package executable:

pyff-package old_package new_package

You can also compare directories using the pyff-dir executable. In this case, pyff finds all Python content in both directories (recurively) and compares everything it finds:

pyff-dir old_directory new_directory

Finally, pyff-git can compare Python content between two revisions in a given Git repository. As with the pyff-dir case, this finds all Python content in the repository.

pyff-git https://github.com/petr-muller/pyff.git master^ master

Development

The development of pyff is far from complete: most of the basic features (code elements being removed, changed or added) are there but not all of them. Some Python code can also confuse pyff or even make it crash. PRs or issue reports are happily accepted.

pyff is written using a modern (3.6+) Python version and has both unit and integration tests. The unit test coverage goal is 100% but it is OK to not cover some elementary (or really hard to unit-test) code, provided the code is marked with a # pragma: no cover comment. pytest is used as a unit test driver. All code is statically checked with Pylint and also annotated with Python type hints. The mypy checker is used to check them. You can install all necessary test requirements using pip:

pip install -r requirements-tests.txt

There are shell helpers in helpers/helpers.sh that make executing all checks easier:

$ . helpers/helpers.sh
$ ft # Fast Test: run just unit tests, without pylint and mypy checks
$ st # Slow Test: run all (unit and integration) tests, pylint and mypy

The integration tests are executed using an excellent clitest tool.

Future

pyff is a pre-1.0.0 version: basically a toy project of mine. A brief list of TODOs for me to consider doing a 1.0.0 version is in #19. My idea is to bring pyff to a small GitHub PR-commenting bot that would comment PRs to Python repositories with a nice, human-readable summary of changes.