-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(pint_units): Fixed
BaseQuantity
to allow quantities multiplicat…
…ions (#25) List of changes: - Removed `__new__` from BaseQuantity which was causing the problem - Renamed `__compatible_unit__` to `__base_unit__` - Added `ureg.check` to default units. This will check if the unit is compatible, but will not check the input value. - Added testing for BaseQuantity class and units. - Added a serialization property so that we can call `component.model_dump(mode="json")` when using pint.Quantities, Closes #24
- Loading branch information
Showing
6 changed files
with
131 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,33 @@ | ||
"""This module defines basic unit quantities.""" | ||
"""This module defines basic unit quantities. | ||
To create new Quantities for a given base unit, we just need to specify the | ||
base unit as the second argument of `ureg.check`. | ||
""" | ||
|
||
from infrasys.base_quantity import BaseQuantity | ||
from infrasys.component import Component | ||
|
||
# ruff:noqa | ||
# fmt: off | ||
|
||
class Distance(BaseQuantity): __compatible_unit__ = "meter" | ||
class Distance(BaseQuantity): __base_unit__ = "meter" | ||
|
||
class Voltage(BaseQuantity): __base_unit__ = "volt" | ||
|
||
class Current(BaseQuantity): __base_unit__ = "ampere" | ||
|
||
class Angle(BaseQuantity): __base_unit__ = "degree" | ||
|
||
class Voltage(BaseQuantity): __compatible_unit__ = "volt" | ||
class ActivePower(BaseQuantity): __base_unit__ = "watt" | ||
|
||
class Current(BaseQuantity): __compatible_unit__ = "ampere" | ||
class Energy(BaseQuantity): __base_unit__ = "watthour" | ||
|
||
class Angle(BaseQuantity): __compatible_unit__ = "degree" | ||
class Time(BaseQuantity): __base_unit__ = "minute" | ||
|
||
class ActivePower(BaseQuantity): __compatible_unit__ = "watt" | ||
class Resistance(BaseQuantity): __base_unit__ = "ohm" | ||
|
||
class Energy(BaseQuantity): __compatible_unit__ = "watthour" | ||
|
||
class Time(BaseQuantity): __compatible_unit__ = "minute" | ||
class Test(Component): | ||
voltage: Voltage | ||
|
||
class Resistance(BaseQuantity): __compatible_unit__ = "ohm" | ||
Test(name="test", voltage=Voltage(100, "kV")) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
from infrasys.base_quantity import ureg, BaseQuantity | ||
from infrasys.quantities import ActivePower, Time | ||
from pint.errors import DimensionalityError | ||
import pytest | ||
import numpy as np | ||
|
||
|
||
def test_base_quantity(): | ||
distance_quantity = ureg.check(None, "meter")(BaseQuantity) | ||
|
||
unit = distance_quantity(100, "meter") | ||
assert isinstance(unit, BaseQuantity) | ||
|
||
# Check that we can not assign units that are not-related. | ||
with pytest.raises(DimensionalityError): | ||
_ = distance_quantity(100, "kWh") | ||
|
||
# Check unit multiplication | ||
active_power_quantity = ActivePower(100, "kW") | ||
hours = Time(2, "h") | ||
|
||
result_quantity = active_power_quantity * hours | ||
assert result_quantity.check("[energy]") | ||
assert result_quantity.magnitude == 200 | ||
|
||
# Check to dict | ||
assert result_quantity.to_dict() == { | ||
"value": result_quantity.magnitude, | ||
"units": str(result_quantity.units), | ||
} | ||
|
||
|
||
def test_base_quantity_numpy(): | ||
array = np.arange(0, 10) | ||
measurements = ActivePower(array, "kW") | ||
assert isinstance(measurements, BaseQuantity) | ||
assert measurements.to_dict()["value"] == array.tolist() | ||
|
||
|
||
def test_unit_deserialization(): | ||
test_units = { | ||
"value": 100, | ||
"units": "kilowatt", # The unit name should be the pint default name | ||
} | ||
active_power = BaseQuantity.from_dict(test_units) | ||
assert isinstance(active_power, BaseQuantity) | ||
assert active_power.magnitude == 100 | ||
assert str(active_power.units) == "kilowatt" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters