foamlib 0.1.6__py3-none-any.whl → 0.1.7__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.7"
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,45 @@ 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 = (
71
+ Opt(common.integer).suppress()
72
+ + Literal("(").suppress()
73
+ + Group(ZeroOrMore(_value))
74
+ + Literal(")").suppress()
75
+ )
76
+ _uniform_field = Keyword("uniform").suppress() + _value
77
+ _nonuniform_field = (
78
+ Keyword("nonuniform").suppress()
79
+ + Literal("List<").suppress()
80
+ + common.identifier.suppress()
81
+ + Literal(">").suppress()
82
+ + _list
83
+ )
84
+ _dimensions = (
85
+ Literal("[").suppress() + common.number * 7 + Literal("]").suppress()
86
+ ).set_parse_action(lambda s, loc, tks: FoamDimensionSet(*tks))
87
+ _dimensioned = (common.identifier + _dimensions + _value).set_parse_action(
88
+ lambda s, loc, tks: FoamDimensioned(tks[0], tks[1], tks[2].as_list())
89
+ )
66
90
 
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")
91
+ _value << (
92
+ _uniform_field
93
+ | _nonuniform_field
94
+ | _list
95
+ | _dimensioned
96
+ | _dimensions
97
+ | common.number
98
+ | _yes
99
+ | _no
100
+ | common.identifier
101
+ )
146
102
 
147
103
 
148
104
  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
105
+ return cast(FoamValue, _value.parse_string(value, parse_all=True).as_list()[0])
168
106
 
169
107
 
170
108
  def _serialize_bool(value: Any) -> str:
@@ -176,7 +114,7 @@ def _serialize_bool(value: Any) -> str:
176
114
  raise TypeError(f"Not a bool: {type(value)}")
177
115
 
178
116
 
179
- def _serialize_sequence(sequence: Any) -> str:
117
+ def _serialize_list(sequence: Any) -> str:
180
118
  if (
181
119
  isinstance(sequence, Sequence)
182
120
  and not isinstance(sequence, str)
@@ -193,7 +131,7 @@ def _serialize_field(value: Any) -> str:
193
131
  return f"uniform {value}"
194
132
  else:
195
133
  try:
196
- s = _serialize_sequence(value)
134
+ s = _serialize_list(value)
197
135
  except TypeError:
198
136
  raise TypeError(f"Not a valid field: {type(value)}") from None
199
137
  else:
@@ -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.7
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=4M78qiB1De99KYGW79G2QuvIQxP54HQ9fNaVeRcf-eo,550
2
+ foamlib/_cases.py,sha256=Q5c8vPzKT5coOy4q_H6s5gHgEArhLHByh6GSvDVCRdY,20683
3
+ foamlib/_dictionaries.py,sha256=IVq2dTEhSGKUVgBEIttk4NotE1FxQ5igY99rjPw-EcI,12871
4
+ foamlib/_subprocesses.py,sha256=5vqdQvpN_2v4GgDqxi-s88NGhZ6doFxkh0XY89ZWuHA,1926
5
+ foamlib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ foamlib-0.1.7.dist-info/LICENSE.txt,sha256=5Dte9TUnLZzPRs4NQzl-Jc2-Ljd-t_v0ZR5Ng5r0UsY,35131
7
+ foamlib-0.1.7.dist-info/METADATA,sha256=tMiYqlMCkMvqhKrtKdnSZckprsZwIhX_guIOFqsljac,4526
8
+ foamlib-0.1.7.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
9
+ foamlib-0.1.7.dist-info/top_level.txt,sha256=ZdVYtetXGwPwyfL-WhlhbTFQGAwKX5P_gXxtH9JYFPI,8
10
+ foamlib-0.1.7.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,,