assfucked new test suite ; seperated version which is very fucking experimental
This commit is contained in:
183
pommer/experimental/__init__.py
Normal file
183
pommer/experimental/__init__.py
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
import os
|
||||||
|
import re
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
def parse_pom_xml(pom_path):
|
||||||
|
"""Parse a Maven POM file with better error handling and namespace support"""
|
||||||
|
try:
|
||||||
|
if not os.path.exists(pom_path):
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Register namespace
|
||||||
|
ET.register_namespace('', "http://maven.apache.org/POM/4.0.0")
|
||||||
|
ns = {'mvn': "http://maven.apache.org/POM/4.0.0"}
|
||||||
|
|
||||||
|
tree = ET.parse(pom_path)
|
||||||
|
root = tree.getroot()
|
||||||
|
|
||||||
|
# Helper function to safely get text
|
||||||
|
def get_text(element, path, default="unknown"):
|
||||||
|
elem = element.find(path, ns)
|
||||||
|
return elem.text if elem is not None else default
|
||||||
|
|
||||||
|
artifact_id = get_text(root, './mvn:artifactId')
|
||||||
|
group_id = get_text(root, './mvn:groupId')
|
||||||
|
version = get_text(root, './mvn:version')
|
||||||
|
name = get_text(root, './mvn:name', artifact_id)
|
||||||
|
|
||||||
|
# Get Java version with better fallback logic
|
||||||
|
java_version = "17" # Default
|
||||||
|
java_elem = root.find('./mvn:properties/mvn:java.version', ns)
|
||||||
|
if java_elem is not None and java_elem.text:
|
||||||
|
java_version = java_elem.text.strip()
|
||||||
|
|
||||||
|
# Packaging type
|
||||||
|
packaging = get_text(root, './mvn:packaging', 'jar')
|
||||||
|
|
||||||
|
# Kotlin detection
|
||||||
|
kotlin_version = None
|
||||||
|
kotlin_elem = root.find('./mvn:properties/mvn:kotlin.version', ns)
|
||||||
|
if kotlin_elem is not None:
|
||||||
|
kotlin_version = kotlin_elem.text
|
||||||
|
|
||||||
|
# Check for Kotlin plugin or dependency
|
||||||
|
is_kotlin = False
|
||||||
|
if kotlin_version:
|
||||||
|
is_kotlin = True
|
||||||
|
else:
|
||||||
|
# Check plugins
|
||||||
|
for plugin in root.findall('.//mvn:plugin', ns):
|
||||||
|
group = plugin.find('./mvn:groupId', ns)
|
||||||
|
if group is not None and group.text == 'org.jetbrains.kotlin':
|
||||||
|
is_kotlin = True
|
||||||
|
break
|
||||||
|
|
||||||
|
# Check dependencies
|
||||||
|
if not is_kotlin:
|
||||||
|
for dep in root.findall('.//mvn:dependency', ns):
|
||||||
|
group = dep.find('./mvn:groupId', ns)
|
||||||
|
artifact = dep.find('./mvn:artifactId', ns)
|
||||||
|
if (group is not None and group.text == 'org.jetbrains.kotlin' and
|
||||||
|
artifact is not None and 'kotlin' in artifact.text.lower()):
|
||||||
|
is_kotlin = True
|
||||||
|
break
|
||||||
|
|
||||||
|
return {
|
||||||
|
"artifact_id": artifact_id,
|
||||||
|
"group_id": group_id,
|
||||||
|
"version": version,
|
||||||
|
"name": name,
|
||||||
|
"java_version": java_version,
|
||||||
|
"packaging": packaging,
|
||||||
|
"is_kotlin": is_kotlin,
|
||||||
|
"kotlin_version": kotlin_version,
|
||||||
|
"pom_path": str(Path(pom_path).resolve()),
|
||||||
|
"build_system": "maven"
|
||||||
|
}
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error parsing POM file {pom_path}: {str(e)}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def parse_gradle_file(gradle_path):
|
||||||
|
"""Parse Gradle build files with improved regex and error handling"""
|
||||||
|
try:
|
||||||
|
if not os.path.exists(gradle_path):
|
||||||
|
return None
|
||||||
|
|
||||||
|
with open(gradle_path, 'r', encoding='utf-8') as f:
|
||||||
|
content = f.read()
|
||||||
|
|
||||||
|
is_kotlin_dsl = gradle_path.endswith('.kts')
|
||||||
|
|
||||||
|
# Extract basic info with more robust regex
|
||||||
|
group_match = re.search(r'group\s*[=:]\s*[\'"]([^\'"]+)[\'"]', content)
|
||||||
|
group_id = group_match.group(1) if group_match else "unknown"
|
||||||
|
|
||||||
|
version_match = re.search(r'version\s*[=:]\s*[\'"]([^\'"]+)[\'"]', content)
|
||||||
|
version = version_match.group(1) if version_match else "unknown"
|
||||||
|
|
||||||
|
# Project name detection
|
||||||
|
artifact_id = "unknown"
|
||||||
|
project_dir = os.path.dirname(gradle_path)
|
||||||
|
|
||||||
|
# Check settings.gradle[.kts]
|
||||||
|
for settings_file in ['settings.gradle', 'settings.gradle.kts']:
|
||||||
|
settings_path = os.path.join(project_dir, settings_file)
|
||||||
|
if os.path.exists(settings_path):
|
||||||
|
try:
|
||||||
|
with open(settings_path, 'r', encoding='utf-8') as f:
|
||||||
|
settings_content = f.read()
|
||||||
|
name_match = re.search(r'rootProject\.name\s*[=:]\s*[\'"]([^\'"]+)[\'"]', settings_content)
|
||||||
|
if name_match:
|
||||||
|
artifact_id = name_match.group(1)
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if artifact_id == "unknown":
|
||||||
|
artifact_id = os.path.basename(project_dir) if project_dir else "unknown"
|
||||||
|
|
||||||
|
# Java version detection with multiple patterns
|
||||||
|
java_version = "17" # Default
|
||||||
|
|
||||||
|
# Pattern 1: JavaVersion.VERSION_XX
|
||||||
|
version_match = re.search(r'(?:source|target)Compatibility\s*[=:]\s*JavaVersion\.VERSION_(\d+)', content)
|
||||||
|
if version_match:
|
||||||
|
java_version = version_match.group(1)
|
||||||
|
else:
|
||||||
|
# Pattern 2: sourceCompatibility = 'XX'
|
||||||
|
version_match = re.search(r'(?:source|target)Compatibility\s*[=:]\s*[\'"](\d+)[\'"]', content)
|
||||||
|
if version_match:
|
||||||
|
java_version = version_match.group(1)
|
||||||
|
else:
|
||||||
|
# Pattern 3: Toolchain
|
||||||
|
toolchain_match = re.search(
|
||||||
|
r'toolchain\s*{[^}]*languageVersion\s*[=:]\s*JavaLanguageVersion\.of\(\s*(\d+)\s*\)',
|
||||||
|
content, re.DOTALL
|
||||||
|
)
|
||||||
|
if toolchain_match:
|
||||||
|
java_version = toolchain_match.group(1)
|
||||||
|
|
||||||
|
# Kotlin detection
|
||||||
|
is_kotlin = is_kotlin_dsl
|
||||||
|
kotlin_version = None
|
||||||
|
|
||||||
|
if not is_kotlin:
|
||||||
|
# Check for Kotlin plugin
|
||||||
|
kotlin_plugin_match = re.search(
|
||||||
|
r'(?:id|kotlin)\s*[(]?\s*[\'"](?:org\.jetbrains\.kotlin\.(?:jvm|android)|kotlin)[\'"]\s*[)]?',
|
||||||
|
content
|
||||||
|
)
|
||||||
|
if kotlin_plugin_match:
|
||||||
|
is_kotlin = True
|
||||||
|
|
||||||
|
# Try to get version
|
||||||
|
version_match = re.search(
|
||||||
|
r'(?:id|kotlin)\s*[(]?\s*[\'"]org\.jetbrains\.kotlin\.\w+[\'"]\s*[)]?\s*version\s*[\'"]([^\'"]+)[\'"]',
|
||||||
|
content
|
||||||
|
)
|
||||||
|
if version_match:
|
||||||
|
kotlin_version = version_match.group(1)
|
||||||
|
|
||||||
|
# Application plugin detection
|
||||||
|
is_application = bool(re.search(r'id\s*[(]?\s*[\'"]application[\'"]\s*[)]?', content))
|
||||||
|
|
||||||
|
return {
|
||||||
|
"artifact_id": artifact_id,
|
||||||
|
"group_id": group_id,
|
||||||
|
"version": version,
|
||||||
|
"name": artifact_id, # Use artifact_id as name if not specified
|
||||||
|
"java_version": java_version,
|
||||||
|
"packaging": "application" if is_application else "jar",
|
||||||
|
"is_kotlin": is_kotlin,
|
||||||
|
"kotlin_version": kotlin_version,
|
||||||
|
"gradle_path": str(Path(gradle_path).resolve()),
|
||||||
|
"is_kotlin_dsl": is_kotlin_dsl,
|
||||||
|
"build_system": "gradle"
|
||||||
|
}
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error parsing Gradle file {gradle_path}: {str(e)}")
|
||||||
|
return None
|
||||||
24
pommer/experimental/discovery.py
Normal file
24
pommer/experimental/discovery.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import os
|
||||||
|
import glob
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
def find_pom_files(base_dir="."):
|
||||||
|
"""Find all pom.xml files recursively"""
|
||||||
|
base_path = Path(base_dir).resolve()
|
||||||
|
return [
|
||||||
|
str(p) for p in
|
||||||
|
base_path.glob("**/pom.xml")
|
||||||
|
if not any(part.startswith('.') for part in p.parts)
|
||||||
|
]
|
||||||
|
|
||||||
|
def find_gradle_files(base_dir="."):
|
||||||
|
"""Find all build.gradle[.kts] files recursively"""
|
||||||
|
base_path = Path(base_dir).resolve()
|
||||||
|
gradle_files = list(base_path.glob("**/build.gradle"))
|
||||||
|
kts_files = list(base_path.glob("**/build.gradle.kts"))
|
||||||
|
|
||||||
|
# Filter out hidden directories
|
||||||
|
return [
|
||||||
|
str(p) for p in gradle_files + kts_files
|
||||||
|
if not any(part.startswith('.') for part in p.parts)
|
||||||
|
]
|
||||||
137
pommer/experimental/generator.py
Normal file
137
pommer/experimental/generator.py
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
def generate_maven_workflow(pom_infos):
|
||||||
|
"""Generate GitHub workflow for Maven projects"""
|
||||||
|
if not pom_infos:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Get highest Java version
|
||||||
|
java_versions = [int(info["java_version"]) for info in pom_infos if info["java_version"].isdigit()]
|
||||||
|
java_version = str(max(java_versions)) if java_versions else "17"
|
||||||
|
|
||||||
|
workflow = f"""name: Maven Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main, master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up JDK {java_version}
|
||||||
|
uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
java-version: '{java_version}'
|
||||||
|
distribution: 'temurin'
|
||||||
|
cache: 'maven'
|
||||||
|
"""
|
||||||
|
|
||||||
|
for info in pom_infos:
|
||||||
|
workflow += f"""
|
||||||
|
- name: Build {info['name']}
|
||||||
|
run: mvn -B package -f "{info['pom_path']}"
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: {info['artifact_id']}
|
||||||
|
path: {os.path.dirname(info['pom_path'])}/target/*.jar
|
||||||
|
"""
|
||||||
|
|
||||||
|
return workflow
|
||||||
|
|
||||||
|
def generate_gradle_workflow(gradle_infos):
|
||||||
|
"""Generate GitHub workflow for Gradle projects"""
|
||||||
|
if not gradle_infos:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Get highest Java version
|
||||||
|
java_versions = [int(info["java_version"]) for info in gradle_infos if info["java_version"].isdigit()]
|
||||||
|
java_version = str(max(java_versions)) if java_versions else "17"
|
||||||
|
|
||||||
|
workflow = f"""name: Gradle Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main, master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up JDK {java_version}
|
||||||
|
uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
java-version: '{java_version}'
|
||||||
|
distribution: 'temurin'
|
||||||
|
cache: 'gradle'
|
||||||
|
|
||||||
|
- name: Make gradlew executable
|
||||||
|
run: chmod +x gradlew
|
||||||
|
"""
|
||||||
|
|
||||||
|
for info in gradle_infos:
|
||||||
|
workflow += f"""
|
||||||
|
- name: Build {info['name']}
|
||||||
|
run: ./gradlew build
|
||||||
|
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: {info['artifact_id']}
|
||||||
|
path: build/libs/*.jar
|
||||||
|
"""
|
||||||
|
|
||||||
|
return workflow
|
||||||
|
|
||||||
|
def generate_build_script(project_infos):
|
||||||
|
"""Generate a universal build script"""
|
||||||
|
script = """#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Universal Build Script"
|
||||||
|
echo "======================"
|
||||||
|
"""
|
||||||
|
|
||||||
|
maven_projects = [p for p in project_infos if p["build_system"] == "maven"]
|
||||||
|
gradle_projects = [p for p in project_infos if p["build_system"] == "gradle"]
|
||||||
|
|
||||||
|
if maven_projects:
|
||||||
|
script += """
|
||||||
|
# Maven projects
|
||||||
|
echo "Building Maven projects..."
|
||||||
|
"""
|
||||||
|
for project in maven_projects:
|
||||||
|
script += f"""
|
||||||
|
echo "Building {project['name']}"
|
||||||
|
mvn -f "{project['pom_path']}" clean package
|
||||||
|
"""
|
||||||
|
|
||||||
|
if gradle_projects:
|
||||||
|
script += """
|
||||||
|
# Gradle projects
|
||||||
|
echo "Building Gradle projects..."
|
||||||
|
"""
|
||||||
|
for project in gradle_projects:
|
||||||
|
script += f"""
|
||||||
|
echo "Building {project['name']}"
|
||||||
|
cd "{os.path.dirname(project['gradle_path'])}"
|
||||||
|
chmod +x gradlew || true
|
||||||
|
./gradlew build || gradle build
|
||||||
|
cd -
|
||||||
|
"""
|
||||||
|
|
||||||
|
script += """
|
||||||
|
echo "Build completed successfully!"
|
||||||
|
"""
|
||||||
|
return script
|
||||||
66
pommer/experimental/main.py
Normal file
66
pommer/experimental/main.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
import argparse
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
from .parser import parse_pom_xml, parse_gradle_file
|
||||||
|
from .generator import (
|
||||||
|
generate_maven_workflow,
|
||||||
|
generate_gradle_workflow,
|
||||||
|
generate_build_script
|
||||||
|
)
|
||||||
|
from .discovery import find_pom_files, find_gradle_files
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description='Generate CI workflows for Java projects')
|
||||||
|
parser.add_argument('--dir', default='.', help='Base directory to scan')
|
||||||
|
parser.add_argument('--output-json', action='store_true', help='Output project info as JSON')
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Find and parse projects
|
||||||
|
projects = []
|
||||||
|
|
||||||
|
for pom_path in find_pom_files(args.dir):
|
||||||
|
if project := parse_pom_xml(pom_path):
|
||||||
|
projects.append(project)
|
||||||
|
|
||||||
|
for gradle_path in find_gradle_files(args.dir):
|
||||||
|
if project := parse_gradle_file(gradle_path):
|
||||||
|
projects.append(project)
|
||||||
|
|
||||||
|
if not projects:
|
||||||
|
print("No projects found")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Generate workflows
|
||||||
|
maven_projects = [p for p in projects if p["build_system"] == "maven"]
|
||||||
|
gradle_projects = [p for p in projects if p["build_system"] == "gradle"]
|
||||||
|
|
||||||
|
# Create output directory
|
||||||
|
workflows_dir = Path(".github/workflows")
|
||||||
|
workflows_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
if maven_projects:
|
||||||
|
workflow = generate_maven_workflow(maven_projects)
|
||||||
|
if workflow:
|
||||||
|
(workflows_dir / "maven.yml").write_text(workflow)
|
||||||
|
print("Generated Maven workflow")
|
||||||
|
|
||||||
|
if gradle_projects:
|
||||||
|
workflow = generate_gradle_workflow(gradle_projects)
|
||||||
|
if workflow:
|
||||||
|
(workflows_dir / "gradle.yml").write_text(workflow)
|
||||||
|
print("Generated Gradle workflow")
|
||||||
|
|
||||||
|
# Generate build script
|
||||||
|
build_script = generate_build_script(projects)
|
||||||
|
Path("build.sh").write_text(build_script)
|
||||||
|
os.chmod("build.sh", 0o755)
|
||||||
|
print("Generated build.sh")
|
||||||
|
|
||||||
|
if args.output_json:
|
||||||
|
Path("projects.json").write_text(json.dumps(projects, indent=2))
|
||||||
|
print("Generated projects.json")
|
||||||
|
|
||||||
|
print(f"Found {len(projects)} projects:")
|
||||||
|
for p in projects:
|
||||||
|
print(f"- {p['name']} ({p['build_system']})")
|
||||||
@@ -4,10 +4,7 @@
|
|||||||
|
|
||||||
Fix this shit!
|
Fix this shit!
|
||||||
|
|
||||||
Commercial Grade Test Suite for pommer.py
|
Fucking assfucked shit wont pass fucking 36 Failed and 31 Passed fuck you , fix this you downy black monkey.
|
||||||
|
|
||||||
This comprehensive test suite covers all functionality of the pommer.py script
|
|
||||||
with extensive edge case coverage, input validation, and error handling tests.
|
|
||||||
|
|
||||||
Requirements:
|
Requirements:
|
||||||
- pytest
|
- pytest
|
||||||
Reference in New Issue
Block a user