foamlib 1.4.2__tar.gz → 1.4.3__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.
Files changed (35) hide show
  1. {foamlib-1.4.2 → foamlib-1.4.3}/PKG-INFO +1 -1
  2. {foamlib-1.4.2 → foamlib-1.4.3}/pyproject.toml +1 -1
  3. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/_parsing/parsing.py +70 -4
  4. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/_typing.py +25 -4
  5. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/files.py +92 -178
  6. {foamlib-1.4.2 → foamlib-1.4.3}/LICENSE.txt +0 -0
  7. {foamlib-1.4.2 → foamlib-1.4.3}/README.md +0 -0
  8. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/__init__.py +0 -0
  9. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_cases/__init__.py +0 -0
  10. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_cases/_run.py +0 -0
  11. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_cases/_subprocess.py +0 -0
  12. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_cases/_util.py +0 -0
  13. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_cases/async_.py +0 -0
  14. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_cases/base.py +0 -0
  15. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_cases/slurm.py +0 -0
  16. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_cases/sync.py +0 -0
  17. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/__init__.py +0 -0
  18. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/_common.py +0 -0
  19. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/_io.py +0 -0
  20. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/_parsing/__init__.py +0 -0
  21. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/_parsing/_elements.py +0 -0
  22. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/_parsing/_grammar.py +0 -0
  23. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/_serialization.py +0 -0
  24. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/_util.py +0 -0
  25. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/_files/types.py +0 -0
  26. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/postprocessing/__init__.py +0 -0
  27. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/postprocessing/load_tables.py +0 -0
  28. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/postprocessing/table_reader.py +0 -0
  29. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/preprocessing/__init__.py +0 -0
  30. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/preprocessing/case_modifier.py +0 -0
  31. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/preprocessing/grid_parameter_sweep.py +0 -0
  32. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/preprocessing/of_dict.py +0 -0
  33. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/preprocessing/parameter_study.py +0 -0
  34. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/preprocessing/system.py +0 -0
  35. {foamlib-1.4.2 → foamlib-1.4.3}/src/foamlib/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: foamlib
3
- Version: 1.4.2
3
+ Version: 1.4.3
4
4
  Summary: Pythonic interface for working with OpenFOAM
5
5
  Author: Gabriel S. Gerlero
6
6
  Author-email: Gabriel S. Gerlero <ggerlero@cimec.unl.edu.ar>
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "foamlib"
7
- version = "1.4.2"
7
+ version = "1.4.3"
8
8
  license = "GPL-3.0-only"
9
9
  license-files = ["LICENSE.txt"]
10
10
  description = "Pythonic interface for working with OpenFOAM"
@@ -1,7 +1,12 @@
1
1
  import dataclasses
2
2
  import sys
3
3
  from collections.abc import Collection, Iterator, Sequence
4
- from typing import cast
4
+ from typing import cast, overload
5
+
6
+ if sys.version_info >= (3, 11):
7
+ from typing import Never, Unpack
8
+ else:
9
+ from typing_extensions import Never, Unpack
5
10
 
6
11
  if sys.version_info >= (3, 12):
7
12
  from typing import override
@@ -116,20 +121,63 @@ class ParsedFile(
116
121
  )
117
122
  return ret
118
123
 
124
+ @overload
125
+ @with_default
126
+ def getall(self, keywords: tuple[()], /) -> Collection[StandaloneData]: ...
127
+
128
+ @overload
129
+ @with_default
130
+ def getall(
131
+ self, keywords: tuple[str, Unpack[tuple[str, ...]]], /
132
+ ) -> Collection[Data | EllipsisType | None]: ...
133
+
119
134
  @override
120
135
  @with_default
121
136
  def getall(
122
137
  self, keywords: tuple[str, ...], /
123
- ) -> Collection[Data | StandaloneData | EllipsisType]:
138
+ ) -> Collection[Data | StandaloneData | EllipsisType | None]:
124
139
  return [entry.data for entry in self._parsed.getall(keywords)]
