Skip to content

steveklabnik/json-merge_patch

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

JSON::MergePatch

Build Status Code Climate Coverage Status

This gem augments Ruby's built-in JSON library to support merging JSON blobs in accordance with the draft-snell-merge-patch draft.

As far as I know, it is a complete implementation of the draft. If you find something that's not compliant, please let me know.

Installation

Add this line to your application's Gemfile:

gem 'json-merge_patch'

And then execute:

$ bundle

Or install it yourself as:

$ gem install json-merge_patch

Usage

First, require the gem:

require 'json/merge_patch'

Then, use it:

# The example from http://tools.ietf.org/html/draft-snell-merge-patch-08#section-2

document = <<-JSON
{
  "title": "Goodbye!",
    "author" : {
      "givenName" : "John",
      "familyName" : "Doe"
    },
    "tags":["example","sample"],
    "content": "This will be unchanged"
}
JSON

merge_patch = <<-JSON
{
  "title": "Hello!",
    "phoneNumber": "+01-123-456-7890",
    "author": {
      "familyName": null
    },
    "tags": ["example"]
}
JSON

JSON.merge(document, merge_patch)
# => 
{
  "title": "Hello!",
  "phoneNumber": "+01-123-456-7890",
  "author" : {
    "givenName" : "John",
  },
  "tags":["example"],
  "content": "This will be unchanged"
}

If you'd prefer to operate on pure Ruby objects rather than JSON strings, you can construct a MergePatch object instead.

JSON::MergePatch.new({}, {"foo" => "bar"}).call
# => {"foo"=>"bar"}

Also check out http://json-merge-patch.herokuapp.com/, which is a Rails app that serves up json-merge-patch responses.

Use in Rails

JSON::MergePatch provides a Railtie that registers the proper MIME type with Rails. To use it, do something like this:

def update
  safe_params = params.require(:merge).permit(:original, :patch)

  @result = JSON::MergePatch.new(
    safe_params[:original],
    safe_params[:patch]
  ).call

  respond_to do |format|
    format.json_merge_patch do
      render :json => @result
    end
  end
end

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

About

An implementation of the snell-merge-patch draft for JSON.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages