PySerials 0.0.0.dev25__tar.gz → 0.0.0.dev26__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 (23) hide show
  1. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/PKG-INFO +3 -3
  2. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/pyproject.toml +3 -3
  3. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/PySerials.egg-info/PKG-INFO +3 -3
  4. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/PySerials.egg-info/requires.txt +2 -2
  5. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/update.py +28 -11
  6. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/README.md +0 -0
  7. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/setup.cfg +0 -0
  8. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/PySerials.egg-info/SOURCES.txt +0 -0
  9. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/PySerials.egg-info/dependency_links.txt +0 -0
  10. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/PySerials.egg-info/not-zip-safe +0 -0
  11. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/PySerials.egg-info/top_level.txt +0 -0
  12. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/__init__.py +0 -0
  13. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/compare.py +0 -0
  14. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/exception/__init__.py +0 -0
  15. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/exception/_base.py +0 -0
  16. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/exception/read.py +0 -0
  17. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/exception/update.py +0 -0
  18. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/exception/validate.py +0 -0
  19. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/format.py +0 -0
  20. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/nested_dict.py +0 -0
  21. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/read.py +0 -0
  22. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/validate.py +0 -0
  23. {pyserials-0.0.0.dev25 → pyserials-0.0.0.dev26}/src/pyserials/write.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PySerials
3
- Version: 0.0.0.dev25
3
+ Version: 0.0.0.dev26
4
4
  Requires-Python: >=3.10
5
5
  Requires-Dist: jsonschema<5,>=4.21.0
6
6
  Requires-Dist: referencing>=0.35.1
@@ -8,6 +8,6 @@ Requires-Dist: jsonpath-ng<2,>=1.6.1
8
8
  Requires-Dist: ruamel.yaml<0.18,>=0.17.32
9
9
  Requires-Dist: ruamel.yaml.string<1,>=0.1.1
10
10
  Requires-Dist: tomlkit<0.12,>=0.11.8
11
- Requires-Dist: MDit==0.0.0.dev22
12
- Requires-Dist: ExceptionMan==0.0.0.dev22
11
+ Requires-Dist: MDit==0.0.0.dev23
12
+ Requires-Dist: ExceptionMan==0.0.0.dev23
13
13
  Requires-Dist: ProtocolMan==0.0.0.dev2
@@ -17,7 +17,7 @@ namespaces = true
17
17
  # ----------------------------------------- Project Metadata -------------------------------------
18
18
  #
19
19
  [project]
20
- version = "0.0.0.dev25"
20
+ version = "0.0.0.dev26"
21
21
  name = "PySerials"
