Add core source files: main, models, config
This commit is contained in:
118
src/codexchange/models.py
Normal file
118
src/codexchange/models.py
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
"""Pydantic models for CodeXchange CLI."""
|
||||||
|
|
||||||
|
from enum import Enum
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from pydantic import BaseModel, Field, field_validator
|
||||||
|
|
||||||
|
|
||||||
|
class Language(str, Enum):
|
||||||
|
"""Supported programming languages."""
|
||||||
|
|
||||||
|
JAVASCRIPT = "javascript"
|
||||||
|
TYPESCRIPT = "typescript"
|
||||||
|
PYTHON = "python"
|
||||||
|
JAVA = "java"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_extension(cls, extension: str) -> Optional["Language"]:
|
||||||
|
"""Get language from file extension."""
|
||||||
|
extension_map = {
|
||||||
|
".js": cls.JAVASCRIPT,
|
||||||
|
".jsx": cls.JAVASCRIPT,
|
||||||
|
".ts": cls.TYPESCRIPT,
|
||||||
|
".tsx": cls.TYPESCRIPT,
|
||||||
|
".py": cls.PYTHON,
|
||||||
|
".java": cls.JAVA,
|
||||||
|
}
|
||||||
|
return extension_map.get(extension.lower())
|
||||||
|
|
||||||
|
@property
|
||||||
|
def extension(self) -> str:
|
||||||
|
"""Get file extension for language."""
|
||||||
|
extension_map = {
|
||||||
|
Language.JAVASCRIPT: ".js",
|
||||||
|
Language.TYPESCRIPT: ".ts",
|
||||||
|
Language.PYTHON: ".py",
|
||||||
|
Language.JAVA: ".java",
|
||||||
|
}
|
||||||
|
return extension_map[self]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def syntax_check_command(self) -> Optional[str]:
|
||||||
|
"""Get syntax check command for language."""
|
||||||
|
commands = {
|
||||||
|
Language.PYTHON: "python",
|
||||||
|
Language.TYPESCRIPT: "npx tsc --noEmit",
|
||||||
|
Language.JAVASCRIPT: "npx eslint",
|
||||||
|
Language.JAVA: None,
|
||||||
|
}
|
||||||
|
return commands.get(self)
|
||||||
|
|
||||||
|
|
||||||
|
VALID_CONVERSIONS = {
|
||||||
|
(Language.JAVASCRIPT, Language.TYPESCRIPT),
|
||||||
|
(Language.JAVASCRIPT, Language.PYTHON),
|
||||||
|
(Language.TYPESCRIPT, Language.JAVASCRIPT),
|
||||||
|
(Language.TYPESCRIPT, Language.PYTHON),
|
||||||
|
(Language.PYTHON, Language.JAVASCRIPT),
|
||||||
|
(Language.PYTHON, Language.TYPESCRIPT),
|
||||||
|
(Language.JAVA, Language.PYTHON),
|
||||||
|
(Language.PYTHON, Language.JAVA),
|
||||||
|
(Language.JAVASCRIPT, Language.JAVA),
|
||||||
|
(Language.JAVA, Language.JAVASCRIPT),
|
||||||
|
(Language.TYPESCRIPT, Language.JAVA),
|
||||||
|
(Language.JAVA, Language.TYPESCRIPT),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ConversionRequest(BaseModel):
|
||||||
|
"""Request model for code conversion."""
|
||||||
|
|
||||||
|
source_code: str = Field(..., description="Source code to convert")
|
||||||
|
source_language: Language = Field(..., description="Source programming language")
|
||||||
|
target_language: Language = Field(..., description="Target programming language")
|
||||||
|
model: str = Field(default="codellama", description="Ollama model to use")
|
||||||
|
|
||||||
|
@field_validator("target_language")
|
||||||
|
@classmethod
|
||||||
|
def validate_conversion(cls, v: Language, info) -> Language:
|
||||||
|
"""Validate that the conversion pair is supported."""
|
||||||
|
source = info.data.get("source_language")
|
||||||
|
if source and (source, v) not in VALID_CONVERSIONS:
|
||||||
|
raise ValueError(
|
||||||
|
f"Conversion from {source.value} to {v.value} is not supported. "
|
||||||
|
f"Supported conversions: JS<->TS, JS<->Python, JS<->Java, TS<->Python, TS<->Java, Python<->Java"
|
||||||
|
)
|
||||||
|
return v
|
||||||
|
|
||||||
|
|
||||||
|
class ConversionResult(BaseModel):
|
||||||
|
"""Result model for code conversion."""
|
||||||
|
|
||||||
|
success: bool
|
||||||
|
converted_code: Optional[str] = None
|
||||||
|
original_code: str
|
||||||
|
source_language: Language
|
||||||
|
target_language: Language
|
||||||
|
model: str
|
||||||
|
error_message: Optional[str] = None
|
||||||
|
syntax_verified: bool = False
|
||||||
|
syntax_warnings: list[str] = Field(default_factory=list)
|
||||||
|
|
||||||
|
|
||||||
|
class ModelInfo(BaseModel):
|
||||||
|
"""Information about an Ollama model."""
|
||||||
|
|
||||||
|
name: str
|
||||||
|
size: Optional[str] = None
|
||||||
|
modified_at: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
|
class FileConversionResult(BaseModel):
|
||||||
|
"""Result of converting a single file."""
|
||||||
|
|
||||||
|
input_path: str
|
||||||
|
output_path: Optional[str] = None
|
||||||
|
success: bool
|
||||||
|
error_message: Optional[str] = None
|
||||||
Reference in New Issue
Block a user