PySerials 0.1.1__tar.gz → 0.1.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.
- {pyserials-0.1.1 → pyserials-0.1.3}/PKG-INFO +3 -3
- {pyserials-0.1.1 → pyserials-0.1.3}/pyproject.toml +4 -4
- pyserials-0.1.3/setup.py +141 -0
- {pyserials-0.1.1 → pyserials-0.1.3}/src/PySerials.egg-info/PKG-INFO +3 -3
- {pyserials-0.1.1 → pyserials-0.1.3}/src/PySerials.egg-info/SOURCES.txt +2 -0
- {pyserials-0.1.1 → pyserials-0.1.3}/src/PySerials.egg-info/requires.txt +1 -1
- pyserials-0.1.3/src/pyserials/__init__.py +38 -0
- pyserials-0.1.3/src/pyserials/compare.py +88 -0
- pyserials-0.1.3/src/pyserials/exception/__init__.py +8 -0
- {pyserials-0.1.1 → pyserials-0.1.3}/src/pyserials/exception/_base.py +17 -7
- {pyserials-0.1.1 → pyserials-0.1.3}/src/pyserials/exception/read.py +108 -43
- {pyserials-0.1.1 → pyserials-0.1.3}/src/pyserials/exception/update.py +46 -32
- {pyserials-0.1.1 → pyserials-0.1.3}/src/pyserials/exception/validate.py +57 -32
- pyserials-0.1.3/src/pyserials/flatten.py +98 -0
- pyserials-0.1.3/src/pyserials/format.py +167 -0
- pyserials-0.1.3/src/pyserials/nested_dict.py +390 -0
- pyserials-0.1.3/src/pyserials/property_dict.py +154 -0
- pyserials-0.1.3/src/pyserials/read.py +511 -0
- pyserials-0.1.3/src/pyserials/update.py +1909 -0
- pyserials-0.1.3/src/pyserials/validate.py +135 -0
- pyserials-0.1.3/src/pyserials/write.py +295 -0
- pyserials-0.1.1/src/pyserials/__init__.py +0 -5
- pyserials-0.1.1/src/pyserials/compare.py +0 -29
- pyserials-0.1.1/src/pyserials/exception/__init__.py +0 -4
- pyserials-0.1.1/src/pyserials/format.py +0 -57
- pyserials-0.1.1/src/pyserials/nested_dict.py +0 -174
- pyserials-0.1.1/src/pyserials/property_dict.py +0 -85
- pyserials-0.1.1/src/pyserials/read.py +0 -201
- pyserials-0.1.1/src/pyserials/update.py +0 -763
- pyserials-0.1.1/src/pyserials/validate.py +0 -89
- pyserials-0.1.1/src/pyserials/write.py +0 -123
- {pyserials-0.1.1 → pyserials-0.1.3}/setup.cfg +0 -0
- {pyserials-0.1.1 → pyserials-0.1.3}/src/PySerials.egg-info/dependency_links.txt +0 -0
- {pyserials-0.1.1 → pyserials-0.1.3}/src/PySerials.egg-info/not-zip-safe +0 -0
- {pyserials-0.1.1 → pyserials-0.1.3}/src/PySerials.egg-info/top_level.txt +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PySerials
|
|
3
|
-
Version: 0.1.
|
|
4
|
-
Requires-Python: >=3.
|
|
3
|
+
Version: 0.1.3
|
|
4
|
+
Requires-Python: >=3.12
|
|
5
5
|
Requires-Dist: jsonschema<5,>=4.21.0
|
|
6
6
|
Requires-Dist: referencing>=0.35.1
|
|
7
|
-
Requires-Dist: jsonpath-ng<
|
|
7
|
+
Requires-Dist: jsonpath-ng<1.8.0,>=1.6.1
|
|
8
8
|
Requires-Dist: ruamel.yaml>=0.18
|
|
9
9
|
Requires-Dist: ruamel.yaml.string<1,>=0.1.1
|
|
10
10
|
Requires-Dist: tomlkit<0.14,>=0.11.8
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
[build-system]
|
|
3
|
-
requires = ["setuptools>=61.0", "versioningit"]
|
|
3
|
+
requires = ["setuptools>=61.0", "versioningit", "mypy>=1.0"]
|
|
4
4
|
build-backend = "setuptools.build_meta"
|
|
5
5
|
|
|
6
6
|
|
|
@@ -17,12 +17,12 @@ namespaces = true
|
|
|
17
17
|
# ----------------------------------------- Project Metadata -------------------------------------
|
|
18
18
|
#
|
|
19
19
|
[project]
|
|
20
|
-
version = "0.1.
|
|
20
|
+
version = "0.1.3"
|
|
21
21
|
name = "PySerials"
|
|
22
22
|
dependencies = [
|
|
23
23
|
"jsonschema >= 4.21.0, < 5",
|
|
24
24
|
"referencing >= 0.35.1",
|
|
25
|
-
"jsonpath-ng >= 1.6.1, <
|
|
25
|
+
"jsonpath-ng >= 1.6.1, < 1.8.0",
|
|
26
26
|
"ruamel.yaml >= 0.18", # https://yaml.readthedocs.io/en/stable/
|
|
27
27
|
"ruamel.yaml.string >= 0.1.1, < 1",
|
|
28
28
|
"tomlkit >= 0.11.8, < 0.14", # https://tomlkit.readthedocs.io/en/stable/,
|
|
@@ -30,4 +30,4 @@ dependencies = [
|
|
|
30
30
|
"ExceptionMan >=0.1,<0.2",
|
|
31
31
|
"ProtocolMan >=0.1,<0.2",
|
|
32
32
|
]
|
|
33
|
-
requires-python = ">=3.
|
|
33
|
+
requires-python = ">=3.12"
|
pyserials-0.1.3/setup.py
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""PySerials Setup Script
|
|
2
|
+
|
|
3
|
+
Usage
|
|
4
|
+
-----
|
|
5
|
+
- Build with mypyc (default when available):
|
|
6
|
+
```
|
|
7
|
+
python -m build
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
- Development install with compiled extensions:
|
|
11
|
+
```
|
|
12
|
+
pip install -e .
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
- Force pure-Python build even when compilers are available:
|
|
16
|
+
```
|
|
17
|
+
DISABLE_MYPYC=1 pip install -e .
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Notes
|
|
21
|
+
-----
|
|
22
|
+
Compiled extensions are built when **both** conditions are met:
|
|
23
|
+
|
|
24
|
+
1. **DISABLE_MYPYC** — The environment variable is not set to a truthy
|
|
25
|
+
value (``1``, ``true``, or ``yes``, case-insensitive).
|
|
26
|
+
Defaults to unset (enabled).
|
|
27
|
+
|
|
28
|
+
2. **SHOULD_COMPILE** — The setup command includes a compilation-triggering
|
|
29
|
+
argument: ``bdist_wheel``, ``editable_wheel``, ``build_ext``, ``build``,
|
|
30
|
+
``install``, or ``develop``.
|
|
31
|
+
Commands like ``egg_info`` or ``sdist`` skip compilation entirely.
|
|
32
|
+
|
|
33
|
+
If build dependencies are missing or compilation fails,
|
|
34
|
+
the build raises an error and stops.
|
|
35
|
+
|
|
36
|
+
mypyc modules
|
|
37
|
+
~~~~~~~~~~~~~
|
|
38
|
+
Only modules with measured speedup and no subclassing risk are compiled:
|
|
39
|
+
|
|
40
|
+
- ``pyserials.compare`` — Recursive dict/list comparison (2.2x speedup).
|
|
41
|
+
- ``pyserials.flatten`` — Nested-to-flat dict conversion (2.4x speedup).
|
|
42
|
+
- ``pyserials.format`` — TOML/YAML object conversion (1.3–2.6x speedup).
|
|
43
|
+
- ``pyserials.update`` — Template filler & recursive update (1.4–2.5x speedup).
|
|
44
|
+
|
|
45
|
+
Modules intentionally kept as pure Python:
|
|
46
|
+
|
|
47
|
+
- ``pyserials.read`` / ``pyserials.write`` — I/O-bound; ~98% time in
|
|
48
|
+
ruamel.yaml / tomlkit / json. Compilation yields only 1.1x.
|
|
49
|
+
- ``pyserials.validate`` — Actually *slower* compiled (0.5–0.9x) due to
|
|
50
|
+
mypyc boxing overhead at the untyped jsonschema boundary.
|
|
51
|
+
- ``pyserials.property_dict`` / ``pyserials.nested_dict`` — Compiled classes
|
|
52
|
+
cannot be subclassed from interpreted Python, which would be a breaking
|
|
53
|
+
change for downstream users.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
import logging
|
|
57
|
+
import os
|
|
58
|
+
import sys
|
|
59
|
+
|
|
60
|
+
from setuptools import setup, Extension
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
SRC_DIR: str = "src/pyserials"
|
|
64
|
+
|
|
65
|
+
log = logging.getLogger("pyserials.setup")
|
|
66
|
+
logging.basicConfig(level=logging.INFO, format="%(name)s: %(message)s")
|
|
67
|
+
|
|
68
|
+
COMPILE_COMMANDS = {
|
|
69
|
+
"bdist_wheel",
|
|
70
|
+
"editable_wheel",
|
|
71
|
+
"build_ext",
|
|
72
|
+
"build",
|
|
73
|
+
"install",
|
|
74
|
+
"develop",
|
|
75
|
+
}
|
|
76
|
+
IS_COMPILE_COMMAND = bool(set(sys.argv) & COMPILE_COMMANDS)
|
|
77
|
+
DISABLE_MYPYC = os.environ.get("DISABLE_MYPYC", "").lower() in ("1", "true", "yes")
|
|
78
|
+
|
|
79
|
+
# Number of parallel compilation jobs (C compiler invocations).
|
|
80
|
+
# Defaults to os.cpu_count(); override with BUILD_PARALLEL=N.
|
|
81
|
+
PARALLEL = int(os.environ.get("BUILD_PARALLEL", os.cpu_count() or 1))
|
|
82
|
+
|
|
83
|
+
# mypyc modules to compile (hot-path only; keep error handling in pure Python).
|
|
84
|
+
MYPYC_MODULES = [
|
|
85
|
+
f"{SRC_DIR}/compare.py",
|
|
86
|
+
f"{SRC_DIR}/flatten.py",
|
|
87
|
+
f"{SRC_DIR}/format.py",
|
|
88
|
+
f"{SRC_DIR}/update.py",
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def create_mypyc_extensions() -> list[Extension]:
|
|
93
|
+
"""Create mypyc-compiled extensions for performance-critical modules."""
|
|
94
|
+
try:
|
|
95
|
+
from mypyc.build import mypycify
|
|
96
|
+
except ImportError as exc:
|
|
97
|
+
log.critical("mypyc dependency not found: %s", exc)
|
|
98
|
+
raise RuntimeError("mypyc dependency not found") from exc
|
|
99
|
+
|
|
100
|
+
try:
|
|
101
|
+
log.info("mypyc modules: %s", MYPYC_MODULES)
|
|
102
|
+
ext_modules = mypycify(
|
|
103
|
+
["--ignore-missing-imports", *MYPYC_MODULES],
|
|
104
|
+
opt_level="3",
|
|
105
|
+
debug_level="0",
|
|
106
|
+
strip_asserts=True,
|
|
107
|
+
multi_file=False,
|
|
108
|
+
verbose=True,
|
|
109
|
+
)
|
|
110
|
+
log.info("Compiling %d mypyc extensions", len(ext_modules))
|
|
111
|
+
return ext_modules
|
|
112
|
+
|
|
113
|
+
except (Exception, SystemExit) as exc:
|
|
114
|
+
log.critical("mypyc compilation failed (%s): %s", type(exc).__name__, exc)
|
|
115
|
+
raise RuntimeError("mypyc compilation failed") from exc
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
# ---------------------------------------------------------------------------
|
|
119
|
+
# Main
|
|
120
|
+
# ---------------------------------------------------------------------------
|
|
121
|
+
|
|
122
|
+
log.info(
|
|
123
|
+
"Setup script invoked by %s command: %s",
|
|
124
|
+
"build" if IS_COMPILE_COMMAND else "metadata-only",
|
|
125
|
+
" ".join(sys.argv),
|
|
126
|
+
)
|
|
127
|
+
log.info(
|
|
128
|
+
"Setup configuration: DISABLE_MYPYC=%s, BUILD_PARALLEL=%d",
|
|
129
|
+
DISABLE_MYPYC,
|
|
130
|
+
PARALLEL,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
ext_modules: list[Extension] = []
|
|
134
|
+
|
|
135
|
+
if IS_COMPILE_COMMAND and not DISABLE_MYPYC:
|
|
136
|
+
ext_modules.extend(create_mypyc_extensions())
|
|
137
|
+
|
|
138
|
+
setup(
|
|
139
|
+
ext_modules=ext_modules,
|
|
140
|
+
options={"build_ext": {"parallel": PARALLEL}},
|
|
141
|
+
)
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PySerials
|
|
3
|
-
Version: 0.1.
|
|
4
|
-
Requires-Python: >=3.
|
|
3
|
+
Version: 0.1.3
|
|
4
|
+
Requires-Python: >=3.12
|
|
5
5
|
Requires-Dist: jsonschema<5,>=4.21.0
|
|
6
6
|
Requires-Dist: referencing>=0.35.1
|
|
7
|
-
Requires-Dist: jsonpath-ng<
|
|
7
|
+
Requires-Dist: jsonpath-ng<1.8.0,>=1.6.1
|
|
8
8
|
Requires-Dist: ruamel.yaml>=0.18
|
|
9
9
|
Requires-Dist: ruamel.yaml.string<1,>=0.1.1
|
|
10
10
|
Requires-Dist: tomlkit<0.14,>=0.11.8
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
pyproject.toml
|
|
2
|
+
setup.py
|
|
2
3
|
src/PySerials.egg-info/PKG-INFO
|
|
3
4
|
src/PySerials.egg-info/SOURCES.txt
|
|
4
5
|
src/PySerials.egg-info/dependency_links.txt
|
|
@@ -7,6 +8,7 @@ src/PySerials.egg-info/requires.txt
|
|
|
7
8
|
src/PySerials.egg-info/top_level.txt
|
|
8
9
|
src/pyserials/__init__.py
|
|
9
10
|
src/pyserials/compare.py
|
|
11
|
+
src/pyserials/flatten.py
|
|
10
12
|
src/pyserials/format.py
|
|
11
13
|
src/pyserials/nested_dict.py
|
|
12
14
|
src/pyserials/property_dict.py
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""PySerials: A Python package for reading, writing, validating, and transforming serialized data.
|
|
2
|
+
|
|
3
|
+
PySerials provides utilities for working with JSON, YAML, and TOML data formats,
|
|
4
|
+
including reading/writing files and strings, recursive dictionary updates,
|
|
5
|
+
template filling, JSON Schema validation, data comparison, and flattening of
|
|
6
|
+
nested structures.
|
|
7
|
+
|
|
8
|
+
Modules
|
|
9
|
+
-------
|
|
10
|
+
read
|
|
11
|
+
Read serialized data from files and strings.
|
|
12
|
+
write
|
|
13
|
+
Write data to serialized format strings and files.
|
|
14
|
+
update
|
|
15
|
+
Recursively update data structures and fill templates.
|
|
16
|
+
validate
|
|
17
|
+
Validate data against JSON schemas.
|
|
18
|
+
compare
|
|
19
|
+
Compare two data structures and report differences.
|
|
20
|
+
format
|
|
21
|
+
Convert data to specific TOML/YAML object types.
|
|
22
|
+
flatten
|
|
23
|
+
Flatten nested dictionaries to single-level dictionaries.
|
|
24
|
+
exception
|
|
25
|
+
Custom exception classes for error reporting.
|
|
26
|
+
|
|
27
|
+
Classes
|
|
28
|
+
-------
|
|
29
|
+
NestedDict
|
|
30
|
+
A dictionary wrapper supporting dot-separated key access and template filling.
|
|
31
|
+
PropertyDict
|
|
32
|
+
A dictionary wrapper supporting attribute-style access.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
from pyserials import exception, update, validate, read, write, format, compare
|
|
36
|
+
from pyserials.nested_dict import NestedDict
|
|
37
|
+
from pyserials.property_dict import PropertyDict
|
|
38
|
+
from pyserials.flatten import flatten
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""Compare two data structures and report differences.
|
|
2
|
+
|
|
3
|
+
This module provides functionality to recursively compare nested data structures
|
|
4
|
+
(dicts, lists, tuples, and scalar values), producing categorized lists of
|
|
5
|
+
JSONPath-like paths indicating which elements were added, removed, modified,
|
|
6
|
+
or left unchanged.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def items(
|
|
15
|
+
source: Any,
|
|
16
|
+
target: Any,
|
|
17
|
+
path: str = "$",
|
|
18
|
+
) -> dict[str, list[str]]:
|
|
19
|
+
"""Recursively compare two data structures and categorize differences.
|
|
20
|
+
|
|
21
|
+
Walks both ``source`` and ``target`` in parallel, emitting JSONPath-style
|
|
22
|
+
strings for every leaf. Paths are grouped into four categories:
|
|
23
|
+
|
|
24
|
+
* **added** – present in *source* but not in *target*.
|
|
25
|
+
* **removed** – present in *target* but not in *source*.
|
|
26
|
+
* **modified** – present in both but with different values or types.
|
|
27
|
+
* **unchanged** – present in both with the same value.
|
|
28
|
+
|
|
29
|
+
.. note::
|
|
30
|
+
Type comparison uses ``type(x) is type(y)`` (exact equality), not
|
|
31
|
+
``isinstance``. Any type mismatch — including subclass vs base class
|
|
32
|
+
(e.g. ``True`` vs ``1``, ``OrderedDict`` vs ``dict``) — causes the
|
|
33
|
+
entire node to be marked **modified** with no further traversal into
|
|
34
|
+
its children. Two nodes are traversed recursively only when their
|
|
35
|
+
exact types match.
|
|
36
|
+
|
|
37
|
+
Parameters
|
|
38
|
+
----------
|
|
39
|
+
source : Any
|
|
40
|
+
The *new* data structure (additions relative to *target*).
|
|
41
|
+
target : Any
|
|
42
|
+
The *old* / reference data structure.
|
|
43
|
+
path : str, default ``"$"``
|
|
44
|
+
Root JSONPath prefix for all emitted paths.
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
dict[str, list[str]]
|
|
49
|
+
A mapping with keys ``"added"``, ``"removed"``, ``"modified"``,
|
|
50
|
+
and ``"unchanged"``, each containing a sorted list of JSONPath strings.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def recursive_compare(src: Any, trg: Any, curr_path: str) -> None:
|
|
54
|
+
if type(src) is not type(trg):
|
|
55
|
+
comp["modified"].append(curr_path)
|
|
56
|
+
return
|
|
57
|
+
if isinstance(src, dict):
|
|
58
|
+
for key in src:
|
|
59
|
+
if key not in trg:
|
|
60
|
+
comp["added"].append(f"{curr_path}.{key}")
|
|
61
|
+
continue
|
|
62
|
+
recursive_compare(src[key], trg[key], f"{curr_path}.{key}")
|
|
63
|
+
for key in trg:
|
|
64
|
+
if key not in src:
|
|
65
|
+
comp["removed"].append(f"{curr_path}.{key}")
|
|
66
|
+
return
|
|
67
|
+
if isinstance(src, (list, tuple)):
|
|
68
|
+
len_src: int = len(src)
|
|
69
|
+
len_trg: int = len(trg)
|
|
70
|
+
min_len: int = min(len_src, len_trg)
|
|
71
|
+
for i in range(min_len):
|
|
72
|
+
recursive_compare(src[i], trg[i], f"{curr_path}[{i}]")
|
|
73
|
+
for i in range(min_len, max(len_src, len_trg)):
|
|
74
|
+
comp["added" if len_src > len_trg else "removed"].append(
|
|
75
|
+
f"{curr_path}[{i}]"
|
|
76
|
+
)
|
|
77
|
+
return
|
|
78
|
+
comp["unchanged" if src == trg else "modified"].append(curr_path)
|
|
79
|
+
return
|
|
80
|
+
|
|
81
|
+
comp: dict[str, list[str]] = {
|
|
82
|
+
"added": [],
|
|
83
|
+
"removed": [],
|
|
84
|
+
"modified": [],
|
|
85
|
+
"unchanged": [],
|
|
86
|
+
}
|
|
87
|
+
recursive_compare(source, target, path)
|
|
88
|
+
return {key: sorted(comp[key]) for key in comp}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""Exceptions raised by PySerials.
|
|
2
|
+
|
|
3
|
+
All exceptions inherit from :class:`PySerialsException`, which itself
|
|
4
|
+
extends ``exceptionman.ReporterException`` for rich error reporting.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pyserials.exception._base import PySerialsException
|
|
8
|
+
from pyserials.exception import read, update, validate
|
|
@@ -5,22 +5,32 @@ from __future__ import annotations
|
|
|
5
5
|
from typing import TYPE_CHECKING as _TYPE_CHECKING
|
|
6
6
|
from functools import partial as _partial
|
|
7
7
|
|
|
8
|
-
from exceptionman import ReporterException as _ReporterException
|
|
9
|
-
import mdit as _mdit
|
|
8
|
+
from exceptionman import ReporterException as _ReporterException # type: ignore[import-untyped]
|
|
9
|
+
import mdit as _mdit # type: ignore[import-untyped]
|
|
10
10
|
|
|
11
11
|
if _TYPE_CHECKING:
|
|
12
12
|
from mdit import Document
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
class PySerialsException(_ReporterException):
|
|
16
|
-
"""Base class for all exceptions raised by PySerials.
|
|
15
|
+
class PySerialsException(_ReporterException): # type: ignore[misc]
|
|
16
|
+
"""Base class for all exceptions raised by PySerials.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
Wraps an ``mdit.Document`` error report and configures Sphinx rendering.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
report : mdit.Document
|
|
23
|
+
The structured error report document.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
__slots__ = ()
|
|
27
|
+
|
|
28
|
+
def __init__(self, report: Document) -> None:
|
|
29
|
+
sphinx_config: dict[str, str] = {"html_title": "PySerials Error Report"}
|
|
20
30
|
sphinx_target_config = _mdit.target.sphinx(
|
|
21
31
|
renderer=_partial(
|
|
22
32
|
_mdit.render.sphinx,
|
|
23
|
-
config=_mdit.render.get_sphinx_config(sphinx_config)
|
|
33
|
+
config=_mdit.render.get_sphinx_config(sphinx_config),
|
|
24
34
|
)
|
|
25
35
|
)
|
|
26
36
|
report.target_configs["sphinx"] = sphinx_target_config
|