From e745e8394b83687cd4091d7b75e5402d64d32de3 Mon Sep 17 00:00:00 2001 From: Daniel Kallendorf Date: Wed, 14 May 2025 18:07:08 +0200 Subject: [PATCH 1/4] Implementation of the name based listing https://github.com/campa-consortium/pals/discussions/52#discussioncomment-12836541 --- examples/fodo.py | 27 +++++++++++++-------------- schema/BaseElement.py | 3 --- schema/Line.py | 4 ++-- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/examples/fodo.py b/examples/fodo.py index c2e6ed5..5021f29 100644 --- a/examples/fodo.py +++ b/examples/fodo.py @@ -16,43 +16,40 @@ def main(): drift1 = DriftElement( - name="drift1", length=0.25, ) quad1 = QuadrupoleElement( - name="quad1", length=1.0, MagneticMultipoleP=MagneticMultipoleParameters( Bn1=1.0, ), ) drift2 = DriftElement( - name="drift2", length=0.5, ) quad2 = QuadrupoleElement( - name="quad2", length=1.0, MagneticMultipoleP=MagneticMultipoleParameters( Bn1=-1.0, ), ) drift3 = DriftElement( - name="drift3", length=0.5, ) # Create line with all elements line = Line( - line=[ - drift1, - quad1, - drift2, - quad2, - drift3, - ] + line={ + 'drift1': drift1, + 'quad1': quad1, + 'drift2': drift2, + 'quad2': quad2, + 'drift3': drift3, + } ) + # Serialize to YAML - yaml_data = yaml.dump(line.model_dump(), default_flow_style=False) + yaml_data = yaml.dump( + line.model_dump(), default_flow_style=False, sort_keys=False) print("Dumping YAML data...") print(f"{yaml_data}") # Write YAML data to file @@ -66,8 +63,10 @@ def main(): loaded_line = Line(**yaml_data) # Validate loaded data assert line == loaded_line + + # Serialize to JSON - json_data = json.dumps(line.model_dump(), sort_keys=True, indent=2) + json_data = json.dumps(line.model_dump(), indent=2) print("Dumping JSON data...") print(f"{json_data}") # Write JSON data to file diff --git a/schema/BaseElement.py b/schema/BaseElement.py index 825635e..cfed954 100644 --- a/schema/BaseElement.py +++ b/schema/BaseElement.py @@ -11,6 +11,3 @@ class BaseElement(BaseModel): # Validate every time a new value is assigned to an attribute, # not only when an instance of BaseElement is created model_config = ConfigDict(validate_assignment=True) - - # Unique element name - name: Optional[str] = None diff --git a/schema/Line.py b/schema/Line.py index e1ad070..e05f3a0 100644 --- a/schema/Line.py +++ b/schema/Line.py @@ -1,5 +1,5 @@ from pydantic import BaseModel, ConfigDict, Field -from typing import Annotated, List, Literal, Union +from typing import Annotated, Literal, Union, OrderedDict from schema.BaseElement import BaseElement from schema.ThickElement import ThickElement @@ -16,7 +16,7 @@ class Line(BaseModel): kind: Literal["Line"] = "Line" - line: List[ + line: OrderedDict[str, Annotated[ Union[ BaseElement, From ccb3c517cf4789da7f1bff64842d1e0910d325ff Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 14 May 2025 16:07:37 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- examples/fodo.py | 14 ++++++-------- schema/BaseElement.py | 2 +- schema/Line.py | 5 +++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/examples/fodo.py b/examples/fodo.py index 5021f29..bbe32a2 100644 --- a/examples/fodo.py +++ b/examples/fodo.py @@ -39,17 +39,16 @@ def main(): # Create line with all elements line = Line( line={ - 'drift1': drift1, - 'quad1': quad1, - 'drift2': drift2, - 'quad2': quad2, - 'drift3': drift3, + "drift1": drift1, + "quad1": quad1, + "drift2": drift2, + "quad2": quad2, + "drift3": drift3, } ) # Serialize to YAML - yaml_data = yaml.dump( - line.model_dump(), default_flow_style=False, sort_keys=False) + yaml_data = yaml.dump(line.model_dump(), default_flow_style=False, sort_keys=False) print("Dumping YAML data...") print(f"{yaml_data}") # Write YAML data to file @@ -64,7 +63,6 @@ def main(): # Validate loaded data assert line == loaded_line - # Serialize to JSON json_data = json.dumps(line.model_dump(), indent=2) print("Dumping JSON data...") diff --git a/schema/BaseElement.py b/schema/BaseElement.py index cfed954..075babd 100644 --- a/schema/BaseElement.py +++ b/schema/BaseElement.py @@ -1,5 +1,5 @@ from pydantic import BaseModel, ConfigDict -from typing import Literal, Optional +from typing import Literal class BaseElement(BaseModel): diff --git a/schema/Line.py b/schema/Line.py index e05f3a0..049bbac 100644 --- a/schema/Line.py +++ b/schema/Line.py @@ -16,7 +16,8 @@ class Line(BaseModel): kind: Literal["Line"] = "Line" - line: OrderedDict[str, + line: OrderedDict[ + str, Annotated[ Union[ BaseElement, @@ -26,7 +27,7 @@ class Line(BaseModel): "Line", ], Field(discriminator="kind"), - ] + ], ] From b57d58ac9149ea71628484c89c4a5b8f4cfd217e Mon Sep 17 00:00:00 2001 From: Daniel Kallendorf Date: Sat, 17 May 2025 21:52:56 +0200 Subject: [PATCH 3/4] Updated unit tests --- tests/test_schema.py | 47 +++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/tests/test_schema.py b/tests/test_schema.py index 3abdc8a..e22acef 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -15,21 +15,16 @@ def test_BaseElement(): - # Create one base element with custom name - element_name = "base_element" - element = BaseElement(name=element_name) - assert element.name == element_name + # nothing to test here + pass def test_ThickElement(): # Create one thick element with custom name and length - element_name = "thick_element" element_length = 1.0 element = ThickElement( - name=element_name, length=element_length, ) - assert element.name == element_name assert element.length == element_length # Try to assign negative length and # detect validation error without breaking pytest @@ -45,13 +40,10 @@ def test_ThickElement(): def test_DriftElement(): # Create one drift element with custom name and length - element_name = "drift_element" element_length = 1.0 element = DriftElement( - name=element_name, length=element_length, ) - assert element.name == element_name assert element.length == element_length # Try to assign negative length and # detect validation error without breaking pytest @@ -67,7 +59,6 @@ def test_DriftElement(): def test_QuadrupoleElement(): # Create one drift element with custom name and length - element_name = "quadrupole_element" element_length = 1.0 element_magnetic_multipole_Bn1 = 1.1 element_magnetic_multipole_Bn2 = 1.2 @@ -84,11 +75,9 @@ def test_QuadrupoleElement(): tilt2=element_magnetic_multipole_tilt2, ) element = QuadrupoleElement( - name=element_name, length=element_length, MagneticMultipoleP=element_magnetic_multipole, ) - assert element.name == element_name assert element.length == element_length assert element.MagneticMultipoleP.Bn1 == element_magnetic_multipole_Bn1 assert element.MagneticMultipoleP.Bs1 == element_magnetic_multipole_Bs1 @@ -103,28 +92,28 @@ def test_QuadrupoleElement(): def test_Line(): # Create first line with one base element - element1 = BaseElement(name="element1") - line1 = Line(line=[element1]) - assert line1.line == [element1] + element1 = BaseElement() + line1 = Line(line={"element1":element1}) + assert line1.line == {"element1":element1} # Extend first line with one thick element - element2 = ThickElement(name="element2", length=2.0) - line1.line.extend([element2]) - assert line1.line == [element1, element2] + element2 = ThickElement(length=2.0) + line1.line.update({"element2":element2}) + assert line1.line == {"element1":element1, "element2":element2} # Create second line with one drift element - element3 = DriftElement(name="element3", length=3.0) - line2 = Line(line=[element3]) + element3 = DriftElement(length=3.0) + line2 = Line(line={"element3":element3}) # Extend first line with second line - line1.line.extend(line2.line) - assert line1.line == [element1, element2, element3] + line1.line.update(line2.line) + assert line1.line == {"element1":element1, "element2":element2,"element3":element3} def test_yaml(): # Create one base element - element1 = BaseElement(name="element1") + element1 = BaseElement() # Create one thick element - element2 = ThickElement(name="element2", length=2.0) + element2 = ThickElement(length=2.0) # Create line with both elements - line = Line(line=[element1, element2]) + line = Line(line={"element1":element1, "element2":element2}) # Serialize the Line object to YAML yaml_data = yaml.dump(line.model_dump(), default_flow_style=False) print(f"\n{yaml_data}") @@ -145,11 +134,11 @@ def test_yaml(): def test_json(): # Create one base element - element1 = BaseElement(name="element1") + element1 = BaseElement() # Create one thick element - element2 = ThickElement(name="element2", length=2.0) + element2 = ThickElement(length=2.0) # Create line with both elements - line = Line(line=[element1, element2]) + line = Line(line={"element1":element1, "element2":element2}) # Serialize the Line object to JSON json_data = json.dumps(line.model_dump(), sort_keys=True, indent=2) print(f"\n{json_data}") From 95783a99e588fbf014494e22b36d543117f74ed6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 17 May 2025 19:58:55 +0000 Subject: [PATCH 4/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_schema.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/test_schema.py b/tests/test_schema.py index e22acef..233e81a 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -93,18 +93,22 @@ def test_QuadrupoleElement(): def test_Line(): # Create first line with one base element element1 = BaseElement() - line1 = Line(line={"element1":element1}) - assert line1.line == {"element1":element1} + line1 = Line(line={"element1": element1}) + assert line1.line == {"element1": element1} # Extend first line with one thick element element2 = ThickElement(length=2.0) - line1.line.update({"element2":element2}) - assert line1.line == {"element1":element1, "element2":element2} + line1.line.update({"element2": element2}) + assert line1.line == {"element1": element1, "element2": element2} # Create second line with one drift element element3 = DriftElement(length=3.0) - line2 = Line(line={"element3":element3}) + line2 = Line(line={"element3": element3}) # Extend first line with second line line1.line.update(line2.line) - assert line1.line == {"element1":element1, "element2":element2,"element3":element3} + assert line1.line == { + "element1": element1, + "element2": element2, + "element3": element3, + } def test_yaml(): @@ -113,7 +117,7 @@ def test_yaml(): # Create one thick element element2 = ThickElement(length=2.0) # Create line with both elements - line = Line(line={"element1":element1, "element2":element2}) + line = Line(line={"element1": element1, "element2": element2}) # Serialize the Line object to YAML yaml_data = yaml.dump(line.model_dump(), default_flow_style=False) print(f"\n{yaml_data}") @@ -138,7 +142,7 @@ def test_json(): # Create one thick element element2 = ThickElement(length=2.0) # Create line with both elements - line = Line(line={"element1":element1, "element2":element2}) + line = Line(line={"element1": element1, "element2": element2}) # Serialize the Line object to JSON json_data = json.dumps(line.model_dump(), sort_keys=True, indent=2) print(f"\n{json_data}")