2016-12-25 03:18:23 +00:00
|
|
|
import argparse
|
|
|
|
import fnmatch
|
|
|
|
import os
|
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
|
|
|
|
from voussoirkit import safeprint
|
|
|
|
from voussoirkit import spinal
|
|
|
|
|
2017-01-16 06:04:20 +00:00
|
|
|
def search(
|
|
|
|
terms,
|
|
|
|
*,
|
|
|
|
case_sensitive=False,
|
|
|
|
do_regex=False,
|
|
|
|
do_glob=False,
|
|
|
|
local_only=False,
|
|
|
|
match_any=False,
|
|
|
|
):
|
2016-12-25 03:18:23 +00:00
|
|
|
def term_matches(text, term):
|
|
|
|
return (
|
|
|
|
(term in text) or
|
|
|
|
(do_regex and re.search(term, text)) or
|
|
|
|
(do_glob and fnmatch.fnmatch(text, term))
|
|
|
|
)
|
|
|
|
|
2017-01-16 06:04:20 +00:00
|
|
|
if case_sensitive:
|
|
|
|
search_terms = terms
|
|
|
|
else:
|
|
|
|
search_terms = [term.lower() for term in terms]
|
|
|
|
|
2016-12-25 03:18:23 +00:00
|
|
|
anyall = any if match_any else all
|
|
|
|
|
2017-01-16 06:04:20 +00:00
|
|
|
generator = spinal.walk_generator(
|
|
|
|
depth_first=False,
|
|
|
|
recurse=not local_only,
|
|
|
|
yield_directories=True,
|
|
|
|
)
|
2016-12-25 03:18:23 +00:00
|
|
|
for filepath in generator:
|
2017-01-16 06:04:20 +00:00
|
|
|
basename = filepath.basename
|
|
|
|
if not case_sensitive:
|
|
|
|
basename = basename.lower()
|
|
|
|
|
2016-12-25 03:18:23 +00:00
|
|
|
if anyall(term_matches(basename, term) for term in search_terms):
|
|
|
|
safeprint.safeprint(filepath.absolute_path)
|
|
|
|
|
|
|
|
|
|
|
|
def search_argparse(args):
|
|
|
|
return search(
|
|
|
|
terms=args.search_terms,
|
2017-01-16 06:04:20 +00:00
|
|
|
case_sensitive=args.case_sensitive,
|
2016-12-25 03:18:23 +00:00
|
|
|
do_glob=args.do_glob,
|
|
|
|
do_regex=args.do_regex,
|
2017-01-16 06:04:20 +00:00
|
|
|
local_only=args.local_only,
|
2016-12-25 03:18:23 +00:00
|
|
|
match_any=args.match_any,
|
|
|
|
)
|
|
|
|
|
|
|
|
def main(argv):
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
|
|
|
|
parser.add_argument('search_terms', nargs='+', default=None)
|
|
|
|
parser.add_argument('--any', dest='match_any', action='store_true')
|
|
|
|
parser.add_argument('--regex', dest='do_regex', action='store_true')
|
|
|
|
parser.add_argument('--glob', dest='do_glob', action='store_true')
|
2017-01-16 06:04:20 +00:00
|
|
|
parser.add_argument('--case', dest='case_sensitive', action='store_true')
|
|
|
|
parser.add_argument('--local', dest='local_only', action='store_true')
|
2016-12-25 03:18:23 +00:00
|
|
|
parser.set_defaults(func=search_argparse)
|
|
|
|
|
|
|
|
args = parser.parse_args(argv)
|
|
|
|
args.func(args)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main(sys.argv[1:])
|