fastjsonpatch 0.1.0__tar.gz → 0.1.2__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.
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/CHANGELOG.md +6 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/Cargo.lock +1 -1
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/Cargo.toml +1 -1
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/PKG-INFO +38 -32
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/README.md +37 -31
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/pyproject.toml +1 -1
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/.github/workflows/CI.yml +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/.gitignore +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/LICENSE +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/MAINTAINING.md +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/THIRD_PARTY_LICENSES.md +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/bench/compare.py +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/python/fastjsonpatch/__init__.py +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/scripts/test_linux_matrix.sh +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/scripts/third_party_licenses.py +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/src/lib.rs +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/tests/rfc6902/LICENSE-APACHE-2.0 +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/tests/rfc6902/README.md +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/tests/rfc6902/spec_tests.json +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/tests/rfc6902/test_rfc6902.py +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/tests/rfc6902/tests.json +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/tests/test_parity.py +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/tests/upstream/test_upstream.py +0 -0
- {fastjsonpatch-0.1.0 → fastjsonpatch-0.1.2}/tests/upstream/tests.js +0 -0
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.2 (2026-10-11)
|
|
4
|
+
|
|
5
|
+
Documentation only: the README now states only measured facts (including exactly
|
|
6
|
+
which platforms CI tests), and its link to MAINTAINING.md works on PyPI. No code
|
|
7
|
+
changes. (0.1.1 was tagged but not published.)
|
|
8
|
+
|
|
3
9
|
## 0.1.0 (2026-10-11)
|
|
4
10
|
|
|
5
11
|
First release. Behaves like jsonpatch 1.34 with `make_patch`, `apply`/`apply_patch`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fastjsonpatch
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: Operating System :: OS Independent
|
|
@@ -29,9 +29,9 @@ Project-URL: Repository, https://github.com/amzntiger/fastjsonpatch
|
|
|
29
29
|
|
|
30
30
|
A drop-in, faster [jsonpatch](https://github.com/stefankoegl/python-json-patch)
|
|
31
31
|
([RFC 6902](https://www.rfc-editor.org/rfc/rfc6902) JSON Patch) for Python.
|
|
32
|
-
`make_patch` and `apply` run in Rust and return the **same patches
|
|
33
|
-
and the same
|
|
34
|
-
|
|
32
|
+
`make_patch` and `apply` run in Rust and return the **same patches and the same
|
|
33
|
+
documents, and raise exceptions with the same types and messages,** as jsonpatch 1.34.
|
|
34
|
+
In the benchmarks below, making a patch is 9-57x faster and applying one 6-27x faster.
|
|
35
35
|
|
|
36
36
|
```sh
|
|
37
37
|
pip install fastjsonpatch
|
|
@@ -60,19 +60,18 @@ every Python from 3.12 on. The only dependency is `jsonpointer`.
|
|
|
60
60
|
## Why
|
|
61
61
|
|
|
62
62
|
JSON Patch describes a change to a JSON document as a list of operations (`add`,
|
|
63
|
-
`remove`, `replace`, `move`, `copy`, `test`). It is
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
`remove`, `replace`, `move`, `copy`, `test`). It is a media type for HTTP `PATCH`
|
|
64
|
+
requests (`application/json-patch+json`), Kubernetes accepts it
|
|
65
|
+
(`kubectl patch --type=json`), and it can store or send the difference between two
|
|
66
|
+
versions of a document.
|
|
66
67
|
|
|
67
|
-
jsonpatch is
|
|
68
|
-
That is fine for small documents, but the cost grows quickly:
|
|
68
|
+
jsonpatch is written in pure Python. In the measurements below:
|
|
69
69
|
|
|
70
|
-
- `make_patch` on a 10,000-record document takes
|
|
71
|
-
|
|
72
|
-
- `apply` deep-copies the whole document first, so
|
|
73
|
-
|
|
74
|
-
-
|
|
75
|
-
each call, even for small resources.
|
|
70
|
+
- `make_patch` on a 10,000-record document takes 290 ms, and diffing two Kubernetes
|
|
71
|
+
OpenAPI specs (3.7 MB and 3.8 MB) takes 136 ms.
|
|
72
|
+
- `apply` deep-copies the whole document first, so a 3-operation patch on the
|
|
73
|
+
3.8 MB Kubernetes spec takes 71 ms, against 21 µs when applied in place.
|
|
74
|
+
- Applying or computing a patch on a small REST resource takes 47-74 µs per call.
|
|
76
75
|
|
|
77
76
|
fastjsonpatch keeps jsonpatch's behaviour exactly and moves these hot paths to Rust,
|
|
78
77
|
so existing code gets faster without changes.
|
|
@@ -85,10 +84,10 @@ Real-world data:
|
|
|
85
84
|
|
|
86
85
|
| scenario | size | jsonpatch | fastjsonpatch | speedup |
|
|
87
86
|
|---|---|---|---|---|
|
|
88
|
-
| Kubernetes OpenAPI v1.33 → v1.34: make_patch |
|
|
87
|
+
| Kubernetes OpenAPI v1.33 (3.7 MB) → v1.34 (3.8 MB): make_patch | 283 ops | 136.4 ms | 9.6 ms | **14x** |
|
|
89
88
|
| Kubernetes OpenAPI v1.33 → v1.34: apply | 283 ops | 78.0 ms | 11.4 ms | **7x** |
|
|
90
|
-
| 3-op patch on the 3.8 MB
|
|
91
|
-
| 3-op patch on the
|
|
89
|
+
| 3-op patch on the v1.34 spec | 3.8 MB | 71.1 ms | 10.1 ms | **7x** |
|
|
90
|
+
| 3-op patch on the v1.34 spec, `in_place=True` | 3.8 MB | 21.2 µs | 4.7 µs | **4x** |
|
|
92
91
|
| PyPI metadata snapshots (8k records): make_patch | 2,487 ops | 255.2 ms | 12.1 ms | **21x** |
|
|
93
92
|
| PyPI metadata snapshots: apply | 2,487 ops | 91.7 ms | 14.0 ms | **7x** |
|
|
94
93
|
| REST resource, apply_patch per request | ×1000 | 47.4 ms | 7.5 ms | **6x** |
|
|
@@ -105,19 +104,20 @@ Synthetic records shaped like `{"id", "name", "score", "tags": [..], "meta": {..
|
|
|
105
104
|
| 2k ints, insert 1 at front | 1 | 17.04 ms | 1.91 ms | **9x** | 581 µs | 21 µs | **27x** |
|
|
106
105
|
| small config (200 keys), 1 edit | 1 | 1.98 ms | 35 µs | **57x** | 464 µs | 32 µs | **15x** |
|
|
107
106
|
|
|
108
|
-
Python 3.14 made `copy.deepcopy` about 1.
|
|
109
|
-
a large document is faster too
|
|
110
|
-
|
|
107
|
+
Python 3.14 made `copy.deepcopy` about 1.5x faster, so on 3.14 jsonpatch's `apply` on
|
|
108
|
+
a large document is faster too; on the "10k records, 100 field edits" workload the
|
|
109
|
+
`apply` speedup drops from about 11x to about 6x. The `make_patch` speedup stays about
|
|
110
|
+
the same. Run `python bench/compare.py` (from the source distribution) to measure on
|
|
111
111
|
your own machine.
|
|
112
112
|
|
|
113
113
|
## Why it is faster
|
|
114
114
|
|
|
115
115
|
**make_patch.** jsonpatch walks both documents in Python and compares every scalar
|
|
116
|
-
with `json.dumps(a) == json.dumps(b)`.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
natively with the same rules as the `json.dumps` comparison (`1`, `1.0` and `True`
|
|
116
|
+
with `json.dumps(a) == json.dumps(b)`. Profiling the "10k records" workload with
|
|
117
|
+
cProfile puts about 40% of the time in `json.dumps` and about a third in `isinstance`
|
|
118
|
+
checks against abstract base classes (`MutableMapping`, `MutableSequence`).
|
|
119
|
+
fastjsonpatch walks the documents in Rust over the CPython objects directly (no
|
|
120
|
+
conversion to a Rust data structure), compares values natively with the same rules as the `json.dumps` comparison (`1`, `1.0` and `True`
|
|
121
121
|
are all different, `-0.0 != 0.0`, NaN equals NaN), keeps the current path on a stack,
|
|
122
122
|
and takes a single lockstep pass when two dicts have the same keys in the same order.
|
|
123
123
|
It is a port of jsonpatch's `DiffBuilder`, so it produces the same operations in the
|
|
@@ -130,14 +130,14 @@ fastjsonpatch copies each dict and list with one C call and only recurses into v
|
|
|
130
130
|
that are themselves containers; it keeps `deepcopy`'s semantics (shared and cyclic
|
|
131
131
|
references are copied once) but skips the bookkeeping for containers referenced only
|
|
132
132
|
once. It then resolves the paths and runs the operations without creating
|
|
133
|
-
|
|
133
|
+
`JsonPointer` or operation objects.
|
|
134
134
|
|
|
135
135
|
## Compatibility
|
|
136
136
|
|
|
137
137
|
fastjsonpatch is jsonpatch's own module (BSD licensed) with three methods routed to
|
|
138
138
|
Rust: `JsonPatch.__init__` (validation), `JsonPatch.from_diff` (`make_patch`) and
|
|
139
139
|
`JsonPatch.apply` (`apply_patch`). Everything else is jsonpatch's code, so the public
|
|
140
|
-
|
|
140
|
+
names are the same: `JsonPatch`, `make_patch`, `apply_patch`, `JsonPatch.from_string`,
|
|
141
141
|
the operation classes, `DiffBuilder`, `multidict`, and the exceptions
|
|
142
142
|
`JsonPatchException`, `InvalidJsonPatch`, `JsonPatchConflict`, `JsonPatchTestFailed`
|
|
143
143
|
(with the same hierarchy, and `JsonPointerException` from jsonpointer).
|
|
@@ -151,8 +151,10 @@ Python code, so results never differ:
|
|
|
151
151
|
- **apply**: works on plain dicts and lists. An operation that would fail, or that
|
|
152
152
|
touches anything else, is run by the original operation classes before anything is
|
|
153
153
|
mutated, so errors have the same type and message.
|
|
154
|
-
-
|
|
155
|
-
|
|
154
|
+
- `apply` and validation use the original code for a custom `pointer_cls`, a
|
|
155
|
+
subclass with custom `operations` or an overridden `_get_operation`, and patches
|
|
156
|
+
that are not lists or tuples. `make_patch` uses it for a custom `dumps=` or
|
|
157
|
+
`json_dumper`.
|
|
156
158
|
|
|
157
159
|
Known differences:
|
|
158
160
|
|
|
@@ -162,13 +164,17 @@ Known differences:
|
|
|
162
164
|
- A value that is not a dict, list or JSON scalar inside a document being applied to
|
|
163
165
|
is copied with `copy.deepcopy` on its own, so aliasing between such values is not
|
|
164
166
|
preserved.
|
|
167
|
+
- `__version__` is fastjsonpatch's version, and jsonpatch's `__author__` and
|
|
168
|
+
`__website__` are not defined.
|
|
165
169
|
|
|
166
170
|
`fastjsonpatch.__jsonpatch_version__` says which jsonpatch release the behaviour
|
|
167
171
|
matches (currently `1.34`).
|
|
168
172
|
|
|
169
173
|
## How it is tested
|
|
170
174
|
|
|
171
|
-
About 1,570 tests
|
|
175
|
+
About 1,570 tests. CI runs them with Python 3.12, 3.13 and 3.14 on Linux (x86_64 and
|
|
176
|
+
aarch64, glibc), macOS (arm64 and x86_64) and Windows (x64); the musl wheels are built
|
|
177
|
+
but not tested in CI:
|
|
172
178
|
|
|
173
179
|
- **Parity:** random documents, mutations and patches (valid and invalid) run through
|
|
174
180
|
both fastjsonpatch and jsonpatch 1.34, comparing the resulting patches and documents
|
|
@@ -190,7 +196,7 @@ pytest tests
|
|
|
190
196
|
python bench/compare.py # speed vs jsonpatch on this machine
|
|
191
197
|
```
|
|
192
198
|
|
|
193
|
-
See [MAINTAINING.md](MAINTAINING.md) for releases and upkeep.
|
|
199
|
+
See [MAINTAINING.md](https://github.com/amzntiger/fastjsonpatch/blob/main/MAINTAINING.md) for releases and upkeep.
|
|
194
200
|
|
|
195
201
|
## License
|
|
196
202
|
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
A drop-in, faster [jsonpatch](https://github.com/stefankoegl/python-json-patch)
|
|
4
4
|
([RFC 6902](https://www.rfc-editor.org/rfc/rfc6902) JSON Patch) for Python.
|
|
5
|
-
`make_patch` and `apply` run in Rust and return the **same patches
|
|
6
|
-
and the same
|
|
7
|
-
|
|
5
|
+
`make_patch` and `apply` run in Rust and return the **same patches and the same
|
|
6
|
+
documents, and raise exceptions with the same types and messages,** as jsonpatch 1.34.
|
|
7
|
+
In the benchmarks below, making a patch is 9-57x faster and applying one 6-27x faster.
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
10
|
pip install fastjsonpatch
|
|
@@ -33,19 +33,18 @@ every Python from 3.12 on. The only dependency is `jsonpointer`.
|
|
|
33
33
|
## Why
|
|
34
34
|
|
|
35
35
|
JSON Patch describes a change to a JSON document as a list of operations (`add`,
|
|
36
|
-
`remove`, `replace`, `move`, `copy`, `test`). It is
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
`remove`, `replace`, `move`, `copy`, `test`). It is a media type for HTTP `PATCH`
|
|
37
|
+
requests (`application/json-patch+json`), Kubernetes accepts it
|
|
38
|
+
(`kubectl patch --type=json`), and it can store or send the difference between two
|
|
39
|
+
versions of a document.
|
|
39
40
|
|
|
40
|
-
jsonpatch is
|
|
41
|
-
That is fine for small documents, but the cost grows quickly:
|
|
41
|
+
jsonpatch is written in pure Python. In the measurements below:
|
|
42
42
|
|
|
43
|
-
- `make_patch` on a 10,000-record document takes
|
|
44
|
-
|
|
45
|
-
- `apply` deep-copies the whole document first, so
|
|
46
|
-
|
|
47
|
-
-
|
|
48
|
-
each call, even for small resources.
|
|
43
|
+
- `make_patch` on a 10,000-record document takes 290 ms, and diffing two Kubernetes
|
|
44
|
+
OpenAPI specs (3.7 MB and 3.8 MB) takes 136 ms.
|
|
45
|
+
- `apply` deep-copies the whole document first, so a 3-operation patch on the
|
|
46
|
+
3.8 MB Kubernetes spec takes 71 ms, against 21 µs when applied in place.
|
|
47
|
+
- Applying or computing a patch on a small REST resource takes 47-74 µs per call.
|
|
49
48
|
|
|
50
49
|
fastjsonpatch keeps jsonpatch's behaviour exactly and moves these hot paths to Rust,
|
|
51
50
|
so existing code gets faster without changes.
|
|
@@ -58,10 +57,10 @@ Real-world data:
|
|
|
58
57
|
|
|
59
58
|
| scenario | size | jsonpatch | fastjsonpatch | speedup |
|
|
60
59
|
|---|---|---|---|---|
|
|
61
|
-
| Kubernetes OpenAPI v1.33 → v1.34: make_patch |
|
|
60
|
+
| Kubernetes OpenAPI v1.33 (3.7 MB) → v1.34 (3.8 MB): make_patch | 283 ops | 136.4 ms | 9.6 ms | **14x** |
|
|
62
61
|
| Kubernetes OpenAPI v1.33 → v1.34: apply | 283 ops | 78.0 ms | 11.4 ms | **7x** |
|
|
63
|
-
| 3-op patch on the 3.8 MB
|
|
64
|
-
| 3-op patch on the
|
|
62
|
+
| 3-op patch on the v1.34 spec | 3.8 MB | 71.1 ms | 10.1 ms | **7x** |
|
|
63
|
+
| 3-op patch on the v1.34 spec, `in_place=True` | 3.8 MB | 21.2 µs | 4.7 µs | **4x** |
|
|
65
64
|
| PyPI metadata snapshots (8k records): make_patch | 2,487 ops | 255.2 ms | 12.1 ms | **21x** |
|
|
66
65
|
| PyPI metadata snapshots: apply | 2,487 ops | 91.7 ms | 14.0 ms | **7x** |
|
|
67
66
|
| REST resource, apply_patch per request | ×1000 | 47.4 ms | 7.5 ms | **6x** |
|
|
@@ -78,19 +77,20 @@ Synthetic records shaped like `{"id", "name", "score", "tags": [..], "meta": {..
|
|
|
78
77
|
| 2k ints, insert 1 at front | 1 | 17.04 ms | 1.91 ms | **9x** | 581 µs | 21 µs | **27x** |
|
|
79
78
|
| small config (200 keys), 1 edit | 1 | 1.98 ms | 35 µs | **57x** | 464 µs | 32 µs | **15x** |
|
|
80
79
|
|
|
81
|
-
Python 3.14 made `copy.deepcopy` about 1.
|
|
82
|
-
a large document is faster too
|
|
83
|
-
|
|
80
|
+
Python 3.14 made `copy.deepcopy` about 1.5x faster, so on 3.14 jsonpatch's `apply` on
|
|
81
|
+
a large document is faster too; on the "10k records, 100 field edits" workload the
|
|
82
|
+
`apply` speedup drops from about 11x to about 6x. The `make_patch` speedup stays about
|
|
83
|
+
the same. Run `python bench/compare.py` (from the source distribution) to measure on
|
|
84
84
|
your own machine.
|
|
85
85
|
|
|
86
86
|
## Why it is faster
|
|
87
87
|
|
|
88
88
|
**make_patch.** jsonpatch walks both documents in Python and compares every scalar
|
|
89
|
-
with `json.dumps(a) == json.dumps(b)`.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
natively with the same rules as the `json.dumps` comparison (`1`, `1.0` and `True`
|
|
89
|
+
with `json.dumps(a) == json.dumps(b)`. Profiling the "10k records" workload with
|
|
90
|
+
cProfile puts about 40% of the time in `json.dumps` and about a third in `isinstance`
|
|
91
|
+
checks against abstract base classes (`MutableMapping`, `MutableSequence`).
|
|
92
|
+
fastjsonpatch walks the documents in Rust over the CPython objects directly (no
|
|
93
|
+
conversion to a Rust data structure), compares values natively with the same rules as the `json.dumps` comparison (`1`, `1.0` and `True`
|
|
94
94
|
are all different, `-0.0 != 0.0`, NaN equals NaN), keeps the current path on a stack,
|
|
95
95
|
and takes a single lockstep pass when two dicts have the same keys in the same order.
|
|
96
96
|
It is a port of jsonpatch's `DiffBuilder`, so it produces the same operations in the
|
|
@@ -103,14 +103,14 @@ fastjsonpatch copies each dict and list with one C call and only recurses into v
|
|
|
103
103
|
that are themselves containers; it keeps `deepcopy`'s semantics (shared and cyclic
|
|
104
104
|
references are copied once) but skips the bookkeeping for containers referenced only
|
|
105
105
|
once. It then resolves the paths and runs the operations without creating
|
|
106
|
-
|
|
106
|
+
`JsonPointer` or operation objects.
|
|
107
107
|
|
|
108
108
|
## Compatibility
|
|
109
109
|
|
|
110
110
|
fastjsonpatch is jsonpatch's own module (BSD licensed) with three methods routed to
|
|
111
111
|
Rust: `JsonPatch.__init__` (validation), `JsonPatch.from_diff` (`make_patch`) and
|
|
112
112
|
`JsonPatch.apply` (`apply_patch`). Everything else is jsonpatch's code, so the public
|
|
113
|
-
|
|
113
|
+
names are the same: `JsonPatch`, `make_patch`, `apply_patch`, `JsonPatch.from_string`,
|
|
114
114
|
the operation classes, `DiffBuilder`, `multidict`, and the exceptions
|
|
115
115
|
`JsonPatchException`, `InvalidJsonPatch`, `JsonPatchConflict`, `JsonPatchTestFailed`
|
|
116
116
|
(with the same hierarchy, and `JsonPointerException` from jsonpointer).
|
|
@@ -124,8 +124,10 @@ Python code, so results never differ:
|
|
|
124
124
|
- **apply**: works on plain dicts and lists. An operation that would fail, or that
|
|
125
125
|
touches anything else, is run by the original operation classes before anything is
|
|
126
126
|
mutated, so errors have the same type and message.
|
|
127
|
-
-
|
|
128
|
-
|
|
127
|
+
- `apply` and validation use the original code for a custom `pointer_cls`, a
|
|
128
|
+
subclass with custom `operations` or an overridden `_get_operation`, and patches
|
|
129
|
+
that are not lists or tuples. `make_patch` uses it for a custom `dumps=` or
|
|
130
|
+
`json_dumper`.
|
|
129
131
|
|
|
130
132
|
Known differences:
|
|
131
133
|
|
|
@@ -135,13 +137,17 @@ Known differences:
|
|
|
135
137
|
- A value that is not a dict, list or JSON scalar inside a document being applied to
|
|
136
138
|
is copied with `copy.deepcopy` on its own, so aliasing between such values is not
|
|
137
139
|
preserved.
|
|
140
|
+
- `__version__` is fastjsonpatch's version, and jsonpatch's `__author__` and
|
|
141
|
+
`__website__` are not defined.
|
|
138
142
|
|
|
139
143
|
`fastjsonpatch.__jsonpatch_version__` says which jsonpatch release the behaviour
|
|
140
144
|
matches (currently `1.34`).
|
|
141
145
|
|
|
142
146
|
## How it is tested
|
|
143
147
|
|
|
144
|
-
About 1,570 tests
|
|
148
|
+
About 1,570 tests. CI runs them with Python 3.12, 3.13 and 3.14 on Linux (x86_64 and
|
|
149
|
+
aarch64, glibc), macOS (arm64 and x86_64) and Windows (x64); the musl wheels are built
|
|
150
|
+
but not tested in CI:
|
|
145
151
|
|
|
146
152
|
- **Parity:** random documents, mutations and patches (valid and invalid) run through
|
|
147
153
|
both fastjsonpatch and jsonpatch 1.34, comparing the resulting patches and documents
|
|
@@ -163,7 +169,7 @@ pytest tests
|
|
|
163
169
|
python bench/compare.py # speed vs jsonpatch on this machine
|
|
164
170
|
```
|
|
165
171
|
|
|
166
|
-
See [MAINTAINING.md](MAINTAINING.md) for releases and upkeep.
|
|
172
|
+
See [MAINTAINING.md](https://github.com/amzntiger/fastjsonpatch/blob/main/MAINTAINING.md) for releases and upkeep.
|
|
167
173
|
|
|
168
174
|
## License
|
|
169
175
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|