mirror of
https://github.com/Start9Labs/patch-db.git
synced 2026-03-26 10:21:53 +00:00
audit fixes, repo restructure, and documentation
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>
This commit is contained in:
343
json-patch/specs/spec_tests.json
Normal file
343
json-patch/specs/spec_tests.json
Normal file
@@ -0,0 +1,343 @@
|
||||
[
|
||||
{
|
||||
"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"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user