def get_metrics_from_stat( self, _: Commit, file_diff_stats: Tuple[FileDiffStat, ...], ) -> Generator[Metric, None, None]: total_lines = 0 lines_by_file_type: Dict[str, int] = collections.defaultdict(int) for file_diff_stat in file_diff_stats: lines_changed = (len(file_diff_stat.lines_added) - len(file_diff_stat.lines_removed)) # Track total overall total_lines += lines_changed filename = file_diff_stat.filename.decode('UTF-8') tags = identify.tags_from_filename(filename) or {UNKNOWN} for tag in tags: lines_by_file_type[tag] += lines_changed # Yield overall metric and one per type of expected mapping types yield Metric('TotalLinesOfCode', total_lines) for tag, val in lines_by_file_type.items(): if tag in ALL_TAGS and val: yield Metric(f'TotalLinesOfCode_{tag}', val)
def get_metrics_from_stat( self, _: Commit, file_diff_stats: Tuple[FileDiffStat, ...], ) -> Generator[Metric, None, None]: total_curses = 0 curses_by_file_type: Dict[str, int] = collections.defaultdict(int) for file_diff_stat in file_diff_stats: curses_added = count_curse_words(file_diff_stat.lines_added) curses_removed = count_curse_words(file_diff_stat.lines_removed) curses_changed = curses_added - curses_removed # Track total overall total_curses = total_curses + curses_changed # Track by file extension -> type mapping filename = file_diff_stat.filename.decode('UTF-8') tags = identify.tags_from_filename(filename) or {UNKNOWN} for tag in tags: curses_by_file_type[tag] += curses_changed # Yield overall metric and one per type of expected mapping types yield Metric('TotalCurseWords', total_curses) for tag, value in curses_by_file_type.items(): if tag in ALL_TAGS and value: yield Metric(f'TotalCurseWords_{tag}', value)
def insert_metric_changes(db_logic, sha, change): metric_mapping = db_logic.get_metric_mapping() db_logic.insert_metric_changes( [Metric('PythonImportCount', change)], metric_mapping, Commit(sha, None), )
def test_simple_base_counter(): """Smoke test for SimpleLineCounterBase""" class TestCounter(SimpleLineCounterBase): """This is the test counter!""" def should_include_file(self, file_diff_stat): return True def line_matches_metric(self, line, file_diff_stat): return True parser = TestCounter() info, = parser.get_metrics_info() assert info == MetricInfo('TestCounter', 'This is the test counter!') input_stats = [ FileDiffStat( 'test.py', ['a', 'b', 'c'], ['d'], 'this_should_be_ignored', ), ] metric, = parser.get_metrics_from_stat(Commit.blank, input_stats) assert metric == Metric('TestCounter', 2)
def test_get_metrics_inner_first_commit(cloneable_with_commits): repo_parser = GitRepoParser(cloneable_with_commits.path) with repo_parser.repo_checked_out(): metrics = _get_metrics_inner(( None, cloneable_with_commits.commits[0], repo_parser, {LinesOfCodeParser}, re.compile(b'^$'), )) assert Metric(name='TotalLinesOfCode', value=0) in metrics
def insert_metric_changes(db, sha, change): metric_mapping = get_metric_mapping(db) write_logic.insert_metric_changes( db, [Metric('PythonImportCount', change)], metric_mapping, Commit(sha, None), )
def test_get_metrics_inner_nth_commit(cloneable_with_commits): repo_parser = RepoParser(cloneable_with_commits.path) with repo_parser.repo_checked_out(): metrics = _get_metrics_inner(( cloneable_with_commits.commits[-2], cloneable_with_commits.commits[-1], repo_parser, [LinesOfCodeParser], )) assert Metric(name='TotalLinesOfCode', value=2) in metrics
def test_text_line_counter_base(): class Counter(TextLineCounterBase): def text_line_matches_metric(self, line, file_diff_stat): return 'foo' in line parser = Counter() stat = FileDiffStat(b'test.py', [b'hi', b'foo world'], [], Status.ADDED) metric, = parser.get_metrics_from_stat(BLANK_COMMIT, (stat, )) assert metric == Metric('Counter', 1)
def test_lines_in_init(): parser = Python__init__LineCount() input_stats = (FileDiffStat( b'testing/__init__.py', [b'from .foo import bar'], [], Status.ADDED, ), ) metric, = parser.get_metrics_from_stat(BLANK_COMMIT, input_stats) assert metric == Metric('Python__init__LineCount', 1)
def test_curse_words_parser(): parser = CurseWordsParser() input_stats = [ FileDiffStat( b'templates/foo.tmpl', [b'#man seriously, f**k cheetah'], [], None, ), FileDiffStat( b'cmds/foo.py', [b"# I'm clean I swear"], [], None, ), ] metrics = list(parser.get_metrics_from_stat(input_stats)) assert Metric('TotalCurseWords_Template', 1) in metrics assert Metric('TotalCurseWords_Python', 0) in metrics
def test_python_import_parser(): parser = PythonImportCount() input_stats = (FileDiffStat( b'test.py', [b'import collections', b'from os import path'], [b'import os.path', b'nothing'], Status.ALREADY_EXISTING, ), ) metric, = parser.get_metrics_from_stat(BLANK_COMMIT, input_stats) assert metric == Metric('PythonImportCount', 1)
def test_binary_file_count_detects_deleted(): parser = BinaryFileCount() input_stats = [ FileDiffStat( 'foo', [], [], Status.DELETED, special_file=SpecialFile(SpecialFileType.BINARY, None, 'foo'), ), ] metric, = parser.get_metrics_from_stat(Commit.blank, input_stats) assert metric == Metric('BinaryFileCount', -1)
def test_submodule_count_detects_added(): parser = SubmoduleCount() input_stats = ( FileDiffStat( b'foo', [], [], Status.ADDED, special_file=SpecialFile(SpecialFileType.SUBMODULE, b'bar', None), ), ) metric, = parser.get_metrics_from_stat(BLANK_COMMIT, input_stats) assert metric == Metric('SubmoduleCount', 1)
def test_template_import_parser(): parser = CheetahTemplateImportCount() input_stats = (FileDiffStat( b'test.tmpl', [b'#import collections', b'#from os import path'], [b'#import os.path', b'nothing'], Status.ALREADY_EXISTING, ), ) metric, = parser.get_metrics_from_stat(BLANK_COMMIT, input_stats) assert metric == Metric('CheetahTemplateImportCount', 1)
def test_parser(): parser = TODOCount() input_stats = ( FileDiffStat( b'foo/bar.py', [b'# TO' + b'DO: herp all the derps', b'womp'], [], Status.ALREADY_EXISTING, ), ) metric, = parser.get_metrics_from_stat(BLANK_COMMIT, input_stats) assert metric == Metric('TODOCount', 1)
def test_lines_in_init(): parser = Python__init__LineCount() input_stats = [ FileDiffStat( b'testing/__init__.py', [b'from .foo import bar'], [], None, ), ] metric, = parser.get_metrics_from_stat(Commit.blank, input_stats) assert metric == Metric('Python__init__LineCount', 1)
def test_parser(): parser = TODOCount() input_stats = [ FileDiffStat( b'foo/bar.py', [b'# TO' + b'DO: herp all the derps', b'womp'], [], None, ), ] metrics = list(parser.get_metrics_from_stat(input_stats)) assert metrics == [Metric('TODOCount', 1)]
def test_binary_file_count_detects_added(): parser = BinaryFileCount() input_stats = (FileDiffStat( b'foo', [], [], Status.ADDED, special_file=SpecialFile(SpecialFileType.BINARY, b'foo', None), ), ) metric, = parser.get_metrics_from_stat(BLANK_COMMIT, input_stats) assert metric == Metric('BinaryFileCount', 1)
def test_lines_in_init(): parser = Python__init__LineCount() input_stats = [ FileDiffStat( b'testing/__init__.py', [b'from .foo import bar'], [], None, ), ] metrics = list(parser.get_metrics_from_stat(input_stats)) assert metrics == [Metric('Python__init__LineCount', 1)]
def test_parser(): parser = TODOCount() input_stats = [ FileDiffStat( b'foo/bar.py', [b'# TO' + b'DO: herp all the derps', b'womp'], [], None, ), ] metric, = parser.get_metrics_from_stat(Commit.blank, input_stats) assert metric == Metric('TODOCount', 1)
def test_curse_words_parser(): parser = CurseWordsParser() input_stats = ( FileDiffStat( b'some/file.rb', [b'#man seriously, f**k ruby'], [], Status.ADDED, ), FileDiffStat( b'cmds/foo.py', [b"# I'm clean I swear"], [], Status.ADDED, ), ) metrics = set(parser.get_metrics_from_stat(BLANK_COMMIT, input_stats)) assert metrics == { Metric('TotalCurseWords', 1), Metric('TotalCurseWords_ruby', 1), }
def test_curse_words_parser(): parser = CurseWordsParser() input_stats = [ FileDiffStat( b'some/file.rb', [b'#man seriously, f**k ruby'], [], None, ), FileDiffStat( b'cmds/foo.py', [b"# I'm clean I swear"], [], None, ), ] metrics = set(parser.get_metrics_from_stat(Commit.blank, input_stats)) assert metrics == { Metric('TotalCurseWords', 1), Metric('TotalCurseWords_ruby', 1), }
def get_metrics_from_stat(self, _, file_diff_stats): total_lines = 0 lines_by_file_type = collections.defaultdict(int) for file_diff_stat in file_diff_stats: lines_changed = (len(file_diff_stat.lines_added) - len(file_diff_stat.lines_removed)) # Track total overall total_lines += lines_changed filename = file_diff_stat.filename.decode('UTF-8') tags = identify.tags_from_filename(filename) or {UNKNOWN} for tag in tags: lines_by_file_type[tag] += lines_changed # Yield overall metric and one per type of expected mapping types yield Metric('TotalLinesOfCode', total_lines) for tag, val in lines_by_file_type.items(): if tag in ALL_TAGS and val: yield Metric('TotalLinesOfCode_{}'.format(tag), val)
def get_metrics_from_stat(self, _, file_diff_stats): symlink_delta = 0 for file_diff_stat in file_diff_stats: if (file_diff_stat.special_file is not None and (file_diff_stat.special_file.file_type is SpecialFileType.SYMLINK)): if file_diff_stat.status is Status.ADDED: symlink_delta += 1 elif file_diff_stat.status is Status.DELETED: symlink_delta -= 1 yield Metric(type(self).__name__, symlink_delta)
def get_metrics_from_stat(self, file_diff_stats): binary_delta = 0 for file_diff_stat in file_diff_stats: if (file_diff_stat.special_file is not None and (file_diff_stat.special_file.file_type is SpecialFileType.BINARY)): if file_diff_stat.status is Status.ADDED: binary_delta += 1 elif file_diff_stat.status is Status.DELETED: binary_delta -= 1 yield Metric(type(self).__name__, binary_delta)
def test_template_import_parser(): parser = CheetahTemplateImportCount() input_stats = [ FileDiffStat( b'test.tmpl', [b'#import collections', b'#from os import path'], [b'#import os.path', b'nothing'], None, ), ] metrics = list(parser.get_metrics_from_stat(Commit.blank, input_stats)) assert metrics == [Metric('CheetahTemplateImportCount', 1)]
def get_metrics_from_stat(self, _, file_diff_stats): metric_value = 0 for file_diff_stat in file_diff_stats: if self.should_include_file(file_diff_stat): for line in file_diff_stat.lines_added: if self.line_matches_metric(line, file_diff_stat): metric_value += 1 for line in file_diff_stat.lines_removed: if self.line_matches_metric(line, file_diff_stat): metric_value -= 1 yield Metric(self.metric_name, metric_value)
def test_python_import_parser(): parser = PythonImportCount() input_stats = [ FileDiffStat( b'test.py', [b'import collections', b'from os import path'], [b'import os.path', b'nothing'], None, ), ] metrics = list(parser.get_metrics_from_stat(Commit.blank, input_stats)) assert metrics == [Metric('PythonImportCount', 1)]
def test_binary_file_count_detects_ignores_moved(): parser = BinaryFileCount() input_stats = [ FileDiffStat( 'foo', [], [], Status.ALREADY_EXISTING, special_file=SpecialFile(SpecialFileType.BINARY, 'foo', 'foo'), ), ] metrics = list(parser.get_metrics_from_stat(Commit.blank, input_stats)) assert metrics == [Metric('BinaryFileCount', 0)]
def test_binary_file_count_detects_added(): parser = BinaryFileCount() input_stats = [ FileDiffStat( 'foo', [], [], Status.ADDED, special_file=SpecialFile(SpecialFileType.BINARY, 'foo', None), ), ] metrics = list(parser.get_metrics_from_stat(Commit.blank, input_stats)) assert metrics == [Metric('BinaryFileCount', 1)]