Skip to content

Instantly share code, notes, and snippets.

@jtratner
Created June 24, 2019 00:04
Show Gist options
  • Save jtratner/22c959cce951be2ee67122e552c04935 to your computer and use it in GitHub Desktop.
Save jtratner/22c959cce951be2ee67122e552c04935 to your computer and use it in GitHub Desktop.
Compare Pipfiles
import json
import sys
import csv
def pipfile_to_pkg_version(path):
with open(path, "r") as fp:
new_pip = json.load(fp)
by_env = {}
for k, env in new_pip.items():
by_env[k] = by_pkg = {}
for pkg, data in env.items():
if not isinstance(data, dict):
continue
by_pkg[pkg] = data.get("version", "NONE")
return by_env
def find_common_keys(d1, d2):
common = set(d1) & set(d2)
d1_only = set(d1) - set(d2)
d2_only = set(d2) - set(d1)
return d1_only, d2_only, common
def compare_pipfiles(old_pf, new_pf, print_matches=False):
"""Compare old and new pipfile, printing 4 columns.
Examples:
env,pkg,old_version,new_version
default,pandas,0.18.2,0.18.2
default,boto3,1.0,1.1
default,newpkg,n/a,1.0
"""
null_value = 'n/a'
old_env2pkg2version = pipfile_to_pkg_version(old_pf)
new_env2pkg2version = pipfile_to_pkg_version(new_pf)
old_env, new_env, common = find_common_keys(old_env2pkg2version, new_env2pkg2version)
if old_env or new_env:
print(f'Only in old pf {old_env}', file=sys.stderr)
print(f'Only in new pf {new_env}', file=sys.stderr)
writer = csv.writer(sys.stdout)
writer.writerow(['env', 'pkg', 'old', 'new'])
for env in set(common):
old_pkgs, new_pkgs = old_env2pkg2version[env], new_env2pkg2version[env]
for k in sorted(set(old_pkgs) | set(new_pkgs)):
old_version = old_pkgs.get(k, null_value)
new_version = new_pkgs.get(k, null_value)
if old_version == new_version and not print_matches:
continue
writer.writerow([env, k, old_version, new_version])
if __name__ == '__main__':
compare_pipfiles(sys.argv[1], sys.argv[2])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment