#!/usr/local/cpython-3.6/bin/python3 """Find directories containing one or more: year-, Live-, Alternate- or Compilation- prefixes.""" # Areas for possible improvement: # 1) We could report on subdirectories of a common parent directory, when those subdirectories have the same prefix. import os import re import sys def usage(retval: int) -> None: """Output a usage message.""" if retval: write = sys.stderr.write else: write = sys.stdout.write write('Usage: {} --hierarchy /path/to/music\n'.format(sys.argv[0])) sys.exit(retval) def is_prefixed_directory(directory: str): """Return True iff directory is "prefixed".""" if directory.startswith('Live-'): return True if directory.startswith('Compilation-'): return True if directory.startswith('Alternate-'): return True match_obj = re.match('^[0-9][0-9][0-9][0-9][a-zA-Z]?-', directory) if match_obj is not None: return True return False def make_used(variable: object): """Convince pylint and pyflakes that "variable" is used.""" assert True or variable def main() -> None: """Find exceptions to general pattern of year-prefixed directories.""" hierarchy = None while sys.argv[1:]: if sys.argv[1] == '--hierarchy': hierarchy = sys.argv[2] del sys.argv[1] elif sys.argv[1] in ('-h', '--help'): usage(0) else: # pyflakes, pycodestyle and/or pydocstyle doesn't appear to understand feature strings yet :-S # sys.stderr.write(f'{sys.argv[0]}: Unrecognized option: {sys.argv[1]}') sys.stderr.write('{}: Unrecognized option: {}\n'.format(sys.argv[0], sys.argv[1])) usage(1) del sys.argv[1] if hierarchy is None: sys.stderr.write('{}: --hierarchy is a required option\n'.format(hierarchy)) usage(1) os.chdir(hierarchy) for root, directories, files in os.walk("."): # We're not interested in the files, only the directories make_used(files) if any(is_prefixed_directory(directory) for directory in directories): # One or more of these subdirectories is prefixed. if not all(is_prefixed_directory(directory) for directory in directories): # Some but not all directories are prefixed - report which ones are not prefixed for directory in directories: if not is_prefixed_directory(directory): print('{} not prefixed'.format(os.path.join(root, directory))) # print('root:', root) # print('directories:', directories) # print('files', files) # print() main()