backbone-rails 0.5.0 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -15,12 +15,20 @@ Add it to your Gemfile:
15
15
 
16
16
  gem 'backbone-rails'
17
17
 
18
- Require what you need in `app/assets/javascripts/application.js.coffee`:
18
+ Require backbone and its dependencies as a group in `app/assets/javascripts/application.js.coffee`:
19
+
20
+ #= require backbone-rails
21
+
22
+ With pure javascript, the lines would look like `app/assets/javascripts/application.js`:
23
+
24
+ //= require backbone-rails
25
+
26
+ Or if you need to, require what you need in `app/assets/javascripts/application.js.coffee`:
19
27
 
20
28
  #= require json2
21
29
  #= require underscore
22
30
  #= require backbone
23
-
31
+
24
32
  With pure javascript, the lines would look like `app/assets/javascripts/application.js`:
25
33
 
26
34
  //= require json2
@@ -37,4 +45,4 @@ The gem will follow backbone versioning.
37
45
 
38
46
  ## Contributors
39
47
 
40
- * [John Bintz](https://github.com/johnbintz) (Support for Rails 3.0 via generators)
48
+ * [John Bintz](https://github.com/johnbintz) (Support for Rails 3.0 via generators)
@@ -0,0 +1,3 @@
1
+ //= require json2
2
+ //= require underscore
3
+ //= require backbone
@@ -1,4 +1,4 @@
1
- // Backbone.js 0.5.0
1
+ // Backbone.js 0.5.2
2
2
  // (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
3
3
  // Backbone may be freely distributed under the MIT license.
4
4
  // For all details and documentation:
@@ -25,7 +25,7 @@
25
25
  }
26
26
 
27
27
  // Current version of the library. Keep in sync with `package.json`.
28
- Backbone.VERSION = '0.5.0';
28
+ Backbone.VERSION = '0.5.2';
29
29
 
30
30
  // Require Underscore, if we're on the server, and it's not already present.
31
31
  var _ = root._;
@@ -68,10 +68,10 @@
68
68
 
69
69
  // Bind an event, specified by a string name, `ev`, to a `callback` function.
70
70
  // Passing `"all"` will bind the callback to all events fired.
71
- bind : function(ev, callback) {
71
+ bind : function(ev, callback, context) {
72
72
  var calls = this._callbacks || (this._callbacks = {});
73
73
  var list = calls[ev] || (calls[ev] = []);
74
- list.push(callback);
74
+ list.push([callback, context]);
75
75
  return this;
76
76
  },
77
77
 
@@ -89,7 +89,7 @@
89
89
  var list = calls[ev];
90
90
  if (!list) return this;
91
91
  for (var i = 0, l = list.length; i < l; i++) {
92
- if (callback === list[i]) {
92
+ if (list[i] && callback === list[i][0]) {
93
93
  list[i] = null;
94
94
  break;
95
95
  }
@@ -114,7 +114,7 @@
114
114
  list.splice(i, 1); i--; l--;
115
115
  } else {
116
116
  args = both ? Array.prototype.slice.call(arguments, 1) : arguments;
117
- callback.apply(this, args);
117
+ callback[0].apply(callback[1] || this, args);
118
118
  }
119
119
  }
120
120
  }
@@ -133,7 +133,7 @@
133
133
  var defaults;
134
134
  attributes || (attributes = {});
135
135
  if (defaults = this.defaults) {
136
- if (_.isFunction(defaults)) defaults = defaults();
136
+ if (_.isFunction(defaults)) defaults = defaults.call(this);
137
137
  attributes = _.extend({}, defaults, attributes);
138
138
  }
139
139
  this.attributes = {};
@@ -143,7 +143,7 @@
143
143
  this._changed = false;
144
144
  this._previousAttributes = _.clone(this.attributes);
145
145
  if (options && options.collection) this.collection = options.collection;
146
- this.initialize.apply(this, arguments);
146
+ this.initialize(attributes, options);
147
147
  };
148
148
 
149
149
  // Attach all inheritable methods to the Model prototype.
@@ -582,7 +582,7 @@
582
582
  options || (options = {});
583
583
  model = this._prepareModel(model, options);
584
584
  if (!model) return false;
585
- var already = this.getByCid(model) || this.get(model);
585
+ var already = this.getByCid(model);
586
586
  if (already) throw new Error(["Can't add the same model to a set twice", already.id]);
587
587
  this._byId[model.id] = model;
