Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,20 @@ concurrency:
group: ${{ github.ref }}-${{ github.head_ref }}-pals-python
cancel-in-progress: true

permissions:
contents: read # access to check out code and install dependencies

jobs:
tests:
name: tests
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
python-version: ["3.11", "3.12", "3.13", "3.14"]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ dependencies = [
"pyyaml",
"toml",
]
requires-python = ">=3.10"
requires-python = ">=3.11"
authors = [
{ name="Axel Huebl", email="axelhuebl@lbl.gov" },
{ name="Edoardo Zoni", email="ezoni@lbl.gov" },
Expand Down
8 changes: 4 additions & 4 deletions src/pals/PALS.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
from pydantic import BaseModel

from pydantic import model_validator
from typing import List, Optional
from typing import Self

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()]
Facility = list[get_all_elements_as_annotation()]


class PALSroot(BaseModel):
"""Represent the roo PALS structure"""

version: Optional[str] = None
version: str | None = None

facility: Facility

Expand All @@ -37,7 +37,7 @@ def model_dump(self, *args, **kwargs):
return data

@staticmethod
def from_file(filename: str) -> "PALSroot":
def from_file(filename: str) -> Self:
"""Load a facility from a text file"""
pals_dict = load_file_to_dict(filename)
return PALSroot(**pals_dict)
Expand Down
4 changes: 2 additions & 2 deletions src/pals/kinds/BeamBeam.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import BaseElement
from ..parameters import BeamBeamParameters
Expand All @@ -13,4 +13,4 @@ class BeamBeam(BaseElement):
kind: Literal["BeamBeam"] = "BeamBeam"

# Beam-beam-specific parameters
BeamBeamP: Optional[BeamBeamParameters] = None
BeamBeamP: BeamBeamParameters | None = None
6 changes: 3 additions & 3 deletions src/pals/kinds/BeamLine.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from pydantic import model_validator
from typing import List, Literal
from typing import Literal, Self

from .all_elements import get_all_elements_as_annotation
from .mixin import BaseElement
Expand All @@ -11,7 +11,7 @@ class BeamLine(BaseElement):

kind: Literal["BeamLine"] = "BeamLine"

line: List[get_all_elements_as_annotation()]
line: list[get_all_elements_as_annotation()]

@model_validator(mode="before")
@classmethod
Expand All @@ -28,7 +28,7 @@ def model_dump(self, *args, **kwargs):
return dump_element_list(self, "line", *args, **kwargs)

@staticmethod
def from_file(filename: str) -> "BeamLine":
def from_file(filename: str) -> Self:
"""Load a BeamLine from a text file"""
pals_dict = load_file_to_dict(filename)
return BeamLine(**pals_dict)
Expand Down
6 changes: 3 additions & 3 deletions src/pals/kinds/Converter.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import BaseElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
Expand All @@ -13,5 +13,5 @@ class Converter(BaseElement):
kind: Literal["Converter"] = "Converter"

# Converter-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
6 changes: 3 additions & 3 deletions src/pals/kinds/CrabCavity.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
Expand All @@ -13,5 +13,5 @@ class CrabCavity(ThickElement):
kind: Literal["CrabCavity"] = "CrabCavity"

# CrabCavity-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
6 changes: 3 additions & 3 deletions src/pals/kinds/EGun.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
Expand All @@ -13,5 +13,5 @@ class EGun(ThickElement):
kind: Literal["EGun"] = "EGun"

# EGun-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
4 changes: 2 additions & 2 deletions src/pals/kinds/FloorShift.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import BaseElement
from ..parameters import FloorShiftParameters
Expand All @@ -11,4 +11,4 @@ class FloorShift(BaseElement):
kind: Literal["FloorShift"] = "FloorShift"

# Floor shift-specific parameters
FloorShiftP: Optional[FloorShiftParameters] = None
FloorShiftP: FloorShiftParameters | None = None
4 changes: 2 additions & 2 deletions src/pals/kinds/Fork.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import BaseElement
from ..parameters import ForkParameters
Expand All @@ -13,4 +13,4 @@ class Fork(BaseElement):
kind: Literal["Fork"] = "Fork"

# Fork-specific parameters
ForkP: Optional[ForkParameters] = None
ForkP: ForkParameters | None = None
6 changes: 3 additions & 3 deletions src/pals/kinds/Instrument.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
Expand All @@ -13,5 +13,5 @@ class Instrument(ThickElement):
kind: Literal["Instrument"] = "Instrument"

# Instrument-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
6 changes: 3 additions & 3 deletions src/pals/kinds/Kicker.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
Expand All @@ -13,5 +13,5 @@ class Kicker(ThickElement):
kind: Literal["Kicker"] = "Kicker"

# Kicker-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
6 changes: 3 additions & 3 deletions src/pals/kinds/Lattice.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from pydantic import model_validator
from typing import List, Literal, Union
from typing import Literal, Self

