Skip to content
Draft
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
1 change: 1 addition & 0 deletions meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ test:
- tomli
- xarray
- numpy
- lxml-stubs
source_files:
- tests
commands:
Expand Down
3 changes: 2 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ test = [
"ruff",
"tomli", # for support of python<3.11 toml parsing in check_metadata.py
"xarray", # for testing extra
"numpy" # for testing extra
"numpy", # for testing extra
"lxml-stubs" # for type checking of lxml in tests
]
docs = [
"pyyaml",
Expand Down
20 changes: 10 additions & 10 deletions space_packet_parser/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import logging
import warnings
from abc import ABCMeta, abstractmethod
from typing import Protocol
from typing import Any, Protocol

import lxml.etree as ElementTree
from lxml.builder import ElementMaker
Expand Down Expand Up @@ -150,12 +150,12 @@ class XmlObject(metaclass=ABCMeta):
@abstractmethod
def from_xml(
cls,
element: ElementTree.Element,
element: ElementTree._Element,
*,
tree: ElementTree.ElementTree | None,
parameter_lookup: dict[str, any] | None,
parameter_type_lookup: dict[str, any] | None,
container_lookup: dict[str, any] | None,
tree: ElementTree._ElementTree | None,
parameter_lookup: dict[str, Any] | None,
parameter_type_lookup: dict[str, Any] | None,
container_lookup: dict[str, Any] | None,
) -> XmlObject:
"""Create an object from an XML element

Expand All @@ -167,9 +167,9 @@ def from_xml(

Parameters
----------
element : ElementTree.Element
element : ElementTree._Element
XML element from which to parse the object
tree: Optional[ElementTree.ElementTree]
tree: Optional[ElementTree._ElementTree]
Full XML tree for parsing that requires access to other elements
parameter_lookup: Optional[dict[str, parameters.ParameterType]]
Parameters dict for parsing that requires knowledge of existing parameters
Expand All @@ -185,7 +185,7 @@ def from_xml(
raise NotImplementedError()

@abstractmethod
def to_xml(self, *, elmaker: ElementMaker) -> ElementTree.Element:
def to_xml(self, *, elmaker: ElementMaker) -> ElementTree._Element:
"""Create an XML element from the object self

Parameters
Expand All @@ -195,7 +195,7 @@ def to_xml(self, *, elmaker: ElementMaker) -> ElementTree.Element:

Returns
-------
: ElementTree.Element
: ElementTree._Element
XML Element object
"""
raise NotImplementedError()
Expand Down
99 changes: 52 additions & 47 deletions space_packet_parser/xtce/calibrators.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from abc import ABCMeta, abstractmethod
from collections import namedtuple
from typing import Any

import lxml.etree as ElementTree
from lxml.builder import ElementMaker
Expand All @@ -19,20 +20,20 @@ class Calibrator(common.AttrComparable, common.XmlObject, metaclass=ABCMeta):
@abstractmethod
def from_xml(
cls,
element: ElementTree.Element,
element: ElementTree._Element,
*,
tree: ElementTree.Element | None = None,
parameter_lookup: dict[str, any] | None = None,
parameter_type_lookup: dict[str, any] | None = None,
container_lookup: dict[str, any] | None = None,
tree: ElementTree._ElementTree | None = None,
parameter_lookup: dict[str, Any] | None = None,
parameter_type_lookup: dict[str, Any] | None = None,
container_lookup: dict[str, Any] | None = None,
) -> Calibrator:
"""Abstract classmethod to create a default_calibrator object from an XML element.

Parameters
----------
element : ElementTree.Element
element : ElementTree._Element
XML element
tree: Optional[ElementTree.Element]
tree: Optional[ElementTree._ElementTree]
Ignored
parameter_lookup: Optional[dict]
Ignored
Expand Down Expand Up @@ -96,20 +97,20 @@ def __init__(self, points: list, order: int = 0, extrapolate: bool = False):
@classmethod
def from_xml(
cls,
element: ElementTree.Element,
element: ElementTree._Element,
*,
tree: ElementTree.Element | None = None,
parameter_lookup: dict[str, any] | None = None,
parameter_type_lookup: dict[str, any] | None = None,
container_lookup: dict[str, any] | None = None,
tree: ElementTree._ElementTree | None = None,
parameter_lookup: dict[str, Any] | None = None,
parameter_type_lookup: dict[str, Any] | None = None,
container_lookup: dict[str, Any] | None = None,
) -> SplineCalibrator:
"""Create a spline default_calibrator object from an <xtce:SplineCalibrator> XML element.

Parameters
----------
element : ElementTree.Element
element : ElementTree._Element
The XML element from which to create the object.
tree: Optional[ElementTree.Element]
tree: Optional[ElementTree._ElementTree]
Ignored
parameter_lookup: Optional[dict]
Ignored
Expand All @@ -130,7 +131,7 @@ def from_xml(
extrapolate = element.attrib["extrapolate"].lower() == "true" if "extrapolate" in element.attrib else False
return cls(order=order, points=spline_points, extrapolate=extrapolate)

def to_xml(self, *, elmaker: ElementMaker) -> ElementTree.Element:
def to_xml(self, *, elmaker: ElementMaker) -> ElementTree._Element:
"""Create a SplineCalibrator XML element

Parameters
Expand All @@ -140,7 +141,7 @@ def to_xml(self, *, elmaker: ElementMaker) -> ElementTree.Element:

Returns
-------
: ElementTree.Element
: ElementTree._Element
"""
return elmaker.SplineCalibrator(
*(elmaker.SplinePoint(raw=str(p.raw), calibrated=str(p.calibrated)) for p in self.points),
Expand Down Expand Up @@ -266,20 +267,20 @@ def __init__(self, coefficients: list[PolynomialCoefficient]):
@classmethod
def from_xml(
cls,
element: ElementTree.Element,
element: ElementTree._Element,
*,
tree: ElementTree.Element | None = None,
parameter_lookup: dict[str, any] | None = None,
parameter_type_lookup: dict[str, any] | None = None,
container_lookup: dict[str, any] | None = None,
tree: ElementTree._ElementTree | None = None,
parameter_lookup: dict[str, Any] | None = None,
parameter_type_lookup: dict[str, Any] | None = None,
container_lookup: dict[str, Any] | None = None,
) -> PolynomialCalibrator:
"""Create a polynomial default_calibrator object from an <xtce:PolynomialCalibrator> XML element.

Parameters
----------
element : ElementTree.Element
element : ElementTree._Element
<xtce:PolynomialCalibrator> XML element
tree: Optional[ElementTree.Element]
tree: Optional[ElementTree._ElementTree]
Ignored
parameter_lookup: Optional[dict]
Ignored
Expand All @@ -298,7 +299,7 @@ def from_xml(
]
return cls(coefficients=coefficients)

def to_xml(self, elmaker: ElementMaker) -> ElementTree.Element:
def to_xml(self, elmaker: ElementMaker) -> ElementTree._Element:
"""Create a PolynomialCalibrator XML element

Parameters
Expand All @@ -308,7 +309,7 @@ def to_xml(self, elmaker: ElementMaker) -> ElementTree.Element:

Returns
-------
: ElementTree.Element
: ElementTree._Element
"""
return elmaker.PolynomialCalibrator(
*(
Expand Down Expand Up @@ -348,20 +349,20 @@ def __init__(self):
@classmethod
def from_xml(
cls,
element: ElementTree.Element,
element: ElementTree._Element,
*,
tree: ElementTree.Element | None = None,
parameter_lookup: dict[str, any] | None = None,
parameter_type_lookup: dict[str, any] | None = None,
container_lookup: dict[str, any] | None = None,
tree: ElementTree._ElementTree | None = None,
parameter_lookup: dict[str, Any] | None = None,
parameter_type_lookup: dict[str, Any] | None = None,
container_lookup: dict[str, Any] | None = None,
) -> MathOperationCalibrator:
"""Create a math operation default_calibrator from an <xtce:MathOperationCalibrator> XML element.

Parameters
----------
element : ElementTree.Element
element : ElementTree._Element
The XML element from which to create the object.
tree: Optional[ElementTree.Element]
tree: Optional[ElementTree._ElementTree]
Ignored
parameter_lookup: Optional[dict]
Ignored
Expand All @@ -376,7 +377,7 @@ def from_xml(
"""
raise NotImplementedError(cls.err_msg)

def to_xml(self, elmaker: dict) -> ElementTree.Element:
def to_xml(self, elmaker: dict) -> ElementTree._Element:
"""Create a MathOperationsCalibrator XML element

Parameters
Expand All @@ -386,7 +387,7 @@ def to_xml(self, elmaker: dict) -> ElementTree.Element:

Returns
-------
: ElementTree.Element
: ElementTree._Element
"""
raise NotImplementedError(self.err_msg)

Expand Down Expand Up @@ -423,12 +424,12 @@ def __init__(self, match_criteria: list, calibrator: Calibrator):
self.calibrator = calibrator

@staticmethod
def get_context_match_criteria(element: ElementTree.Element) -> list[comparisons.MatchCriteria]:
def get_context_match_criteria(element: ElementTree._Element) -> list[comparisons.MatchCriteria]:
"""Parse contextual requirements from a Comparison, ComparisonList, or BooleanExpression

Parameters
----------
element : ElementTree.Element
element : ElementTree._Element
<xtce:ContextCalibrator> XML element from which to parse the ContextCalibrator object.

Returns
Expand All @@ -437,6 +438,10 @@ def get_context_match_criteria(element: ElementTree.Element) -> list[comparisons
List of Comparisons that can be evaluated to determine whether this calibrator should be used.
"""
context_match_element = element.find("ContextMatch")
if not context_match_element:
raise ValueError(
f"ContextCalibrator XML element {element.tag} {element.attrib} must contain a ContextMatch element"
)
if (comparison_list_element := context_match_element.find("ComparisonList")) is not None:
return [comparisons.Comparison.from_xml(el) for el in comparison_list_element.iterfind("Comparison")]
if (comparison_element := context_match_element.find("Comparison")) is not None:
Expand All @@ -452,20 +457,20 @@ def get_context_match_criteria(element: ElementTree.Element) -> list[comparisons
@classmethod
def from_xml(
cls,
element: ElementTree.Element,
element: ElementTree._Element,
*,
tree: ElementTree.Element | None = None,
parameter_lookup: dict[str, any] | None = None,
parameter_type_lookup: dict[str, any] | None = None,
container_lookup: dict[str, any] | None = None,
tree: ElementTree._ElementTree | None = None,
parameter_lookup: dict[str, Any] | None = None,
parameter_type_lookup: dict[str, Any] | None = None,
container_lookup: dict[str, Any] | None = None,
) -> ContextCalibrator:
"""Create a ContextCalibrator object from an <xtce:ContextCalibrator> XML element

Parameters
----------
element : ElementTree.Element
element : ElementTree._Element
<xtce:ContextCalibrator> XML element from which to parse the ContextCalibrator object.
tree: Optional[ElementTree.Element]
tree: Optional[ElementTree._ElementTree]
Ignored
parameter_lookup: Optional[dict]
Ignored
Expand All @@ -481,9 +486,9 @@ def from_xml(
match_criteria = cls.get_context_match_criteria(element)

if (cal_element := element.find("Calibrator/SplineCalibrator")) is not None:
calibrator = SplineCalibrator.from_xml(cal_element)
calibrator: Calibrator = SplineCalibrator.from_xml(cal_element)
elif (cal_element := element.find("Calibrator/PolynomialCalibrator")) is not None:
calibrator = PolynomialCalibrator.from_xml(cal_element)
calibrator: Calibrator = PolynomialCalibrator.from_xml(cal_element)
else:
raise NotImplementedError(
"Unsupported default_calibrator type. space_packet_parser only supports Polynomial and Spline"
Expand All @@ -492,7 +497,7 @@ def from_xml(

return cls(match_criteria=match_criteria, calibrator=calibrator)

def to_xml(self, *, elmaker: ElementMaker) -> ElementTree.Element:
def to_xml(self, *, elmaker: ElementMaker) -> ElementTree._Element:
"""Create a MathOperationsCalibrator XML element

Parameters
Expand All @@ -502,7 +507,7 @@ def to_xml(self, *, elmaker: ElementMaker) -> ElementTree.Element:

Returns
-------
: ElementTree.Element
: ElementTree._Element
"""
context_match_element = elmaker.ContextMatch()

Expand Down
Loading
Loading