{"id":18640072,"url":"https://github.com/petr-muller/pyff","last_synced_at":"2025-07-15T16:32:34.662Z","repository":{"id":57456917,"uuid":"120000856","full_name":"petr-muller/pyff","owner":"petr-muller","description":"Python Diff","archived":false,"fork":false,"pushed_at":"2023-10-10T20:45:36.000Z","size":136,"stargazers_count":9,"open_issues_count":3,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-17T21:51:04.155Z","etag":null,"topics":["diff","python","semantic","syntax"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/petr-muller.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-02-02T15:54:04.000Z","updated_at":"2024-02-16T17:32:18.000Z","dependencies_parsed_at":"2025-04-11T17:05:23.257Z","dependency_job_id":"66525feb-fd5f-47ae-87f4-752497759c58","html_url":"https://github.com/petr-muller/pyff","commit_stats":{"total_commits":64,"total_committers":3,"mean_commits":"21.333333333333332","dds":0.1875,"last_synced_commit":"ed07dc48ca0af8ace89cbe21b4b1f4a3306c472c"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/petr-muller/pyff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petr-muller%2Fpyff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petr-muller%2Fpyff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petr-muller%2Fpyff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petr-muller%2Fpyff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/petr-muller","download_url":"https://codeload.github.com/petr-muller/pyff/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petr-muller%2Fpyff/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265445309,"owners_count":23766448,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["diff","python","semantic","syntax"],"created_at":"2024-11-07T05:53:07.654Z","updated_at":"2025-07-15T16:32:34.443Z","avatar_url":"https://github.com/petr-muller.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pyff: Python Diff\n\nPython Diff compares two versions of Python code (modules, packages,\ndirectories containing Python modules and/or packages) and detects syntactical\nand semantical differences between them.\n\n[![Build Status](https://travis-ci.org/petr-muller/pyff.svg?branch=master)](https://travis-ci.org/petr-muller/pyff) [![Maintainability](https://api.codeclimate.com/v1/badges/bb1aa4b86fed8097aa0f/maintainability)](https://codeclimate.com/github/petr-muller/pyff/maintainability) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/b970a7c6c6314ab3b28bddaeab523457)](https://www.codacy.com/app/afri/pyff?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=petr-muller/pyff\u0026amp;utm_campaign=Badge_Grade) [![Coverage Status](https://coveralls.io/repos/github/petr-muller/pyff/badge.svg?branch=master)](https://coveralls.io/github/petr-muller/pyff?branch=master)\n\n## Installation\n\nYou can install pyff from [Python Package Index](https://pypi.org/) as\n`pythodiff` (unfortunately, a name `pyff` was taken already):\n\n```\npip install pythondiff\n```\n\n## Usage\n\nYou can run `pyff` to compare two Python modules:\n\n```\npyff old.py new.py\n```\n\nFor comparing Python packages, there is the `pyff-package` executable:\n\n```\npyff-package old_package new_package\n```\n\nYou can also compare directories using the `pyff-dir` executable. In this case,\n`pyff` finds all Python content in both directories (recurively) and compares\neverything it finds:\n\n```\npyff-dir old_directory new_directory\n```\n\nFinally, `pyff-git` can compare Python content between two revisions in a given\nGit repository. As with the `pyff-dir` case, this finds all Python content in\nthe repository.\n\n```\npyff-git https://github.com/petr-muller/pyff.git master^ master\n```\n\n## Development\n\nThe development of `pyff` is far from complete: most of the basic features (code\nelements being removed, changed or added) are there but not all of them. Some\nPython code can also confuse `pyff` or even make it crash. PRs or issue reports\nare happily accepted.\n\n`pyff` is written using a modern (3.6+) Python version and has both unit and\nintegration tests. The unit test coverage goal is 100% but it is OK to not cover\nsome elementary (or really hard to unit-test) code, provided the code is marked\nwith a `# pragma: no cover` comment. [pytest](https://pytest.org) is used as a\nunit test driver. All code is statically checked with\n[Pylint](https://www.pylint.org/) and also annotated with Python type hints. The\n[mypy](http://mypy-lang.org/) checker is used to check them. You can install all\nnecessary test requirements using pip:\n\n```\npip install -r requirements-tests.txt\n```\n\nThere are shell helpers in `helpers/helpers.sh` that make\nexecuting all checks easier:\n\n```\n$ . helpers/helpers.sh\n$ ft # Fast Test: run just unit tests, without pylint and mypy checks\n$ st # Slow Test: run all (unit and integration) tests, pylint and mypy\n```\n\nThe integration tests are executed using an excellent\n[clitest](https://github.com/aureliojargas/clitest) tool.\n\n## Future\n\n`pyff` is a pre-1.0.0 version: basically a toy project of mine. A brief list of\nTODOs for me to consider doing a 1.0.0 version is in [#19](#19). My idea is to\nbring `pyff` to a small GitHub PR-commenting bot that would comment PRs to\nPython repositories with a nice, human-readable summary of changes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpetr-muller%2Fpyff","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpetr-muller%2Fpyff","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpetr-muller%2Fpyff/lists"}