diff --git a/maven_check_minimal_deps/__main__.py b/maven_check_minimal_deps/__main__.py index 94ffd4f..13cf40f 100644 --- a/maven_check_minimal_deps/__main__.py +++ b/maven_check_minimal_deps/__main__.py @@ -15,10 +15,62 @@ def can_compile(path: Path) -> bool: process = subprocess.run(['mvn', 'clean', 'compile'], cwd=path, check=False,capture_output=True) return process.returncode == 0 +def can_test_compile(path: Path) -> bool: + process = subprocess.run(['mvn', 'clean', 'compile', 'test-compile'], cwd=path, check=False,capture_output=True) + return process.returncode == 0 + def write_pom(project_path: Path, pom: bs4.BeautifulSoup | str) -> None: with open(project_path / 'pom.xml', 'w') as f: f.write(str(pom)) +def check_for_dependencies_that_need_only_be_used_in_test_scope(pom, errors, project_path): + main_dependencies = [] + for dep in pom.select('dependencies > dependency'): + if dep.scope is None: + main_dependencies.append(dep) + + for dep in main_dependencies: + name = '{}:{}'.format(dep.groupId.get_text(), dep.artifactId.get_text()) + logger.info('Checking %s', name) + dep.insert(-1, bs4.BeautifulSoup('test', 'lxml-xml')) + + write_pom(project_path, pom) + + if can_compile(project_path): + errors.append(f'Could move {name} to test scope') + logger.error('%s', errors[-1]) + else: + dep.scope.extract() + del dep, name + +def check_for_unneeded_dependencies(pom, errors, project_path): + """Assumes that + `check_for_dependencies_that_need_only_be_used_in_test_scope` have already + been run, such that we can skip main dependencies. + + """ + + soup_deps = pom.select_one('dependencies') + + test_dependencies = [] + for dep in soup_deps.select('dependency'): + if dep.scope and dep.scope.get_text().strip() == 'test': + test_dependencies.append(dep) + + for dep in test_dependencies: + name = '{}:{}'.format(dep.groupId.get_text(), dep.artifactId.get_text()) + logger.info('Checking %s', name) + dep.extract() + + write_pom(project_path, pom) + + if can_test_compile(project_path): + errors.append(f'Could remove {name} from dependencies') + logger.error('%s', errors[-1]) + else: + soup_deps.insert(-1, dep) + del dep, name + def main(): logging.basicConfig() logger.setLevel('INFO') @@ -29,28 +81,10 @@ def main(): with open(args.project / 'pom.xml') as f: original_pom = f.read() pom = bs4.BeautifulSoup(original_pom, 'lxml-xml') - - main_dependencies = [] - for dep in pom.select('dependencies > dependency'): - if dep.scope is None: - main_dependencies.append(dep) - errors = [] - for dep in main_dependencies: - name = '{}:{}'.format(dep.groupId.get_text(), dep.artifactId.get_text()) - logger.info('Checking %s', name) - dep.insert(-1, bs4.BeautifulSoup('test', 'lxml-xml')) - - write_pom(args.project, pom) - - if can_compile(args.project): - errors.append(f'Could move {name} to test scope') - logger.error('%s', errors[-1]) - else: - dep.scope.extract() - del dep, name - + check_for_dependencies_that_need_only_be_used_in_test_scope(pom, errors, args.project) + check_for_unneeded_dependencies(pom, errors, args.project) logger.info('Resetting POM') write_pom(args.project, original_pom) logger.info('Finished checks')