mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	bump(github.com/evanphx/json-patch): 94e38aa1586e8a6c8a75770bddf5ff84c48a106b
This commit is contained in:
		
							
								
								
									
										2
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							@@ -1240,7 +1240,7 @@
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/evanphx/json-patch",
 | 
								"ImportPath": "github.com/evanphx/json-patch",
 | 
				
			||||||
			"Rev": "ed7cfbae1fffc071f71e068df27bf4f0521402d8"
 | 
								"Rev": "94e38aa1586e8a6c8a75770bddf5ff84c48a106b"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/exponent-io/jsonpath",
 | 
								"ImportPath": "github.com/exponent-io/jsonpath",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -372,7 +372,7 @@
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/evanphx/json-patch",
 | 
								"ImportPath": "github.com/evanphx/json-patch",
 | 
				
			||||||
			"Rev": "ed7cfbae1fffc071f71e068df27bf4f0521402d8"
 | 
								"Rev": "94e38aa1586e8a6c8a75770bddf5ff84c48a106b"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/ghodss/yaml",
 | 
								"ImportPath": "github.com/ghodss/yaml",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,7 +24,7 @@
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/evanphx/json-patch",
 | 
								"ImportPath": "github.com/evanphx/json-patch",
 | 
				
			||||||
			"Rev": "ed7cfbae1fffc071f71e068df27bf4f0521402d8"
 | 
								"Rev": "94e38aa1586e8a6c8a75770bddf5ff84c48a106b"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/ghodss/yaml",
 | 
								"ImportPath": "github.com/ghodss/yaml",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								staging/src/k8s.io/apiserver/Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								staging/src/k8s.io/apiserver/Godeps/Godeps.json
									
									
									
										generated
									
									
									
								
							@@ -372,7 +372,7 @@
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/evanphx/json-patch",
 | 
								"ImportPath": "github.com/evanphx/json-patch",
 | 
				
			||||||
			"Rev": "ed7cfbae1fffc071f71e068df27bf4f0521402d8"
 | 
								"Rev": "94e38aa1586e8a6c8a75770bddf5ff84c48a106b"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/ghodss/yaml",
 | 
								"ImportPath": "github.com/ghodss/yaml",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -112,7 +112,7 @@
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/evanphx/json-patch",
 | 
								"ImportPath": "github.com/evanphx/json-patch",
 | 
				
			||||||
			"Rev": "ed7cfbae1fffc071f71e068df27bf4f0521402d8"
 | 
								"Rev": "94e38aa1586e8a6c8a75770bddf5ff84c48a106b"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/ghodss/yaml",
 | 
								"ImportPath": "github.com/ghodss/yaml",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -104,7 +104,7 @@
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/evanphx/json-patch",
 | 
								"ImportPath": "github.com/evanphx/json-patch",
 | 
				
			||||||
			"Rev": "ed7cfbae1fffc071f71e068df27bf4f0521402d8"
 | 
								"Rev": "94e38aa1586e8a6c8a75770bddf5ff84c48a106b"
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"ImportPath": "github.com/ghodss/yaml",
 | 
								"ImportPath": "github.com/ghodss/yaml",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										289
									
								
								vendor/github.com/evanphx/json-patch/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										289
									
								
								vendor/github.com/evanphx/json-patch/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,29 +1,284 @@
 | 
				
			|||||||
## JSON-Patch
 | 
					# JSON-Patch
 | 
				
			||||||
 | 
					`jsonpatch` is a library which provides functionallity for both applying
 | 
				
			||||||
