Jsonpatch - Pure Elixir implementation of RFC 6902

A JSON patch is a way to define a sequence of manipulating operations on a JavaScript object. The IETF published the RFC 6902 - found here https://tools.ietf.org/html/rfc6902. The Kubernetes API is an user of those JSON patches. In my opinion this is the easiest way to change a Kubernetes resource. Unfortunantely no library was available until yet or I did not fount it. This was my motivation to create the JSON patch library.

In this sense - keep calm and code Elixir
Your Corka/Sebastian

15 Likes

There was:

But it doesn’t seem to have been updated in a while according to hex. Also when I used that library at my last company I noticed it wasn’t that fast. So there is defiantly room for improvement.

I’m not sure it’s good to rely on a json encoder/decoder.

Also be careful about lists they are not that clear in json patch standard and can cause of lot of problems.

1 Like

Thanks for your feedback

Well, my search skills fail. I will have a look at that lib for comparison. But I already saw that it offers a better error feedback. This is currently not the best for Jsonpatch. Anyhow I also have to take a deeper look at performance.

I’m not sure it’s good to rely on a json encoder/decoder.

This was historically grown. I just wanted to offer the option for mapping but I build first the encoder/decoder. I will leave it to the consumer of the lib what encoder/coder they want to use. I removed the dependency.

v0.9.0

The new release added helpful feedback on errors while patching.

In this example the test operation failed.

iex> patch = [
...> %Jsonpatch.Operation.Add{path: "/age", value: 33},
...> %Jsonpatch.Operation.Test{path: "/name", value: "Alice"}
...> ]
iex> target = %{"name" => "Bob", "married" => false, "hobbies" => ["Sport", "Elixir", "Football"], "home" => "Berlin"}
iex> Jsonpatch.apply_patch(patch, target)
{:error, :test_failed, "Expected value 'Alice' at '/name'"}

Other possible errors are :invalid_path and :invalid_index.

v0.9.3

It has been a since the last update. I worked on testing to eliminate dead code and bugs (of course). Also I tried to make the documentation a little bit prettier.

I am happy about any feedback.

Your Corka/Sebastian

5 Likes

v0.10.0

A new minor version is out. Recently I discovered that escaping exists for ~ and /. Also “know your standard library”: I was using Enum.with_index + Enum.find which was really not clever and replaced it with Enum.fetch.

Breaking change: Jsonpatch.apply_patch/2 was not really matching the Elixir style in my opinion. Therefore it was changed and Jsonpatch.apply_patch!/2 was added.

Before:

iex> Jsonpatch.apply_patch(patch, target)
%{"name" => "Bob", "married" => true, "hobbies" => ["Elixir!"], "age" => 33}

Now:

iex> Jsonpatch.apply_patch(patch, target)
{:ok, %{"name" => "Bob", "married" => true, "hobbies" => ["Elixir!"], "age" => 33}}

In contrast Jsonpatch.apply_patch!/2 will return no tuple. Instead it will return the patched value or JsonpatchException.

Changelog:

  • Made jsonpatch more Elixir-API-like by adding Jsonpatch.apply_patch! (which raise an exception) and changed Jsonpatch.apply_patch to return a tuple.
  • Implemented escaping for ‘~’ and ‘/’
  • Allow usage of ‘-’ for Add and Copy operation
  • Fixed adding and copying values to array
  • Improved error feedback of test operation
  • Fixed: Replace operation adds error to target
  • Cleaned code: Replaced strange constructs of Enum.with_index with Enum.fetch

Updated documentation: Jsonpatch — Jsonpatch v0.10.0

1 Like

v0.11.0

The whole process for creating patches through Jsonpatch.diff/2 was not perfect. I was encouraged through a github issue to rewrite it with a reduce-loop. This version fixes this. In addition, Jsonpatch.FlatMap was removed because it is not necessary anymore and it was not the focus of this lib.

Changelog:

  • Removed module Jsonpatch.FlatMap because it is not necessary anymore and not the focus of the lib
  • Reworked creating diff to create less unnecessary data and for more accurate patches
  • Fixed adding values to empty lists (thanks @webdeb )

Updated documentation: Jsonpatch — Jsonpatch v0.11.0

7 Likes