#! /usr/bin/env python
from __future__ import print_function
import os
from abjad.tools import systemtools


def iterate_modules():
    for directory, subdirectory_names, file_names in os.walk('.'):
        for file_name in file_names:
            if not file_name.endswith('.py'):
                continue
            elif file_name.startswith(('test', '_')):
                continue
            full_name = os.path.join(directory, file_name)
            yield full_name


def find_misnamed_private_modules():
    offending_definition_lines = []
    for file_path in iterate_modules():
        with open(file_path, 'r') as file_pointer:
            for line in file_pointer:
                if not line.startswith('def '):
                    continue
                elif line.startswith('def _'):
                    continue
                function_name = ' '.join(line.strip().split()[1:])[:-1]
                function_name = function_name.split('(')[0]
                module_name = os.path.basename(file_path)
                module_name = os.path.splitext(module_name)[0]
                if function_name[1:] == module_name:
                    medium_name = os.sep.join(
                        file_path.split(os.sep)[-2:])
                    token = '{} in {}'.format(
                        function_name, medium_name)
                    offending_definition_lines.append(token)
    print()
    total = len(offending_definition_lines)
    print('Total private functions defined in public modules: {}'.format(total))
    print()


if __name__ == '__main__':
    systemtools.IOManager.clear_terminal()
    print('Finding misnamed private modules ...')
    find_misnamed_private_modules()
