foamlib 0.8.2__py3-none-any.whl → 0.8.4__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,6 +1,6 @@
1
1
  """A Python interface for interacting with OpenFOAM."""
2
2
 
3
- __version__ = "0.8.2"
3
+ __version__ = "0.8.4"
4
4
 
5
5
  from ._cases import (
6
6
  AsyncFoamCase,
foamlib/_files/_files.py CHANGED
@@ -308,15 +308,15 @@ class FoamFile(
308
308
  self[(*keywords, k)] = v
309
309
 
310
310
  elif keywords:
311
+ val = dumps(data, kind=kind)
311
312
  parsed.put(
312
313
  keywords,
313
314
  normalize(data, kind=kind),
314
315
  before
315
316
  + indentation
316
317
  + dumps(keywords[-1])
317
- + b" "
318
- + dumps(data, kind=kind)
319
- + b";"
318
+ + ((b" " + val) if val else b"")
319
+ + (b";" if not keywords[-1].startswith("#") else b"")
320
320
  + after,
321
321
  )
322
322
 
@@ -89,7 +89,7 @@ def _parse_ascii_field(
89
89
  s = re.sub(ignore.re, " ", s)
90
90
  s = s.replace("(", " ").replace(")", " ")
91
91
 
92
- return np.fromstring(s, sep=" ").reshape(-1, *tensor_kind.shape)
92
+ return np.fromstring(s, sep=" ").reshape(-1, *tensor_kind.shape) # type: ignore [return-value]
93
93
 
94
94
 
95
95
  def _unpack_binary_field(
@@ -99,7 +99,7 @@ def _unpack_binary_field(
99
99
  assert float_size in (4, 8)
100
100
 
101
101
  dtype = np.float32 if float_size == 4 else float
102
- return np.frombuffer(b, dtype=dtype).reshape(-1, *tensor_kind.shape)
102
+ return np.frombuffer(b, dtype=dtype).reshape(-1, *tensor_kind.shape) # type: ignore [return-value]
103
103
 
104
104
 
105
105
  def _tensor_list(
@@ -153,12 +153,19 @@ def _tensor_list(
153
153
 
154
154
 
155
155
  def _dict_of(
156
- keyword: ParserElement, data: ParserElement, *, located: bool = False
156
+ keyword: ParserElement,
157
+ data: ParserElement,
158
+ *,
159
+ directive: ParserElement | None = None,
160
+ located: bool = False,
157
161
  ) -> ParserElement:
158
162
  dict_ = Forward()
159
163
 
160
164
  keyword_entry = keyword + (dict_ | (data + Literal(";").suppress()))
161
165
 
166
+ if directive is not None:
167
+ keyword_entry |= directive + data + LineEnd().suppress() # type: ignore [no-untyped-call]
168
+
162
169
  if located:
163
170
  keyword_entry = Located(keyword_entry)
164
171
 
@@ -175,12 +182,17 @@ def _keyword_entry_of(
175
182
  keyword: ParserElement,
176
183
  data: ParserElement,
177
184
  *,
185
+ directive: ParserElement | None = None,
178
186
  located: bool = False,
179
187
  ) -> ParserElement:
180
188
  keyword_entry = keyword + (
181
- _dict_of(keyword, data, located=located) | (data + Literal(";").suppress())
189
+ _dict_of(keyword, data, directive=directive, located=located)
190
+ | (data + Literal(";").suppress())
182
191
  )
183
192
 
193
+ if directive is not None:
194
+ keyword_entry |= directive + data + LineEnd().suppress() # type: ignore [no-untyped-call]
195
+
184
196
  if located:
185
197
  keyword_entry = Located(keyword_entry)
186
198
  else:
@@ -223,9 +235,10 @@ _TENSOR = (
223
235
  | _tensor(TensorKind.SYMM_TENSOR)
224
236
  | _tensor(TensorKind.TENSOR)
225
237
  )
226
- _IDENTIFIER = Combine(
238
+ _IDENTIFIER = Forward()
239
+ _IDENTIFIER <<= Combine(
227
240
  Word(_IDENTCHARS, _IDENTBODYCHARS, exclude_chars="()")
228
- + Opt(Literal("(") + Word(_IDENTBODYCHARS, exclude_chars="()") + Literal(")"))
241
+ + Opt(Literal("(") + _IDENTIFIER + Literal(")"))
229
242
  )
230
243
  _DIMENSIONED = (Opt(_IDENTIFIER) + _DIMENSIONS + _TENSOR).set_parse_action(
231
244
  lambda tks: Dimensioned(*reversed(tks.as_list()))
@@ -239,7 +252,8 @@ _FIELD = (Keyword("uniform", _IDENTBODYCHARS).suppress() + _TENSOR) | (
239
252
  | _tensor_list(TensorKind.TENSOR, ignore=_COMMENT)
240
253
  )
241
254
  )
242
- _TOKEN = dbl_quoted_string | _IDENTIFIER
255
+ _DIRECTIVE = Word("#", _IDENTBODYCHARS)
256
+ _TOKEN = dbl_quoted_string | _IDENTIFIER | _DIRECTIVE
243
257
  _DATA = Forward()
244
258
  _KEYWORD_ENTRY = _keyword_entry_of(_TOKEN | _list_of(_IDENTIFIER), _DATA)
245
259
  _DICT = _dict_of(_TOKEN, _DATA)
@@ -258,18 +272,21 @@ _DATA <<= (
258
272
 
259
273
 
260
274
  def parse_data(s: str) -> Data:
275
+ if not s.strip():
276
+ return ""
261
277
  return cast(Data, _DATA.parse_string(s, parse_all=True)[0])
262
278
 
263
279
 
264
280
  _LOCATED_DICTIONARY = Group(
265
- _keyword_entry_of(_TOKEN, Opt(_DATA, default=""), located=True)
281
+ _keyword_entry_of(
282
+ _TOKEN, Opt(_DATA, default=""), directive=_DIRECTIVE, located=True
283
+ )
266
284
  )[...]
267
285
  _LOCATED_DATA = Group(Located(_DATA.copy().add_parse_action(lambda tks: ["", tks[0]])))
268
286
 
269
287
  _FILE = (
270
288
  Dict(_LOCATED_DICTIONARY + Opt(_LOCATED_DATA) + _LOCATED_DICTIONARY)
271
289
  .ignore(_COMMENT)
272
- .ignore(Literal("#include") + ... + LineEnd()) # type: ignore [no-untyped-call]
273
290
  .parse_with_tabs()
274
291
  )
275
292
 
@@ -50,7 +50,7 @@ def normalize(data: Entry, *, kind: Kind = Kind.DEFAULT) -> Entry:
50
50
  arr = arr.astype(float)
51
51
 
52
52
  if arr.ndim == 1 or (arr.ndim == 2 and arr.shape[1] in (3, 6, 9)):
53
- return arr
53
+ return arr # type: ignore [return-value]
54
54
 
55
55
  return data
56
56
 
@@ -111,7 +111,10 @@ def dumps(
111
111
 
112
112
  if isinstance(data, tuple) and kind == Kind.SINGLE_ENTRY and len(data) == 2:
113
113
  k, v = data
114
- ret = dumps(k) + b" " + dumps(v)
114
+ ret = dumps(k)
115
+ val = dumps(v)
116
+ if val:
117
+ ret += b" " + val
115
118
  if not isinstance(v, Mapping):
116
119
  ret += b";"
117
120
  return ret
foamlib/_files/_types.py CHANGED
@@ -79,7 +79,7 @@ class Dimensioned:
79
79
 
80
80
  def __post_init__(self) -> None:
81
81
  if is_sequence(self.value):
82
- self.value = np.asarray(self.value, dtype=float)
82
+ self.value = np.asarray(self.value, dtype=float) # type: ignore [assignment]
83
83
  else:
84
84
  assert isinstance(self.value, (int, float, np.ndarray))
85
85
  self.value = float(self.value)
@@ -1,11 +1,12 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: foamlib
3
- Version: 0.8.2
3
+ Version: 0.8.4
4
4
  Summary: A Python interface for interacting with OpenFOAM
5
5
  Project-URL: Homepage, https://github.com/gerlero/foamlib
6
6
  Project-URL: Repository, https://github.com/gerlero/foamlib
7
7
  Project-URL: Documentation, https://foamlib.readthedocs.io
8
8
  Author-email: "Gabriel S. Gerlero" <ggerlero@cimec.unl.edu.ar>
9
+ License-File: LICENSE.txt
9
10
  Classifier: Development Status :: 4 - Beta
10
11
  Classifier: Framework :: AsyncIO
11
12
  Classifier: Intended Audience :: Developers
@@ -31,7 +32,7 @@ Requires-Dist: pyparsing<4,>=3.1.2
31
32
  Requires-Dist: typing-extensions<5,>=4; python_version < '3.11'
32
33
  Provides-Extra: dev
33
34
  Requires-Dist: mypy<2,>=1; extra == 'dev'
34
- Requires-Dist: pytest-asyncio<0.25,>=0.21; extra == 'dev'
35
+ Requires-Dist: pytest-asyncio<0.26,>=0.21; extra == 'dev'
35
36
  Requires-Dist: pytest-cov; extra == 'dev'
36
37
  Requires-Dist: pytest<9,>=7; extra == 'dev'
37
38
  Requires-Dist: ruff; extra == 'dev'
@@ -43,12 +44,12 @@ Requires-Dist: sphinx<9,>=5; extra == 'docs'
43
44
  Provides-Extra: lint
44
45
  Requires-Dist: ruff; extra == 'lint'
45
46
  Provides-Extra: test
46
- Requires-Dist: pytest-asyncio<0.25,>=0.21; extra == 'test'
47
+ Requires-Dist: pytest-asyncio<0.26,>=0.21; extra == 'test'
47
48
  Requires-Dist: pytest-cov; extra == 'test'
48
49
  Requires-Dist: pytest<9,>=7; extra == 'test'
49
50
  Provides-Extra: typing
50
51
  Requires-Dist: mypy<2,>=1; extra == 'typing'
51
- Requires-Dist: pytest-asyncio<0.25,>=0.21; extra == 'typing'
52
+ Requires-Dist: pytest-asyncio<0.26,>=0.21; extra == 'typing'
52
53
  Requires-Dist: pytest-cov; extra == 'typing'
53
54
  Requires-Dist: pytest<9,>=7; extra == 'typing'
54
55
  Description-Content-Type: text/markdown
@@ -1,4 +1,4 @@
1
- foamlib/__init__.py,sha256=QpOhIHnI_P5oekqBFi8WZFxeYVsyODiHJFcRGvDoB8c,452
1
+ foamlib/__init__.py,sha256=xYSLuRubvL_srTiNR5-bYmOHuvUEv_y3cMIOAXMcCt8,452
2
2
  foamlib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  foamlib/_cases/__init__.py,sha256=_A1TTHuQfS9FH2_33lSEyLtOJZGFHZBco1tWJCVOHks,358
4
4
  foamlib/_cases/_async.py,sha256=onECxRLQCF7Kd-GeuLqH_Xv3gbMMhKOSbFaUG5Ttgmk,7822
@@ -9,12 +9,12 @@ foamlib/_cases/_subprocess.py,sha256=6BlBRxknj2-BFcGkx7oVcuL63_utSaY1Axmsc1qV9j8
9
9
  foamlib/_cases/_sync.py,sha256=2BJXB7Nzldb4OgPukqupgYqdceUGkI2mYhhtGPWEBrc,5901
10
10
  foamlib/_cases/_util.py,sha256=tK4SM5WT3eEgGsFLnidIySbom1qowBAua9z13gipKJk,1518
11
11
  foamlib/_files/__init__.py,sha256=q1vkjXnjnSZvo45jPAICpWeF2LZv5V6xfzAR6S8fS5A,96
12
- foamlib/_files/_files.py,sha256=5sxtHQuN25w1gszZBpSMOaF--KOJy2HLmM6CScLof9s,15331
12
+ foamlib/_files/_files.py,sha256=V740S36NVunULv8pnyEsJ7lIWbSjk_-LwbP7BBqFsO0,15404
13
13
  foamlib/_files/_io.py,sha256=BGbbm6HKxL2ka0YMCmHqZQZ1R4PPQlkvWWb4FHMAS8k,2217
14
- foamlib/_files/_parsing.py,sha256=Cwc_5Z34UAz5hkB-Sb2hQ6bemoPRuXgmtcAybtOSic8,12997
15
- foamlib/_files/_serialization.py,sha256=SeSR7vMaii5GQ4OXJv8yFPecqOk_mGxAyPJRtjum30Q,5145
16
- foamlib/_files/_types.py,sha256=ouP2VQtQr2M-GJCojm954Cb8CdzyfypDpmQlZQWsmw4,3379
17
- foamlib-0.8.2.dist-info/METADATA,sha256=jyVgylX2aU7UT907iOuyxtTG94iDHCoobt-yyd2JwsE,7942
18
- foamlib-0.8.2.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
19
- foamlib-0.8.2.dist-info/licenses/LICENSE.txt,sha256=5Dte9TUnLZzPRs4NQzl-Jc2-Ljd-t_v0ZR5Ng5r0UsY,35131
20
- foamlib-0.8.2.dist-info/RECORD,,
14
+ foamlib/_files/_parsing.py,sha256=_YCi1-ltrlQWyh5RvGDZgi47MzJ7FzFcsK6L_rAWksA,13489
15
+ foamlib/_files/_serialization.py,sha256=PvMzNyTja6OKT_GUfExTulx9nMLBjfu0-9yThCKbvxs,5227
16
+ foamlib/_files/_types.py,sha256=m-fFjJnS4sFSavDsijlXpAfEhnbh10RBumSHAT0GOgQ,3408
17
+ foamlib-0.8.4.dist-info/METADATA,sha256=YsjrAXLrG3ELANlB9PRyyHiciEJAU7rL0IP4AOsMV8A,7968
18
+ foamlib-0.8.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
19
+ foamlib-0.8.4.dist-info/licenses/LICENSE.txt,sha256=5Dte9TUnLZzPRs4NQzl-Jc2-Ljd-t_v0ZR5Ng5r0UsY,35131
20
+ foamlib-0.8.4.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.26.3
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any