mirror of
https://github.com/Start9Labs/patch-db.git
synced 2026-03-26 02:11:54 +00:00
Soundness and performance audit (17 fixes): - See AUDIT.md for full details and @claude comments in code Repo restructure: - Inline json-ptr and json-patch submodules as regular directories - Remove cbor submodule, replace serde_cbor with ciborium - Rename patch-db/ -> core/, patch-db-macro/ -> macro/, patch-db-macro-internals/ -> macro-internals/, patch-db-util/ -> util/ - Purge upstream CI/CD, bench, and release cruft from json-patch - Remove .gitmodules Test fixes: - Fix proptest doesnt_crash (unique file paths, proper close/cleanup) - Add PatchDb::close() for clean teardown Documentation: - Add README.md, ARCHITECTURE.md, CONTRIBUTING.md, CLAUDE.md, AUDIT.md - Add TSDocs to TypeScript client exports Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
344 lines
5.2 KiB
JSON
344 lines
5.2 KiB
JSON
[
|
|
{
|
|
"comment": "4.1. add with missing object",
|
|
"doc": {
|
|
"q": {
|
|
"bar": 2
|
|
}
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "add",
|
|
"path": "/a/b",
|
|
"value": 1
|
|
}
|
|
],
|
|
"error": "path /a does not exist -- missing objects are not created recursively"
|
|
},
|
|
{
|
|
"comment": "A.1. Adding an Object Member",
|
|
"doc": {
|
|
"foo": "bar"
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "add",
|
|
"path": "/baz",
|
|
"value": "qux"
|
|
}
|
|
],
|
|
"expected": {
|
|
"baz": "qux",
|
|
"foo": "bar"
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.2. Adding an Array Element",
|
|
"doc": {
|
|
"foo": [
|
|
"bar",
|
|
"baz"
|
|
]
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "add",
|
|
"path": "/foo/1",
|
|
"value": "qux"
|
|
}
|
|
],
|
|
"expected": {
|
|
"foo": [
|
|
"bar",
|
|
"qux",
|
|
"baz"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.3. Removing an Object Member",
|
|
"doc": {
|
|
"baz": "qux",
|
|
"foo": "bar"
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "remove",
|
|
"path": "/baz"
|
|
}
|
|
],
|
|
"expected": {
|
|
"foo": "bar"
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.4. Removing an Array Element",
|
|
"doc": {
|
|
"foo": [
|
|
"bar",
|
|
"qux",
|
|
"baz"
|
|
]
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "remove",
|
|
"path": "/foo/1"
|
|
}
|
|
],
|
|
"expected": {
|
|
"foo": [
|
|
"bar",
|
|
"baz"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.5. Replacing a Value",
|
|
"doc": {
|
|
"baz": "qux",
|
|
"foo": "bar"
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "replace",
|
|
"path": "/baz",
|
|
"value": "boo"
|
|
}
|
|
],
|
|
"expected": {
|
|
"baz": "boo",
|
|
"foo": "bar"
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.6. Moving a Value",
|
|
"doc": {
|
|
"foo": {
|
|
"bar": "baz",
|
|
"waldo": "fred"
|
|
},
|
|
"qux": {
|
|
"corge": "grault"
|
|
}
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "move",
|
|
"from": "/foo/waldo",
|
|
"path": "/qux/thud"
|
|
}
|
|
],
|
|
"expected": {
|
|
"foo": {
|
|
"bar": "baz"
|
|
},
|
|
"qux": {
|
|
"corge": "grault",
|
|
"thud": "fred"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.7. Moving an Array Element",
|
|
"doc": {
|
|
"foo": [
|
|
"all",
|
|
"grass",
|
|
"cows",
|
|
"eat"
|
|
]
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "move",
|
|
"from": "/foo/1",
|
|
"path": "/foo/3"
|
|
}
|
|
],
|
|
"expected": {
|
|
"foo": [
|
|
"all",
|
|
"cows",
|
|
"eat",
|
|
"grass"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.8. Testing a Value: Success",
|
|
"doc": {
|
|
"baz": "qux",
|
|
"foo": [
|
|
"a",
|
|
2,
|
|
"c"
|
|
]
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "test",
|
|
"path": "/baz",
|
|
"value": "qux"
|
|
},
|
|
{
|
|
"op": "test",
|
|
"path": "/foo/1",
|
|
"value": 2
|
|
}
|
|
],
|
|
"expected": {
|
|
"baz": "qux",
|
|
"foo": [
|
|
"a",
|
|
2,
|
|
"c"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.9. Testing a Value: Error",
|
|
"doc": {
|
|
"baz": "qux"
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "test",
|
|
"path": "/baz",
|
|
"value": "bar"
|
|
}
|
|
],
|
|
"error": "string not equivalent"
|
|
},
|
|
{
|
|
"comment": "A.10. Adding a nested Member Object",
|
|
"doc": {
|
|
"foo": "bar"
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "add",
|
|
"path": "/child",
|
|
"value": {
|
|
"grandchild": {}
|
|
}
|
|
}
|
|
],
|
|
"expected": {
|
|
"foo": "bar",
|
|
"child": {
|
|
"grandchild": {
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.11. Ignoring Unrecognized Elements",
|
|
"doc": {
|
|
"foo": "bar"
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "add",
|
|
"path": "/baz",
|
|
"value": "qux",
|
|
"xyz": 123
|
|
}
|
|
],
|
|
"expected": {
|
|
"foo": "bar",
|
|
"baz": "qux"
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.12. Adding to a Non-existent Target",
|
|
"doc": {
|
|
"foo": "bar"
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "add",
|
|
"path": "/baz/bat",
|
|
"value": "qux"
|
|
}
|
|
],
|
|
"error": "add to a non-existent target"
|
|
},
|
|
{
|
|
"comment": "A.13 Invalid JSON Patch Document",
|
|
"doc": {
|
|
"foo": "bar"
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "add",
|
|
"path": "/baz",
|
|
"value": "qux",
|
|
"op": "remove"
|
|
}
|
|
],
|
|
"error": "operation has two 'op' members",
|
|
"disabled": true
|
|
},
|
|
{
|
|
"comment": "A.14. ~ Escape Ordering",
|
|
"doc": {
|
|
"/": 9,
|
|
"~1": 10
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "test",
|
|
"path": "/~01",
|
|
"value": 10
|
|
}
|
|
],
|
|
"expected": {
|
|
"/": 9,
|
|
"~1": 10
|
|
}
|
|
},
|
|
{
|
|
"comment": "A.15. Comparing Strings and Numbers",
|
|
"doc": {
|
|
"/": 9,
|
|
"~1": 10
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "test",
|
|
"path": "/~01",
|
|
"value": "10"
|
|
}
|
|
],
|
|
"error": "number is not equal to string"
|
|
},
|
|
{
|
|
"comment": "A.16. Adding an Array Value",
|
|
"doc": {
|
|
"foo": [
|
|
"bar"
|
|
]
|
|
},
|
|
"patch": [
|
|
{
|
|
"op": "add",
|
|
"path": "/foo/-",
|
|
"value": [
|
|
"abc",
|
|
"def"
|
|
]
|
|
}
|
|
],
|
|
"expected": {
|
|
"foo": [
|
|
"bar",
|
|
[
|
|
"abc",
|
|
"def"
|
|
]
|
|
]
|
|
}
|
|
}
|
|
]
|