22# -*- coding: utf-8 -*-
33
44"""Usage:
5- pip-grep [-s] <package>...
5+ pip-grep [-s] <reqfile> < package>...
66
77Options:
88 -h --help Show this screen.
99"""
10+ import os
1011from docopt import docopt
11- from pkg_resources import DistributionNotFound , get_distribution
12+ from pip .req import parse_requirements
13+ from pip .index import PackageFinder
14+ from pip ._vendor .requests import session
1215
16+ requests = session ()
1317
14- def has_any_distribution (names , silent = False ):
15- for name in names :
16- try :
17- get_distribution (name )
18- except DistributionNotFound :
19- continue
2018
19+ class Requirements (object ):
20+ def __init__ (self , reqfile = None ):
21+ super (Requirements , self ).__init__ ()
22+ self .path = reqfile
23+ self .requirements = []
24+
25+ if reqfile :
26+ self .load (reqfile )
27+
28+ def __repr__ (self ):
29+ return '<Requirements \' {}\' >' .format (self .path )
30+
31+ def load (self , reqfile ):
32+ if not os .path .exists (reqfile ):
33+ raise ValueError ('The given requirements file does not exist.' )
34+
35+ finder = PackageFinder ([], [], session = requests )
36+ for requirement in parse_requirements (reqfile , finder = finder , session = requests ):
37+ if requirement .req :
38+ if not getattr (requirement .req , 'name' , None ):
39+ # Prior to pip 8.1.2 the attribute `name` did not exist.
40+ requirement .req .name = requirement .req .project_name
41+ self .requirements .append (requirement .req )
42+
43+
44+ def grep (reqfile , packages , silent = False ):
45+ try :
46+ r = Requirements (reqfile )
47+ except ValueError :
2148 if not silent :
22- print ('Package {name} found!' .format (name = name ))
49+ print ('There was a problem loading the given requirement file.' )
50+ exit (os .EX_NOINPUT )
2351
24- exit (0 )
52+ for req in r .requirements :
53+ if req .name in packages :
54+ if not silent :
55+ print ('Package {} found!' .format (req .name ))
56+ exit (0 )
2557
2658 if not silent :
2759 print ('Not found.' )
@@ -31,7 +63,10 @@ def has_any_distribution(names, silent=False):
3163
3264def main ():
3365 args = docopt (__doc__ , version = 'pip-grep' )
34- has_any_distribution (names = args ['<package>' ], silent = args ['-s' ])
66+
67+ kwargs = {'reqfile' : args ['<reqfile>' ], 'packages' : args ['<package>' ], 'silent' : args ['-s' ]}
68+
69+ grep (** kwargs )
3570
3671
3772if __name__ == '__main__' :
0 commit comments