mirror of
https://github.com/compiler-explorer/compiler-explorer.git
synced 2025-12-27 07:04:04 -05:00
55 lines
2.9 KiB
Python
55 lines
2.9 KiB
Python
"""Data models for the CE Properties Wizard."""
|
|
|
|
import re
|
|
from typing import List, Optional
|
|
|
|
from pydantic import BaseModel, Field, validator
|
|
|
|
|
|
class CompilerInfo(BaseModel):
|
|
"""Model representing compiler information."""
|
|
|
|
id: str = Field(..., description="Unique identifier for the compiler")
|
|
name: str = Field(..., description="Display name for the compiler")
|
|
exe: str = Field(..., description="Path to the compiler executable")
|
|
compiler_type: Optional[str] = Field(None, description="Type of compiler (gcc, clang, etc)")
|
|
version: Optional[str] = Field(None, description="Compiler version")
|
|
semver: Optional[str] = Field(None, description="Semantic version")
|
|
group: Optional[str] = Field(None, description="Compiler group to add to")
|
|
options: Optional[str] = Field(None, description="Default compiler options")
|
|
language: str = Field(..., description="Programming language")
|
|
target: Optional[str] = Field(None, description="Target platform (for cross-compilers)")
|
|
is_cross_compiler: bool = Field(False, description="Whether this is a cross-compiler")
|
|
force_name: bool = Field(False, description="Force inclusion of .name property even when semver exists")
|
|
java_home: Optional[str] = Field(None, description="JAVA_HOME path for Java-based compilers")
|
|
runtime: Optional[str] = Field(None, description="Runtime executable path for Java-based compilers")
|
|
execution_wrapper: Optional[str] = Field(None, description="Execution wrapper path for languages like Dart")
|
|
include_path: Optional[str] = Field(None, description="Include paths for MSVC compilers")
|
|
lib_path: Optional[str] = Field(None, description="Library paths for MSVC compilers")
|
|
needs_sdk_prompt: bool = Field(False, description="Whether to prompt user for Windows SDK path")
|
|
|
|
@validator("id")
|
|
def validate_id(cls, value): # noqa: N805
|
|
"""Ensure ID is valid for properties files."""
|
|
if not re.match(r"^[a-zA-Z0-9_-]+$", value):
|
|
raise ValueError("ID must contain only alphanumeric characters, hyphens, and underscores")
|
|
return value
|
|
|
|
|
|
class LanguageConfig(BaseModel):
|
|
"""Model representing language configuration."""
|
|
|
|
name: str = Field(..., description="Language name")
|
|
properties_file: str = Field(..., description="Properties filename (without path, defaults to local)")
|
|
compiler_types: List[str] = Field(default_factory=list, description="Known compiler types for this language")
|
|
extensions: List[str] = Field(default_factory=list, description="File extensions")
|
|
keywords: List[str] = Field(default_factory=list, description="Keywords in compiler path/name")
|
|
|
|
def get_properties_file(self, env: str = "local") -> str:
|
|
"""Get properties file name for specified environment."""
|
|
if env == "local":
|
|
return self.properties_file
|
|
else:
|
|
# Replace .local. with .{env}.
|
|
return self.properties_file.replace(".local.", f".{env}.")
|