Skip to content

Commit ca2afe1

Browse files
Merge pull request #28 from flexiblepower/fix/support-python-3.8
adapt code to work in Python 3.8
2 parents bd33a58 + 37c70eb commit ca2afe1

File tree

10 files changed

+85
-37
lines changed

10 files changed

+85
-37
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ jobs:
5757
strategy:
5858
matrix:
5959
python:
60-
# - "3.9"
61-
# - "3.7" # oldest Python supported by PSF
60+
- "3.8"
61+
- "3.9"
62+
- "3.10"
6263
- "3.11" # newest Python that is stable
6364
platform:
6465
- ubuntu-latest

src/s2python/common/number_range.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Any
1+
from typing import Any, Dict
22

33
from pydantic import root_validator
44

@@ -11,7 +11,7 @@ class Config(GenNumberRange.Config):
1111
validate_assignment = True
1212

1313
@root_validator(pre=False)
14-
def validate_start_end_order(cls, values: dict[str, Any]) -> dict[str, Any]:
14+
def validate_start_end_order(cls, values: Dict[str, Any]) -> Dict[str, Any]:
1515
if values.get("start_of_range", 0.0) > values.get("end_of_range", 0.0):
1616
raise ValueError(cls, 'start_of_range should not be higher than end_of_range')
1717

src/s2python/common/power_range.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Any
1+
from typing import Any, Dict
22

33
from pydantic import root_validator
44

@@ -12,7 +12,7 @@ class Config(GenPowerRange.Config):
1212
validate_assignment = True
1313

1414
@root_validator(pre=False)
15-
def validate_start_end_order(cls, values: dict[str, Any]) -> dict[str, Any]:
15+
def validate_start_end_order(cls, values: Dict[str, Any]) -> Dict[str, Any]:
1616
if values.get("start_of_range", 0.0) > values.get("end_of_range", 0.0):
1717
raise ValueError(cls, 'start_of_range should not be higher than end_of_range')
1818

src/s2python/common/support.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@
22

33

44
def commodity_has_quantity(commodity: 'Commodity', quantity: CommodityQuantity) -> bool:
5-
match commodity:
6-
case Commodity.HEAT:
7-
return quantity in [CommodityQuantity.HEAT_THERMAL_POWER,
8-
CommodityQuantity.HEAT_TEMPERATURE,
9-
CommodityQuantity.HEAT_FLOW_RATE]
10-
case Commodity.ELECTRICITY:
11-
return quantity in [CommodityQuantity.ELECTRIC_POWER_3_PHASE_SYMMETRIC,
12-
CommodityQuantity.ELECTRIC_POWER_L1,
13-
CommodityQuantity.ELECTRIC_POWER_L2,
14-
CommodityQuantity.ELECTRIC_POWER_L3]
15-
case Commodity.GAS:
16-
return quantity in [CommodityQuantity.NATURAL_GAS_FLOW_RATE]
17-
case Commodity.OIL:
18-
return quantity in [CommodityQuantity.OIL_FLOW_RATE]
19-
case _:
20-
raise RuntimeError(f'Unsupported commodity {commodity}. Missing implementation.')
5+
if commodity == Commodity.HEAT:
6+
return quantity in [CommodityQuantity.HEAT_THERMAL_POWER,
7+
CommodityQuantity.HEAT_TEMPERATURE,
8+
CommodityQuantity.HEAT_FLOW_RATE]
9+
elif commodity == Commodity.ELECTRICITY:
10+
return quantity in [CommodityQuantity.ELECTRIC_POWER_3_PHASE_SYMMETRIC,
11+
CommodityQuantity.ELECTRIC_POWER_L1,
12+
CommodityQuantity.ELECTRIC_POWER_L2,
13+
CommodityQuantity.ELECTRIC_POWER_L3]
14+
elif commodity == Commodity.GAS:
15+
return quantity in [CommodityQuantity.NATURAL_GAS_FLOW_RATE]
16+
elif commodity == Commodity.OIL:
17+
return quantity in [CommodityQuantity.OIL_FLOW_RATE]
18+
else:
19+
raise RuntimeError(f'Unsupported commodity {commodity}. Missing implementation.')

