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 CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "0.1.6"
1
+ __version__ = "0.1.8"
2
2
 
3
3
  from ._cases import FoamCase, AsyncFoamCase, FoamTimeDirectory, FoamCaseBase
4
4
  from ._dictionaries import (
foamlib/_cases.py CHANGED
@@ -14,7 +14,6 @@ from typing import (
14
14
  Sequence,
15
15
  AsyncGenerator,
16
16
  Callable,
17
- Mapping,
18
17
  Iterator,
19
18
  overload,
20
19
  )
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
- def _parse_bool(value: str) -> bool:
68
- if value == "yes":
69
- return True
70
- elif value == "no":
71
- return False
72
- else:
73
- raise ValueError(f"Cannot parse '{value}' as a boolean")
74
-
75
-
76
- def _parse_number(value: str) -> Union[int, float]:
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
- with suppress(ValueError):
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 _serialize_sequence(sequence: Any) -> str:
180
- if (
181
- isinstance(sequence, Sequence)
182
- and not isinstance(sequence, str)
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(sequence, np.ndarray)
185
- ):
186
- return f"({' '.join(_serialize(v) for v in sequence)})"
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(sequence)}")
131
+ raise TypeError(f"Not a valid sequence: {type(value)}")
189
132
 
190
133
 
191
134
  def _serialize_field(value: Any) -> str:
192
- if isinstance(value, (int, float)):
193
- return f"uniform {value}"
194
- else:
135
+ if _is_sequence(value):
195
136
  try:
196
- s = _serialize_sequence(value)
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 _serialize_sequence(value)
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.6
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,,
@@ -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,,