Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion gittensor/classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from gittensor.validator.oss_contributions.mirror.scored_pr import ScoredMirrorPR

from gittensor.constants import (
EXTENSIONLESS_FILE_EXTENSIONS,
MAINTAINER_ASSOCIATIONS,
MAX_CODE_DENSITY_MULTIPLIER,
MIN_TOKEN_SCORE_FOR_BASE_SCORE,
Expand Down Expand Up @@ -77,7 +78,10 @@ def __post_init__(self):

def _calculate_file_extension(self) -> str:
basename = self.filename.split('/')[-1]
return basename.split('.')[-1].lower() if '.' in basename else ''
if '.' in basename:
return basename.split('.')[-1].lower()
basename_lower = basename.lower()
return basename_lower if basename_lower in EXTENSIONLESS_FILE_EXTENSIONS else ''

def is_test_file(self) -> bool:
filename_lower = self.filename.lower()
Expand Down
1 change: 1 addition & 0 deletions gittensor/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
'erb',
]
MAX_LINES_SCORED_FOR_NON_CODE_EXT = 300
EXTENSIONLESS_FILE_EXTENSIONS = {'dockerfile', 'makefile'}

# =============================================================================
# Repository & PR Scoring
Expand Down
16 changes: 16 additions & 0 deletions tests/test_classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,22 @@ def test_is_test_file_preserves_existing_test_conventions():
assert _file_change('src/foo/bar.py').is_test_file() is False


@pytest.mark.parametrize(
'filename,expected',
[
('Dockerfile', 'dockerfile'),
('dockerfile', 'dockerfile'),
('ops/Dockerfile', 'dockerfile'),
('Makefile', 'makefile'),
('makefile', 'makefile'),
('build.mk', 'mk'),
('README', ''),
],
)
def test_file_extension_handles_configured_extensionless_filenames(filename, expected):
assert _file_change(filename).file_extension == expected


@pytest.mark.parametrize(
'filename',
[
Expand Down
43 changes: 41 additions & 2 deletions tests/validator/test_token_scoring_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@

import pytest

from gittensor.validator.utils.load_weights import TokenConfig, load_token_config
from gittensor.validator.utils.tree_sitter_scoring import score_tree_diff
from gittensor.classes import FileChange
from gittensor.utils.github_api_tools import FileContentPair
from gittensor.validator.utils.load_weights import TokenConfig, load_programming_language_weights, load_token_config
from gittensor.validator.utils.tree_sitter_scoring import calculate_token_score_from_file_changes, score_tree_diff


class TestTreeDiffScoring:
Expand All @@ -25,6 +27,43 @@ class TestTreeDiffScoring:
def weights(self) -> TokenConfig:
return load_token_config()

@pytest.mark.parametrize(
'filename,old_content,new_content',
[
(
'Dockerfile',
'FROM python:3.12-slim\n',
'FROM python:3.12-slim\nRUN pip install uv\nCOPY . /app\n',
),
(
'Makefile',
'test:\n\tpytest\n',
'test:\n\tpytest\n\nlint:\n\truff check\n',
),
],
)
def test_configured_extensionless_files_reach_tree_diff(self, weights, filename, old_content, new_content):
file_change = FileChange(
pr_number=1,
repository_full_name='test/repo',
filename=filename,
changes=3,
additions=2,
deletions=1,
status='modified',
)
result = calculate_token_score_from_file_changes(
[file_change],
{filename: FileContentPair(old_content=old_content, new_content=new_content)},
weights,
load_programming_language_weights(),
)

file_result = result.file_results[0]
assert file_change.file_extension == filename.lower()
assert file_result.scoring_method == 'tree-diff'
assert file_result.nodes_scored > 0

def test_new_file_scores_all_nodes(self, weights):
"""
Test scoring a completely new file (no old content).
Expand Down
Loading