125
140
 
141
+ @overload
142
+ def __getitem__(self, keywords: tuple[()]) -> StandaloneData: ...
143
+
144
+ @overload
145
+ def __getitem__(
146
+ self, keywords: tuple[str, Unpack[tuple[str, ...]]]
147
+ ) -> Data | EllipsisType | None: ...
148
+
149
+ @override
150
+ def __getitem__(
151
+ self, keywords: tuple[str, ...]
152
+ ) -> Data | StandaloneData | EllipsisType | None: # ty: ignore[invalid-method-override]
153
+ entry = self._parsed[keywords]
154
+ return entry.data
155
+
126
156
  @override
127
- def __setitem__(
128
- self, key: tuple[str, ...], value: Data | StandaloneData | EllipsisType | None
157
+ def __setitem__( # ty: ignore[invalid-method-override]
158
+ self, key: Never, value: Never
129
159
  ) -> None: # pragma: no cover
130
160
  msg = "Use 'put' method instead"
131
161
  raise NotImplementedError(msg)
132
162
 
163
+ @overload
164
+ def put(
165
+ self,
166
+ keywords: tuple[()],
167
+ /,
168
+ data: StandaloneData,
169
+ content: bytes,
170
+ ) -> None: ...
171
+
172
+ @overload
173
+ def put(
174
+ self,
175
+ keywords: tuple[str, Unpack[tuple[str, ...]]],
176
+ /,
177
+ data: Data | EllipsisType | None,
178
+ content: bytes,
179
+ ) -> None: ...
180
+
133
181
  def put(
134
182
  self,
135
183
  keywords: tuple[str, ...],
@@ -143,6 +191,24 @@ class ParsedFile(
143
191
  self._parsed[keywords] = ParsedFile._Entry(data, start, start + len(content))
144
192
  self._remove_child_entries(keywords)
145
193
 
194
+ @overload
195
+ def add(
196
+ self,
197
+ keywords: tuple[()],
198
+ data: StandaloneData,
199
+ content: bytes,
200
+ /,
201
+ ) -> None: ...
202
+
203
+ @overload
204
+ def add(
205
+ self,
206
+ keywords: tuple[str, Unpack[tuple[str, ...]]],
207
+ data: Data | EllipsisType | None,
208
+ content: bytes,
209
+ /,
210
+ ) -> None: ...
211
+
146
212
  @override
147
213
  def add( # ty: ignore[invalid-method-override]
148
214
  self,
@@ -1,6 +1,12 @@
1
+ import sys
1
2
  from collections.abc import Mapping, Sequence
2
3
  from typing import Literal, TypeAlias
3
4
 
5
+ if sys.version_info >= (3, 11):
6
+ from typing import Unpack
7
+ else:
8
+ from typing_extensions import Unpack
9
+
4
10
  import numpy as np
5
11
  from multicollections import MultiDict
6
12
 
@@ -38,8 +44,11 @@ DataEntryLike: TypeAlias = (
38
44
  DataEntry | Sequence["DataEntryLike | KeywordEntryLike | DictLike"] | FieldLike
39
45
  )
40
46
 
41
- Data: TypeAlias = DataEntry | tuple[DataEntry, ...]
42
- DataLike: TypeAlias = DataEntryLike | tuple[DataEntryLike, ...]
47
+ Data: TypeAlias = DataEntry | tuple[DataEntry, DataEntry, Unpack[tuple[DataEntry, ...]]]
48
+ DataLike: TypeAlias = (
49
+ DataEntryLike
50
+ | tuple[DataEntryLike, DataEntryLike, Unpack[tuple[DataEntryLike, ...]]]
51
+ )
43
52
 
44
53
  StandaloneDataEntry: TypeAlias = (
45
54
  DataEntry
@@ -57,9 +66,21 @@ StandaloneDataEntryLike: TypeAlias = (
57
66
  | Sequence[Sequence[int]]
58
67
  )
59
68
 
60
- StandaloneData: TypeAlias = StandaloneDataEntry | tuple[StandaloneDataEntry, ...]
69
+ StandaloneData: TypeAlias = (
70
+ StandaloneDataEntry
71
+ | tuple[
72
+ StandaloneDataEntry,
73
+ StandaloneDataEntry,
74
+ Unpack[tuple[StandaloneDataEntry, ...]],
75
+ ]
76
+ )
61
77
  StandaloneDataLike: TypeAlias = (
62
- StandaloneDataEntryLike | tuple[StandaloneDataEntryLike, ...]
78
+ StandaloneDataEntryLike
79
+ | tuple[
80
+ StandaloneDataEntryLike,
81
+ StandaloneDataEntryLike,
82
+ Unpack[tuple[StandaloneDataEntryLike, ...]],
83
+ ]
63
84
  )
64
85
 
65
86
  SubDict: TypeAlias = (
@@ -6,9 +6,9 @@ from copy import deepcopy
6
6
  from typing import Literal, cast, overload
7
7
 
8
8
  if sys.version_info >= (3, 11):
9
- from typing import assert_never
9
+ from typing import Unpack, assert_never
10
10
  else:
11
- from typing_extensions import assert_never
11
+ from typing_extensions import Unpack, assert_never
12
12
 
13
13
  if sys.version_info >= (3, 12):
14
14
  from typing import override
@@ -21,7 +21,6 @@ from multicollections import MultiDict
21
21
  from multicollections.abc import MutableMultiMapping, with_default
22
22
 
23
23
  from .._files import _common
24
- from ._common import dict_from_items
25
24
  from ._io import FoamFileIO
26
25
  from ._parsing import parse
27
26
  from ._serialization import dumps, normalized
@@ -131,7 +130,12 @@ class FoamFile(
131
130
  ) -> Iterator["Data | StandaloneData | FoamFile.SubDict | None"]:
132
131
  for k, v in self._file._get_parsed().items():
133
132
  if k != ("FoamFile",) or self._include_header:
134
- yield v if v is not ... else FoamFile.SubDict(self._file, k)
133
+ if v is ...:
134
+ assert k
135
+ k = cast("tuple[str, Unpack[tuple[str, ...]]]", k)
136
+ yield FoamFile.SubDict(self._file, k)
137
+ else:
138
+ yield v
135
139
 
136
140
  @override
137
141
  def __len__(self) -> int:
@@ -162,14 +166,18 @@ class FoamFile(
162
166
  def __iter__(
163
167
  self,
164
168
  ) -> Iterator[
165
- tuple[str | None, "Data | StandaloneData | FoamFile.SubDict | None"]
169
+ tuple[str, "Data | FoamFile.SubDict | None"] | tuple[None, StandaloneData]
166
170
  ]:
167
171
  for k, v in self._file._get_parsed().items():
168
172
  if k != ("FoamFile",) or self._include_header:
169
- yield (
170
- k[-1] if k else None,
171
- v if v is not ... else FoamFile.SubDict(self._file, k),
172
- )
173
+ if not k:
174
+ yield None, v
175
+ else:
176
+ k = cast("tuple[str, Unpack[tuple[str, ...]]]", k)
177
+ yield (
178
+ k[-1],
179
+ v if v is not ... else FoamFile.SubDict(self._file, k),
180
+ )
173
181
 
174
182
  @override
175
183
  def __len__(self) -> int:
@@ -237,6 +245,7 @@ class FoamFile(
237
245
  def __iter__(self) -> Iterator["Data | FoamFile.SubDict | None"]:
238
246
  for k, v in self._subdict._file._get_parsed().items():
239
247
  if k[:-1] == self._subdict._keywords:
248
+ k = cast("tuple[str, Unpack[tuple[str, ...]]]", k)
240
249
  yield (
241
250
  v
242
251
  if v is not ...
@@ -263,8 +272,9 @@ class FoamFile(
263
272
  ) -> Iterator[tuple[str, "Data | FoamFile.SubDict | None"]]:
264
273
  for k, v in self._subdict._file._get_parsed().items():
265
274
  if k[:-1] == self._subdict._keywords:
275
+ k = cast("tuple[str, Unpack[tuple[str, ...]]]", k)
266
276
  yield (
267
- k[-1] if k else None,
277
+ k[-1],
268
278
  v
269
279
  if v is not ...
270
280
  else FoamFile.SubDict(self._subdict._file, k),
@@ -278,39 +288,22 @@ class FoamFile(
278
288
  def __contains__(self, x: object) -> bool: # ty: ignore[invalid-method-override]
279
289
  return any(i == x for i in iter(self))
280
290
 
281
- def __init__(self, _file: "FoamFile", _keywords: tuple[str, ...]) -> None:
291
+ def __init__(
292
+ self, _file: "FoamFile", _keywords: tuple[str, Unpack[tuple[str, ...]]]
293
+ ) -> None:
282
294
  self._file = _file
283
295
  self._keywords = _keywords
284
296
 
285
297
  @override
286
298
  @with_default
287
- def getall(self, keyword: str) -> Collection["Data | FoamFile.SubDict | None"]:
299
+ def getall(
300
+ self, keyword: str, /
301
+ ) -> Collection["Data | FoamFile.SubDict | None"]:
288
302
  return self._file.getall((*self._keywords, keyword))
289
303
 
290
- @overload
291
- def __getitem__(self, keyword: str) -> "Data | FoamFile.SubDict | None": ...
292
-
293
- @overload
294
- def __getitem__(
295
- self, keyword: slice
296
- ) -> (
297
- dict[str, "Data | FoamFile.SubDict | None"]
298
- | MultiDict[str, "Data | FoamFile.SubDict | None"]
299
- ): ...
300
-
301
304
  @override
302
- def __getitem__(
303
- self, keyword: str | slice
304
- ) -> "Data | FoamFile.SubDict | None | dict[str, Data | FoamFile.SubDict | None] | MultiDict[str, Data | FoamFile.SubDict | None]":
305
- if keyword == slice(None):
306
- return self.as_dict(deep=False)
307
-
308
- if isinstance(keyword, slice):
309
- msg = "Only empty slices (:) are supported"
310
- raise ValueError(msg) # noqa: TRY004
311
-
312
- ret = self._file[(*self._keywords, keyword)]
313
- return cast("Data | FoamFile.SubDict | None", ret)
305
+ def __getitem__(self, keyword: str) -> "Data | FoamFile.SubDict | None":
306
+ return self._file[(*self._keywords, keyword)] # ty: ignore[invalid-return-type]
314
307
 
315
308
  @overload
316
309
  def __setitem__(
@@ -345,7 +338,7 @@ class FoamFile(
345
338
 
346
339
  @override
347
340
  @with_default
348
- def popone(self, keyword: str) -> "Data | FoamFile.SubDict | None":
341
+ def popone(self, keyword: str, /) -> "Data | FoamFile.SubDict | None":
349
342
  return self._file.popone((*self._keywords, keyword))
350
343
 
351
344
  @override
@@ -428,42 +421,17 @@ class FoamFile(
428
421
  def __repr__(self) -> str:
429
422
  return f"{type(self).__qualname__}('{self._file}', {self._keywords})"
430
423
 
431
- @overload
432
- def as_dict(self, *, deep: Literal[True] = ...) -> SubDict: ...
433
-
434
- @overload
435
- def as_dict(
436
- self, *, deep: Literal[False] = ...
437
- ) -> (
438
- dict[str, "Data | FoamFile.SubDict | None"]
439
- | MultiDict[str, "Data | FoamFile.SubDict | None"]
440
- ): ...
441
-
442
- def as_dict(
443
- self, *, deep: bool = True
444
- ) -> (
445
- SubDict
446
- | dict[str, "Data | FoamFile.SubDict | None"]
447
- | MultiDict[str, "Data | FoamFile.SubDict | None"]
448
- ):
449
- """
450
- Return a dict representation of the sub-dictionary.
424
+ def as_dict(self) -> SubDict:
425
+ """Return a nested dict representation of the sub-dictionary."""
426
+ file = self._file.as_dict(include_header=True)
451
427
 
452
- :param deep: Whether to return a nested representation by recursing into
453
- nested sub-dictionaries.
454
- """
455
- if deep:
456
- file = self._file.as_dict(include_header=True)
457
-
458
- ret = file[self._keywords[0]]
428
+ ret = file[self._keywords[0]]
429
+ assert isinstance(ret, Mapping)
430
+ for k in self._keywords[1:]:
431
+ ret = ret[k]
459
432
  assert isinstance(ret, Mapping)
460
- for k in self._keywords[1:]:
461
- ret = ret[k]
462
- assert isinstance(ret, Mapping)
463
-
464
- return ret # ty: ignore[invalid-return-type]
465
433
 
466
- return dict_from_items(self.items(), target=SubDict)
434
+ return ret # ty: ignore[invalid-return-type]
467
435
 
468
436
  @property
469
437
  def version(self) -> float:
@@ -663,6 +631,7 @@ class FoamFile(
663
631
  if not keywords:
664
632
  msg = "Cannot set a mapping at the root level of a FoamFile\nUse update(), extend(), or merge() instead."
665
633
  raise ValueError(msg)
634
+ keywords = cast("tuple[str, Unpack[tuple[str, ...]]]", keywords)
666
635
 
667
636
  if keyword.startswith("#"):
668
637
  msg = f"Cannot set a directive as the keyword for a dictionary: {keyword}"
@@ -688,6 +657,7 @@ class FoamFile(
688
657
  self[(*keywords, k)] = v # ty: ignore[invalid-assignment]
689
658
 
690
659
  elif keywords:
660
+ keywords = cast("tuple[str, Unpack[tuple[str, ...]]]", keywords)
691
661
  val = dumps(data, keywords=keywords, format_=format_)
692
662
 
693
663
  content = (
@@ -718,39 +688,42 @@ class FoamFile(
718
688
  @overload
719
689
  @with_default
720
690
  def getall(
721
- self, keywords: str | tuple[str]
691
+ self,
692
+ keywords: str | tuple[str, Unpack[tuple[str, ...]]],
693
+ /,
722
694
  ) -> Collection["Data | FoamFile.SubDict | None"]: ...
723
695
 
724
696
  @overload
725
697
  @with_default
726
- def getall(self, keywords: None | tuple[()]) -> Collection[StandaloneData]: ...
727
-
728
- @overload
729
- @with_default
730
- def getall(
731
- self, keywords: tuple[str, ...]
732
- ) -> Collection["Data | StandaloneData | FoamFile.SubDict | None"]: ...
698
+ def getall(self, keywords: None | tuple[()], /) -> Collection[StandaloneData]: ...
733
699
 
734
700
  @override
735
701
  @with_default
736
702
  def getall(
737
703
  self,
738
704
  keywords: str | tuple[str, ...] | None,
705
+ /,
739
706
  ) -> Collection["Data | StandaloneData | FoamFile.SubDict | None"]:
740
707
  keywords = FoamFile._normalized_keywords(keywords)
708
+ keywords = cast("tuple[str, Unpack[tuple[str, ...]]] | tuple[()]", keywords)
741
709
 
742
710
  parsed = self._get_parsed()
743
711
 
744
- ret = parsed.getall(keywords)
712
+ values = parsed.getall(keywords)
745
713
 
746
- return [
747
- FoamFile.SubDict(self, keywords) if v is ... else deepcopy(v) for v in ret
748
- ]
714
+ ret = []
715
+ for v in values:
716
+ if v is ...:
717
+ assert keywords
718
+ ret.append(FoamFile.SubDict(self, keywords))
719
+ else:
720
+ ret.append(deepcopy(v))
721
+ return ret
749
722
 
750
723
  @overload
751
724
  def __getitem__(
752
725
  self,
753
- keywords: str | tuple[str],
726
+ keywords: str | tuple[str, Unpack[tuple[str, ...]]],
754
727
  ) -> "Data | FoamFile.SubDict | None": ...
755
728
 
756
729
  @overload
@@ -759,35 +732,18 @@ class FoamFile(
759
732
  keywords: None | tuple[()],
760
733
  ) -> StandaloneData: ...
761
734
 
762
- @overload
763
- def __getitem__(
764
- self,
765
- keywords: tuple[str, ...],
766
- ) -> "Data | StandaloneData | FoamFile.SubDict | None": ...
767
-
768
- @overload
769
- def __getitem__(
770
- self,
771
- keywords: slice,
772
- ) -> (
773
- dict[str | None, "Data | StandaloneData | FoamFile.SubDict | None"]
774
- | MultiDict[str | None, "Data | StandaloneData | FoamFile.SubDict | None"]
775
- ): ...
776
-
777
735
  @override
778
736
  def __getitem__( # ty: ignore[invalid-method-override]
779
737
  self,
780
- keywords: str | tuple[str, ...] | None | slice,
781
- ) -> "Data | StandaloneData | FoamFile.SubDict | None | dict[str | None, Data | StandaloneData | FoamFile.SubDict | None] | MultiDict[str | None, Data | StandaloneData | FoamFile.SubDict | None]":
782
- keywords = FoamFile._normalized_keywords(keywords, slice_ok=True)
783
-
784
- if keywords == slice(None):
785
- return self.as_dict(deep=False)
738
+ keywords: str | tuple[str, ...] | None,
739
+ ) -> "Data | StandaloneData | FoamFile.SubDict | None":
740
+ keywords = FoamFile._normalized_keywords(keywords)
786
741
 
787
- assert not isinstance(keywords, slice)
788
742
  parsed = self._get_parsed()
743
+ keywords = cast("tuple[str, Unpack[tuple[str, ...]]] | tuple[()]", keywords)
789
744
  ret = parsed[keywords]
790
745
  if ret is ...:
746
+ assert keywords
791
747
  return FoamFile.SubDict(self, keywords)
792
748
  return deepcopy(ret)
793
749
 
@@ -861,7 +817,9 @@ class FoamFile(
861
817
  @with_default
862
818
  @override
863
819
  def popone(
864
- self, keywords: str | tuple[str, ...] | None
820
+ self,
821
+ keywords: str | tuple[str, ...] | None,
822
+ /,
865
823
  ) -> "Data | StandaloneData | FoamFile.SubDict | None":
866
824
  keywords = FoamFile._normalized_keywords(keywords)
867
825
 
@@ -1020,40 +978,16 @@ class FoamFile(
1020
978
  def __fspath__(self) -> str:
1021
979
  return str(self.path)
1022
980
 
1023
- @overload
1024
- def as_dict(
1025
- self, *, include_header: bool = ..., deep: Literal[True] = ...
1026
- ) -> File: ...
1027
-
1028
- @overload
1029
- def as_dict(
1030
- self, *, include_header: bool = ..., deep: Literal[False] = ...
1031
- ) -> (
1032
- dict[str | None, "Data | StandaloneData | FoamFile.SubDict | None"]
1033
- | MultiDict[str | None, "Data | StandaloneData | FoamFile.SubDict | None"]
1034
- ): ...
1035
-
1036
- def as_dict(
1037
- self, *, include_header: bool = False, deep: bool = True
1038
- ) -> (
1039
- File
1040
- | dict[str | None, "Data | StandaloneData | FoamFile.SubDict | None"]
1041
- | MultiDict[str | None, "Data | StandaloneData | FoamFile.SubDict | None"]
1042
- ):
981
+ def as_dict(self, *, include_header: bool = False) -> File:
1043
982
  """
1044
- Return a dict representation of the file.
983
+ Return a nested dict representation of the file.
1045
984
 
1046
985
  :param include_header: Whether to include the "FoamFile" header in the output.
1047
- :param deep: Whether to return a nested representation by recursing into
1048
- nested sub-dictionaries.
1049
986
  """
1050
- if deep:
1051
- d = self._get_parsed().as_dict()
1052
- if not include_header:
1053
- d.pop("FoamFile", None)
1054
- return deepcopy(d)
1055
-
1056
- return dict_from_items(self.items(include_header=include_header), target=File) # ty: ignore[invalid-return-type]
987
+ d = self._get_parsed().as_dict()
988
+ if not include_header:
989
+ d.pop("FoamFile", None)
990
+ return deepcopy(d)
1057
991
 
1058
992
  @staticmethod
1059
993
  def loads(
@@ -1135,14 +1069,14 @@ class FoamFile(
1135
1069
  @overload
1136
1070
  @staticmethod
1137
1071
  def _normalized_keywords(
1138
- keywords: None, /, *, slice_ok: bool = ...
1072
+ keywords: None | tuple[()], /, *, slice_ok: bool = ...
1139
1073
  ) -> tuple[()]: ...
1140
1074
 
1141
1075
  @overload
1142
1076
  @staticmethod
1143
1077
  def _normalized_keywords(
1144
- keywords: tuple[str, ...], /, *, slice_ok: bool = ...
1145
- ) -> tuple[str, ...]: ...
1078
+ keywords: tuple[str, Unpack[tuple[str, ...]]], /, *, slice_ok: bool = ...
1079
+ ) -> tuple[str, Unpack[tuple[str, ...]]]: ...
1146
1080
 
1147
1081
  @overload
1148
1082
  @staticmethod
@@ -1225,7 +1159,7 @@ class FoamFieldFile(FoamFile):
1225
1159
  @override
1226
1160
  @with_default
1227
1161
  def getall(
1228
- self, keyword: str
1162
+ self, keyword: str, /
1229
1163
  ) -> Collection["FoamFieldFile.BoundarySubDict | Data | None"]:
1230
1164
  ret = super().getall(keyword)
1231
1165
  for r in ret:
@@ -1273,23 +1207,17 @@ class FoamFieldFile(FoamFile):
1273
1207
  @overload
1274
1208
  @with_default
1275
1209
  def getall(
1276
- self, keywords: str | tuple[str]
1277
- ) -> Collection["Data | FoamFieldFile.BoundariesSubDict | None"]: ...
1210
+ self, keywords: str | tuple[str, Unpack[tuple[str, ...]]], /
1211
+ ) -> Collection["Data | FoamFieldFile.SubDict | None"]: ...
1278
1212
 
1279
1213
  @overload
1280
1214
  @with_default
1281
- def getall(self, keywords: None | tuple[()]) -> Collection[StandaloneData]: ...
1282
-
1283
- @overload
1284
- @with_default
1285
- def getall(
1286
- self, keywords: tuple[str, ...]
1287
- ) -> Collection["Data | StandaloneData | FoamFieldFile.SubDict | None"]: ...
1215
+ def getall(self, keywords: None | tuple[()], /) -> Collection[StandaloneData]: ...
1288
1216
 
1289
1217
  @override
1290
1218
  @with_default
1291
1219
  def getall(
1292
- self, keywords: str | tuple[str, ...] | None
1220
+ self, keywords: str | tuple[str, ...] | None, /
1293
1221
  ) -> Collection["Data | StandaloneData | FoamFieldFile.SubDict | None"]:
1294
1222
  keywords = FoamFieldFile._normalized_keywords(keywords)
1295
1223
 
@@ -1299,8 +1227,10 @@ class FoamFieldFile(FoamFile):
1299
1227
  for i, r in enumerate(ret):
1300
1228
  if isinstance(r, FoamFile.SubDict):
1301
1229
  if len(keywords) == 1:
1230
+ keywords = cast("tuple[str]", keywords)
1302
1231
  ret[i] = FoamFieldFile.BoundariesSubDict(self, keywords)
1303
1232
  elif len(keywords) == 2:
1233
+ keywords = cast("tuple[str, str]", keywords)
1304
1234
  ret[i] = FoamFieldFile.BoundarySubDict(self, keywords)
1305
1235
 
1306
1236
  return ret
@@ -1308,14 +1238,8 @@ class FoamFieldFile(FoamFile):
1308
1238
  @overload
1309
1239
  def __getitem__(
1310
1240
  self,
1311
- keywords: str | tuple[str],
1312
- ) -> "Data | FoamFieldFile.BoundariesSubDict | None": ...
1313
-
1314
- @overload
1315
- def __getitem__(
1316
- self,
1317
- keywords: tuple[str, str],
1318
- ) -> "Data | FoamFieldFile.BoundarySubDict | None": ...
1241
+ keywords: str | tuple[str, Unpack[tuple[str, ...]]],
1242
+ ) -> "Data | FoamFieldFile.SubDict | None": ...
1319
1243
 
1320
1244
  @overload
1321
1245
  def __getitem__(
@@ -1323,35 +1247,25 @@ class FoamFieldFile(FoamFile):
1323
1247
  keywords: None | tuple[()],
1324
1248
  ) -> StandaloneData: ...
1325
1249
 
1326
- @overload
1327
- def __getitem__(
1328
- self,
1329
- keywords: tuple[str, ...],
1330
- ) -> "Data | StandaloneData | FoamFieldFile.SubDict | None": ...
1331
-
1332
- @overload
1333
- def __getitem__(
1334
- self,
1335
- keywords: slice,
1336
- ) -> File: ...
1337
-
1338
1250
  @override
1339
1251
  def __getitem__( # ty: ignore[invalid-method-override]
1340
1252
  self,
1341
- keywords: str | tuple[str, ...] | None | slice,
1342
- ) -> "Data | StandaloneData | FoamFieldFile.SubDict | None | dict[str | None, Data | StandaloneData | FoamFieldFile.SubDict | None] | MultiDict[str | None, Data | StandaloneData | FoamFieldFile.SubDict | None]":
1343
- keywords = FoamFieldFile._normalized_keywords(keywords, slice_ok=True)
1344
-
1345
- if keywords == slice(None):
1346
- return self.as_dict(deep=False)
1253
+ keywords: str | tuple[str, ...] | None,
1254
+ ) -> "Data | StandaloneData | FoamFieldFile.SubDict | None":
1255
+ keywords = FoamFieldFile._normalized_keywords(keywords)
1347
1256
 
1348
- assert not isinstance(keywords, slice)
1349
- ret = super().__getitem__(keywords)
1257
+ ret = super().__getitem__(keywords) # ty: ignore[no-matching-overload]
1350
1258
 
1351
- if keywords[0] == "boundaryField" and isinstance(ret, FoamFile.SubDict):
1259
+ if (
1260
+ keywords
1261
+ and keywords[0] == "boundaryField"
1262
+ and isinstance(ret, FoamFile.SubDict)
1263
+ ):
1352
1264
  if len(keywords) == 1:
1265
+ keywords = cast("tuple[str]", keywords)
1353
1266
  ret = FoamFieldFile.BoundariesSubDict(self, keywords)
1354
1267
  elif len(keywords) == 2:
1268
+ keywords = cast("tuple[str, str]", keywords)
1355
1269
  ret = FoamFieldFile.BoundarySubDict(self, keywords)
1356
1270
 
1357
1271
  return ret
File without changes
File without changes
File without changes
File without changes