72 lines
1.8 KiB
Python
72 lines
1.8 KiB
Python
from dataclasses import dataclass, field
|
|
from enum import Enum, auto
|
|
from typing import Any, Dict, List, Optional, Set
|
|
|
|
|
|
class ToolIntentionType(Enum):
|
|
"""
|
|
High-level intentions that are common across tools
|
|
"""
|
|
|
|
ADD_PACKAGE = auto()
|
|
REMOVE_PACKAGE = auto()
|
|
UPDATE_PACKAGE = auto()
|
|
DOWNLOAD_PACKAGE = auto()
|
|
SEARCH_PACKAGES = auto()
|
|
SYNC_PACKAGES = auto()
|
|
LIST_PACKAGES = auto()
|
|
INIT_PROJECT = auto()
|
|
BUILD_PROJECT = auto()
|
|
RUN_SCRIPT = auto()
|
|
UNKNOWN = auto()
|
|
|
|
|
|
@dataclass
|
|
class Dependency:
|
|
"""
|
|
Common representation of a dependency
|
|
"""
|
|
|
|
name: str
|
|
arg_index: int
|
|
original_text: str
|
|
version_constraint: Optional[str] = None
|
|
extras: Set[str] = field(default_factory=set)
|
|
is_dev_dependency: bool = False
|
|
corrected_text: Optional[str] = None
|
|
|
|
|
|
@dataclass
|
|
class CommandToolIntention:
|
|
"""
|
|
Represents a parsed tool command with normalized intention
|
|
"""
|
|
|
|
tool: str
|
|
command: str
|
|
intention_type: ToolIntentionType
|
|
command_chain: List[str] = field(default_factory=list)
|
|
packages: List[Dependency] = field(default_factory=list)
|
|
options: Dict[str, Any] = field(default_factory=dict)
|
|
raw_args: List[str] = field(default_factory=list)
|
|
|
|
def modifies_packages(self) -> bool:
|
|
"""
|
|
Check if this intention type modifies installed packages.
|
|
"""
|
|
return self.intention_type in {
|
|
ToolIntentionType.ADD_PACKAGE,
|
|
ToolIntentionType.REMOVE_PACKAGE,
|
|
ToolIntentionType.UPDATE_PACKAGE,
|
|
ToolIntentionType.SYNC_PACKAGES,
|
|
}
|
|
|
|
def queries_packages(self) -> bool:
|
|
"""
|
|
Check if this intention type queries for packages.
|
|
"""
|
|
return self.intention_type in {
|
|
ToolIntentionType.SEARCH_PACKAGES,
|
|
ToolIntentionType.LIST_PACKAGES,
|
|
}
|