backbone-associations-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in backbone-associations-rails.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Stafford Brunk
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # backbone-associations-rails [![Gem Version](https://badge.fury.io/rb/backbone-associations-rails.png)](http://badge.fury.io/rb/backbone-associations-rails)
2
+
3
+ This gem vendors the [Backbone-associations](https://github.com/dhruvaray/backbone-associations) library for easy usage in the Rails asset pipeline.
4
+
5
+ ## Dependencies
6
+
7
+ ```backbone-associations``` requires Backbone.js >= 0.9.2 and Underscore.js >= 1.3.1
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ group :assets
14
+ gem 'backbone-associations-rails'
15
+ end
16
+
17
+ Then require it in your javascript manifest file (```application.js``` by default)
18
+
19
+ //= reuqire backbone-associations
20
+
21
+ ## Versioning
22
+
23
+ ```backbone-associations-rails``` will track the version of ```backbone-associations```.
24
+
25
+ ## Issues
26
+ For issues with ```backbone-associations```, please file an issue over at their [issue tracker](https://github.com/dhruvaray/backbone-associations/issues).
data/Rakefile ADDED
@@ -0,0 +1,58 @@
1
+ require "bundler/gem_tasks"
2
+ require 'open-uri'
3
+ require 'json'
4
+
5
+
6
+ # Helper Functions
7
+ def name
8
+ @name ||= Dir['*.gemspec'].first.split('.').first
9
+ end
10
+
11
+ def version
12
+ line = File.read("lib/#{name}/version.rb")[/^\s*VERSION\s*=\s*.*/]
13
+ line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
14
+ end
15
+
16
+ def latest_tag
17
+ tags = JSON.parse(open('https://api.github.com/repos/dhruvaray/backbone-associations/tags').read)
18
+ tags.sort!{|a,b| b["name"] <=> a["name"]}
19
+ tags.first
20
+ end
21
+
22
+ namespace :backbone_associations do
23
+
24
+ desc "Fetches and displays the latest backbone-associations tag"
25
+ task :latest do
26
+ tag = latest_tag
27
+ puts "The latest backbone-associations tag is #{tag["name"]} with commit #{tag["commit"]["sha"]}"
28
+ end
29
+
30
+ desc "Updates the vendored backbone-associations version to the latest tag"
31
+ task :update do
32
+ tag = latest_tag
33
+
34
+ # Pull attributes we need
35
+ name = tag["name"]
36
+ sha = tag["commit"]["sha"]
37
+
38
+ # Cleanup the name
39
+ name.gsub!(/^v/, '')
40
+ name.gsub!(/-/, '.')
41
+
42
+ if name == version
43
+ puts "Gem version #{version} matches the latest backbone-associations version #{name}"
44
+ exit
45
+ end
46
+
47
+ # Update marionette
48
+ puts "Updating backbone-associations..."
49
+ url = "https://raw.github.com/dhruvaray/backbone-associations/#{sha}/lib/backbone-associations.js"
50
+ Dir.chdir './vendor/assets/javascripts' do
51
+ `curl -O #{url}`
52
+ end
53
+
54
+ # Update version file
55
+ puts "Updating version.rb..."
56
+ `sed -i "" "s/ VERSION = '.*'/ VERSION = '#{name}'/g" lib/backbone-associations-rails/version.rb`
57
+ end
58
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'backbone-associations-rails/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "backbone-associations-rails"
8
+ gem.version = Backbone::Associations::Rails::VERSION
9
+ gem.authors = ["Stafford Brunk"]
10
+ gem.email = ["stafford.brunk@gmail.com"]
11
+ gem.description = %q{Backbone-associations provides a way of specifying 1:1 and 1:N relationships between Backbone models. Additionally, parent model instances (and objects extended from Backbone.Events) can listen in to CRUD events initiated on any children - in the object graph - by providing an appropriately qualified event path name.}
12
+ gem.summary = %q{Packages the backbone.associations library for use with the asset pipline}
13
+ gem.homepage = "https://github.com/wingrunr21/backbone-associations-rails"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ end
@@ -0,0 +1,10 @@
1
+ require "backbone-associations-rails/version"
2
+
3
+ module Backbone
4
+ module Associations
5
+ module Rails
6
+ class Engine < ::Rails::Engine
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module Backbone
2
+ module Associations
3
+ module Rails
4
+ VERSION = '0.1.0'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,197 @@
1
+ //
2
+ // Backbone-associations.js 0.1.0
3
+ //
4
+ // (c) 2012 Dhruva Ray, Jaynti Kanani
5
+ //
6
+ // Backbone-associations may be freely distributed under the MIT license; see the accompanying LICENSE.txt.
7
+ //
8
+ // Depends on [Backbone](https://github.com/documentcloud/backbone) (and thus on [Underscore](https://github.com/documentcloud/underscore/) as well)
9
+ //
10
+ // A complete [Test & Benchmark Suite](../test/test-suite.html) is included for your perusal.
11
+
12
+ // Initial Setup
13
+ // --------------
14
+ (function() {
15
+ // The top-level namespace. All public Backbone classes and modules will be attached to this.
16
+ // Exported for the browser and CommonJS.
17
+ var _, Backbone;
18
+ if ( typeof window === 'undefined' ) {
19
+ _ = require( 'underscore' );
20
+ Backbone = require( 'backbone' );
21
+ exports = module.exports = Backbone;
22
+ }
23
+ else {
24
+ _ = window._;
25
+ Backbone = window.Backbone;
26
+ exports = window;
27
+ }
28
+ // Backbone.AssociatedModel
29
+ // --------------
30
+
31
+ //Add `Many` and `One` relations to Backbone Object
32
+ Backbone.Many = "Many";
33
+ Backbone.One = "One";
34
+ //Define `AssociatedModel` (Extends Backbone.Model)
35
+ Backbone.AssociatedModel = Backbone.Model.extend({
36
+ //Define relations with Associated Model
37
+ relations: undefined,
38
+ //Set a hash of model attributes on the object,
39
+ //firing `"change"` unless you choose to silence it.
40
+ //It maintains relations between models during the set operation. It also bubbles up child events to the parent.
41
+ set: function( key, value, options ) {
42
+ var attributes,processedRelations,tbp;
43
+ // Duplicate backbone's behavior to allow separate key/value parameters, instead of a single 'attributes' object.
44
+ if ( _.isObject( key ) || key == null ) {
45
+ attributes = key;
46
+ options = value;
47
+ }
48
+ else {
49
+ attributes = {};
50
+ attributes[ key ] = value;
51
+ }
52
+ // Extract attributes and options.
53
+ options || (options = {});
54
+ if(!attributes) return;
55
+ if (options.unset) for (attr in attributes) attributes[attr] = void 0;
56
+ //Check for existence of relations in this model
57
+ if(this.relations){
58
+ //Iterate over `this.relations` and `set` model and collection values
59
+ _.each(this.relations ,function(relation){
60
+ if (attributes[relation.key] != undefined ){
61
+ //Get value of attribute with relation key in `val`
62
+ var val = getValue(attributes,relation.key);
63
+ //Get class if relation is stored as a string
64
+ relation.relatedModel && _.isString(relation.relatedModel) && (relation.relatedModel = eval(relation.relatedModel));
65
+ relation.collectionType && _.isString(relation.collectionType) && (relation.collectionType = eval(relation.collectionType));
66
+ //Track reference change of associated model for `change:attribute` event
67
+ var refChanged = false;
68
+ //If `relation` defines model as associated collection...
69
+ if(relation.type === Backbone.Many){
70
+ //`relation.collectionType` should be instance of `Backbone.Collection`
71
+ if(relation.collectionType && !relation.collectionType.prototype instanceof Backbone.Collection){
72
+ throw new Error( 'collectionType must inherit from Backbone.Collection' );
73
+ }
74
+ //Create new `Backbone.Collection` with `collectionType`
75
+ if(!this.attributes[relation.key]){
76
+ this.attributes[relation.key] = relation.collectionType ? new relation.collectionType() : this._createCollection(relation.relatedModel);
77
+ refChanged = true;
78
+ }
79
+ // Get all models if `val` is already instanceof `Backbone.Collection`
80
+ if(val instanceof Backbone.Collection){
81
+ val = val.models;
82
+ }
83
+ //Resetting new Collection with new value and options
84
+ this.attributes[relation.key].reset(val,options);
85
+ }
86
+ //If `relation` defines model as associated model...
87
+ else if(relation.type == Backbone.One && relation.relatedModel){
88
+ //Create New `Backbone.Model` using `relation.relatedModel` if `attributes` is not null
89
+ if(!this.attributes[relation.key]){
90
+ //If `val` is already instance of `AssociatedModel`, reserve `relation.key` for `Backbone.Model.prototype.set`
91
+ if(val instanceof Backbone.AssociatedModel) return;
92
+ this.attributes[relation.key] = new relation.relatedModel();
93
+ refChanged = true;
94
+ }
95
+ //If the new attributes is a smaller subset, then use the default values for that attribute - if available.
96
+ else{
97
+ var opt = {};
98
+ var defaults = getValue(this.attributes[relation.key], 'defaults');
99
+ _.each(this.attributes[relation.key].attributes,function(value,key){
100
+ !_.has(val,key) && (opt[key] = (defaults ? defaults[key] : void 0));
101
+ });
102
+ this.attributes[relation.key].set(opt,{silent:true});
103
+ }
104
+ //Set `val` to model with options
105
+ this.attributes[relation.key].set(val,options);
106
+ }
107
+ //Add proxy events to respective parents
108
+ this.attributes[relation.key].off("all");
109
+ this.attributes[relation.key].on("all",function(events){this.trigger(events,_.rest(arguments))},this);
110
+ //If reference has changed, trigger `change:attribute` event
111
+ refChanged && this.trigger('change:'+relation.key,options);
112
+ //Create a local `processedRelations` array to store the relation key which has been processed.
113
+ //We cannot use `this.relations` because if there is no value defined for `relation.key`, it will not get processed by either Backbone `set` or the `AssociatedModel` set
114
+ !processedRelations && (processedRelations=[]);
115
+ if(_.indexOf(processedRelations,relation.key)===-1){
116
+ processedRelations.push(relation.key);
117
+ }
118
+ }
119
+ },this);
120
+ };
121
+ if(processedRelations){
122
+ //Find attributes yet to be processed - `tbp`
123
+ tbp = {};
124
+ for(var key in attributes){
125
+ if(_.indexOf(processedRelations,key)===-1){
126
+ tbp[key] = attributes[key];
127
+ }
128
+ }
129
+ }
130
+ //Set all `attributes` to `tbp`
131
+ else{
132
+ tbp = attributes;
133
+ }
134
+ //Returns results for `Backbone.Model.prototype.set`
135
+ return Backbone.Model.prototype.set.call( this, tbp , options);
136
+ },
137
+ //Returns New `collection` of type `relation.relatedModel`
138
+ _createCollection: function(type) {
139
+ var collection;
140
+ if ( type && type.prototype instanceof Backbone.AssociatedModel ) {
141
+ //Creates new `Backbone.Collection` and defines model class
142
+ collection = new Backbone.Collection();
143
+ collection.model = type;
144
+ }
145
+ else{
146
+ throw new Error( 'type must inherit from Backbone.AssociatedModel' );
147
+ }
148
+ return collection;
149
+ },
150
+ //The JSON representation of the model.
151
+ toJSON : function(){
152
+ //Get json representation from `Backbone.Model.prototype.toJSON`
153
+ var json = Backbone.Model.prototype.toJSON.apply( this, arguments );
154
+ //If `this.relations` is defined, iterate through each `relation` and added it's json representation to parents' json representation
155
+ if(this.relations){
156
+ _.each(this.relations ,function(relation){
157
+ if(this.attributes[relation.key]){
158
+ json[relation.key] = (this.attributes[relation.key].cid !== this.cid) ? this.attributes[relation.key].toJSON() : void 0;
159
+ }
160
+ },this);
161
+ }
162
+ return json;
163
+ },
164
+ //deep `clone` the model.
165
+ clone : function(){
166
+ //Get shallow clone from `Backbone.Model.prototype.clone`
167
+ var cloneObj = Backbone.Model.prototype.clone.apply( this, arguments );
168
+ //If `this.relations` is defined, iterate through each `relation` and `clone`
169
+ if(this.relations){
170
+ _.each(this.relations ,function(relation){
171
+ if(this.attributes[relation.key]){
172
+ var sourceObj = cloneObj.attributes[relation.key];
173
+ if(sourceObj instanceof Backbone.Collection){
174
+ //Creates new `collection` using `relation`
175
+ var newCollection = relation.collectionType ? new relation.collectionType() : this._createCollection(relation.relatedModel);
176
+ //Added each `clone` model to `newCollection`
177
+ sourceObj.each(function(model){
178
+ newCollection.add(model.clone());
179
+ });
180
+ cloneObj.attributes[relation.key] = newCollection;
181
+ }
182
+ else if(sourceObj instanceof Backbone.Model){
183
+ cloneObj.attributes[relation.key] = sourceObj.clone();
184
+ }
185
+ }
186
+ },this);
187
+ }
188
+ return cloneObj;
189
+ }
190
+ });
191
+ // Duplicate Backbone's behavior. To get a value from a Backbone object as a property
192
+ // or as a function.
193
+ var getValue = function(object, prop) {
194
+ if (!(object && object[prop])) return null;
195
+ return _.isFunction(object[prop]) ? object[prop]() : object[prop];
196
+ };
197
+ })();
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: backbone-associations-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Stafford Brunk
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-07 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Backbone-associations provides a way of specifying 1:1 and 1:N relationships
15
+ between Backbone models. Additionally, parent model instances (and objects extended
16
+ from Backbone.Events) can listen in to CRUD events initiated on any children - in
17
+ the object graph - by providing an appropriately qualified event path name.
18
+ email:
19
+ - stafford.brunk@gmail.com
20
+ executables: []
21
+ extensions: []
22
+ extra_rdoc_files: []
23
+ files:
24
+ - .gitignore
25
+ - Gemfile
26
+ - LICENSE.txt
27
+ - README.md
28
+ - Rakefile
29
+ - backbone-associations-rails.gemspec
30
+ - lib/backbone-associations-rails.rb
31
+ - lib/backbone-associations-rails/version.rb
32
+ - vendor/assets/javascripts/backbone-associations.js
33
+ homepage: https://github.com/wingrunr21/backbone-associations-rails
34
+ licenses: []
35
+ post_install_message:
36
+ rdoc_options: []
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ requirements: []
52
+ rubyforge_project:
53
+ rubygems_version: 1.8.23
54
+ signing_key:
55
+ specification_version: 3
56
+ summary: Packages the backbone.associations library for use with the asset pipline
57
+ test_files: []