588
588
  this._byCid[model.cid] = model;
@@ -640,7 +640,7 @@
640
640
  // Underscore methods that we want to implement on the Collection.
641
641
  var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', 'detect',
642
642
  'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include',
643
- 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size',
643
+ 'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size',
644
644
  'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty'];
645
645
 
646
646
  // Mix in each Underscore method as a proxy to `Collection#models`.
@@ -738,7 +738,7 @@
738
738
  };
739
739
 
740
740
  // Cached regex for cleaning hashes.
741
- var hashStrip = /^#*!?/;
741
+ var hashStrip = /^#*/;
742
742
 
743
743
  // Cached regex for detecting MSIE.
744
744
  var isExplorer = /msie [\w.]+/;
@@ -801,16 +801,18 @@
801
801
  // opened by a non-pushState browser.
802
802
  this.fragment = fragment;
803
803
  historyStarted = true;
804
- var started = this.loadUrl() || this.loadUrl(window.location.hash);
805
- var atRoot = window.location.pathname == this.options.root;
804
+ var loc = window.location;
805
+ var atRoot = loc.pathname == this.options.root;
806
806
  if (this._wantsPushState && !this._hasPushState && !atRoot) {
807
807
  this.fragment = this.getFragment(null, true);
808
- window.location = this.options.root + '#' + this.fragment;
809
- } else if (this._wantsPushState && this._hasPushState && atRoot && window.location.hash) {
810
- this.navigate(window.location.hash);
811
- } else {
812
- return started;
808
+ window.location.replace(this.options.root + '#' + this.fragment);
809
+ // Return immediately as browser will do redirect to new url
810
+ return true;
811
+ } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) {
812
+ this.fragment = loc.hash.replace(hashStrip, '');
813
+ window.history.replaceState({}, document.title, loc.protocol + '//' + loc.host + this.options.root + this.fragment);
813
814
  }
815
+ return this.loadUrl();
814
816
  },
815
817
 
816
818
  // Add a route to be tested when the fragment changes. Routes added later may
@@ -847,18 +849,18 @@
847
849
  // URL-encoding the fragment in advance. This does not trigger
848
850
  // a `hashchange` event.
849
851
  navigate : function(fragment, triggerRoute) {
850
- fragment = (fragment || '').replace(hashStrip, '');
851
- if (this.fragment == fragment || this.fragment == decodeURIComponent(fragment)) return;
852
+ var frag = (fragment || '').replace(hashStrip, '');
853
+ if (this.fragment == frag || this.fragment == decodeURIComponent(frag)) return;
852
854
  if (this._hasPushState) {
853
855
  var loc = window.location;
854
- if (fragment.indexOf(this.options.root) != 0) fragment = this.options.root + fragment;
855
- this.fragment = fragment;
856
- window.history.pushState({}, document.title, loc.protocol + '//' + loc.host + fragment);
856
+ if (frag.indexOf(this.options.root) != 0) frag = this.options.root + frag;
857
+ this.fragment = frag;
858
+ window.history.pushState({}, document.title, loc.protocol + '//' + loc.host + frag);
857
859
  } else {
858
- window.location.hash = this.fragment = fragment;
859
- if (this.iframe && (fragment != this.getFragment(this.iframe.location.hash))) {
860
+ window.location.hash = this.fragment = frag;
861
+ if (this.iframe && (frag != this.getFragment(this.iframe.location.hash))) {
860
862
  this.iframe.document.open().close();
861
- this.iframe.location.hash = fragment;
863
+ this.iframe.location.hash = frag;
862
864
  }
863
865
  }
864
866
  if (triggerRoute) this.loadUrl(fragment);
@@ -1035,8 +1037,7 @@
1035
1037
  // Default JSON-request options.
1036
1038
  var params = _.extend({
1037
1039
  type: type,
1038
- dataType: 'json',
1039
- processData: false
1040
+ dataType: 'json'
1040
1041
  }, options);
1041
1042
 
1042
1043
  // Ensure that we have a URL.
@@ -1053,7 +1054,6 @@
1053
1054
  // For older servers, emulate JSON by encoding the request into an HTML-form.
1054
1055
  if (Backbone.emulateJSON) {
1055
1056
  params.contentType = 'application/x-www-form-urlencoded';
1056
- params.processData = true;
1057
1057
  params.data = params.data ? {model : params.data} : {};
1058
1058
  }
1059
1059
 
@@ -1069,6 +1069,11 @@
1069
1069
  }
1070
1070
  }