22
22
  dependencies = [
23
23
  "jsonschema >= 4.21.0, < 5",
@@ -26,8 +26,8 @@ dependencies = [
26
26
  "ruamel.yaml >= 0.17.32, < 0.18", # https://yaml.readthedocs.io/en/stable/
27
27
  "ruamel.yaml.string >= 0.1.1, < 1",
28
28
  "tomlkit >= 0.11.8, < 0.12", # https://tomlkit.readthedocs.io/en/stable/,
29
- "MDit == 0.0.0.dev22",
30
- "ExceptionMan == 0.0.0.dev22",
29
+ "MDit == 0.0.0.dev23",
30
+ "ExceptionMan == 0.0.0.dev23",
31
31
  "ProtocolMan == 0.0.0.dev2",
32
32
  ]
33
33
  requires-python = ">=3.10"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PySerials
3
- Version: 0.0.0.dev25
3
+ Version: 0.0.0.dev26
4
4
  Requires-Python: >=3.10
5
5
  Requires-Dist: jsonschema<5,>=4.21.0
6
6
  Requires-Dist: referencing>=0.35.1
@@ -8,6 +8,6 @@ Requires-Dist: jsonpath-ng<2,>=1.6.1
8
8
  Requires-Dist: ruamel.yaml<0.18,>=0.17.32
9
9
  Requires-Dist: ruamel.yaml.string<1,>=0.1.1
10
10
  Requires-Dist: tomlkit<0.12,>=0.11.8
11
- Requires-Dist: MDit==0.0.0.dev22
12
- Requires-Dist: ExceptionMan==0.0.0.dev22
11
+ Requires-Dist: MDit==0.0.0.dev23
12
+ Requires-Dist: ExceptionMan==0.0.0.dev23
13
13
  Requires-Dist: ProtocolMan==0.0.0.dev2
@@ -4,6 +4,6 @@ jsonpath-ng<2,>=1.6.1
4
4
  ruamel.yaml<0.18,>=0.17.32
5
5
  ruamel.yaml.string<1,>=0.1.1
6
6
  tomlkit<0.12,>=0.11.8
7
- MDit==0.0.0.dev22
8
- ExceptionMan==0.0.0.dev22
7
+ MDit==0.0.0.dev23
8
+ ExceptionMan==0.0.0.dev23
9
9
  ProtocolMan==0.0.0.dev2
@@ -1,4 +1,5 @@
1
- from typing import Literal as _Literal
1
+ from __future__ import annotations as _annotations
2
+ from typing import TYPE_CHECKING as _TYPE_CHECKING
2
3
  import re as _re
3
4
 
4
5
  import jsonpath_ng as _jsonpath
@@ -6,6 +7,9 @@ from jsonpath_ng import exceptions as _jsonpath_exceptions
6
7
 
7
8
  import pyserials.exception as _exception
8
9
 
10
+ if _TYPE_CHECKING:
11
+ from typing import Literal, Callable
12
+
9
13
 
10
14
  def dict_from_addon(
11
15
  data: dict,
@@ -18,7 +22,7 @@ def dict_from_addon(
18
22
  """Recursively update a dictionary from another dictionary."""
19
23
  def recursive(source: dict, add: dict, path: str, log: dict):
20
24
 
21
- def raise_error(typ: _Literal["duplicate", "type_mismatch"]):
25
+ def raise_error(typ: Literal["duplicate", "type_mismatch"]):
22
26
  raise _exception.update.PySerialsUpdateDictFromAddonError(
23
27
  problem_type=typ,
24
28
  path=fullpath,
@@ -89,15 +93,23 @@ class TemplateFiller:
89
93
  self,
90
94
  marker_start: str = "${{",
91
95
  marker_end: str = "}}",
96
+ marker_start_unpack: str = "*{{",
97
+ marker_end_unpack: str = "}}",
92
98
  implicit_root: bool = True,
99
+ stringer: Callable[[str], str] = str,
93
100
  ):
101
+ def make_regex(start, end):
102
+ start_esc = _re.escape(start)
103
+ end_esc = _re.escape(end)
104
+ regex_sub = rf"{start_esc}([^{end_esc}]+){end_esc}"
105
+ return _re.compile(regex_sub)
106
+
94
107
  self._marker_start = marker_start
95
108
  self._marker_end = marker_end
96
- start = _re.escape(marker_start)
97
- end = _re.escape(marker_end)
98
- regex_sub = rf"{start}([^{end}]+){end}"
99
- self._pattern_template = _re.compile(regex_sub)
109
+ self._pattern_template = make_regex(marker_start, marker_end)
110
+ self._pattern_template_unpack = make_regex(marker_start_unpack, marker_end_unpack)
100
111
  self._add_prefix = implicit_root
112
+ self._stringer = stringer
101
113
  self._data = None
102
114
  self._source = None
103
115
  self._recursive = None
@@ -211,15 +223,20 @@ class TemplateFiller:
211
223
  if match_whole_str:
212
224
  return get_address_value(match_whole_str)
213
225
  return self._pattern_template.sub(
214
- lambda x: str(get_address_value(x)),
226
+ lambda x: self._stringer(get_address_value(x)),
215
227
  templ
216
228
  )
217
229
  if isinstance(templ, list):
218
- return [
219
- self._recursive_subst(
230
+ out = []
231
+ for idx, elem in enumerate(templ):
232
+ elem_filled = self._recursive_subst(
220
233
  elem, f"{current_path}[{idx}]", always_list
221
- ) for idx, elem in enumerate(templ)
222
- ]
234
+ )
235
+ if self._pattern_template_unpack.fullmatch(elem):
236
+ out.extend(elem_filled)
237
+ else:
238
+ out.append(elem_filled)
239
+ return out
223
240
  if isinstance(templ, dict):
224
241
  new_dict = {}
225
242
  for key, val in templ.items():