From d58196205cea3a4650d68443dd90132bbd4b2b4e Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Fri, 25 Jul 2014 11:36:05 -0400 Subject: [PATCH] diffing works! --- bin/pip-diff | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/bin/pip-diff b/bin/pip-diff index e69de29..f5bb2f8 100755 --- a/bin/pip-diff +++ b/bin/pip-diff @@ -0,0 +1,133 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""Usage: + pip-diff (--fresh | --stale) + pip-diff (-h | --help) + +Options: + -h --help Show this screen. + --fresh List newly added packages. + --stale List removed packages. +""" +import os +from docopt import docopt +from pkg_resources import parse_requirements + + +# TODO: ignore lines +IGNORABLE_LINES = '#', '-r' +VERSION_OPERATORS = ['==', '>=', '<=', '>', '<', ','] + +def split(s): + for operator in VERSION_OPERATORS: + s = s.replace(operator, '!') + + return s.split('!') + + +# TODO: consider package upgrades. + +class Requirements(object): + """docstring for Requirements""" + def __init__(self, reqfile=None): + super(Requirements, self).__init__() + self.path = reqfile + self.requirements = [] + + if reqfile: + self.load(reqfile) + + def __repr__(self): + return ''.format(self.path) + + def load(self, reqfile): + + if not os.path.exists(reqfile): + raise ValueError('The given requirements file does not exist.') + + with open(reqfile) as f: + data = [] + + for line in f: + line = line.strip() + + # Skip lines that start with any comment/control charecters. + if not any([line.startswith(p) for p in IGNORABLE_LINES]): + data.append(line) + + for requirement in parse_requirements(data): + self.requirements.append(requirement) + + + # assert that the given file exists + # parse the file + # insert those entries into self.declarations + pass + + def diff(self, requirements, ignore_versions=False): + r1 = self + r2 = requirements + results = {'fresh': [], 'stale': []} + + # Generate fresh packages. + other_reqs = ( + [r.project_name for r in r1.requirements] + if ignore_versions else r1.requirements + ) + + for req in r2.requirements: + r = req.project_name if ignore_versions else req + + if r not in other_reqs: + results['fresh'].append(req) + + # Generate stale packages. + other_reqs = ( + [r.project_name for r in r2.requirements] + if ignore_versions else r2.requirements + ) + + for req in r1.requirements: + r = req.project_name if ignore_versions else req + + if r not in other_reqs: + results['stale'].append(req) + + return results + + + + + +def diff(r1, r2, include_fresh=False, include_stale=False): + # assert that r1 and r2 are files. + + try: + r1 = Requirements(r1) + r2 = Requirements(r2) + except ValueError: + print 'There was a problem loading the given requirements files.' + exit(os.EX_NOINPUT) + + results = r1.diff(r2) + print results + + + +def main(): + args = docopt(__doc__, version='pip-diff') + + kwargs = { + 'r1': args[''], + 'r2': args[''], + 'include_fresh': args['--fresh'], + 'include_stale': args['--stale'] + } + + diff(**kwargs) + + + +if __name__ == '__main__': + main() \ No newline at end of file