1071
1071
 
1072
+ // Don't process data on a non-GET request.
1073
+ if (params.type !== 'GET') {
1074
+ params.processData = false;
1075
+ }
1076
+
1072
1077
  // Make the request.
1073
1078
  return $.ajax(params);
1074
1079
  };
@@ -1143,7 +1148,7 @@
1143
1148
 
1144
1149
  // Helper function to escape a string for HTML rendering.
1145
1150
  var escapeHTML = function(string) {
1146
- return string.replace(/&(?!\w+;|#\d+;|#x[\da-f]+;)/gi, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27').replace(/\//g,'&#x2F;');
1151
+ return string.replace(/&(?!\w+;|#\d+;|#x[\da-f]+;)/gi, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g,'&#x2F;');
1147
1152
  };
1148
1153
 
1149
1154
  }).call(this);
@@ -1,4 +1,4 @@
1
- // Underscore.js 1.1.6
1
+ // Underscore.js 1.1.7
2
2
  // (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
3
3
  // Underscore is freely distributable under the MIT license.
4
4
  // Portions of Underscore are inspired or borrowed from Prototype,
@@ -55,25 +55,26 @@
55
55
  module.exports = _;
56
56
  _._ = _;
57
57
  } else {
58
- root._ = _;
58
+ // Exported as a string, for Closure Compiler "advanced" mode.
59
+ root['_'] = _;
59
60
  }
60
61
 
61
62
  // Current version.
62
- _.VERSION = '1.1.6';
63
+ _.VERSION = '1.1.7';
63
64
 
64
65
  // Collection Functions
65
66
  // --------------------
66
67
 
67
68
  // The cornerstone, an `each` implementation, aka `forEach`.
68
- // Handles objects implementing `forEach`, arrays, and raw objects.
69
+ // Handles objects with the built-in `forEach`, arrays, and raw objects.
69
70
  // Delegates to **ECMAScript 5**'s native `forEach` if available.
70
71
  var each = _.each = _.forEach = function(obj, iterator, context) {
71
72
  if (obj == null) return;
72
73
  if (nativeForEach && obj.forEach === nativeForEach) {
73
74
  obj.forEach(iterator, context);
74
- } else if (_.isNumber(obj.length)) {
75
+ } else if (obj.length === +obj.length) {
75
76
  for (var i = 0, l = obj.length; i < l; i++) {
76
- if (iterator.call(context, obj[i], i, obj) === breaker) return;
77
+ if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
77
78
  }
78
79
  } else {
79
80
  for (var key in obj) {
@@ -106,7 +107,7 @@
106
107
  return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
107
108
  }
108
109
  each(obj, function(value, index, list) {
109
- if (!initial && index === 0) {
110
+ if (!initial) {
110
111
  memo = value;
111
112
  initial = true;
112
113
  } else {
@@ -181,14 +182,14 @@
181
182
  // Delegates to **ECMAScript 5**'s native `some` if available.
182
183
  // Aliased as `any`.
183
184
  var any = _.some = _.any = function(obj, iterator, context) {
184
- iterator || (iterator = _.identity);
185
+ iterator = iterator || _.identity;
185
186
  var result = false;
186
187
  if (obj == null) return result;
187
188
  if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
188
189
  each(obj, function(value, index, list) {
189
- if (result = iterator.call(context, value, index, list)) return breaker;
190
+ if (result |= iterator.call(context, value, index, list)) return breaker;
190
191
  });
191
- return result;
192
+ return !!result;
192
193
  };
193
194
 
194
195
  // Determine if a given value is included in the array or object using `===`.
@@ -251,6 +252,16 @@
251
252
  }), 'value');
252
253
  };
253
254
 
255
+ // Groups the object's values by a criterion produced by an iterator
256
+ _.groupBy = function(obj, iterator) {
257
+ var result = {};
258
+ each(obj, function(value, index) {
259
+ var key = iterator(value, index);
260
+ (result[key] || (result[key] = [])).push(value);
261
+ });
262
+ return result;
263
+ };
264
+
254
265
  // Use a comparator function to figure out at what index an object should
255
266
  // be inserted so as to maintain order. Uses binary search.
256
267
  _.sortedIndex = function(array, obj, iterator) {
@@ -267,7 +278,7 @@
267
278
  _.toArray = function(iterable) {
268
279
  if (!iterable) return [];
269
280
  if (iterable.toArray) return iterable.toArray();
270
- if (_.isArray(iterable)) return iterable;
281
+ if (_.isArray(iterable)) return slice.call(iterable);
271
282
  if (_.isArguments(iterable)) return slice.call(iterable);
272
283
  return _.values(iterable);
273
284
  };
@@ -316,8 +327,7 @@
316
327
 
317
328
  // Return a version of the array that does not contain the specified value(s).
318
329
  _.without = function(array) {
319
- var values = slice.call(arguments, 1);
320
- return _.filter(array, function(value){ return !_.include(values, value); });
330
+ return _.difference(array, slice.call(arguments, 1));
321
331
  };
322
332
 
323
333
  // Produce a duplicate-free version of the array. If the array has already
@@ -330,9 +340,15 @@
330
340
  }, []);
331
341
  };
332
342
 
343
+ // Produce an array that contains the union: each distinct element from all of
344
+ // the passed-in arrays.
345
+ _.union = function() {
346
+ return _.uniq(_.flatten(arguments));
347
+ };
348
+
333
349
  // Produce an array that contains every item shared between all the
334
- // passed-in arrays.
335
- _.intersect = function(array) {
350
+ // passed-in arrays. (Aliased as "intersect" for back-compat.)
351
+ _.intersection = _.intersect = function(array) {
336
352
  var rest = slice.call(arguments, 1);
337
353
  return _.filter(_.uniq(array), function(item) {
338
354
  return _.every(rest, function(other) {
@@ -341,6 +357,12 @@
341
357
  });
342
358
  };
343
359
 
360
+ // Take the difference between one array and another.
361
+ // Only the elements present in just the first array will remain.
362
+ _.difference = function(array, other) {
363
+ return _.filter(array, function(value){ return !_.include(other, value); });
364
+ };
365
+
344
366
  // Zip together multiple lists into a single array -- elements that share
345
367
  // an index go together.
346
368
  _.zip = function() {
@@ -502,7 +524,7 @@
502
524
  var funcs = slice.call(arguments);
503
525
  return function() {
504
526
  var args = slice.call(arguments);
505
- for (var i=funcs.length-1; i >= 0; i--) {
527
+ for (var i = funcs.length - 1; i >= 0; i--) {
506
528
  args = [funcs[i].apply(this, args)];
507
529
  }
508
530
  return args[0];
@@ -537,7 +559,11 @@
537
559
  // Return a sorted list of the function names available on the object.
538
560
  // Aliased as `methods`
539
561
  _.functions = _.methods = function(obj) {
540
- return _.filter(_.keys(obj), function(key){ return _.isFunction(obj[key]); }).sort();
562
+ var names = [];
563
+ for (var key in obj) {
564
+ if (_.isFunction(obj[key])) names.push(key);
565
+ }
566
+ return names.sort();
541
567
  };
542
568
 
543
569
  // Extend a given object with all the properties in passed-in object(s).
@@ -589,6 +615,7 @@
589
615
  if (b._chain) b = b._wrapped;
590
616
  // One of them implements an isEqual()?
591
617
  if (a.isEqual) return a.isEqual(b);
618
+ if (b.isEqual) return b.isEqual(a);
592
619
  // Check dates' integer values.
593
620
  if (_.isDate(a) && _.isDate(b)) return a.getTime() === b.getTime();
594
621
  // Both are NaN?
@@ -630,6 +657,11 @@
630
657
  return toString.call(obj) === '[object Array]';
631
658
  };
632
659
 
660
+ // Is a given variable an object?
661
+ _.isObject = function(obj) {
662
+ return obj === Object(obj);
663
+ };
664
+
633
665
  // Is a given variable an arguments object?
634
666
  _.isArguments = function(obj) {
635
667
  return !!(obj && hasOwnProperty.call(obj, 'callee'));
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: backbone-rails
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.5.0
5
+ version: 0.5.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Alexander Flatter
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-02 00:00:00 Z
13
+ date: 2011-08-07 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -39,6 +39,7 @@ files:
39
39
  - lib/backbone-rails/railtie.rb
40
40
  - vendor/assets/javascripts/underscore.js
41
41
  - vendor/assets/javascripts/backbone.js
42
+ - vendor/assets/javascripts/backbone-rails.js
42
43
  - vendor/assets/javascripts/json2.js
43
44
  - vendor/assets/javascripts/backbone.js.old
44
45
  - MIT-LICENSE