Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
0
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),
    )
Пример #4
0
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)
Пример #5
0
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
Пример #6
0
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),
    )
Пример #7
0
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
Пример #8
0
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)
Пример #9
0
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)
Пример #10
0
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
Пример #11
0
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)
Пример #14
0
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)
Пример #15
0
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)
Пример #16
0
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)
Пример #17
0
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)]
Пример #18
0
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)
Пример #19
0
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)]
Пример #20
0
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)
Пример #21
0
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),
    }
Пример #22
0
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),
    }
Пример #23
0
    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)
Пример #24
0
    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)
Пример #25
0
    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)
Пример #26
0
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)]
Пример #27
0
    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)
Пример #28
0
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)]
Пример #29
0
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)]
Пример #30
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)]