-
-
Save jcppkkk/eea79425405cb34fb316e3a11915b81f to your computer and use it in GitHub Desktop.
Compare two Pipfile.lock files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Python 3.6 min | |
import json | |
import re | |
import argparse | |
# CONSTS | |
DEFAULT = 'default' | |
VERSION = 'version' | |
def _remove_equal(line): | |
return re.sub('[=]', '', line) | |
def pipenvdiff(): | |
parser = argparse.ArgumentParser(description='Compare two Pipfile.lock files') | |
parser.add_argument('file1', type=str, nargs='+', help='File 1 (the old one) to be compared') | |
parser.add_argument('file2', type=str, nargs='+', help='File 2 (the new one) to be compared') | |
args = parser.parse_args() | |
file_1, file_2 = args.file1[0], args.file2[0] | |
with open(file_1) as data_file_1, open(file_2) as data_file_2: | |
data_1_loaded, data_2_loaded = json.load(data_file_1), json.load(data_file_2) | |
packages_1, packages_2 = data_1_loaded[DEFAULT], data_2_loaded[DEFAULT] | |
changes = sorted(set(packages_1.keys()) & set(packages_2.keys())) | |
removed = sorted(set(packages_1.keys()) - set(packages_2.keys())) | |
added = sorted(set(packages_2.keys()) - set(packages_1.keys())) | |
if changes: | |
change_major = [] | |
change_minor = [] | |
change_patch = [] | |
for package_name in changes: | |
p1_version = _remove_equal(packages_1.get(package_name, {}).get(VERSION, "[None]")) | |
p2_version = _remove_equal(packages_2.get(package_name, {}).get(VERSION, "[None]")) | |
p1_numbers = p1_version.split(".") | |
p2_numbers = p2_version.split(".") | |
if p1_version == p2_version: | |
continue | |
line = f'{package_name}: {p1_version} -> {p2_version}' | |
if p1_numbers[0] != p2_numbers[0]: | |
change_major += [line] | |
elif p1_numbers[1] != p2_numbers[1]: | |
change_minor += [line] | |
else: | |
change_patch += [line] | |
if change_patch: | |
print("\n[Patches]") | |
print("\n".join(change_patch)) | |
if change_minor: | |
print("\n[Minor change]") | |
print("\n".join(change_minor)) | |
if change_major: | |
print("\n[Major change]") | |
print("\n".join(change_major)) | |
if removed: | |
print("\n[Remove]") | |
for package_name in removed: | |
p1_version = _remove_equal(packages_1.get(package_name, {}).get(VERSION, "[None]")) | |
print(f'{package_name}: {p1_version}') | |
if added: | |
print("\n[Add]") | |
for package_name in added: | |
p2_version = _remove_equal(packages_2.get(package_name, {}).get(VERSION, "[None]")) | |
print(f'{package_name}: {p2_version}') | |
if __name__ == "__main__": | |
pipenvdiff() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment