backbone_extensions 0.0.17 → 0.0.18

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.
@@ -2,120 +2,123 @@
2
2
  //= require underscore.string
3
3
  (function(_, Backbone) {
4
4
  'use strict';
5
- function mixin(namespace) {
6
- namespace = namespace || {};
7
-
8
- function mergeAssociationOptions() {
9
- return _(arguments).chain().toArray().reduce(function(result, options) { return _(result).extend(options); }, {})
10
- .omit('class', 'className', 'inverseOf', 'parseName', 'through').value();
11
- }
12
-
13
- function buildAssociation(associationType, associationName, options) {
14
- function through() {
15
- function association() {
16
- var t = (_(options.through).isFunction() && options.through.call(this)) || _.str.camelize(options.through);
17
- return this[t] && this[t]() && this[t]()[associationName] && this[t]()[associationName]();
5
+ var global = this, fn = {};
6
+ function mixin(namespace, globalOptions) {
7
+ namespace = namespace || global || {};
8
+ globalOptions = globalOptions || {};
9
+ _(fn).extend({
10
+ mergeOptions: function() {
11
+ return _(arguments).chain().toArray().reduce(function(result, options) { return _(result).extend(options); }, {})
12
+ .omit('class', 'className', 'inverseOf', 'parseName', 'through').value();
13
+ },
14
+
15
+ buildAssociation: function(associationType, associationName, options) {
16
+ function through() {
17
+ function association() {
18
+ var t = (_(options.through).isFunction() && options.through.call(this)) || _.str.camelize(options.through);
19
+ return this[t] && this[t]() && this[t]()[associationName] && this[t]()[associationName]();
20
+ }
21
+ return options.through && association.call(this);
18
22
  }
19
- return options.through && association.call(this);
20
- }
21
-
22
- function throughCollection() {
23
- return (this.collection && this.collection[associationName] && this.collection[associationName]()) ||
24
- (this._options && this._options.collection && this._options.collection[associationName] && this._options.collection[associationName]());
25
- }
26
23
 
27
- function createAssociation() {
28
- var self = this, collectionName = _.str.classify(associationName), className = options.className && _.str.classify(options.className),
29
- newOptions = mergeAssociationOptions(options, this._options);
30
-
31
- if (options.inverseOf) {
32
- newOptions[_.str.camelize(options.inverseOf)] = function() { return self; };
24
+ function throughCollection() {
25
+ return (this.collection && this.collection[associationName] && this.collection[associationName]()) ||
26
+ (this._options && this._options.collection && this._options.collection[associationName] && this._options.collection[associationName]());
33
27
  }
34
28
 
35
- return _((options['class'] && new options['class'](null, newOptions)) ||
36
- (className && namespace[className] && new namespace[className](null, newOptions)) ||
37
- (namespace[collectionName] && new namespace[collectionName](null, newOptions))).tap(function(association) {
38
- through.call(self, association);
39
- });
40
- }
29
+ function createAssociation() {
30
+ var self = this, collectionName = _.str.classify(associationName), className = options.className && _.str.classify(options.className),
31
+ newOptions = fn.mergeOptions(options, globalOptions, this._options);
41
32
 
42
- var associations = {
43
- hasMany: createAssociation,
44
- hasOne: function() { return throughCollection.call(this) || createAssociation.call(this); },
45
- belongsTo: function() { return throughCollection.call(this) || through.call(this); }
46
- };
47
-
48
- this.prototype[associationName] = function() {
49
- return (this._associations || (this._associations = {})) && this._associations[associationName] ||
50
- (this._associations[associationName] = (this._options && _(this._options).result(associationName)) || associations[associationType].call(this));
51
- };
52
- }
53
-
54
- function parseAssociation(associationType, associationName, options) {
55
- function parseResponseWith(key, response) {
56
- var result;
57
- return _([_.str.camelize, _.str.underscored]).any(function(fn) {
58
- var k = fn(key);
59
- return (result = response[k] && {key: k, response: response[k]});
60
- }) && result || {response: null};
61
- }
33
+ if (options.inverseOf) {
34
+ newOptions[_.str.camelize(options.inverseOf)] = function() { return self; };
35
+ }
62
36
 
63
- function through(response) {
64
- var t = parseResponseWith(_(options).result('through'), response).response,
65
- singularAssociationName = _.singularize && _(associationName).singularize(),
66
- p = options.parseName || singularAssociationName;
67
- return {response: t && p && _(t)[associationType === 'hasOne' ? 'result' : 'pluck'](p)};
68
- }
37
+ return _((options['class'] && new options['class'](null, newOptions)) ||
38
+ (className && namespace[className] && new namespace[className](null, newOptions)) ||
39
+ (namespace[collectionName] && new namespace[collectionName](null, newOptions))).tap(function(association) {
40
+ through.call(self, association);
41
+ });
42
+ }
69
43
 
70
- if (options.parse) {
71
44
  var associations = {
72
- hasMany: function(assocResponse, association, newOptions) {
73
- association.add(assocResponse, newOptions);
74
- },
75
- hasOne: function(assocResponse, association, newOptions) {
76
- association.clear({silent: true}).set(assocResponse, newOptions);
77
- }
45
+ hasMany: createAssociation,
46
+ hasOne: function() { return throughCollection.call(this) || createAssociation.call(this); },
47
+ belongsTo: function() { return throughCollection.call(this) || through.call(this); }
78
48
  };
79
49
 
80
- if (associations[associationType]) {
81
- var parsers = this._parsers;
82
- if (_(parsers).isEmpty()) {
83
- this.prototype.parse = _(this.prototype.parse).wrap(function(oldParse, response) {
84
- var self = this;
85
- return _(oldParse.call(self, response)).tap(function(parsedResponse) {
86
- _(parsers)
87
- .chain()
88
- .map(function(parser) {
89
- return _(parser.parseFn.call(self).call(self, parsedResponse)).tap(function(result) {
90
- parser.associationFn.call(self, result.response);
91
- }).key;
92
- })
93
- .each(function(key) {
94
- return key && delete parsedResponse[key];
95
- });
96
- });
97
- });
98
- }
50
+ this.prototype[associationName] = function() {
51
+ return (this._associations || (this._associations = {})) && this._associations[associationName] ||
52
+ (this._associations[associationName] = (this._options && _(this._options).result(associationName)) || associations[associationType].call(this));
53
+ };
54
+ },
55
+
56
+ parseAssociation: function(associationType, associationName, options) {
57
+ function parseResponseWith(key, response) {
58
+ var result;
59
+ return _([_.str.camelize, _.str.underscored]).any(function(fn) {
60
+ var k = fn(key);
61
+ return (result = response[k] && {key: k, response: response[k]});
62
+ }) && result || {response: null};
63
+ }
64
+
65
+ function through(response) {
66
+ var t = parseResponseWith(_(options).result('through'), response).response,
67
+ singularAssociationName = _.singularize && _(associationName).singularize(),
68
+ p = options.parseName || singularAssociationName;
69
+ return {response: t && p && _(t)[associationType === 'hasOne' ? 'result' : 'pluck'](p)};
70
+ }
99
71
 
100
- this._parsers.push({
101
- parseFn: function() {
102
- return _(options.parse).isFunction() &&
103
- function(response) { return {response: options.parse.call(this, response) }; } ||
104
- function(response) {
105
- return (options.through && through.call(this, response)) ||
106
- (options.parseName && parseResponseWith(options.parseName, response)) ||
107
- (options.className && parseResponseWith(options.className, response)) ||
108
- parseResponseWith(associationName, response);
109
- };
72
+ if (options.parse) {
73
+ var associations = {
74
+ hasMany: function(assocResponse, association, newOptions) {
75
+ association.add(assocResponse, newOptions);
110
76
  },
111
- associationFn: function(assocResponse) {
112
- return assocResponse &&
113
- associations[associationType].call(this, assocResponse, this[associationName](), mergeAssociationOptions(options, this._options));
77
+ hasOne: function(assocResponse, association, newOptions) {
78
+ association.clear({silent: true}).set(assocResponse, newOptions);
114
79
  }
115
- });
80
+ };
81
+
82
+ if (associations[associationType]) {
83
+ var parsers = this._parsers;
84
+ if (_(parsers).isEmpty()) {
85
+ this.prototype.parse = _(this.prototype.parse).wrap(function(oldParse, response) {
86
+ var self = this;
87
+ return _(oldParse.call(self, response)).tap(function(parsedResponse) {
88
+ _(parsers)
89
+ .chain()
90
+ .map(function(parser) {
91
+ return _(parser.parseFn.call(self).call(self, parsedResponse)).tap(function(result) {
92
+ parser.associationFn.call(self, result.response);
93
+ }).key;
94
+ })
95
+ .each(function(key) {
96
+ return key && delete parsedResponse[key];
97
+ });
98
+ });
99
+ });
100
+ }
101
+
102
+ this._parsers.push({
103
+ parseFn: function() {
104
+ return _(options.parse).isFunction() &&
105
+ function(response) { return {response: options.parse.call(this, response) }; } ||
106
+ function(response) {
107
+ return (options.through && through.call(this, response)) ||
108
+ (options.parseName && parseResponseWith(options.parseName, response)) ||
109
+ (options.className && parseResponseWith(options.className, response)) ||
110
+ parseResponseWith(associationName, response);
111
+ };
112
+ },
113
+ associationFn: function(assocResponse) {
114
+ return assocResponse &&
115
+ associations[associationType].call(this, assocResponse, this[associationName](), fn.mergeOptions(options, globalOptions, this._options));
116
+ }
117
+ });
118
+ }
116
119
  }
117
120
  }
118
- }
121
+ });
119
122
 
120
123
  return {
121
124
  included: function(source) {
@@ -128,8 +131,8 @@
128
131
  if (options.parse && !_(this).has('_parsers')) {
129
132
  this._parsers = [];
130
133
  }
131
- buildAssociation.call(this, associationType, associationName, options);
132
- parseAssociation.call(this, associationType, associationName, options);
134
+ fn.buildAssociation.call(this, associationType, associationName, options);
135
+ fn.parseAssociation.call(this, associationType, associationName, options);
133
136
  return this;
134
137
  };
135
138
  return associations;
@@ -164,6 +167,7 @@
164
167
  }
165
168
  };
166
169
  }
170
+ mixin.fn = fn;
167
171
 
168
172
  Backbone.extensions = _(Backbone.extensions || {}).extend({associations: mixin});
169
173
  }).call(this, _, Backbone);
@@ -1,3 +1,3 @@
1
1
  module BackboneExtensions
2
- VERSION = '0.0.17'
2
+ VERSION = '0.0.18'
3
3
  end
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.17
4
+ version: 0.0.18
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-01-17 00:00:00.000000000 Z
13
+ date: 2013-01-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: fuubar
@@ -126,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
126
  version: '0'
127
127
  segments:
128
128
  - 0
129
- hash: -3752352878697027147
129
+ hash: 1206709655256402287
130
130
  required_rubygems_version: !ruby/object:Gem::Requirement
131
131
  none: false
132
132
  requirements:
@@ -135,10 +135,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
135
  version: '0'
136
136
  segments:
137
137
  - 0
138
- hash: -3752352878697027147
138
+ hash: 1206709655256402287
139
139
  requirements: []
140
140
  rubyforge_project:
141
- rubygems_version: 1.8.21
141
+ rubygems_version: 1.8.24
142
142
  signing_key:
143
143
  specification_version: 3
144
144
  summary: Extensions to backbone javascript library as a rails engine