backbone_extensions 0.0.23 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +2 -0
- data/lib/assets/javascripts/backbone_extensions/associations.js +35 -35
- data/lib/assets/javascripts/backbone_extensions/decorator.js +11 -12
- data/lib/assets/javascripts/backbone_extensions/delegate_events.js +24 -22
- data/lib/assets/javascripts/backbone_extensions/include.js +6 -5
- data/lib/backbone_extensions/version.rb +1 -1
- metadata +23 -7
data/Rakefile
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
|
+
ENV['JASMINE_SPEC_FORMAT'] = 'Fuubar'
|
2
3
|
begin
|
3
4
|
require 'bundler/setup'
|
4
5
|
rescue LoadError
|
5
6
|
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
7
|
end
|
7
8
|
|
9
|
+
require 'yajl/json_gem'
|
8
10
|
Bundler::GemHelper.install_tasks
|
9
11
|
|
10
12
|
require 'jshint/tasks'
|
@@ -1,21 +1,22 @@
|
|
1
1
|
//= require backbone_extensions/include
|
2
2
|
//= require underscore.string
|
3
|
-
(function(
|
3
|
+
(function() {
|
4
4
|
'use strict';
|
5
|
-
var
|
5
|
+
var exports = this, _ = exports._, Backbone = exports.Backbone;
|
6
|
+
var fn = {};
|
6
7
|
function mixin(namespace, globalOptions) {
|
7
|
-
namespace = namespace ||
|
8
|
+
namespace = namespace || exports || {};
|
8
9
|
globalOptions = globalOptions || {};
|
9
|
-
_
|
10
|
+
_.extend(fn, {
|
10
11
|
mergeOptions: function() {
|
11
|
-
return _
|
12
|
+
return _.chain(arguments).toArray().reduce(function(result, options) { return _.extend(result, options); }, {})
|
12
13
|
.omit('class', 'className', 'inverseOf', 'parseName', 'through').value();
|
13
14
|
},
|
14
15
|
|
15
16
|
buildAssociation: function(namespace, associationType, associationName, options) {
|
16
17
|
function through() {
|
17
18
|
function association() {
|
18
|
-
var t = (_(options.through)
|
19
|
+
var t = (_.isFunction(options.through) && options.through.call(this)) || _.str.camelize(options.through);
|
19
20
|
return this[t] && this[t]() && this[t]()[associationName] && this[t]()[associationName]();
|
20
21
|
}
|
21
22
|
return options.through && association.call(this);
|
@@ -34,9 +35,9 @@
|
|
34
35
|
newOptions[_.str.camelize(options.inverseOf)] = function() { return self; };
|
35
36
|
}
|
36
37
|
|
37
|
-
return _((options['class'] && new options['class'](null, newOptions)) ||
|
38
|
+
return _.tap((options['class'] && new options['class'](null, newOptions)) ||
|
38
39
|
(className && namespace[className] && new namespace[className](null, newOptions)) ||
|
39
|
-
(namespace[collectionName] && new namespace[collectionName](null, newOptions))
|
40
|
+
(namespace[collectionName] && new namespace[collectionName](null, newOptions)), function(association) {
|
40
41
|
through.call(self, association);
|
41
42
|
});
|
42
43
|
}
|
@@ -49,28 +50,28 @@
|
|
49
50
|
|
50
51
|
this.prototype[associationName] = function() {
|
51
52
|
return (this._associations || (this._associations = {})) && this._associations[associationName] ||
|
52
|
-
(this._associations[associationName] = (this._options && _(this._options
|
53
|
+
(this._associations[associationName] = (this._options && _.result(this._options, associationName)) || associations[associationType].call(this));
|
53
54
|
};
|
54
55
|
},
|
55
56
|
|
56
57
|
parseAssociation: function(associationType, associationName, options) {
|
57
58
|
function parseResponseWith(key, response) {
|
58
59
|
var result;
|
59
|
-
return _([_.str.camelize, _.str.underscored]
|
60
|
+
return _.any([_.str.camelize, _.str.underscored], function(fn) {
|
60
61
|
var k = fn(key);
|
61
62
|
return (result = response[k] && {key: k, response: response[k]});
|
62
63
|
}) && result || {response: null};
|
63
64
|
}
|
64
65
|
|
65
66
|
function through(response) {
|
66
|
-
var t = parseResponseWith(_
|
67
|
-
singularAssociationName = _.singularize && _
|
67
|
+
var t = parseResponseWith(_.result(options, 'through'), response).response,
|
68
|
+
singularAssociationName = _.singularize && _.singularize(associationName),
|
68
69
|
p = options.parseName || singularAssociationName;
|
69
|
-
return {response: t && p && _
|
70
|
+
return {response: t && p && _[associationType === 'hasOne' && 'result' || 'pluck'](t, p)};
|
70
71
|
}
|
71
72
|
|
72
73
|
if (options.parse) {
|
73
|
-
if (!_
|
74
|
+
if (!_.has(this, '_parsers')) {
|
74
75
|
this._parsers = [];
|
75
76
|
}
|
76
77
|
|
@@ -85,14 +86,13 @@
|
|
85
86
|
|
86
87
|
if (associations[associationType]) {
|
87
88
|
var parsers = this._parsers;
|
88
|
-
if (_
|
89
|
-
this.prototype.parse = _(this.prototype.parse
|
89
|
+
if (_.isEmpty(parsers)) {
|
90
|
+
this.prototype.parse = _.wrap(this.prototype.parse, function(oldParse, response) {
|
90
91
|
var self = this;
|
91
|
-
return _(oldParse.call(self, response)
|
92
|
-
_(parsers)
|
93
|
-
.chain()
|
92
|
+
return _.tap(oldParse.call(self, response), function(parsedResponse) {
|
93
|
+
_.chain(parsers)
|
94
94
|
.map(function(parser) {
|
95
|
-
return _(parser.parseFn.call(self).call(self, parsedResponse)
|
95
|
+
return _.tap(parser.parseFn.call(self).call(self, parsedResponse), function(result) {
|
96
96
|
parser.associationFn.call(self, result.response);
|
97
97
|
}).key;
|
98
98
|
})
|
@@ -105,7 +105,7 @@
|
|
105
105
|
|
106
106
|
this._parsers.push({
|
107
107
|
parseFn: function() {
|
108
|
-
return _(options.parse)
|
108
|
+
return _.isFunction(options.parse) &&
|
109
109
|
function(response) { return {response: options.parse.call(this, response) }; } ||
|
110
110
|
function(response) {
|
111
111
|
return (options.through && through.call(this, response)) ||
|
@@ -126,12 +126,12 @@
|
|
126
126
|
|
127
127
|
return {
|
128
128
|
included: function(source) {
|
129
|
-
var associations = _({
|
129
|
+
var associations = _.reduce({
|
130
130
|
belongsTo: {}, hasMany: {parse: true}, hasOne: {parse: true}
|
131
|
-
}
|
131
|
+
}, function(associations, defaultOptions, associationType) {
|
132
132
|
associations[associationType] = function(name, options) {
|
133
133
|
var associationName = _.str.camelize(name);
|
134
|
-
options = _({}
|
134
|
+
options = _.extend({}, defaultOptions, globalOptions, options);
|
135
135
|
fn.buildAssociation.call(this, namespace, associationType, associationName, options);
|
136
136
|
fn.parseAssociation.call(this, associationType, associationName, options);
|
137
137
|
return this;
|
@@ -139,30 +139,30 @@
|
|
139
139
|
return associations;
|
140
140
|
}, {});
|
141
141
|
|
142
|
-
_
|
142
|
+
_.extend(source, associations, {
|
143
143
|
associations: function() {
|
144
144
|
var self = this;
|
145
|
-
_
|
146
|
-
_
|
145
|
+
_.chain(arguments).toArray().compact().each(function(options) {
|
146
|
+
_.chain(associations).keys().each(function(associationType) {
|
147
147
|
if (options[associationType]) {
|
148
|
-
associations[associationType].call(self, options[associationType], _
|
148
|
+
associations[associationType].call(self, options[associationType], _.omit(options, associationType));
|
149
149
|
}
|
150
150
|
});
|
151
151
|
});
|
152
152
|
},
|
153
153
|
|
154
|
-
extend: _(source.extend
|
155
|
-
return _(oldExtend.call(this, protoProps, classProps)
|
154
|
+
extend: _.wrap(source.extend, function(oldExtend, protoProps, classProps) {
|
155
|
+
return _.tap(oldExtend.call(this, protoProps, classProps), function(Klass) {
|
156
156
|
var args = (protoProps || {}).associations;
|
157
157
|
if (args) {
|
158
|
-
Klass.associations.apply(Klass, _([args])
|
158
|
+
Klass.associations.apply(Klass, _.flatten([args]));
|
159
159
|
}
|
160
160
|
});
|
161
161
|
})
|
162
162
|
});
|
163
163
|
|
164
|
-
source.prototype.initialize = _(source.prototype.initialize
|
165
|
-
this._options = this._options || _
|
164
|
+
source.prototype.initialize = _.wrap(source.prototype.initialize, function(oldInitialize, attrsOrModels, options) {
|
165
|
+
this._options = this._options || _.clone(options);
|
166
166
|
oldInitialize.call(this, attrsOrModels, options);
|
167
167
|
});
|
168
168
|
}
|
@@ -170,5 +170,5 @@
|
|
170
170
|
}
|
171
171
|
mixin.fn = fn;
|
172
172
|
|
173
|
-
Backbone.extensions = _(Backbone.extensions || {}
|
174
|
-
}).call(this
|
173
|
+
Backbone.extensions = _.extend(Backbone.extensions || {}, {associations: mixin});
|
174
|
+
}).call(this);
|
@@ -1,5 +1,6 @@
|
|
1
|
-
(function(
|
1
|
+
(function() {
|
2
2
|
'use strict';
|
3
|
+
var exports = this, _ = exports._, Backbone = exports.Backbone;
|
3
4
|
function Decorator(models, options) {
|
4
5
|
this._decoratee = models instanceof Backbone.Collection ? models.models : models;
|
5
6
|
this.initialize.call(this, models, options);
|
@@ -8,8 +9,8 @@
|
|
8
9
|
function wrapDecorator(fnName) {
|
9
10
|
return function() {
|
10
11
|
var Klass = this.constructor, args = arguments;
|
11
|
-
if (_(this._decoratee)
|
12
|
-
return _(this._decoratee
|
12
|
+
if (_.isArray(this._decoratee)) {
|
13
|
+
return _.map(this._decoratee, function(model) {
|
13
14
|
return (Klass.fn[fnName]).apply(model, args);
|
14
15
|
});
|
15
16
|
} else {
|
@@ -18,17 +19,15 @@
|
|
18
19
|
};
|
19
20
|
}
|
20
21
|
|
21
|
-
_
|
22
|
+
_.extend(Decorator, {
|
22
23
|
extend: function(protoProps, classProps) {
|
23
|
-
var proto = _(protoProps)
|
24
|
-
.chain()
|
25
|
-
.omit('collection', 'constructor', 'initialize', 'model'),
|
24
|
+
var proto = _.chain(protoProps).omit('collection', 'constructor', 'initialize', 'model'),
|
26
25
|
wrapped = proto.reduce(function(proto, fn, name) {
|
27
26
|
return (proto[name] = wrapDecorator(name)) && proto;
|
28
27
|
}, {}).value();
|
29
28
|
this.fn = proto.value();
|
30
|
-
return _(Backbone.Model.extend.call(this, _
|
31
|
-
_(['model', 'collection']
|
29
|
+
return _.tap(Backbone.Model.extend.call(this, _.extend(protoProps, wrapped), classProps), function(Klass) {
|
30
|
+
_.each(['model', 'collection'], function(type) {
|
32
31
|
if (protoProps[type]) {
|
33
32
|
protoProps[type].prototype.decorator = function() {
|
34
33
|
return new Klass(this);
|
@@ -39,9 +38,9 @@
|
|
39
38
|
}
|
40
39
|
}, Backbone.extensions && Backbone.extensions.include || {});
|
41
40
|
|
42
|
-
_(Decorator.prototype
|
41
|
+
_.extend(Decorator.prototype, {
|
43
42
|
initialize: function(models, options) {}
|
44
43
|
});
|
45
44
|
|
46
|
-
Backbone.extensions = _(Backbone.extensions || {}
|
47
|
-
}).call(this
|
45
|
+
Backbone.extensions = _.extend(Backbone.extensions || {}, {Decorator: Decorator});
|
46
|
+
}).call(this);
|
@@ -1,13 +1,14 @@
|
|
1
|
-
(function(
|
1
|
+
(function() {
|
2
2
|
'use strict';
|
3
|
+
var exports = this, _ = exports._, Backbone = exports.Backbone;
|
3
4
|
function bindModelEvents(tuple) {
|
4
5
|
var self = this, subject = tuple[0], eventNames = tuple[1], isJquery = !!_(subject).result('jquery'),
|
5
6
|
modelEvents = self._modelCallbacks, context = tuple[2];
|
6
7
|
modelEvents.push(tuple);
|
7
|
-
_(subject && eventNames
|
8
|
-
_(event.split(' ')
|
9
|
-
_([callback]).
|
10
|
-
var fn = _
|
8
|
+
_.each(subject && eventNames, function(callback, event) {
|
9
|
+
_.each(event.split(' '), function(e) {
|
10
|
+
_.chain([callback]).flatten().each(function(c) {
|
11
|
+
var fn = _.isFunction(c) ? c : self[c];
|
11
12
|
if (isJquery) {
|
12
13
|
if (context) {
|
13
14
|
subject.on(e, context, fn);
|
@@ -24,12 +25,12 @@
|
|
24
25
|
|
25
26
|
function unbindModelEvents() {
|
26
27
|
var self = this, modelEvents = self._modelCallbacks;
|
27
|
-
_
|
28
|
-
var subject = tuple[0], events = tuple[1], context = tuple[2], isJquery = !!_
|
29
|
-
_(subject && events
|
30
|
-
_(event.split(' ')
|
31
|
-
_([callback]).
|
32
|
-
var fn = _
|
28
|
+
_.each(modelEvents, function(tuple) {
|
29
|
+
var subject = tuple[0], events = tuple[1], context = tuple[2], isJquery = !!_.result(subject, 'jquery');
|
30
|
+
_.each(subject && events, function(callback, event) {
|
31
|
+
_.each(event.split(' '), function(e) {
|
32
|
+
_.chain([callback]).flatten().each(function(c) {
|
33
|
+
var fn = _.isFunction(c) ? c : self[c];
|
33
34
|
if (isJquery) {
|
34
35
|
if (context) {
|
35
36
|
subject.off(e, context, fn);
|
@@ -55,27 +56,28 @@
|
|
55
56
|
|
56
57
|
var delegateEvents = {
|
57
58
|
included: function(source) {
|
58
|
-
_(source.prototype
|
59
|
-
initialize: _(source.prototype.initialize
|
59
|
+
_.extend(source.prototype, {
|
60
|
+
initialize: _.wrap(source.prototype.initialize, function(oldInitialize, attrsOrModels, options) {
|
60
61
|
this._modelCallbacks = [];
|
61
62
|
oldInitialize.call(this, attrsOrModels, options);
|
62
63
|
}),
|
63
64
|
|
64
|
-
delegateEvents: _(source.prototype.delegateEvents
|
65
|
-
var self = this, args = _
|
65
|
+
delegateEvents: _.wrap(source.prototype.delegateEvents, function(oldDelegateEvents) {
|
66
|
+
var self = this, args = _.rest(arguments);
|
66
67
|
|
67
68
|
if (!args.length) {
|
68
69
|
return oldDelegateEvents.call(this);
|
69
70
|
}
|
71
|
+
|
70
72
|
wrapUndelegateEvents.call(this, function() {
|
71
|
-
_
|
73
|
+
_.chain(args).toArray().compact().each(function(obj) {
|
72
74
|
var arg = _(obj);
|
73
75
|
if (arg.isArray()) {
|
74
76
|
bindModelEvents.call(self, obj);
|
75
77
|
} else {
|
76
78
|
arg.each(function(callbacks, event) {
|
77
|
-
_([callbacks]).
|
78
|
-
oldDelegateEvents.call(self, _({}
|
79
|
+
_.chain([callbacks]).flatten().each(function(callback) {
|
80
|
+
oldDelegateEvents.call(self, _.tap({}, function(obj) {
|
79
81
|
obj[event] = callback;
|
80
82
|
}));
|
81
83
|
});
|
@@ -85,12 +87,12 @@
|
|
85
87
|
});
|
86
88
|
}),
|
87
89
|
|
88
|
-
undelegateEvents: _(source.prototype.undelegateEvents
|
90
|
+
undelegateEvents: _.wrap(source.prototype.undelegateEvents, function(oldUndelegateEvents) {
|
89
91
|
unbindModelEvents.call(this);
|
90
92
|
return oldUndelegateEvents.call(this);
|
91
93
|
}),
|
92
94
|
|
93
|
-
remove: _(source.prototype.remove
|
95
|
+
remove: _.wrap(source.prototype.remove, function(oldRemove) {
|
94
96
|
this.undelegateEvents();
|
95
97
|
return oldRemove.call(this);
|
96
98
|
})
|
@@ -98,5 +100,5 @@
|
|
98
100
|
}
|
99
101
|
};
|
100
102
|
|
101
|
-
Backbone.extensions = _(Backbone.extensions || {}
|
102
|
-
}).call(this
|
103
|
+
Backbone.extensions = _.extend(Backbone.extensions || {}, {delegateEvents: delegateEvents});
|
104
|
+
}).call(this);
|
@@ -1,10 +1,11 @@
|
|
1
|
-
(function(
|
1
|
+
(function() {
|
2
2
|
'use strict';
|
3
|
+
var exports = this, _ = exports._, Backbone = exports.Backbone;
|
3
4
|
var include = {
|
4
5
|
include: function() {
|
5
6
|
var self = this;
|
6
|
-
_
|
7
|
-
if (module && module.included && _(module.included)
|
7
|
+
_.chain(arguments).toArray().each(function(module) {
|
8
|
+
if (module && module.included && _.isFunction(module.included)) {
|
8
9
|
module.included(self);
|
9
10
|
}
|
10
11
|
});
|
@@ -12,5 +13,5 @@
|
|
12
13
|
}
|
13
14
|
};
|
14
15
|
|
15
|
-
Backbone.extensions = _(Backbone.extensions || {}
|
16
|
-
}).call(this
|
16
|
+
Backbone.extensions = _.extend(Backbone.extensions || {}, {include: include});
|
17
|
+
}).call(this);
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backbone_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.24
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-03-29 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: fuubar
|
@@ -35,7 +35,7 @@ dependencies:
|
|
35
35
|
requirements:
|
36
36
|
- - ! '>='
|
37
37
|
- !ruby/object:Gem::Version
|
38
|
-
version: 1.2
|
38
|
+
version: 1.3.2
|
39
39
|
type: :development
|
40
40
|
prerelease: false
|
41
41
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
requirements:
|
44
44
|
- - ! '>='
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: 1.2
|
46
|
+
version: 1.3.2
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: jshint_on_rails
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -76,6 +76,22 @@ dependencies:
|
|
76
76
|
- - ! '>='
|
77
77
|
- !ruby/object:Gem::Version
|
78
78
|
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: yajl-ruby
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
79
95
|
- !ruby/object:Gem::Dependency
|
80
96
|
name: rails
|
81
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
142
|
version: '0'
|
127
143
|
segments:
|
128
144
|
- 0
|
129
|
-
hash:
|
145
|
+
hash: 3920379791586607175
|
130
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
147
|
none: false
|
132
148
|
requirements:
|
@@ -135,10 +151,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
151
|
version: '0'
|
136
152
|
segments:
|
137
153
|
- 0
|
138
|
-
hash:
|
154
|
+
hash: 3920379791586607175
|
139
155
|
requirements: []
|
140
156
|
rubyforge_project:
|
141
|
-
rubygems_version: 1.8.
|
157
|
+
rubygems_version: 1.8.24
|
142
158
|
signing_key:
|
143
159
|
specification_version: 3
|
144
160
|
summary: Extensions to backbone javascript library as a rails engine
|