from .BeamLine import BeamLine
from .PlaceholderName import PlaceholderName
Expand All @@ -12,7 +12,7 @@ class Lattice(BaseElement):

kind: Literal["Lattice"] = "Lattice"

branches: List[Union[BeamLine, PlaceholderName]]
branches: list[BeamLine | PlaceholderName]

@model_validator(mode="before")
@classmethod
Expand All @@ -29,7 +29,7 @@ def model_dump(self, *args, **kwargs):
return dump_element_list(self, "branches", *args, **kwargs)

@staticmethod
def from_file(filename: str) -> "Lattice":
def from_file(filename: str) -> Self:
"""Load a Lattice from a text file"""
pals_dict = load_file_to_dict(filename)
return Lattice(**pals_dict)
Expand Down
6 changes: 3 additions & 3 deletions src/pals/kinds/Mask.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
Expand All @@ -13,5 +13,5 @@ class Mask(ThickElement):
kind: Literal["Mask"] = "Mask"

# Mask-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
6 changes: 3 additions & 3 deletions src/pals/kinds/Multipole.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
Expand All @@ -13,5 +13,5 @@ class Multipole(ThickElement):
kind: Literal["Multipole"] = "Multipole"

# Multipole-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
6 changes: 3 additions & 3 deletions src/pals/kinds/Octupole.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
Expand All @@ -13,5 +13,5 @@ class Octupole(ThickElement):
kind: Literal["Octupole"] = "Octupole"

# Octupole-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
4 changes: 2 additions & 2 deletions src/pals/kinds/Patch.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import PatchParameters
Expand All @@ -13,4 +13,4 @@ class Patch(ThickElement):
kind: Literal["Patch"] = "Patch"

# Patch-specific parameters
PatchP: Optional[PatchParameters] = None
PatchP: PatchParameters | None = None
8 changes: 4 additions & 4 deletions src/pals/kinds/Quadrupole.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal, Self

from pydantic import model_validator

Expand All @@ -13,11 +13,11 @@ class Quadrupole(ThickElement):
kind: Literal["Quadrupole"] = "Quadrupole"

# Quadrupole-specific parameters
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None

@model_validator(mode="after")
def validate_at_least_one_multipole(self) -> "Quadrupole":
def validate_at_least_one_multipole(self) -> Self:
"""Ensure at least one multipole parameter is specified."""
if self.MagneticMultipoleP is None and self.ElectricMultipoleP is None:
raise ValueError(
Expand Down
8 changes: 4 additions & 4 deletions src/pals/kinds/RBend.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import (
Expand All @@ -15,7 +15,7 @@ class RBend(ThickElement):
kind: Literal["RBend"] = "RBend"

# Bend-specific parameters
BendP: Optional[BendParameters] = None
BendP: BendParameters | None = None

ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
10 changes: 5 additions & 5 deletions src/pals/kinds/RFCavity.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import (
Expand All @@ -18,8 +18,8 @@ class RFCavity(ThickElement):
kind: Literal["RFCavity"] = "RFCavity"

# RF-specific parameters
RFP: Optional[RFParameters] = None
SolenoidP: Optional[SolenoidParameters] = None
RFP: RFParameters | None = None
SolenoidP: SolenoidParameters | None = None

ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
8 changes: 4 additions & 4 deletions src/pals/kinds/SBend.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import (
Expand All @@ -15,7 +15,7 @@ class SBend(ThickElement):
kind: Literal["SBend"] = "SBend"

# Bend-specific parameters
BendP: Optional[BendParameters] = None
BendP: BendParameters | None = None

ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
6 changes: 3 additions & 3 deletions src/pals/kinds/Sextupole.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import ElectricMultipoleParameters, MagneticMultipoleParameters
Expand All @@ -13,5 +13,5 @@ class Sextupole(ThickElement):
kind: Literal["Sextupole"] = "Sextupole"

# Sextupole-specific parameters
ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
8 changes: 4 additions & 4 deletions src/pals/kinds/Solenoid.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from .mixin import ThickElement
from ..parameters import (
Expand All @@ -17,7 +17,7 @@ class Solenoid(ThickElement):
kind: Literal["Solenoid"] = "Solenoid"

# Solenoid-specific parameters
SolenoidP: Optional[SolenoidParameters] = None
SolenoidP: SolenoidParameters | None = None

ElectricMultipoleP: Optional[ElectricMultipoleParameters] = None
MagneticMultipoleP: Optional[MagneticMultipoleParameters] = None
ElectricMultipoleP: ElectricMultipoleParameters | None = None
MagneticMultipoleP: MagneticMultipoleParameters | None = None
4 changes: 2 additions & 2 deletions src/pals/kinds/UnionEle.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from pydantic import model_validator # noqa
from typing import List, Literal
from typing import Literal

from .all_elements import get_all_elements_as_annotation
from .mixin import BaseElement
Expand All @@ -12,7 +12,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()] = []

@model_validator(mode="before")
@classmethod
Expand Down
Loading