foamlib 0.1.6__py3-none-any.whl → 0.1.8__py3-none-any.whl
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/__init__.py +1 -1
- foamlib/_cases.py +0 -1
- foamlib/_dictionaries.py +55 -117
- {foamlib-0.1.6.dist-info → foamlib-0.1.8.dist-info}/METADATA +4 -1
- foamlib-0.1.8.dist-info/RECORD +10 -0
- foamlib-0.1.6.dist-info/RECORD +0 -10
- {foamlib-0.1.6.dist-info → foamlib-0.1.8.dist-info}/LICENSE.txt +0 -0
- {foamlib-0.1.6.dist-info → foamlib-0.1.8.dist-info}/WHEEL +0 -0
- {foamlib-0.1.6.dist-info → foamlib-0.1.8.dist-info}/top_level.txt +0 -0
foamlib/__init__.py
CHANGED
foamlib/_cases.py
CHANGED
foamlib/_dictionaries.py
CHANGED
@@ -23,6 +23,7 @@ except ModuleNotFoundError:
|
|
23
23
|
else:
|
24
24
|
numpy = True
|
25
25
|
|
26
|
+
from pyparsing import Group, Keyword, Opt, ZeroOrMore, Literal, Forward, common
|
26
27
|
|
27
28
|
FoamDimensionSet = namedtuple(
|
28
29
|
"FoamDimensionSet",
|
@@ -63,108 +64,46 @@ FoamValue = Union[
|
|
63
64
|
A value that can be stored in an OpenFOAM dictionary.
|
64
65
|
"""
|
65
66
|
|
67
|
+
_YES = Keyword("yes").set_parse_action(lambda s, loc, tks: True)
|
68
|
+
_NO = Keyword("no").set_parse_action(lambda s, loc, tks: False)
|
69
|
+
_VALUE = Forward()
|
70
|
+
_LIST = Opt(
|
71
|
+
Literal("List") + Literal("<") + common.identifier + Literal(">")
|
72
|
+
).suppress() + (
|
73
|
+
(
|
74
|
+
Opt(common.integer).suppress()
|
75
|
+
+ Literal("(").suppress()
|
76
|
+
+ Group(ZeroOrMore(_VALUE))
|
77
|
+
+ Literal(")").suppress()
|
78
|
+
)
|
79
|
+
| (
|
80
|
+
common.integer + Literal("{").suppress() + _VALUE + Literal("}").suppress()
|
81
|
+
).set_parse_action(lambda s, loc, tks: [tks[1]] * tks[0])
|
82
|
+
)
|
83
|
+
_FIELD = (Keyword("uniform").suppress() + _VALUE) | (
|
84
|
+
Keyword("nonuniform").suppress() + _LIST
|
85
|
+
)
|
86
|
+
_DIMENSIONS = (
|
87
|
+
Literal("[").suppress() + common.number * 7 + Literal("]").suppress()
|
88
|
+
).set_parse_action(lambda s, loc, tks: FoamDimensionSet(*tks))
|
89
|
+
_DIMENSIONED = (common.identifier + _DIMENSIONS + _VALUE).set_parse_action(
|
90
|
+
lambda s, loc, tks: FoamDimensioned(tks[0], tks[1], tks[2].as_list())
|
91
|
+
)
|
66
92
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
with suppress(ValueError):
|
78
|
-
return int(value)
|
79
|
-
with suppress(ValueError):
|
80
|
-
return float(value)
|
81
|
-
raise ValueError(f"Cannot parse '{value}' as a number")
|
82
|
-
|
83
|
-
|
84
|
-
def _parse_sequence(value: str) -> Sequence[FoamValue]:
|
85
|
-
start = value.find("(")
|
86
|
-
if start != -1:
|
87
|
-
assert value.endswith(")")
|
88
|
-
seq = []
|
89
|
-
nested = 0
|
90
|
-
start += 1
|
91
|
-
for i, c in enumerate(value[start:], start=start):
|
92
|
-
if c == "(":
|
93
|
-
nested += 1
|
94
|
-
elif c == ")":
|
95
|
-
nested -= 1
|
96
|
-
if c.isspace() and not nested:
|
97
|
-
v = value[start:i].strip()
|
98
|
-
if v:
|
99
|
-
seq.append(_parse(v))
|
100
|
-
start = i + 1
|
101
|
-
|
102
|
-
v = value[start:-1].strip()
|
103
|
-
if v:
|
104
|
-
seq.append(_parse(v))
|
105
|
-
|
106
|
-
return seq
|
107
|
-
|
108
|
-
else:
|
109
|
-
raise ValueError(f"Cannot parse '{value}' as a sequence")
|
110
|
-
|
111
|
-
|
112
|
-
def _parse_field(value: str) -> FoamValue:
|
113
|
-
if value.startswith("uniform "):
|
114
|
-
value = value[len("uniform ") :]
|
115
|
-
return _parse(value)
|
116
|
-
elif value.startswith("nonuniform "):
|
117
|
-
value = value[len("nonuniform ") :]
|
118
|
-
return _parse_sequence(value)
|
119
|
-
else:
|
120
|
-
raise ValueError(f"Cannot parse '{value}' as a field")
|
121
|
-
|
122
|
-
|
123
|
-
def _parse_dimensions(value: str) -> FoamDimensionSet:
|
124
|
-
if value.startswith("["):
|
125
|
-
assert value.endswith("]")
|
126
|
-
return FoamDimensionSet(*(_parse_number(v) for v in value[1:-1].split()))
|
127
|
-
else:
|
128
|
-
raise ValueError(f"Cannot parse '{value}' as a dimension set")
|
129
|
-
|
130
|
-
|
131
|
-
def _parse_dimensioned(value: str) -> FoamDimensioned:
|
132
|
-
start = value.find("[", 1)
|
133
|
-
if start != -1:
|
134
|
-
name = value[:start].strip()
|
135
|
-
end = value.find("]", start)
|
136
|
-
if end != -1:
|
137
|
-
dimensions = _parse_dimensions(value[start : end + 1])
|
138
|
-
value = value[end + 1 :].strip()
|
139
|
-
return FoamDimensioned(
|
140
|
-
name,
|
141
|
-
dimensions,
|
142
|
-
cast(Union[int, float, Sequence[Union[int, float]]], _parse(value)),
|
143
|
-
)
|
144
|
-
|
145
|
-
raise ValueError(f"Cannot parse '{value}' as a dimensioned value")
|
93
|
+
_VALUE << (
|
94
|
+
_FIELD
|
95
|
+
| _LIST
|
96
|
+
| _DIMENSIONED
|
97
|
+
| _DIMENSIONS
|
98
|
+
| common.number
|
99
|
+
| _YES
|
100
|
+
| _NO
|
101
|
+
| common.identifier
|
102
|
+
)
|
146
103
|
|
147
104
|
|
148
105
|
def _parse(value: str) -> FoamValue:
|
149
|
-
|
150
|
-
return _parse_bool(value)
|
151
|
-
|
152
|
-
with suppress(ValueError):
|
153
|
-
return _parse_field(value)
|
154
|
-
|
155
|
-
with suppress(ValueError):
|
156
|
-
return _parse_number(value)
|
157
|
-
|
158
|
-
with suppress(ValueError):
|
159
|
-
return _parse_dimensions(value)
|
160
|
-
|
161
|
-
with suppress(ValueError):
|
162
|
-
return _parse_dimensioned(value)
|
163
|
-
|
164
|
-
with suppress(ValueError):
|
165
|
-
return _parse_sequence(value)
|
166
|
-
|
167
|
-
return value
|
106
|
+
return cast(FoamValue, _VALUE.parse_string(value, parse_all=True).as_list()[0])
|
168
107
|
|
169
108
|
|
170
109
|
def _serialize_bool(value: Any) -> str:
|
@@ -176,24 +115,26 @@ def _serialize_bool(value: Any) -> str:
|
|
176
115
|
raise TypeError(f"Not a bool: {type(value)}")
|
177
116
|
|
178
117
|
|
179
|
-
def
|
180
|
-
|
181
|
-
isinstance(
|
182
|
-
and not isinstance(
|
118
|
+
def _is_sequence(value: Any) -> bool:
|
119
|
+
return (
|
120
|
+
isinstance(value, Sequence)
|
121
|
+
and not isinstance(value, str)
|
183
122
|
or numpy
|
184
|
-
and isinstance(
|
185
|
-
)
|
186
|
-
|
123
|
+
and isinstance(value, np.ndarray)
|
124
|
+
)
|
125
|
+
|
126
|
+
|
127
|
+
def _serialize_list(value: Any) -> str:
|
128
|
+
if _is_sequence(value):
|
129
|
+
return f"({' '.join(_serialize(v) for v in value)})"
|
187
130
|
else:
|
188
|
-
raise TypeError(f"Not a valid sequence: {type(
|
131
|
+
raise TypeError(f"Not a valid sequence: {type(value)}")
|
189
132
|
|
190
133
|
|
191
134
|
def _serialize_field(value: Any) -> str:
|
192
|
-
if
|
193
|
-
return f"uniform {value}"
|
194
|
-
else:
|
135
|
+
if _is_sequence(value):
|
195
136
|
try:
|
196
|
-
s =
|
137
|
+
s = _serialize_list(value)
|
197
138
|
except TypeError:
|
198
139
|
raise TypeError(f"Not a valid field: {type(value)}") from None
|
199
140
|
else:
|
@@ -213,15 +154,12 @@ def _serialize_field(value: Any) -> str:
|
|
213
154
|
f"Unsupported sequence length for field: {len(value[0])}"
|
214
155
|
)
|
215
156
|
return f"nonuniform List<{kind}> {len(value)}{s}"
|
157
|
+
else:
|
158
|
+
return f"uniform {value}"
|
216
159
|
|
217
160
|
|
218
161
|
def _serialize_dimensions(value: Any) -> str:
|
219
|
-
if (
|
220
|
-
isinstance(value, Sequence)
|
221
|
-
and not isinstance(value, str)
|
222
|
-
or numpy
|
223
|
-
and isinstance(value, np.ndarray)
|
224
|
-
) and len(value) == 7:
|
162
|
+
if _is_sequence(value) and len(value) == 7:
|
225
163
|
return f"[{' '.join(str(v) for v in value)}]"
|
226
164
|
else:
|
227
165
|
raise TypeError(f"Not a valid dimension set: {type(value)}")
|
@@ -249,7 +187,7 @@ def _serialize(
|
|
249
187
|
return _serialize_dimensioned(value)
|
250
188
|
|
251
189
|
with suppress(TypeError):
|
252
|
-
return
|
190
|
+
return _serialize_list(value)
|
253
191
|
|
254
192
|
with suppress(TypeError):
|
255
193
|
return _serialize_bool(value)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: foamlib
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.8
|
4
4
|
Summary: A Python interface for interacting with OpenFOAM
|
5
5
|
Author-email: "Gabriel S. Gerlero" <ggerlero@cimec.unl.edu.ar>
|
6
6
|
Project-URL: Homepage, https://github.com/gerlero/foamlib
|
@@ -26,6 +26,7 @@ Requires-Python: >=3.7
|
|
26
26
|
Description-Content-Type: text/markdown
|
27
27
|
License-File: LICENSE.txt
|
28
28
|
Requires-Dist: aioshutil <2,>=1
|
29
|
+
Requires-Dist: pyparsing <4,>=3
|
29
30
|
Provides-Extra: docs
|
30
31
|
Requires-Dist: sphinx <8,>=7 ; extra == 'docs'
|
31
32
|
Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
|
@@ -36,6 +37,8 @@ Requires-Dist: pytest <9,>=7 ; extra == 'lint'
|
|
36
37
|
Requires-Dist: pytest-asyncio <0.24,>=0.21 ; extra == 'lint'
|
37
38
|
Requires-Dist: numpy <2,>=1 ; extra == 'lint'
|
38
39
|
Requires-Dist: black ; extra == 'lint'
|
40
|
+
Requires-Dist: flake8 ; extra == 'lint'
|
41
|
+
Requires-Dist: Flake8-pyproject ; extra == 'lint'
|
39
42
|
Provides-Extra: test
|
40
43
|
Requires-Dist: pytest <9,>=7 ; extra == 'test'
|
41
44
|
Requires-Dist: pytest-asyncio <0.24,>=0.21 ; extra == 'test'
|
@@ -0,0 +1,10 @@
|
|
1
|
+
foamlib/__init__.py,sha256=Lq8PsAvbE-bdL4D_1TWlLVltS9_14AhRrY0xq_u-bZE,550
|
2
|
+
foamlib/_cases.py,sha256=Q5c8vPzKT5coOy4q_H6s5gHgEArhLHByh6GSvDVCRdY,20683
|
3
|
+
foamlib/_dictionaries.py,sha256=71E0IMfU4sxjxsHJ7-_kUyuZX6olU31OLKxFhoEvC0s,12903
|
4
|
+
foamlib/_subprocesses.py,sha256=5vqdQvpN_2v4GgDqxi-s88NGhZ6doFxkh0XY89ZWuHA,1926
|
5
|
+
foamlib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
+
foamlib-0.1.8.dist-info/LICENSE.txt,sha256=5Dte9TUnLZzPRs4NQzl-Jc2-Ljd-t_v0ZR5Ng5r0UsY,35131
|
7
|
+
foamlib-0.1.8.dist-info/METADATA,sha256=lTbuF5eCAj3Nce2vHZGBS6xoQPzorYG_GMp5iogXo_A,4526
|
8
|
+
foamlib-0.1.8.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
9
|
+
foamlib-0.1.8.dist-info/top_level.txt,sha256=ZdVYtetXGwPwyfL-WhlhbTFQGAwKX5P_gXxtH9JYFPI,8
|
10
|
+
foamlib-0.1.8.dist-info/RECORD,,
|
foamlib-0.1.6.dist-info/RECORD
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
foamlib/__init__.py,sha256=JgLq3i2DqpIp1R2I1z_aWDmUTDHhwXvWFCuPsQ5ZBqo,550
|
2
|
-
foamlib/_cases.py,sha256=NhtIOPumR_iWR9tL8K7WO2UVjB14WIacnaxnoa4EjYY,20696
|
3
|
-
foamlib/_dictionaries.py,sha256=ZjNDEe-ls8pSxqvV6qtO0XRBBTfkj-8U6igNHbtXvqs,14523
|
4
|
-
foamlib/_subprocesses.py,sha256=5vqdQvpN_2v4GgDqxi-s88NGhZ6doFxkh0XY89ZWuHA,1926
|
5
|
-
foamlib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
|
-
foamlib-0.1.6.dist-info/LICENSE.txt,sha256=5Dte9TUnLZzPRs4NQzl-Jc2-Ljd-t_v0ZR5Ng5r0UsY,35131
|
7
|
-
foamlib-0.1.6.dist-info/METADATA,sha256=3Bkce079R0PXo5Leq9G9ZyuncUrOXTJXww73RtDP2wQ,4404
|
8
|
-
foamlib-0.1.6.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
9
|
-
foamlib-0.1.6.dist-info/top_level.txt,sha256=ZdVYtetXGwPwyfL-WhlhbTFQGAwKX5P_gXxtH9JYFPI,8
|
10
|
-
foamlib-0.1.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|