diff options
author | romangraef <roman.graef@gmail.com> | 2018-06-03 13:46:20 +0200 |
---|---|---|
committer | romangraef <roman.graef@gmail.com> | 2018-06-03 13:46:20 +0200 |
commit | 2748ab3d274f67a2a701ba4f7d5d98ab2da6e025 (patch) | |
tree | f674b9bfb910841894549b6696dbc4d848d24d8d /lib/find_stats.py | |
download | tabsvsspaces-2748ab3d274f67a2a701ba4f7d5d98ab2da6e025.tar.gz tabsvsspaces-2748ab3d274f67a2a701ba4f7d5d98ab2da6e025.tar.bz2 tabsvsspaces-2748ab3d274f67a2a701ba4f7d5d98ab2da6e025.zip |
Initial commit
Diffstat (limited to 'lib/find_stats.py')
-rw-r--r-- | lib/find_stats.py | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/find_stats.py b/lib/find_stats.py new file mode 100644 index 0000000..effb5b7 --- /dev/null +++ b/lib/find_stats.py @@ -0,0 +1,59 @@ +import os +from pathlib import Path + +from .stats import Statistics + +IGNORED_FOLDERS = [ + 'venv', +] + + +def find_all_files(folder: Path, verbose: bool = False): + def gen(): + for subpath, subfolders, filenames in os.walk(str(folder)): + subfolders[:] = [subfolder for subfolder in subfolders if + not (subfolder.startswith('.') or subfolder.lower() in IGNORED_FOLDERS)] + current_path = Path(subpath) + for file in filenames: + file_path = current_path / file + if not file.startswith('.'): + yield file_path + if verbose: + print('Scanning', file_path) + else: + if verbose: + print('Skipping', file_path) + + return list(gen()) + + +def find_stats_for_file(filename: Path, name: str, stats: Statistics): + extension = filename.name.split('.')[-1] + try: + for line in filename.read_text().split('\n'): + spaces = False + tabs = False + while len(line) > 0 and line[0] in [' ', '\t']: + if line[0] == ' ': + spaces = True + if line[0] == '\t': + tabs = True + line = line[1:] + if spaces and tabs: + stats.add_mixed_line(extension=extension, + filename=name) + elif spaces: + stats.add_spaces(extension=extension) + elif tabs: + stats.add_tabs(extension=extension) + except (UnicodeDecodeError, OSError): + pass + + +def find_stats(folder: Path, verbose: bool = False) -> Statistics: + folder = folder.resolve() + files = find_all_files(folder, verbose=verbose) + stats = Statistics() + for file in files: + find_stats_for_file(folder / file, file, stats) + return stats |