def list_imports(): import optparse parser = optparse.OptionParser(__doc__.strip()) parser.add_option( '-I', '--ignore', dest='ignores', action='append', default=def_ignores, help="Add the given directory name to the list to be ignored.") parser.add_option( '-u', '--unified', action='store_true', help="Just output the unique set of dependencies found, " "in no particular order, without the filenames. The default " "is to output all imports, in order of appearance, along with " "the filename and line number.") parser.add_option('-v', '--verbose', action='count', default=0, help="Output input lines as well.") opts, args = parser.parse_args() setup_logging(opts.verbose) if not args: logging.warning("Searching for files from root directory.") args = ['.'] info = logging.info if opts.unified: all_symnames = set() for fn in iter_pyfiles(args, opts.ignores): all_symnames.update( x[0] for x in find_imports(fn, opts.verbose, opts.ignores)) for symname in sorted(all_symnames): print(symname) else: for fn in iter_pyfiles(args, opts.ignores): if opts.verbose: lines = list(open(fn, 'rU')) for symname, lineno, islocal in find_imports( fn, opts.verbose, opts.ignores): print('%s:%d: %s' % (fn, lineno, symname)) if opts.verbose: for no in range(lineno - 1, len(lines)): l = lines[no].rstrip() print(' %s' % l) if l[-1] != '\\': break print()
def list_imports(): import optparse parser = optparse.OptionParser(__doc__.strip()) parser.add_option('-I', '--ignore', dest='ignores', action='append', default=def_ignores, help="Add the given directory name to the list to be ignored.") parser.add_option('-u', '--unified', action='store_true', help="Just output the unique set of dependencies found, " "in no particular order, without the filenames. The default " "is to output all imports, in order of appearance, along with " "the filename and line number.") parser.add_option('-v', '--verbose', action='count', default=0, help="Output input lines as well.") opts, args = parser.parse_args() setup_logging(opts.verbose) if not args: logging.warning("Searching for files from root directory.") args = ['.'] info = logging.info if opts.unified: all_symnames = set() for fn in iter_pyfiles(args, opts.ignores): all_symnames.update(x[0] for x in find_imports(fn, opts.verbose, opts.ignores)) for symname in sorted(all_symnames): print_(symname) else: for fn in iter_pyfiles(args, opts.ignores): if opts.verbose: lines = list(open(fn, 'rU')) for symname, lineno, islocal in find_imports(fn, opts.verbose, opts.ignores): print_('%s:%d: %s' % (fn, lineno, symname)) if opts.verbose: for no in xrange(lineno-1, len(lines)): l = lines[no].rstrip() print_(' %s' % l) if l[-1] != '\\': break print_()
def fetch_dependencies(self): """ Fetch all dependencies and follow the target file. This was inspired by the snakefood library snakefood-1.4-py2.7.egg/snakefood/gendeps.py """ # No need to run this twice if self.dependency_list: return self.dependency_list log.info("Fetching internal dependecies: %s" % self.filename) depends = find_imports(self.filename, 1, 0) # Get the list of package roots for our input files and prepend them to the # module search path to insure localized imports. inroots = find_roots([self.filename], []) self.file_roots = inroots if not inroots: raise NoRoot for file in inroots: log.debug("Root found: %s" % file) sys.path = inroots + sys.path #log.debug("Using the following import path to search for modules:") #for dn in sys.path: # log.debug(" -- %s" % dn) inroots = frozenset(inroots) # Find all the dependencies. log.debug("Processing file:") allfiles = defaultdict(set) allerrors = [] processed_files = set() ignorefiles = [] alldependencies = [] fiter = iter_pyfiles([self.filename], ignorefiles, False) while 1: newfiles = set() for fn in fiter: log.debug(" post-filter: %s" % fn) processed_files.add(fn) if is_python(fn): files, errors = find_dependencies(fn, 0, 0) log.debug("dependency file count: %d" % len(files)) allerrors.extend(errors) else: # If the file is not a source file, we don't know how to get the # dependencies of that (without importing, which we want to # avoid). files = [] # When packages are the source of dependencies, remove the __init__ # file. This is important because the targets also do not include the # __init__ (i.e. when "from <package> import <subpackage>" is seen). if basename(fn) == '__init__.py': fn = dirname(fn) # no dependency. from_ = relfile(fn, ignorefiles) if from_ is None: log.debug("from_ empty. Move on") continue infrom = from_[0] in inroots log.debug(" from: %s" % from_[0]) log.debug(" file: %s" % from_[1]) allfiles[from_].add((None, None)) # Add the dependencies. for dfn in files: xfn = dfn if basename(xfn) == '__init__.py': xfn = dirname(xfn) to_ = relfile(xfn, ignorefiles) into = to_[0] in inroots log.debug(" from: %s" % from_[1]) log.debug(" to: %s" % to_[1]) if dfn in alldependencies: log.debug("Already added %s to dependency list" % dfn) else: log.debug("Add %s to dependency list" % dfn) allfiles[from_].add(to_) newfiles.add(dfn) alldependencies.append(dfn) if not newfiles: log.debug("No more new files. all done") break else: fiter = iter(sorted(newfiles)) # Output the list of roots found. log.debug("Found roots:") found_roots = set() for key, files in allfiles.iteritems(): found_roots.add(key[0]) found_roots.update(map(itemgetter(0), files)) if None in found_roots: found_roots.remove(None) for root in sorted(found_roots): log.debug(" %s" % root) self.dependency_list = allfiles return self.dependency_list
def fetch_dependencies(self): """ Fetch all dependencies and follow the target file. This was inspired by the snakefood library snakefood-1.4-py2.7.egg/snakefood/gendeps.py """ # No need to run this twice if self.dependency_list: return self.dependency_list log.info("Fetching internal dependecies: %s" % self.filename) depends = find_imports(self.filename, 1, 0) # Get the list of package roots for our input files and prepend them to the # module search path to insure localized imports. inroots = find_roots([self.filename], []) self.file_roots = inroots if not inroots: raise NoRoot for file in inroots: log.debug("Root found: %s" % file) sys.path = inroots + sys.path #log.debug("Using the following import path to search for modules:") #for dn in sys.path: # log.debug(" -- %s" % dn) inroots = frozenset(inroots) # Find all the dependencies. log.debug("Processing file:") allfiles = defaultdict(set) allerrors = [] processed_files = set() ignorefiles = [] alldependencies = [] fiter = iter_pyfiles([self.filename], ignorefiles, False) while 1: newfiles = set() for fn in fiter: log.debug(" post-filter: %s" % fn) processed_files.add(fn) if is_python(fn): files, errors = find_dependencies(fn, 0, 0) log.debug("dependency file count: %d" % len(files)) allerrors.extend(errors) else: # If the file is not a source file, we don't know how to get the # dependencies of that (without importing, which we want to # avoid). files = [] # When packages are the source of dependencies, remove the __init__ # file. This is important because the targets also do not include the # __init__ (i.e. when "from <package> import <subpackage>" is seen). if basename(fn) == '__init__.py': fn = dirname(fn) # no dependency. from_ = relfile(fn, ignorefiles) if from_ is None: log.debug("from_ empty. Move on") continue infrom = from_[0] in inroots log.debug( " from: %s" % from_[0]) log.debug( " file: %s" % from_[1]) allfiles[from_].add((None, None)) # Add the dependencies. for dfn in files: xfn = dfn if basename(xfn) == '__init__.py': xfn = dirname(xfn) to_ = relfile(xfn, ignorefiles) into = to_[0] in inroots log.debug( " from: %s" % from_[1]) log.debug( " to: %s" % to_[1]) if dfn in alldependencies: log.debug("Already added %s to dependency list" % dfn) else: log.debug("Add %s to dependency list" % dfn) allfiles[from_].add(to_) newfiles.add(dfn) alldependencies.append(dfn) if not newfiles: log.debug("No more new files. all done") break else: fiter = iter(sorted(newfiles)) # Output the list of roots found. log.debug("Found roots:") found_roots = set() for key, files in allfiles.iteritems(): found_roots.add(key[0]) found_roots.update(map(itemgetter(0),files)) if None in found_roots: found_roots.remove(None) for root in sorted(found_roots): log.debug(" %s" % root) self.dependency_list = allfiles return self.dependency_list;