src/s2python/frbc/frbc_actuator_description.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import uuid
22

3-
from typing import List, Any
3+
from typing import List, Any, Dict
44

55
from pydantic import root_validator
66

@@ -23,7 +23,7 @@ class Config(GenFRBCActuatorDescription.Config):
2323
supported_commodities: List[Commodity] = GenFRBCActuatorDescription.__fields__['supported_commodities'].field_info # type: ignore[assignment]
2424

2525
@root_validator(pre=False)
26-
def validate_timers_in_transitions(cls, values: dict[str, Any]) -> dict[str, Any]:
26+
def validate_timers_in_transitions(cls, values: Dict[str, Any]) -> Dict[str, Any]:
2727
timers_by_id = {timer.id: timer for timer in values.get("timers", {})}
2828
transition: Transition
2929
for transition in values.get("transitions", []):
@@ -40,7 +40,7 @@ def validate_timers_in_transitions(cls, values: dict[str, Any]) -> dict[str, Any
4040
return values
4141

4242
@root_validator(pre=False)
43-
def validate_timers_unique_ids(cls, values: dict[str, Any]) -> dict[str, Any]:
43+
def validate_timers_unique_ids(cls, values: Dict[str, Any]) -> Dict[str, Any]:
4444
ids = []
4545
timer: Timer
4646
for timer in values.get("timers", []):
@@ -51,7 +51,7 @@ def validate_timers_unique_ids(cls, values: dict[str, Any]) -> dict[str, Any]:
5151
return values
5252

5353
@root_validator(pre=False)
54-
def validate_operation_modes_in_transitions(cls, values: dict[str, Any]) -> dict[str, Any]:
54+
def validate_operation_modes_in_transitions(cls, values: Dict[str, Any]) -> Dict[str, Any]:
5555
operation_mode_by_id = {operation_mode.id: operation_mode
5656
for operation_mode in values.get("operation_modes", [])}
5757
transition: Transition
@@ -67,7 +67,7 @@ def validate_operation_modes_in_transitions(cls, values: dict[str, Any]) -> dict
6767
return values
6868

6969
@root_validator(pre=False)
70-
def validate_operation_modes_unique_ids(cls, values: dict[str, Any]) -> dict[str, Any]:
70+
def validate_operation_modes_unique_ids(cls, values: Dict[str, Any]) -> Dict[str, Any]:
7171
ids = []
7272
operation_mode: FRBCOperationMode
7373
for operation_mode in values.get("operation_modes", []):
@@ -78,7 +78,7 @@ def validate_operation_modes_unique_ids(cls, values: dict[str, Any]) -> dict[str
7878
return values
7979

8080
@root_validator(pre=False)
81-
def validate_operation_mode_elements_have_all_supported_commodities(cls, values: dict[str, Any]) -> dict[str, Any]:
81+
def validate_operation_mode_elements_have_all_supported_commodities(cls, values: Dict[str, Any]) -> Dict[str, Any]:
8282
supported_commodities = values.get('supported_commodities', [])
8383
operation_mode: FRBCOperationMode
8484
for operation_mode in values.get("operation_modes", []):
@@ -99,7 +99,7 @@ def validate_operation_mode_elements_have_all_supported_commodities(cls, values:
9999
return values
100100

101101
@root_validator(pre=False)
102-
def validate_unique_supported_commodities(cls, values: dict[str, Any]) -> dict[str, Any]:
102+
def validate_unique_supported_commodities(cls, values: Dict[str, Any]) -> Dict[str, Any]:
103103
supported_commodities: list[CommodityQuantity] = values.get('supported_commodities', [])
104104

105105
for supported_commodity in supported_commodities:

src/s2python/frbc/frbc_operation_mode.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
from itertools import pairwise
1+
#from itertools import pairwise
22
import uuid
3-
from typing import List, Dict, Any
3+
from typing import List, Dict, Any, Generator, Tuple
44

55
from pydantic import root_validator
66

77
from s2python.common import NumberRange
88
from s2python.frbc import FRBCOperationModeElement
99
from s2python.generated.gen_s2 import FRBCOperationMode as GenFRBCOperationMode
1010
from s2python.validate_values_mixin import ValidateValuesMixin, catch_and_convert_exceptions
11-
11+
from s2python.utils import pairwise
1212

1313
@catch_and_convert_exceptions
1414
class FRBCOperationMode(GenFRBCOperationMode, ValidateValuesMixin['FRBCOperationMode']):
@@ -19,11 +19,11 @@ class Config(GenFRBCOperationMode.Config):
1919
elements: List[FRBCOperationModeElement] = GenFRBCOperationMode.__fields__['elements'].field_info # type: ignore[assignment]
2020

2121
@root_validator(pre=False)
22-
def validate_contiguous_fill_levels_operation_mode_elements(cls, values: dict[str, Any]) -> dict[str, Any]:
22+
def validate_contiguous_fill_levels_operation_mode_elements(cls, values: Dict[str, Any]) -> Dict[str, Any]:
2323
elements_by_fill_level_range: Dict[NumberRange, FRBCOperationModeElement]
2424
elements_by_fill_level_range = {element.fill_level_range: element for element in values.get('elements', [])}
2525

26-
sorted_fill_level_ranges: list[NumberRange]
26+
sorted_fill_level_ranges: List[NumberRange]
2727
sorted_fill_level_ranges = list(elements_by_fill_level_range.keys())
2828
sorted_fill_level_ranges.sort(key=lambda r: r.start_of_range)
2929

src/s2python/utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
def pairwise(arr : list):
2+
for i in range(max(len(arr) - 1,0)):
3+
yield (arr[i], arr[i+1])

src/s2python/validate_values_mixin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import TypeVar, Generic, Protocol, Type, Tuple, Optional, Callable, cast, Any, Union, AbstractSet, Mapping
1+
from typing import TypeVar, Generic, Protocol, Type, Tuple, Optional, Callable, cast, Any, Union, AbstractSet, Mapping, List, Dict
22

33
from pydantic import BaseModel, StrBytes, Protocol as PydanticProtocol, ValidationError
44

@@ -43,7 +43,7 @@ def dict(
4343
exclude_unset: bool = False,
4444
exclude_defaults: bool = False,
4545
exclude_none: bool = False,
46-
) -> dict[str, Any]: ...
46+
) -> Dict[str, Any]: ...
4747

4848
@classmethod
4949
def parse_raw(cls,
@@ -75,7 +75,7 @@ def from_json(cls: Type[C], json_str: str) -> C:
7575

7676

7777
def convert_to_s2exception(f : Callable) -> Callable:
78-
def inner(*args: list[Any], **kwargs: dict[str, Any]) -> Any:
78+
def inner(*args: List[Any], **kwargs: Dict[str, Any]) -> Any:
7979
try:
8080
return f(*args, **kwargs)
8181
except (ValidationError, TypeError) as e:

tests/unit/utils_test.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from unittest import TestCase
2+
3+
from s2python.utils import pairwise
4+
5+
class PairwiseTest(TestCase):
6+
def test_empty(self):
7+
# Arrange
8+
input_array = []
9+
10+
# Act
11+
pairs = list(pairwise(input_array))
12+
13+
# Assert
14+
self.assertEqual(len(pairs), 0)
15+
16+
def test_len_2(self):
17+
# Arrange
18+
input_array = [1,2]
19+
20+
# Act
21+
pairs = list(pairwise(input_array))
22+
23+
# Assert
24+
self.assertEqual(pairs, [(1,2)])
25+
26+
def test_odd(self):
27+
# Arrange
28+
input_array = [1,2,3]
29+
30+
# Act
31+
pairs = list(pairwise(input_array))
32+
33+
# Assert
34+
self.assertEqual(pairs, [(1,2), (2,3)])
35+
36+
def test_even(self):
37+
# Arrange
38+
input_array = [1,2,3,4]
39+
40+
# Act
41+
pairs = list(pairwise(input_array))
42+
43+
# Assert
44+
self.assertEqual(pairs, [(1,2), (2,3), (3,4)])

tox.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ isolated_build = True
66

77
[testenv]
88
description = Invoke pytest to run automated tests
9+
910
setenv =
1011
TOXINIDIR = {toxinidir}
1112
passenv =

0 commit comments

Comments
 (0)