Source code for conda_tasks.parsers.pixi_toml

"""Parser for pixi.toml [tasks] and [target.<platform>.tasks] tables."""

from __future__ import annotations

from typing import TYPE_CHECKING

import tomlkit

from ..exceptions import TaskParseError
from .base import TaskFileParser
from .normalize import normalize_override, normalize_task

if TYPE_CHECKING:
    from pathlib import Path
    from typing import ClassVar

    from ..models import Task


[docs] class PixiTomlParser(TaskFileParser): """Reads ``pixi.toml`` task definitions. Supports: - ``[tasks]`` top-level table - ``[target.<platform>.tasks]`` per-platform overrides """ extensions: ClassVar[tuple[str, ...]] = (".toml",) filenames: ClassVar[tuple[str, ...]] = ("pixi.toml",)
[docs] def can_handle(self, path: Path) -> bool: """Return True if *path* is named ``pixi.toml``.""" return path.name in self.filenames
[docs] def parse(self, path: Path) -> dict[str, Task]: """Parse a ``pixi.toml`` file including platform overrides.""" try: data = tomlkit.loads(path.read_text(encoding="utf-8")).unwrap() except Exception as exc: raise TaskParseError(str(path), str(exc)) from exc raw_tasks = data.get("tasks", {}) if not isinstance(raw_tasks, dict): raise TaskParseError(str(path), "'tasks' must be a table") tasks: dict[str, Task] = {} for name, defn in raw_tasks.items(): tasks[name] = normalize_task(name, defn) target = data.get("target", {}) if isinstance(target, dict): for platform, platform_data in target.items(): if not isinstance(platform_data, dict): continue platform_tasks = platform_data.get("tasks", {}) for name, defn in platform_tasks.items(): override = normalize_override( defn if isinstance(defn, dict) else {"cmd": defn} ) if name in tasks: existing = tasks[name] if existing.platforms is None: existing.platforms = {} existing.platforms[platform] = override else: task = normalize_task(name, defn) task.platforms = {platform: override} tasks[name] = task return tasks
[docs] def add_task(self, path: Path, name: str, task: Task) -> None: """Not supported — ``pixi.toml`` is read-only.""" raise NotImplementedError( "Writing to pixi.toml is not supported. Use conda.toml instead." )
[docs] def remove_task(self, path: Path, name: str) -> None: """Not supported — ``pixi.toml`` is read-only.""" raise NotImplementedError( "Writing to pixi.toml is not supported. Use conda.toml instead." )