Sync objects by diffing and patching
JavaScript
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.gitignore
.travis.yml
README.md
bench.js
bower.json
diff.js
index.js
package.json
patch.js
scope.js
test.js

README.md

Symmetry Build Status

Create diffs between two values:

a = { x: 3, y: 5, z: 1 };
b = { x: 3, y: 8, z: 1 };
Symmetry.diff(a, b)  # => { t: 'o', s: { y: 8 } }

a = ['one', 'two', 'three'];
b = ['one', 'two', 'two and a half'];
Symmetry.diff(a, b)  # => { t: 'a', s: [ [2, 1, 'two and a half'] ] }

And apply them somewhere else:

obj  = { x: 3, y: 5, z: 1 };
diff = { t: 'o', s: { y: 8 } };
Symmetry.patch(obj, diff);
obj  # => { x: 3, y: 8, z: 1 }

Use a scope to create a chain of diffs:

scope = Symmetry.scope({ x: 3, y: 5, z: 1 });

scope.y = 8;
scope.$digest();  # => { t: 'o', s: { y: 8 } }

scope.x = 7;
scope.z = 2;
scope.$digest();  # => { t: 'o', s: { x: 7, z: 2 } }

Can diff anything that can be represented as JSON:

people = new Backbone.Collection([
    { id: 1, name: 'John', age: 30 },
    { id: 2, name: 'Dave', age: 34 }
]);
scope = Symmetry.scope({ people: people });

scope.people.add({ id: 3, name: 'Mark', age: 27 });
scope.people.get(2).set('age', 35);
scope.$digest();  # => { t: 'o', p: { people: { t: 'a', /* ... */ } } }

MIT-licensed

Installing

In node.js, install using NPM:

npm install symmetry

In the browser, simply include diff.js, patch.js or scope.js. (Note that scope.js requires diff.js.)

Hacking the code

git clone https://github.com/Two-Screen/symmetry.git
cd symmetry
npm install
npm test