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


def count_source_lines():
    source_lines = 0
    source_module_names = 0
    test_lines = 0
    test_module_names = 0
    for directory, directory_names, file_names  in os.walk('.'):
        if '.svn' in directory_names:
            directory_names.remove('.svn')
        module_names = [x for x in file_names if x.endswith('.py')]
        for module in module_names:
            module_path = os.path.join(directory, module)
            command = "cat {} | sed '/^\s*$/d' | wc -l".format(module_path)
            process = subprocess.Popen(
                command,
                shell=True,
                stdout=subprocess.PIPE,
                )
            out, error = process.communicate()
            lines = int(out.partition('\n')[0])
            if module.startswith('test_'):
                test_lines += lines
                test_module_names += 1
            else:
                source_lines += lines
                source_module_names += 1
    return source_module_names, source_lines, test_module_names, test_lines


def report(source_module_names, source_lines, test_module_names, test_lines):

    print 'source modules:      {}'.format(source_module_names)
    print 'test modules:        {}'.format(test_module_names)

    print
    print 'source lines:        {}'.format(source_lines)
    print 'test lines:          {}'.format(test_lines)

    print
    print 'total lines:         {}'.format(source_lines + test_lines)
    print

    try:
        ratio = test_lines / float(source_lines)
    except ZeroDivisionError:
        ratio = 1
    ratio = round(ratio, 1)

    print 'test-to-source ratio is {} : 1'.format(ratio)
    print


if __name__ == '__main__':
    systemtools.IOManager.clear_terminal()
    report(*count_source_lines())