Provides the ability to modify and test a JSON according to a
 | 
					[RFC6902 JSON patches](http://tools.ietf.org/html/rfc6902) against documents, as
 | 
				
			||||||
[RFC6902 JSON patch](http://tools.ietf.org/html/rfc6902) and [RFC7396 JSON Merge Patch](https://tools.ietf.org/html/rfc7396).
 | 
					well as for calculating & applying [RFC7396 JSON merge patches](https://tools.ietf.org/html/rfc7396).
 | 
				
			||||||
 | 
					 | 
				
			||||||
*Version*: **1.0**
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](http://godoc.org/github.com/evanphx/json-patch)
 | 
					[](http://godoc.org/github.com/evanphx/json-patch)
 | 
				
			||||||
 | 
					 | 
				
			||||||
[](https://travis-ci.org/evanphx/json-patch)
 | 
					[](https://travis-ci.org/evanphx/json-patch)
 | 
				
			||||||
 | 
					[](https://goreportcard.com/report/github.com/evanphx/json-patch)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### API Usage
 | 
					# Get It!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Given a `[]byte`, obtain a Patch object
 | 
					**Latest and greatest**: 
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					go get -u github.com/evanphx/json-patch
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  `obj, err := jsonpatch.DecodePatch(patch)`
 | 
					**Stable Versions**:
 | 
				
			||||||
 | 
					* Version 3: `go get -u gopkg.in/evanphx/json-patch.v3`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Apply the patch and get a new document back
 | 
					(previous versions below `v3` are unavailable)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  `out, err := obj.Apply(doc)`
 | 
					# Use It!
 | 
				
			||||||
 | 
					* [Create and apply a merge patch](#create-and-apply-a-merge-patch)
 | 
				
			||||||
 | 
					* [Create and apply a JSON Patch](#create-and-apply-a-json-patch)
 | 
				
			||||||
 | 
					* [Comparing JSON documents](#comparing-json-documents)
 | 
				
			||||||
 | 
					* [Combine merge patches](#combine-merge-patches)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Create a JSON Merge Patch document based on two json documents (a to b):
 | 
					## Create and apply a merge patch
 | 
				
			||||||
 | 
					Given both an original JSON document and a modified JSON document, you can create
 | 
				
			||||||
 | 
					a [Merge Patch](https://tools.ietf.org/html/rfc7396) document. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  `mergeDoc, err := jsonpatch.CreateMergePatch(a, b)`
 | 
					It can describe the changes needed to convert from the original to the 
 | 
				
			||||||
 
 | 
					modified JSON document.
 | 
				
			||||||
* Bonus API: compare documents for structural equality
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  `jsonpatch.Equal(doca, docb)`
 | 
					Once you have a merge patch, you can apply it to other JSON documents using the
 | 
				
			||||||
 | 
					`jsonpatch.MergePatch(document, patch)` function.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						jsonpatch "github.com/evanphx/json-patch"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						// Let's create a merge patch from these two documents...
 | 
				
			||||||
 | 
						original := []byte(`{"name": "John", "age": 24, "height": 3.21}`)
 | 
				
			||||||
 | 
						target := []byte(`{"name": "Jane", "age": 24}`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						patch, err := jsonpatch.CreateMergePatch(original, target)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Now lets apply the patch against a different JSON document...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						alternative := []byte(`{"name": "Tina", "age": 28, "height": 3.75}`)
 | 
				
			||||||
 | 
						modifiedAlternative, err := jsonpatch.MergePatch(alternative, patch)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fmt.Printf("patch document:   %s\n", patch)
 | 
				
			||||||
 | 
						fmt.Printf("updated alternative doc: %s\n", modifiedAlternative)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When ran, you get the following output:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					$ go run main.go
 | 
				
			||||||
 | 
					patch document:   {"height":null,"name":"Jane"}
 | 
				
			||||||
 | 
					updated tina doc: {"age":28,"name":"Jane"}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Create and apply a JSON Patch
 | 
				
			||||||
 | 
					You can create patch objects using `DecodePatch([]byte)`, which can then 
 | 
				
			||||||
 | 
					be applied against JSON documents.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The following is an example of creating a patch from two operations, and
 | 
				
			||||||
 | 
					applying it against a JSON document.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						jsonpatch "github.com/evanphx/json-patch"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						original := []byte(`{"name": "John", "age": 24, "height": 3.21}`)
 | 
				
			||||||
 | 
						patchJSON := []byte(`[
 | 
				
			||||||
 | 
							{"op": "replace", "path": "/name", "value": "Jane"},
 | 
				
			||||||
 | 
							{"op": "remove", "path": "/height"}
 | 
				
			||||||
 | 
						]`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						patch, err := jsonpatch.DecodePatch(patchJSON)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						modified, err := patch.Apply(original)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fmt.Printf("Original document: %s\n", original)
 | 
				
			||||||
 | 
						fmt.Printf("Modified document: %s\n", modified)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When ran, you get the following output:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					$ go run main.go
 | 
				
			||||||
 | 
					Original document: {"name": "John", "age": 24, "height": 3.21}
 | 
				
			||||||
 | 
					Modified document: {"age":24,"name":"Jane"}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Comparing JSON documents
 | 
				
			||||||
 | 
					Due to potential whitespace and ordering differences, one cannot simply compare
 | 
				
			||||||
 | 
					JSON strings or byte-arrays directly. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As such, you can instead use `jsonpatch.Equal(document1, document2)` to 
 | 
				
			||||||
 | 
					determine if two JSON documents are _structurally_ equal. This ignores
 | 
				
			||||||
 | 
					whitespace differences, and key-value ordering.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						jsonpatch "github.com/evanphx/json-patch"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						original := []byte(`{"name": "John", "age": 24, "height": 3.21}`)
 | 
				
			||||||
 | 
						similar := []byte(`
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"age": 24,
 | 
				
			||||||
 | 
								"height": 3.21,
 | 
				
			||||||
 | 
								"name": "John"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						`)
 | 
				
			||||||
 | 
						different := []byte(`{"name": "Jane", "age": 20, "height": 3.37}`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if jsonpatch.Equal(original, similar) {
 | 
				
			||||||
 | 
							fmt.Println(`"original" is structurally equal to "similar"`)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !jsonpatch.Equal(original, different) {
 | 
				
			||||||
 | 
							fmt.Println(`"original" is _not_ structurally equal to "similar"`)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When ran, you get the following output:
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					$ go run main.go
 | 
				
			||||||
 | 
					"original" is structurally equal to "similar"
 | 
				
			||||||
 | 
					"original" is _not_ structurally equal to "similar"
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Combine merge patches
 | 
				
			||||||
 | 
					Given two JSON merge patch documents, it is possible to combine them into a 
 | 
				
			||||||
 | 
					single merge patch which can describe both set of changes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The resulting merge patch can be used such that applying it results in a
 | 
				
			||||||
 | 
					document structurally similar as merging each merge patch to the document
 | 
				
			||||||
 | 
					in succession. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						jsonpatch "github.com/evanphx/json-patch"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						original := []byte(`{"name": "John", "age": 24, "height": 3.21}`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nameAndHeight := []byte(`{"height":null,"name":"Jane"}`)
 | 
				
			||||||
 | 
						ageAndEyes := []byte(`{"age":4.23,"eyes":"blue"}`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Let's combine these merge patch documents...
 | 
				
			||||||
 | 
						combinedPatch, err := jsonpatch.MergeMergePatches(nameAndHeight, ageAndEyes)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Apply each patch individual against the original document
 | 
				
			||||||
 | 
						withoutCombinedPatch, err := jsonpatch.MergePatch(original, nameAndHeight)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						withoutCombinedPatch, err = jsonpatch.MergePatch(withoutCombinedPatch, ageAndEyes)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Apply the combined patch against the original document
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						withCombinedPatch, err := jsonpatch.MergePatch(original, combinedPatch)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Do both result in the same thing? They should!
 | 
				
			||||||
 | 
						if jsonpatch.Equal(withCombinedPatch, withoutCombinedPatch) {
 | 
				
			||||||
 | 
							fmt.Println("Both JSON documents are structurally the same!")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fmt.Printf("combined merge patch: %s", combinedPatch)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When ran, you get the following output:
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					$ go run main.go
 | 
				
			||||||
 | 
					Both JSON documents are structurally the same!
 | 
				
			||||||
 | 
					combined merge patch: {"age":4.23,"eyes":"blue","height":null,"name":"Jane"}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# CLI for comparing JSON documents
 | 
				
			||||||
 | 
					You can install the commandline program `json-patch`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This program can take multiple JSON patch documents as arguments, 
 | 
				
			||||||
 | 
					and fed a JSON document from `stdin`. It will apply the patch(es) against 
 | 
				
			||||||
 | 
					the document and output the modified doc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**patch.1.json**
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					    {"op": "replace", "path": "/name", "value": "Jane"},
 | 
				
			||||||
 | 
					    {"op": "remove", "path": "/height"}
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**patch.2.json**
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					    {"op": "add", "path": "/address", "value": "123 Main St"},
 | 
				
			||||||
 | 
					    {"op": "replace", "path": "/age", "value": "21"}
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**document.json**
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    "name": "John",
 | 
				
			||||||
 | 
					    "age": 24,
 | 
				
			||||||
 | 
					    "height": 3.21
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can then run:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					$ go install github.com/evanphx/json-patch/cmd/json-patch
 | 
				
			||||||
 | 
					$ cat document.json | json-patch -p patch.1.json -p patch.2.json
 | 
				
			||||||
 | 
					{"address":"123 Main St","age":"21","name":"Jane"}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Help It!
 | 
				
			||||||
 | 
					Contributions are welcomed! Leave [an issue](https://github.com/evanphx/json-patch/issues)
 | 
				
			||||||
 | 
					or [create a PR](https://github.com/evanphx/json-patch/compare).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Before creating a pull request, we'd ask that you make sure tests are passing
 | 
				
			||||||
 | 
					and that you have added new tests when applicable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Contributors can run tests using:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					go test -cover ./...
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Builds for pull requests are tested automatically 
 | 
				
			||||||
 | 
					using [TravisCI](https://travis-ci.org/evanphx/json-patch).
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										102
									
								
								vendor/github.com/evanphx/json-patch/merge.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										102
									
								
								vendor/github.com/evanphx/json-patch/merge.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,7 @@
 | 
				
			|||||||
package jsonpatch
 | 
					package jsonpatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
@@ -89,6 +90,7 @@ func pruneAryNulls(ary *partialArray) *partialArray {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var errBadJSONDoc = fmt.Errorf("Invalid JSON Document")
 | 
					var errBadJSONDoc = fmt.Errorf("Invalid JSON Document")
 | 
				
			||||||
var errBadJSONPatch = fmt.Errorf("Invalid JSON Patch")
 | 
					var errBadJSONPatch = fmt.Errorf("Invalid JSON Patch")
 | 
				
			||||||
 | 
					var errBadMergeTypes = fmt.Errorf("Mismatched JSON Documents")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MergeMergePatches merges two merge patches together, such that
 | 
					// MergeMergePatches merges two merge patches together, such that
 | 
				
			||||||
// applying this resulting merged merge patch to a document yields the same
 | 
					// applying this resulting merged merge patch to a document yields the same
 | 
				
			||||||
@@ -160,30 +162,106 @@ func doMergePatch(docData, patchData []byte, mergeMerge bool) ([]byte, error) {
 | 
				
			|||||||
	return json.Marshal(doc)
 | 
						return json.Marshal(doc)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CreateMergePatch creates a merge patch as specified in http://tools.ietf.org/html/draft-ietf-appsawg-json-merge-patch-07
 | 
					// resemblesJSONArray indicates whether the byte-slice "appears" to be
 | 
				
			||||||
//
 | 
					// a JSON array or not.
 | 
				
			||||||
// 'a' is original, 'b' is the modified document. Both are to be given as json encoded content.
 | 
					// False-positives are possible, as this function does not check the internal
 | 
				
			||||||
// The function will return a mergeable json document with differences from a to b.
 | 
					// structure of the array. It only checks that the outer syntax is present and
 | 
				
			||||||
//
 | 
					// correct.
 | 
				
			||||||
// An error will be returned if any of the two documents are invalid.
 | 
					func resemblesJSONArray(input []byte) bool {
 | 
				
			||||||
func CreateMergePatch(a, b []byte) ([]byte, error) {
 | 
						input = bytes.TrimSpace(input)
 | 
				
			||||||
	aI := map[string]interface{}{}
 | 
					
 | 
				
			||||||
	bI := map[string]interface{}{}
 | 
						hasPrefix := bytes.HasPrefix(input, []byte("["))
 | 
				
			||||||
	err := json.Unmarshal(a, &aI)
 | 
						hasSuffix := bytes.HasSuffix(input, []byte("]"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return hasPrefix && hasSuffix
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CreateMergePatch will return a merge patch document capable of converting
 | 
				
			||||||
 | 
					// the original document(s) to the modified document(s).
 | 
				
			||||||
 | 
					// The parameters can be bytes of either two JSON Documents, or two arrays of
 | 
				
			||||||
 | 
					// JSON documents.
 | 
				
			||||||
 | 
					// The merge patch returned follows the specification defined at http://tools.ietf.org/html/draft-ietf-appsawg-json-merge-patch-07
 | 
				
			||||||
 | 
					func CreateMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) {
 | 
				
			||||||
 | 
						originalResemblesArray := resemblesJSONArray(originalJSON)
 | 
				
			||||||
 | 
						modifiedResemblesArray := resemblesJSONArray(modifiedJSON)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Do both byte-slices seem like JSON arrays?
 | 
				
			||||||
 | 
						if originalResemblesArray && modifiedResemblesArray {
 | 
				
			||||||
 | 
							return createArrayMergePatch(originalJSON, modifiedJSON)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Are both byte-slices are not arrays? Then they are likely JSON objects...
 | 
				
			||||||
 | 
						if !originalResemblesArray && !modifiedResemblesArray {
 | 
				
			||||||
 | 
							return createObjectMergePatch(originalJSON, modifiedJSON)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// None of the above? Then return an error because of mismatched types.
 | 
				
			||||||
 | 
						return nil, errBadMergeTypes
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// createObjectMergePatch will return a merge-patch document capable of
 | 
				
			||||||
 | 
					// converting the original document to the modified document.
 | 
				
			||||||
 | 
					func createObjectMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) {
 | 
				
			||||||
 | 
						originalDoc := map[string]interface{}{}
 | 
				
			||||||
 | 
						modifiedDoc := map[string]interface{}{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := json.Unmarshal(originalJSON, &originalDoc)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errBadJSONDoc
 | 
							return nil, errBadJSONDoc
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	err = json.Unmarshal(b, &bI)
 | 
					
 | 
				
			||||||
 | 
						err = json.Unmarshal(modifiedJSON, &modifiedDoc)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, errBadJSONDoc
 | 
							return nil, errBadJSONDoc
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	dest, err := getDiff(aI, bI)
 | 
					
 | 
				
			||||||
 | 
						dest, err := getDiff(originalDoc, modifiedDoc)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return json.Marshal(dest)
 | 
						return json.Marshal(dest)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// createArrayMergePatch will return an array of merge-patch documents capable
 | 
				
			||||||
 | 
					// of converting the original document to the modified document for each
 | 
				
			||||||
 | 
					// pair of JSON documents provided in the arrays.
 | 
				
			||||||
 | 
					// Arrays of mismatched sizes will result in an error.
 | 
				
			||||||
 | 
					func createArrayMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) {
 | 
				
			||||||
 | 
						originalDocs := []json.RawMessage{}
 | 
				
			||||||
 | 
						modifiedDocs := []json.RawMessage{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := json.Unmarshal(originalJSON, &originalDocs)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, errBadJSONDoc
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = json.Unmarshal(modifiedJSON, &modifiedDocs)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, errBadJSONDoc
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						total := len(originalDocs)
 | 
				
			||||||
 | 
						if len(modifiedDocs) != total {
 | 
				
			||||||
 | 
							return nil, errBadJSONDoc
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						result := []json.RawMessage{}
 | 
				
			||||||
 | 
						for i := 0; i < len(originalDocs); i++ {
 | 
				
			||||||
 | 
							original := originalDocs[i]
 | 
				
			||||||
 | 
							modified := modifiedDocs[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							patch, err := createObjectMergePatch(original, modified)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							result = append(result, json.RawMessage(patch))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return json.Marshal(result)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Returns true if the array matches (must be json types).
 | 
					// Returns true if the array matches (must be json types).
 | 
				
			||||||
// As is idiomatic for go, an empty array is not the same as a nil array.
 | 
					// As is idiomatic for go, an empty array is not the same as a nil array.
 | 
				
			||||||
func matchesArray(a, b []interface{}) bool {
 | 
					func matchesArray(a, b []interface{}) bool {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/evanphx/json-patch/patch.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/evanphx/json-patch/patch.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -397,7 +397,9 @@ func (d *partialArray) add(key string, val *lazyNode) error {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		idx = len(ary) - idx
 | 
							idx = len(ary) - idx
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if idx < 0 || idx >= len(ary) || idx > len(cur) {
 | 
				
			||||||
 | 
							return fmt.Errorf("Unable to access invalid index: %d", idx)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	copy(ary[0:idx], cur[0:idx])
 | 
						copy(ary[0:idx], cur[0:idx])
 | 
				
			||||||
	ary[idx] = val
 | 
						ary[idx] = val
 | 
				
			||||||
	copy(ary[idx+1:], cur[idx:])
 | 
						copy(ary[idx+1:], cur[idx:])
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user