123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- # -*- coding: utf-8 -*-
- #!/usr/bin/env python2
- from __future__ import absolute_import, print_function
- import modulefinder
- import os
- import pprint
- import sys
- import salt.utils.json
- import salt.utils.yaml
- try:
- import argparse # pylint: disable=minimum-python-version
- HAS_ARGPARSE = True
- except ImportError:
- HAS_ARGPARSE = False
- def parse():
- """
- Parse the arguments
- """
- parser = argparse.ArgumentParser()
- parser.add_argument(
- "-r",
- "--root",
- dest="root",
- default=".",
- help="The base code directory to look in",
- )
- parser.add_argument("-i", "--bif", dest="bif", default="site-packages")
- parser.add_argument(
- "-f", "--format", dest="format", choices=("pprint", "yaml"), default="pprint"
- )
- out = parser.parse_args()
- return out.__dict__
- def mod_data(opts, full):
- """
- Grab the module's data
- """
- ret = {}
- finder = modulefinder.ModuleFinder()
- try:
- finder.load_file(full)
- except ImportError as exc:
- print("ImportError - {0} (Reason: {1})".format(full, exc), file=sys.stderr)
- return ret
- for name, mod in finder.modules.items():
- basemod = name.split(".")[0]
- if basemod in ret:
- continue
- if basemod.startswith("_"):
- continue
- if not mod.__file__:
- continue
- if opts["bif"] not in mod.__file__:
- # Bif - skip
- continue
- if name == os.path.basename(mod.__file__)[:-3]:
- continue
- ret[basemod] = mod.__file__
- for name, err in finder.badmodules.items():
- basemod = name.split(".")[0]
- if basemod in ret:
- continue
- if basemod.startswith("_"):
- continue
- ret[basemod] = err
- return ret
- def scan(opts):
- """
- Scan the provided root for python source files
- """
- ret = {}
- for root, dirs, files in os.walk(opts["root"]):
- for fn_ in files:
- full = os.path.join(root, fn_)
- if full.endswith(".py"):
- ret.update(mod_data(opts, full))
- return ret
- if __name__ == "__main__":
- if not HAS_ARGPARSE:
- print("The argparse python module is required")
- opts = parse()
- try:
- scand = scan(opts)
- if opts["format"] == "yaml":
- print(salt.utils.yaml.safe_dump(scand))
- if opts["format"] == "json":
- print(salt.utils.json.dumps(scand))
- else:
- pprint.pprint(scand)
- exit(0)
- except KeyboardInterrupt:
- print("\nInterrupted on user request", file=sys.stderr)
- exit(1)
|