diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 84a6f51..7240492 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version - rev: v0.15.17 + rev: v0.17.0 hooks: # Run the linter - id: ruff-check diff --git a/examples/fodo.py b/examples/fodo.py index bf5ec43..e4689f1 100644 --- a/examples/fodo.py +++ b/examples/fodo.py @@ -1,9 +1,12 @@ -from pals import MagneticMultipoleParameters -from pals import Drift -from pals import Quadrupole -from pals import BeamLine -from pals import Lattice -from pals import load, store +from pals import ( + BeamLine, + Drift, + Lattice, + MagneticMultipoleParameters, + Quadrupole, + load, + store, +) def main(): diff --git a/pyproject.toml b/pyproject.toml index 79bcd5f..c77542b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,3 +50,6 @@ Issues = "https://github.com/campa-consortium/pals-python/issues" [tool.setuptools.packages.find] where = ["src"] + +[tool.ruff.lint] +ignore = ["N999"] diff --git a/src/pals/PALS.py b/src/pals/PALS.py index 0bc4a13..0c60251 100644 --- a/src/pals/PALS.py +++ b/src/pals/PALS.py @@ -1,12 +1,10 @@ -from pydantic import BaseModel, ConfigDict - -from pydantic import model_validator from typing import Self +from pydantic import BaseModel, ConfigDict, model_validator + +from .functions import load_file_to_dict, store_dict_to_file from .kinds import Lattice from .kinds.all_elements import get_all_elements_as_annotation -from .functions import load_file_to_dict, store_dict_to_file - Facility = list[get_all_elements_as_annotation()] diff --git a/src/pals/__init__.py b/src/pals/__init__.py index 30548f9..55e0032 100644 --- a/src/pals/__init__.py +++ b/src/pals/__init__.py @@ -4,10 +4,9 @@ simpler import statements like `from pals import Drift`. """ -from .kinds import * # noqa -from .parameters import * # noqa -from .PALS import Author, ExtensionLabels, PALSroot, load, store # noqa - +from .kinds import * +from .PALS import Author, ExtensionLabels, PALSroot, load, store # noqa: F401 +from .parameters import * # Rebuild pydantic models that depend on other classes PALSroot.model_rebuild() diff --git a/src/pals/functions.py b/src/pals/functions.py index 91b3649..cb0f362 100644 --- a/src/pals/functions.py +++ b/src/pals/functions.py @@ -121,9 +121,9 @@ def load_file_to_dict( # Attempt to strip two levels of file extensions to determine the schema. # Examples: fodo.pals.yaml, fodo.pals.json, ... - file_noext, extension, file_noext_noext, extension_inner = inspect_file_extensions( - filename, sub_level=sub_level - ).values() + _file_noext, extension, _file_noext_noext, _extension_inner = ( + inspect_file_extensions(filename, sub_level=sub_level).values() + ) # examples: fodo.pals.yaml, fodo.pals.json with open(filename, "r") as file: @@ -178,9 +178,9 @@ def _numpy_to_native(obj): def store_dict_to_file(filename: str, pals_dict: dict): - file_noext, extension, file_noext_noext, extension_inner = inspect_file_extensions( - filename - ).values() + _file_noext, extension, _file_noext_noext, _extension_inner = ( + inspect_file_extensions(filename).values() + ) # examples: fodo.pals.yaml, fodo.pals.json if extension == ".json": diff --git a/src/pals/kinds/BeamBeam.py b/src/pals/kinds/BeamBeam.py index ee71e1a..b5ad169 100644 --- a/src/pals/kinds/BeamBeam.py +++ b/src/pals/kinds/BeamBeam.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import BaseElement from ..parameters import BeamBeamParameters +from .mixin import BaseElement from .utils import under_construction diff --git a/src/pals/kinds/BeamLine.py b/src/pals/kinds/BeamLine.py index 731207e..5df5d9e 100644 --- a/src/pals/kinds/BeamLine.py +++ b/src/pals/kinds/BeamLine.py @@ -1,9 +1,10 @@ -from pydantic import model_validator from typing import Literal, Self +from pydantic import model_validator + +from ..functions import load_file_to_dict, store_dict_to_file from .all_elements import get_all_elements_as_annotation from .mixin import BaseElement -from ..functions import load_file_to_dict, store_dict_to_file class BeamLine(BaseElement): diff --git a/src/pals/kinds/Converter.py b/src/pals/kinds/Converter.py index 78aa93d..729c14d 100644 --- a/src/pals/kinds/Converter.py +++ b/src/pals/kinds/Converter.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import BaseElement from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters +from .mixin import BaseElement from .utils import under_construction diff --git a/src/pals/kinds/CrabCavity.py b/src/pals/kinds/CrabCavity.py index 6c53dc9..d817d22 100644 --- a/src/pals/kinds/CrabCavity.py +++ b/src/pals/kinds/CrabCavity.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/EGun.py b/src/pals/kinds/EGun.py index d728a5c..4b0e3a4 100644 --- a/src/pals/kinds/EGun.py +++ b/src/pals/kinds/EGun.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/FloorShift.py b/src/pals/kinds/FloorShift.py index 589c9c6..d58f26e 100644 --- a/src/pals/kinds/FloorShift.py +++ b/src/pals/kinds/FloorShift.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import BaseElement from ..parameters import FloorShiftParameters +from .mixin import BaseElement class FloorShift(BaseElement): diff --git a/src/pals/kinds/Fork.py b/src/pals/kinds/Fork.py index fa7bb97..9a5c615 100644 --- a/src/pals/kinds/Fork.py +++ b/src/pals/kinds/Fork.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import BaseElement from ..parameters import ForkParameters +from .mixin import BaseElement from .utils import under_construction diff --git a/src/pals/kinds/Instrument.py b/src/pals/kinds/Instrument.py index 4d3f1f4..4e78056 100644 --- a/src/pals/kinds/Instrument.py +++ b/src/pals/kinds/Instrument.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/Kicker.py b/src/pals/kinds/Kicker.py index aadfb47..d4f67c4 100644 --- a/src/pals/kinds/Kicker.py +++ b/src/pals/kinds/Kicker.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/Lattice.py b/src/pals/kinds/Lattice.py index 61e7276..8740970 100644 --- a/src/pals/kinds/Lattice.py +++ b/src/pals/kinds/Lattice.py @@ -1,10 +1,11 @@ -from pydantic import model_validator from typing import Literal, Self +from pydantic import model_validator + +from ..functions import load_file_to_dict, store_dict_to_file from .BeamLine import BeamLine -from .PlaceholderName import PlaceholderName from .mixin import BaseElement -from ..functions import load_file_to_dict, store_dict_to_file +from .PlaceholderName import PlaceholderName class Lattice(BaseElement): @@ -39,8 +40,8 @@ def from_file(filename: str) -> Self: pals_dict = load_file_to_dict(filename) if isinstance(pals_dict, dict) and "PALS" in pals_dict: - from pals.PALS import PALSroot from pals.kinds.PlaceholderName import PlaceholderName + from pals.PALS import PALSroot pals_root = PALSroot(**pals_dict) facility = pals_root.facility or [] diff --git a/src/pals/kinds/Mask.py b/src/pals/kinds/Mask.py index bca82eb..2b287bd 100644 --- a/src/pals/kinds/Mask.py +++ b/src/pals/kinds/Mask.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/Multipole.py b/src/pals/kinds/Multipole.py index 9c2f6fa..923f3c6 100644 --- a/src/pals/kinds/Multipole.py +++ b/src/pals/kinds/Multipole.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/Octupole.py b/src/pals/kinds/Octupole.py index ef1685d..3354733 100644 --- a/src/pals/kinds/Octupole.py +++ b/src/pals/kinds/Octupole.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/Patch.py b/src/pals/kinds/Patch.py index e6c0c3d..48082a6 100644 --- a/src/pals/kinds/Patch.py +++ b/src/pals/kinds/Patch.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import PatchParameters +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/PlaceholderName.py b/src/pals/kinds/PlaceholderName.py index aef0ebf..6bc6919 100644 --- a/src/pals/kinds/PlaceholderName.py +++ b/src/pals/kinds/PlaceholderName.py @@ -1,6 +1,7 @@ -from pydantic import BaseModel, Field, model_serializer from typing import Annotated +from pydantic import BaseModel, Field, model_serializer + from .mixin import BaseElement diff --git a/src/pals/kinds/Quadrupole.py b/src/pals/kinds/Quadrupole.py index dd51b07..1b6c144 100644 --- a/src/pals/kinds/Quadrupole.py +++ b/src/pals/kinds/Quadrupole.py @@ -2,8 +2,8 @@ from pydantic import model_validator +from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters from .mixin import ThickElement -from ..parameters import MagneticMultipoleParameters, ElectricMultipoleParameters class Quadrupole(ThickElement): diff --git a/src/pals/kinds/RBend.py b/src/pals/kinds/RBend.py index 60b5011..1b790fd 100644 --- a/src/pals/kinds/RBend.py +++ b/src/pals/kinds/RBend.py @@ -1,11 +1,11 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ( BendParameters, ElectricMultipoleParameters, MagneticMultipoleParameters, ) +from .mixin import ThickElement class RBend(ThickElement): diff --git a/src/pals/kinds/RFCavity.py b/src/pals/kinds/RFCavity.py index 036c199..7dd40ca 100644 --- a/src/pals/kinds/RFCavity.py +++ b/src/pals/kinds/RFCavity.py @@ -1,12 +1,12 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ( - RFParameters, - SolenoidParameters, ElectricMultipoleParameters, MagneticMultipoleParameters, + RFParameters, + SolenoidParameters, ) +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/SBend.py b/src/pals/kinds/SBend.py index da68191..52783a1 100644 --- a/src/pals/kinds/SBend.py +++ b/src/pals/kinds/SBend.py @@ -1,11 +1,11 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ( BendParameters, ElectricMultipoleParameters, MagneticMultipoleParameters, ) +from .mixin import ThickElement class SBend(ThickElement): diff --git a/src/pals/kinds/Sextupole.py b/src/pals/kinds/Sextupole.py index 37aa7cc..1cb1554 100644 --- a/src/pals/kinds/Sextupole.py +++ b/src/pals/kinds/Sextupole.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/Solenoid.py b/src/pals/kinds/Solenoid.py index b165fa3..8d63be0 100644 --- a/src/pals/kinds/Solenoid.py +++ b/src/pals/kinds/Solenoid.py @@ -1,11 +1,11 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ( - SolenoidParameters, ElectricMultipoleParameters, MagneticMultipoleParameters, + SolenoidParameters, ) +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/UnionEle.py b/src/pals/kinds/UnionEle.py index be99908..b26aa81 100644 --- a/src/pals/kinds/UnionEle.py +++ b/src/pals/kinds/UnionEle.py @@ -1,6 +1,7 @@ -from pydantic import model_validator # noqa from typing import Literal +from pydantic import Field, model_validator + from .all_elements import get_all_elements_as_annotation from .mixin import BaseElement @@ -12,7 +13,7 @@ class UnionEle(BaseElement): kind: Literal["UnionEle"] = "UnionEle" # Elements in the union - uses the same union type as BeamLine - elements: list[get_all_elements_as_annotation()] = [] + elements: list[get_all_elements_as_annotation()] = Field(default_factory=list) @model_validator(mode="before") @classmethod diff --git a/src/pals/kinds/Wiggler.py b/src/pals/kinds/Wiggler.py index 5f151b8..0133beb 100644 --- a/src/pals/kinds/Wiggler.py +++ b/src/pals/kinds/Wiggler.py @@ -1,7 +1,7 @@ from typing import Literal -from .mixin import ThickElement from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters +from .mixin import ThickElement from .utils import under_construction diff --git a/src/pals/kinds/__init__.py b/src/pals/kinds/__init__.py index f0c682d..2151f29 100644 --- a/src/pals/kinds/__init__.py +++ b/src/pals/kinds/__init__.py @@ -4,8 +4,7 @@ from .ACKicker import ACKicker # noqa: F401 from .BeamBeam import BeamBeam # noqa: F401 -from .BeamLine import BeamLine # noqa: F401 -from .Lattice import Lattice # noqa: F401 +from .BeamLine import BeamLine from .BeginningEle import BeginningEle # noqa: F401 from .Converter import Converter # noqa: F401 from .CrabCavity import CrabCavity # noqa: F401 @@ -19,6 +18,7 @@ from .Girder import Girder # noqa: F401 from .Instrument import Instrument # noqa: F401 from .Kicker import Kicker # noqa: F401 +from .Lattice import Lattice from .Marker import Marker # noqa: F401 from .Mask import Mask # noqa: F401 from .Match import Match # noqa: F401 @@ -34,10 +34,9 @@ from .Sextupole import Sextupole # noqa: F401 from .Solenoid import Solenoid # noqa: F401 from .Taylor import Taylor # noqa: F401 -from .UnionEle import UnionEle # noqa: F401 +from .UnionEle import UnionEle from .Wiggler import Wiggler # noqa: F401 - # Rebuild pydantic models that depend on other classes UnionEle.model_rebuild() BeamLine.model_rebuild() diff --git a/src/pals/kinds/all_elements.py b/src/pals/kinds/all_elements.py index 29acd12..d03e315 100644 --- a/src/pals/kinds/all_elements.py +++ b/src/pals/kinds/all_elements.py @@ -13,7 +13,6 @@ from .CrabCavity import CrabCavity from .Drift import Drift from .EGun import EGun -from .PlaceholderName import PlaceholderName from .Feedback import Feedback from .Fiducial import Fiducial from .FloorShift import FloorShift @@ -29,6 +28,7 @@ from .NullEle import NullEle from .Octupole import Octupole from .Patch import Patch +from .PlaceholderName import PlaceholderName from .Quadrupole import Quadrupole from .RBend import RBend from .RFCavity import RFCavity @@ -91,4 +91,4 @@ def get_all_elements_as_annotation(extra_types: tuple | None = None): """ types = get_all_element_types(extra_types) + (PlaceholderName,) # We can't use discriminator with PlaceholderName in the union since it has no 'kind' field - return Union[types] + return Union[types] # noqa: UP007 diff --git a/src/pals/kinds/mixin/BaseElement.py b/src/pals/kinds/mixin/BaseElement.py index 4f07653..de46a4e 100644 --- a/src/pals/kinds/mixin/BaseElement.py +++ b/src/pals/kinds/mixin/BaseElement.py @@ -1,13 +1,14 @@ -from pydantic import BaseModel from typing import Literal +from pydantic import BaseModel + from pals.parameters import ( ApertureParameters, BodyShiftParameters, FloorParameters, MetaParameters, - ReferenceParameters, ReferenceChangeParameters, + ReferenceParameters, TrackingParameters, ) diff --git a/src/pals/kinds/mixin/ThickElement.py b/src/pals/kinds/mixin/ThickElement.py index e8dfffb..2bcf977 100644 --- a/src/pals/kinds/mixin/ThickElement.py +++ b/src/pals/kinds/mixin/ThickElement.py @@ -1,4 +1,5 @@ from typing import Annotated, Literal + from annotated_types import Ge from . import BaseElement diff --git a/src/pals/kinds/mixin/all_element_mixin.py b/src/pals/kinds/mixin/all_element_mixin.py index 3b40795..5c48721 100644 --- a/src/pals/kinds/mixin/all_element_mixin.py +++ b/src/pals/kinds/mixin/all_element_mixin.py @@ -4,8 +4,8 @@ BeamLine and UnionEle classes. """ -from . import BaseElement from ..PlaceholderName import PlaceholderName +from . import BaseElement def unpack_element_items(items: list, container_type: str) -> list: @@ -41,7 +41,7 @@ def unpack_element_items(items: list, container_type: str) -> list: f"Each element must be a dict with exactly one key (the element's name), " f"but we got {item!r}" ) - name, fields = list(item.items())[0] + name, fields = next(iter(item.items())) # In addition to the existing shorthand `- element_name` # (a plain string reference), also allow the alternative # reference syntax `- use: element_name`. @@ -92,7 +92,7 @@ def unpack_element_list_structure( """ # Handle the top-level one-key dict: unpack the container's name if isinstance(data, dict) and len(data) == 1: - name, value = list(data.items())[0] + name, value = next(iter(data.items())) if not isinstance(value, dict): raise TypeError( f"Value for {container_type} key {name!r} must be a dict, but we got {value!r}" diff --git a/src/pals/parameters/ApertureParameters.py b/src/pals/parameters/ApertureParameters.py index 3db501d..01c7876 100644 --- a/src/pals/parameters/ApertureParameters.py +++ b/src/pals/parameters/ApertureParameters.py @@ -1,5 +1,6 @@ -from annotated_types import Ge from typing import Annotated, Literal + +from annotated_types import Ge from pydantic import BaseModel, Field, field_validator diff --git a/src/pals/parameters/ElectricMultipoleParameters.py b/src/pals/parameters/ElectricMultipoleParameters.py index af16624..a7f8dd5 100644 --- a/src/pals/parameters/ElectricMultipoleParameters.py +++ b/src/pals/parameters/ElectricMultipoleParameters.py @@ -1,6 +1,7 @@ -from pydantic import BaseModel, ConfigDict, model_validator from typing import Any +from pydantic import BaseModel, ConfigDict, model_validator + # Valid parameter prefixes, their expected format and description _PARAMETER_PREFIXES = { "tilt": ("tiltN", "Tilt"), diff --git a/src/pals/parameters/ForkParameters.py b/src/pals/parameters/ForkParameters.py index 0738943..e47e6fa 100644 --- a/src/pals/parameters/ForkParameters.py +++ b/src/pals/parameters/ForkParameters.py @@ -1,4 +1,5 @@ from typing import Literal + from pydantic import BaseModel diff --git a/src/pals/parameters/MagneticMultipoleParameters.py b/src/pals/parameters/MagneticMultipoleParameters.py index 7c4b176..0c3bdc1 100644 --- a/src/pals/parameters/MagneticMultipoleParameters.py +++ b/src/pals/parameters/MagneticMultipoleParameters.py @@ -1,6 +1,7 @@ -from pydantic import BaseModel, ConfigDict, model_validator from typing import Any +from pydantic import BaseModel, ConfigDict, model_validator + # Valid parameter prefixes, their expected format and description _PARAMETER_PREFIXES = { "tilt": ("tiltN", "Tilt"), diff --git a/src/pals/parameters/PatchParameters.py b/src/pals/parameters/PatchParameters.py index c9e946e..5ff2ffd 100644 --- a/src/pals/parameters/PatchParameters.py +++ b/src/pals/parameters/PatchParameters.py @@ -1,4 +1,5 @@ from typing import Literal + from pydantic import BaseModel diff --git a/src/pals/parameters/RFParameters.py b/src/pals/parameters/RFParameters.py index d2ae54b..01a6c10 100644 --- a/src/pals/parameters/RFParameters.py +++ b/src/pals/parameters/RFParameters.py @@ -1,6 +1,6 @@ -from annotated_types import Ge from typing import Annotated, Literal +from annotated_types import Ge from pydantic import BaseModel diff --git a/src/pals/parameters/ReferenceParameters.py b/src/pals/parameters/ReferenceParameters.py index c1e84a3..276110e 100644 --- a/src/pals/parameters/ReferenceParameters.py +++ b/src/pals/parameters/ReferenceParameters.py @@ -1,4 +1,5 @@ from typing import Literal + from pydantic import BaseModel @@ -9,7 +10,5 @@ class ReferenceParameters(BaseModel): pc_ref: float = 0.0 # [momentum*c] Reference momentum times speed of light E_tot_ref: float = 0.0 # [eV] Reference total energy time_ref: float = 0.0 # [s] Reference time - location: str = "" # Where reference parameters are evaluated - location: Literal[ - "UPSTREAM_END", "DOWNSTREAM_END" - ] # TODO: undefined default in PALS? + # TODO: not defined in PALS + location: Literal["UPSTREAM_END", "DOWNSTREAM_END"] | None = None