mirror of
https://github.com/codeflash-ai/codeflash.git
synced 2026-05-04 18:25:17 +00:00
Merge pull request #1946 from codeflash-ai/cf-1080-spotless-skip
fix: add Spotless skip flags to Maven and Gradle validation
This commit is contained in:
commit
33c8cc19e4
9 changed files with 62 additions and 18 deletions
|
|
@ -45,7 +45,8 @@ gradle.projectsEvaluated {
|
|||
'spotbugsMain', 'spotbugsTest',
|
||||
'pmdMain', 'pmdTest',
|
||||
'rat', 'japicmp',
|
||||
'jarHell', 'thirdPartyAudit'
|
||||
'jarHell', 'thirdPartyAudit',
|
||||
'spotlessCheck', 'spotlessApply', 'spotlessJava', 'spotlessKotlin', 'spotlessScala'
|
||||
]
|
||||
}.configureEach {
|
||||
enabled = false
|
||||
|
|
|
|||
|
|
@ -43,6 +43,8 @@ _MAVEN_VALIDATION_SKIP_FLAGS = [
|
|||
"-Denforcer.skip=true",
|
||||
"-Djapicmp.skip=true",
|
||||
"-Derrorprone.skip=true",
|
||||
"-Dspotless.check.skip=true",
|
||||
"-Dspotless.apply.skip=true",
|
||||
"-Dmaven.compiler.failOnWarning=false",
|
||||
"-Dmaven.compiler.showWarnings=false",
|
||||
]
|
||||
|
|
|
|||
|
|
@ -2268,7 +2268,10 @@ class JavaScriptSupport:
|
|||
source_without_ext = source_file_abs.with_suffix("")
|
||||
|
||||
# Use os.path.relpath to compute relative path from tests_root to source file
|
||||
rel_path = os.path.relpath(str(source_without_ext), str(tests_root_abs))
|
||||
# Replace backslashes with forward slashes — JavaScript import/require paths
|
||||
# must use forward slashes. Backslashes are escape chars in JS strings
|
||||
# (e.g. \t → tab, \n → newline) and would break imports on Windows.
|
||||
rel_path = os.path.relpath(str(source_without_ext), str(tests_root_abs)).replace("\\", "/")
|
||||
|
||||
# For ESM, add .js extension (TypeScript convention)
|
||||
# TypeScript requires imports to reference the OUTPUT file extension (.js),
|
||||
|
|
|
|||
|
|
@ -369,7 +369,9 @@ def _create_runtime_jest_config(base_config_path: Path | None, project_root: Pat
|
|||
|
||||
runtime_config_path = config_dir / f"jest.codeflash.runtime.config{config_ext}"
|
||||
|
||||
test_dirs_js = ", ".join(f"'{d}'" for d in sorted(test_dirs))
|
||||
# Normalize to forward slashes — backslashes in JS strings are escape chars
|
||||
# (e.g. \t → tab, \n → newline) and would corrupt paths on Windows.
|
||||
test_dirs_js = ", ".join(f"'{d.replace(chr(92), '/')}'" for d in sorted(test_dirs))
|
||||
|
||||
# In monorepos, add the root node_modules to moduleDirectories so Jest
|
||||
# can resolve workspace packages that are hoisted to the monorepo root.
|
||||
|
|
@ -382,6 +384,8 @@ def _create_runtime_jest_config(base_config_path: Path | None, project_root: Pat
|
|||
else:
|
||||
module_dirs_line_no_base = ""
|
||||
|
||||
project_root_posix = project_root.as_posix()
|
||||
|
||||
# TypeScript configs (.ts) cannot be required from CommonJS modules
|
||||
# because Node.js cannot parse TypeScript syntax in require().
|
||||
# When the base config is TypeScript, we create a standalone config
|
||||
|
|
@ -403,7 +407,7 @@ module.exports = {{
|
|||
else:
|
||||
config_content = f"""// Auto-generated by codeflash - runtime config with test roots
|
||||
module.exports = {{
|
||||
roots: ['{project_root}', {test_dirs_js}],
|
||||
roots: ['{project_root_posix}', {test_dirs_js}],
|
||||
testMatch: ['**/*.test.ts', '**/*.test.js', '**/*.test.tsx', '**/*.test.jsx'],
|
||||
{module_dirs_line_no_base}}};
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -54,14 +54,17 @@ class JestCoverageUtils:
|
|||
return CoverageData.create_empty(source_code_path, function_name, code_context)
|
||||
|
||||
# Find the file entry in coverage data
|
||||
# Jest uses absolute paths as keys
|
||||
# Jest/Vitest always writes coverage keys with forward slashes (POSIX paths),
|
||||
# so we normalize our paths to POSIX for comparison — critical on Windows
|
||||
# where Path.resolve() and str(Path) produce backslash paths.
|
||||
file_coverage = None
|
||||
source_path_str = str(source_code_path.resolve())
|
||||
source_path_posix = source_code_path.resolve().as_posix()
|
||||
source_relative_posix = source_code_path.as_posix()
|
||||
|
||||
for file_path, file_data in coverage_data.items():
|
||||
# Match exact path or path ending with full relative path from src/
|
||||
# Avoid matching files with same name in different directories (e.g., db/utils.ts vs utils/utils.ts)
|
||||
if file_path == source_path_str or file_path.endswith(str(source_code_path)):
|
||||
if file_path == source_path_posix or file_path.endswith(source_relative_posix):
|
||||
file_coverage = file_data
|
||||
break
|
||||
|
||||
|
|
|
|||
|
|
@ -641,3 +641,28 @@ class TestGradleEnsureRuntimeMultiModule:
|
|||
assert result is True
|
||||
nested_build = (nested / "build.gradle.kts").read_text(encoding="utf-8")
|
||||
assert "codeflash-runtime" in nested_build
|
||||
|
||||
|
||||
class TestValidationSkipFlags:
|
||||
"""Tests that validation skip flags include all known static analysis and formatting plugins."""
|
||||
|
||||
def test_maven_skip_flags_include_spotless(self):
|
||||
from codeflash.languages.java.maven_strategy import _MAVEN_VALIDATION_SKIP_FLAGS
|
||||
|
||||
flags_str = " ".join(_MAVEN_VALIDATION_SKIP_FLAGS)
|
||||
assert "-Dspotless.check.skip=true" in flags_str
|
||||
assert "-Dspotless.apply.skip=true" in flags_str
|
||||
|
||||
def test_maven_skip_flags_include_all_known_plugins(self):
|
||||
from codeflash.languages.java.maven_strategy import _MAVEN_VALIDATION_SKIP_FLAGS
|
||||
|
||||
flags_str = " ".join(_MAVEN_VALIDATION_SKIP_FLAGS)
|
||||
for plugin in ["rat", "checkstyle", "spotbugs", "pmd", "enforcer", "japicmp", "errorprone", "spotless"]:
|
||||
assert plugin in flags_str, f"Missing skip flag for {plugin}"
|
||||
|
||||
def test_gradle_skip_script_includes_spotless(self):
|
||||
from codeflash.languages.java.gradle_strategy import _GRADLE_SKIP_VALIDATION_INIT_SCRIPT
|
||||
|
||||
assert "spotlessCheck" in _GRADLE_SKIP_VALIDATION_INIT_SCRIPT
|
||||
assert "spotlessApply" in _GRADLE_SKIP_VALIDATION_INIT_SCRIPT
|
||||
assert "spotlessJava" in _GRADLE_SKIP_VALIDATION_INIT_SCRIPT
|
||||
|
|
|
|||
|
|
@ -512,13 +512,16 @@ public class PreciseWaiterTest {
|
|||
stddev_runtime = statistics.stdev(runtimes)
|
||||
coefficient_of_variation = stddev_runtime / mean_runtime
|
||||
|
||||
# Target: 10ms (10,000,000 ns), allow <5% coefficient of variation
|
||||
# (accounts for JIT warmup - first iteration is cold, subsequent are optimized)
|
||||
# Target: 10ms (10,000,000 ns), allow <15% coefficient of variation.
|
||||
# The first iteration per test method runs with cold JIT, and shared CI VMs
|
||||
# (especially Windows) have ~15ms scheduler granularity that adds noise.
|
||||
# 15% still catches instrumentation bugs (e.g., 0ms or 100ms outliers)
|
||||
# while the ±5% mean check below validates timing accuracy.
|
||||
expected_ns = 10_000_000
|
||||
runtimes_ms = [r / 1_000_000 for r in runtimes]
|
||||
|
||||
assert coefficient_of_variation < 0.05, (
|
||||
f"Timing variance too high: CV={coefficient_of_variation:.2%} (should be <5%). "
|
||||
assert coefficient_of_variation < 0.15, (
|
||||
f"Timing variance too high: CV={coefficient_of_variation:.2%} (should be <15%). "
|
||||
f"Runtimes: {runtimes_ms} ms (mean={mean_runtime / 1_000_000:.3f}ms)"
|
||||
)
|
||||
|
||||
|
|
@ -597,13 +600,16 @@ public class PreciseWaiterMultiTest {
|
|||
stddev_runtime = statistics.stdev(runtimes)
|
||||
coefficient_of_variation = stddev_runtime / mean_runtime
|
||||
|
||||
# Target: 10ms (10,000,000 ns), allow <5% coefficient of variation
|
||||
# (accounts for JIT warmup - first iteration is cold, subsequent are optimized)
|
||||
# Target: 10ms (10,000,000 ns), allow <15% coefficient of variation.
|
||||
# The first iteration per test method runs with cold JIT, and shared CI VMs
|
||||
# (especially Windows) have ~15ms scheduler granularity that adds noise.
|
||||
# 15% still catches instrumentation bugs (e.g., 0ms or 100ms outliers)
|
||||
# while the ±5% mean check below validates timing accuracy.
|
||||
expected_ns = 10_000_000
|
||||
runtimes_ms = [r / 1_000_000 for r in runtimes]
|
||||
|
||||
assert coefficient_of_variation < 0.05, (
|
||||
f"Timing variance too high: CV={coefficient_of_variation:.2%} (should be <5%). "
|
||||
assert coefficient_of_variation < 0.15, (
|
||||
f"Timing variance too high: CV={coefficient_of_variation:.2%} (should be <15%). "
|
||||
f"Runtimes: {runtimes_ms} ms (mean={mean_runtime / 1_000_000:.3f}ms)"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ class TestJestRootsConfiguration:
|
|||
runtime_configs = [f for f in get_created_config_files() if "codeflash.runtime" in f.name]
|
||||
assert len(runtime_configs) == 1, f"Expected 1 runtime config, got {len(runtime_configs)}"
|
||||
config_content = runtime_configs[0].read_text(encoding="utf-8")
|
||||
assert str(external_path) in config_content, "Runtime config should contain external test directory"
|
||||
assert external_path.as_posix() in config_content, "Runtime config should contain external test directory"
|
||||
|
||||
clear_created_config_files()
|
||||
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ try {{
|
|||
capture_output=True,
|
||||
text=True,
|
||||
cwd=project_path,
|
||||
timeout=5,
|
||||
timeout=30,
|
||||
)
|
||||
|
||||
assert result.returncode == 0, (
|
||||
|
|
@ -148,7 +148,7 @@ try {{
|
|||
capture_output=True,
|
||||
text=True,
|
||||
cwd=project_path,
|
||||
timeout=5,
|
||||
timeout=30,
|
||||
)
|
||||
|
||||
assert result.returncode == 0, f"JS config should load: {result.stderr}"
|
||||
|
|
|
|||
Loading…
Reference in a new issue