foamlib 0.2.7__tar.gz → 0.2.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {foamlib-0.2.7 → foamlib-0.2.8}/PKG-INFO +1 -1
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib/__init__.py +1 -1
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib/_dictionaries/_base.py +10 -3
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib/_dictionaries/_files.py +9 -9
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib/_dictionaries/_parsing.py +33 -12
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib/_dictionaries/_serialization.py +11 -11
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib.egg-info/PKG-INFO +1 -1
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib.egg-info/SOURCES.txt +1 -2
- foamlib-0.2.7/tests/test_serialization.py +0 -52
- {foamlib-0.2.7 → foamlib-0.2.8}/LICENSE.txt +0 -0
- {foamlib-0.2.7 → foamlib-0.2.8}/README.md +0 -0
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib/_cases.py +0 -0
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib/_dictionaries/__init__.py +0 -0
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib/_util.py +0 -0
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib/py.typed +0 -0
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib.egg-info/dependency_links.txt +0 -0
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib.egg-info/requires.txt +0 -0
- {foamlib-0.2.7 → foamlib-0.2.8}/foamlib.egg-info/top_level.txt +0 -0
- {foamlib-0.2.7 → foamlib-0.2.8}/pyproject.toml +0 -0
- {foamlib-0.2.7 → foamlib-0.2.8}/setup.cfg +0 -0
@@ -40,7 +40,16 @@ class FoamDictionaryBase:
|
|
40
40
|
if not isinstance(self.dimensions, FoamDictionaryBase.DimensionSet):
|
41
41
|
self.dimensions = FoamDictionaryBase.DimensionSet(*self.dimensions)
|
42
42
|
|
43
|
-
Value = Union[
|
43
|
+
Value = Union[
|
44
|
+
str,
|
45
|
+
int,
|
46
|
+
float,
|
47
|
+
bool,
|
48
|
+
Dimensioned,
|
49
|
+
DimensionSet,
|
50
|
+
Sequence["Value"],
|
51
|
+
Mapping[str, "Value"],
|
52
|
+
]
|
44
53
|
"""
|
45
54
|
A value that can be stored in an OpenFOAM dictionary.
|
46
55
|
"""
|
@@ -53,5 +62,3 @@ class FoamDictionaryBase:
|
|
53
62
|
raise NotImplementedError
|
54
63
|
|
55
64
|
_SetValue = Union[Value, "NDArray[np.generic]"]
|
56
|
-
|
57
|
-
_SetMapping = Mapping[str, Union["_SetValue", "_SetMapping"]]
|
@@ -131,11 +131,7 @@ class FoamFile(
|
|
131
131
|
assume_dimensions=assume_dimensions,
|
132
132
|
)
|
133
133
|
|
134
|
-
def __setitem__(
|
135
|
-
self,
|
136
|
-
keyword: str,
|
137
|
-
value: Union["FoamFile._SetValue", "FoamFile._SetMapping"],
|
138
|
-
) -> None:
|
134
|
+
def __setitem__(self, keyword: str, value: "FoamFile._SetValue") -> None:
|
139
135
|
self._setitem(keyword, value)
|
140
136
|
|
141
137
|
def __delitem__(self, keyword: str) -> None:
|
@@ -191,7 +187,7 @@ class FoamFile(
|
|
191
187
|
def _setitem(
|
192
188
|
self,
|
193
189
|
keywords: Union[str, Tuple[str, ...]],
|
194
|
-
value:
|
190
|
+
value: "FoamFile._SetValue",
|
195
191
|
*,
|
196
192
|
assume_field: bool = False,
|
197
193
|
assume_dimensions: bool = False,
|
@@ -224,7 +220,7 @@ class FoamFile(
|
|
224
220
|
def __setitem__(
|
225
221
|
self,
|
226
222
|
keywords: Union[str, Tuple[str, ...]],
|
227
|
-
value:
|
223
|
+
value: "FoamFile._SetValue",
|
228
224
|
) -> None:
|
229
225
|
self._setitem(keywords, value)
|
230
226
|
|
@@ -284,7 +280,11 @@ class FoamFieldFile(FoamFile):
|
|
284
280
|
|
285
281
|
class BoundariesDictionary(FoamFile.Dictionary):
|
286
282
|
def __getitem__(self, keyword: str) -> "FoamFieldFile.BoundaryDictionary":
|
287
|
-
|
283
|
+
value = super().__getitem__(keyword)
|
284
|
+
if not isinstance(value, FoamFieldFile.BoundaryDictionary):
|
285
|
+
assert not isinstance(value, FoamFile.Dictionary)
|
286
|
+
raise TypeError(f"boundary {keyword} is not a dictionary")
|
287
|
+
return value
|
288
288
|
|
289
289
|
class BoundaryDictionary(FoamFile.Dictionary):
|
290
290
|
"""An OpenFOAM dictionary representing a boundary condition as a mutable mapping."""
|
@@ -292,7 +292,7 @@ class FoamFieldFile(FoamFile):
|
|
292
292
|
def __setitem__(
|
293
293
|
self,
|
294
294
|
key: str,
|
295
|
-
value:
|
295
|
+
value: FoamFile._SetValue,
|
296
296
|
) -> None:
|
297
297
|
if key == "value":
|
298
298
|
self._setitem(key, value, assume_field=True)
|
@@ -1,11 +1,16 @@
|
|
1
1
|
import sys
|
2
|
-
from typing import Optional, Tuple
|
2
|
+
from typing import Optional, Tuple, Union
|
3
3
|
|
4
4
|
if sys.version_info >= (3, 9):
|
5
5
|
from collections.abc import Mapping, MutableMapping, Sequence
|
6
6
|
else:
|
7
7
|
from typing import Mapping, MutableMapping, Sequence
|
8
8
|
|
9
|
+
if sys.version_info >= (3, 10):
|
10
|
+
from types import EllipsisType
|
11
|
+
else:
|
12
|
+
from typing import Any as EllipsisType
|
13
|
+
|
9
14
|
from pyparsing import (
|
10
15
|
Dict,
|
11
16
|
Forward,
|
@@ -56,6 +61,28 @@ def _list_of(elem: ParserElement) -> ParserElement:
|
|
56
61
|
)
|
57
62
|
|
58
63
|
|
64
|
+
def _dictionary_of(
|
65
|
+
keyword: ParserElement,
|
66
|
+
value: ParserElement,
|
67
|
+
*,
|
68
|
+
len: Union[int, EllipsisType] = ...,
|
69
|
+
located: bool = False,
|
70
|
+
) -> ParserElement:
|
71
|
+
subdict = Forward()
|
72
|
+
|
73
|
+
entry = keyword + (
|
74
|
+
(Literal("{").suppress() + subdict + Literal("}").suppress())
|
75
|
+
| (value + Literal(";").suppress())
|
76
|
+
)
|
77
|
+
|
78
|
+
if located:
|
79
|
+
entry = Located(entry)
|
80
|
+
|
81
|
+
subdict <<= Dict(Group(entry)[...], asdict=not located)
|
82
|
+
|
83
|
+
return Dict(Group(entry)[len], asdict=not located)
|
84
|
+
|
85
|
+
|
59
86
|
_TENSOR = _list_of(common.number) | common.number
|
60
87
|
_IDENTIFIER = Word(identbodychars + "$", printables.replace(";", ""))
|
61
88
|
_DIMENSIONED = (Opt(_IDENTIFIER) + _DIMENSIONS + _TENSOR).set_parse_action(
|
@@ -66,25 +93,19 @@ _FIELD = (Keyword("uniform").suppress() + _TENSOR) | (
|
|
66
93
|
)
|
67
94
|
_TOKEN = QuotedString('"', unquote_results=False) | _IDENTIFIER
|
68
95
|
_ITEM = Forward()
|
69
|
-
|
96
|
+
_ENTRY = _dictionary_of(_IDENTIFIER, _ITEM, len=1)
|
97
|
+
_LIST = _list_of(_ENTRY | _ITEM)
|
70
98
|
_ITEM <<= _FIELD | _LIST | _DIMENSIONED | _DIMENSIONS | common.number | _SWITCH | _TOKEN
|
99
|
+
|
71
100
|
_TOKENS = (
|
72
101
|
QuotedString('"', unquote_results=False) | Word(printables.replace(";", ""))
|
73
102
|
)[2, ...].set_parse_action(lambda tks: " ".join(tks))
|
74
103
|
|
75
104
|
_VALUE = _ITEM ^ _TOKENS
|
76
105
|
|
77
|
-
_ENTRY = Forward()
|
78
|
-
_DICTIONARY = Dict(Group(_ENTRY)[...])
|
79
|
-
_ENTRY <<= Located(
|
80
|
-
_TOKEN
|
81
|
-
+ (
|
82
|
-
(Literal("{").suppress() + _DICTIONARY + Literal("}").suppress())
|
83
|
-
| (Opt(_VALUE, default="") + Literal(";").suppress())
|
84
|
-
)
|
85
|
-
)
|
86
106
|
_FILE = (
|
87
|
-
|
107
|
+
_dictionary_of(_TOKEN, Opt(_VALUE, default=""), located=True)
|
108
|
+
.ignore(c_style_comment)
|
88
109
|
.ignore(cpp_style_comment)
|
89
110
|
.ignore(Literal("#include") + ... + LineEnd()) # type: ignore [no-untyped-call]
|
90
111
|
)
|
@@ -1,6 +1,5 @@
|
|
1
1
|
import sys
|
2
2
|
from contextlib import suppress
|
3
|
-
from typing import Union
|
4
3
|
|
5
4
|
if sys.version_info >= (3, 9):
|
6
5
|
from collections.abc import Mapping
|
@@ -11,9 +10,7 @@ from .._util import is_sequence
|
|
11
10
|
from ._base import FoamDictionaryBase
|
12
11
|
|
13
12
|
|
14
|
-
def _serialize_switch(
|
15
|
-
value: Union[FoamDictionaryBase._SetValue, FoamDictionaryBase._SetMapping],
|
16
|
-
) -> str:
|
13
|
+
def _serialize_switch(value: FoamDictionaryBase._SetValue) -> str:
|
17
14
|
if value is True:
|
18
15
|
return "yes"
|
19
16
|
elif value is False:
|
@@ -23,7 +20,7 @@ def _serialize_switch(
|
|
23
20
|
|
24
21
|
|
25
22
|
def _serialize_list(
|
26
|
-
value:
|
23
|
+
value: FoamDictionaryBase._SetValue,
|
27
24
|
) -> str:
|
28
25
|
if is_sequence(value):
|
29
26
|
return f"({' '.join(_serialize_value(v) for v in value)})"
|
@@ -32,7 +29,7 @@ def _serialize_list(
|
|
32
29
|
|
33
30
|
|
34
31
|
def _serialize_field(
|
35
|
-
value:
|
32
|
+
value: FoamDictionaryBase._SetValue,
|
36
33
|
) -> str:
|
37
34
|
if is_sequence(value):
|
38
35
|
try:
|
@@ -61,7 +58,7 @@ def _serialize_field(
|
|
61
58
|
|
62
59
|
|
63
60
|
def _serialize_dimensions(
|
64
|
-
value:
|
61
|
+
value: FoamDictionaryBase._SetValue,
|
65
62
|
) -> str:
|
66
63
|
if is_sequence(value) and len(value) == 7:
|
67
64
|
return f"[{' '.join(str(v) for v in value)}]"
|
@@ -70,7 +67,7 @@ def _serialize_dimensions(
|
|
70
67
|
|
71
68
|
|
72
69
|
def _serialize_dimensioned(
|
73
|
-
value:
|
70
|
+
value: FoamDictionaryBase._SetValue,
|
74
71
|
) -> str:
|
75
72
|
if isinstance(value, FoamDictionaryBase.Dimensioned):
|
76
73
|
if value.name is not None:
|
@@ -82,7 +79,7 @@ def _serialize_dimensioned(
|
|
82
79
|
|
83
80
|
|
84
81
|
def _serialize_value(
|
85
|
-
value:
|
82
|
+
value: FoamDictionaryBase._SetValue,
|
86
83
|
*,
|
87
84
|
assume_field: bool = False,
|
88
85
|
assume_dimensions: bool = False,
|
@@ -104,11 +101,14 @@ def _serialize_value(
|
|
104
101
|
with suppress(TypeError):
|
105
102
|
return _serialize_switch(value)
|
106
103
|
|
104
|
+
with suppress(TypeError):
|
105
|
+
return _serialize_dictionary(value)
|
106
|
+
|
107
107
|
return str(value)
|
108
108
|
|
109
109
|
|
110
110
|
def _serialize_dictionary(
|
111
|
-
value:
|
111
|
+
value: FoamDictionaryBase._SetValue,
|
112
112
|
) -> str:
|
113
113
|
if isinstance(value, Mapping):
|
114
114
|
return "\n".join(serialize_entry(k, v) for k, v in value.items())
|
@@ -118,7 +118,7 @@ def _serialize_dictionary(
|
|
118
118
|
|
119
119
|
def serialize_entry(
|
120
120
|
keyword: str,
|
121
|
-
value:
|
121
|
+
value: FoamDictionaryBase._SetValue,
|
122
122
|
*,
|
123
123
|
assume_field: bool = False,
|
124
124
|
assume_dimensions: bool = False,
|
@@ -1,52 +0,0 @@
|
|
1
|
-
from foamlib import FoamFile
|
2
|
-
from foamlib._dictionaries._serialization import _serialize_value
|
3
|
-
|
4
|
-
|
5
|
-
def test_serialize_value() -> None:
|
6
|
-
assert _serialize_value(1) == "1"
|
7
|
-
assert _serialize_value(1.0) == "1.0"
|
8
|
-
assert _serialize_value(1.0e-3) == "0.001"
|
9
|
-
assert _serialize_value(True) == "yes"
|
10
|
-
assert _serialize_value(False) == "no"
|
11
|
-
assert _serialize_value("word") == "word"
|
12
|
-
assert _serialize_value("word word") == "word word"
|
13
|
-
assert _serialize_value('"a string"') == '"a string"'
|
14
|
-
assert _serialize_value(1, assume_field=True) == "uniform 1"
|
15
|
-
assert _serialize_value(1.0, assume_field=True) == "uniform 1.0"
|
16
|
-
assert _serialize_value(1.0e-3, assume_field=True) == "uniform 0.001"
|
17
|
-
assert _serialize_value([1.0, 2.0, 3.0]) == "(1.0 2.0 3.0)"
|
18
|
-
assert _serialize_value([1, 2, 3], assume_field=True) == "uniform (1 2 3)"
|
19
|
-
assert (
|
20
|
-
_serialize_value([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], assume_field=True)
|
21
|
-
== "nonuniform List<scalar> 10(1 2 3 4 5 6 7 8 9 10)"
|
22
|
-
)
|
23
|
-
assert (
|
24
|
-
_serialize_value([[1, 2, 3], [4, 5, 6]], assume_field=True)
|
25
|
-
== "nonuniform List<vector> 2((1 2 3) (4 5 6))"
|
26
|
-
)
|
27
|
-
assert (
|
28
|
-
_serialize_value(FoamFile.DimensionSet(mass=1, length=1, time=-2))
|
29
|
-
== "[1 1 -2 0 0 0 0]"
|
30
|
-
)
|
31
|
-
assert (
|
32
|
-
_serialize_value(
|
33
|
-
FoamFile.Dimensioned(
|
34
|
-
name="g",
|
35
|
-
dimensions=FoamFile.DimensionSet(mass=1, length=1, time=-2),
|
36
|
-
value=9.81,
|
37
|
-
)
|
38
|
-
)
|
39
|
-
== "g [1 1 -2 0 0 0 0] 9.81"
|
40
|
-
)
|
41
|
-
assert (
|
42
|
-
_serialize_value(
|
43
|
-
FoamFile.Dimensioned(
|
44
|
-
dimensions=FoamFile.DimensionSet(mass=1, length=1, time=-2), value=9.81
|
45
|
-
)
|
46
|
-
)
|
47
|
-
== "[1 1 -2 0 0 0 0] 9.81"
|
48
|
-
)
|
49
|
-
assert (
|
50
|
-
_serialize_value("hex (0 1 2 3 4 5 6 7) (1 1 1) simpleGrading (1 1 1)")
|
51
|
-
== "hex (0 1 2 3 4 5 6 7) (1 1 1) simpleGrading (1 1 1)"
|
52
|
-
)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|