backbone-relational-rails 0.8.5 → 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a358ff7e2c4cabae8dbddc3fbe53df8a87ff168c
4
+ data.tar.gz: 1c0de4ed22b1e62f19050ddb1811ae417e026adf
5
+ SHA512:
6
+ metadata.gz: 14f7c8b8e3385e59d57cc4de3c5a114559bfaa6af8d79de6e5e3004a4cd78a645e55d1539a582818cf0c570d91e4024090aa9ccaaef9f248641cf8f8a37cf46e
7
+ data.tar.gz: f18037d420056d0e8be90af1b8a5dbcdeea84fe49905ed24f8174caa85665938ba0986cae98cc46a410c5477a2b7836ca4ce702de06a9a313d1efe53749424eb
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # backbone-relational-rails
2
2
 
3
3
  backbone-relational-rails wraps the [Backbone-relational](https://github.com/PaulUithol/Backbone-relational) library in a rails engine for simple
4
- use with the asset pipeline provided by rails 3.1. The gem includes the development (non-minified)
4
+ use with the asset pipeline first provided by rails 3.1. The gem includes the development (non-minified)
5
5
  source for ease of exploration. The asset pipeline will minify in production.
6
6
 
7
7
  Backbone-relational provides one-to-one, one-to-many and many-to-one relations between models for [Backbone](http://backbonejs.org/).
@@ -18,7 +18,7 @@ Add the following directive to your Javascript manifest file (application.js):
18
18
 
19
19
  ## Versioning
20
20
 
21
- backbone-relational-rails 0.8.5 == Backbone-relational 0.8.5
21
+ backbone-relational-rails 0.8.6 == Backbone-relational 0.8.6
22
22
 
23
23
  Every attempt is made to mirror the currently shipping Backbone-relational version number wherever possible.
24
24
  The major, minor, and patch version numbers will always represent the Backbone-relational version. Should a gem
@@ -1,7 +1,7 @@
1
1
  module Backbone
2
2
  module Relational
3
3
  module Rails
4
- VERSION = "0.8.5"
4
+ VERSION = "0.8.6"
5
5
  end
6
6
  end
7
7
  end
@@ -1,6 +1,6 @@
1
1
  /* vim: set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab: */
2
2
  /**
3
- * Backbone-relational.js 0.8.5
3
+ * Backbone-relational.js 0.8.6
4
4
  * (c) 2011-2013 Paul Uithol and contributors (https://github.com/PaulUithol/Backbone-relational/graphs/contributors)
5
5
  *
6
6
  * Backbone-relational may be freely distributed under the MIT license; see the accompanying LICENSE.txt.
@@ -17,7 +17,8 @@
17
17
  if ( typeof window === 'undefined' ) {
18
18
  _ = require( 'underscore' );
19
19
  Backbone = require( 'backbone' );
20
- exports = module.exports = Backbone;
20
+ exports = Backbone;
21
+ typeof module === 'undefined' || ( module.exports = exports );
21
22
  }
22
23
  else {
23
24
  _ = window._;
@@ -86,9 +87,21 @@
86
87
  }
87
88
  },
88
89
 
90
+ // Some of the queued events may trigger other blocking events. By
91
+ // copying the queue here it allows queued events to process closer to
92
+ // the natural order.
93
+ //
94
+ // queue events [ 'A', 'B', 'C' ]
95
+ // A handler of 'B' triggers 'D' and 'E'
96
+ // By copying `this._queue` this executes:
97
+ // [ 'A', 'B', 'D', 'E', 'C' ]
98
+ // The same order the would have executed if they didn't have to be
99
+ // delayed and queued.
89
100
  process: function() {
90
- while ( this._queue && this._queue.length ) {
91
- this._queue.shift()();
101
+ var queue = this._queue;
102
+ this._queue = [];
103
+ while ( queue && queue.length ) {
104
+ queue.shift()();
92
105
  }
93
106
  },
94
107
 
@@ -298,7 +311,9 @@
298
311
  rootModel = rootModel._superModel;
299
312
  }
300
313
 
301
- var coll = _.findWhere( this._collections, { model: rootModel } );
314
+ var coll = _.find( this._collections, function(item) {
315
+ return item.model === rootModel;
316
+ });
302
317
 
303
318
  if ( !coll && create !== false ) {
304
319
  coll = this._createCollection( rootModel );
@@ -407,6 +422,7 @@
407
422
  var modelColl = model.collection;
408
423
  coll.add( model );
409
424
  this.listenTo( model, 'destroy', this.unregister, this );
425
+ this.listenTo( model, 'relational:unregister', this.unregister, this );
410
426
  model.collection = modelColl;
411
427
  }
412
428
  },
@@ -446,10 +462,10 @@
446
462
  * Remove a 'model' from the store.
447
463
  * @param {Backbone.RelationalModel} model
448
464
  */
449
- unregister: function( model ) {
450
- this.stopListening( model, 'destroy', this.unregister );
465
+ unregister: function( model, collection, options ) {
466
+ this.stopListening( model );
451
467
  var coll = this.getCollection( model );
452
- coll && coll.remove( model );
468
+ coll && coll.remove( model, options );
453
469
  },
454
470
 
455
471
  /**
@@ -496,7 +512,12 @@
496
512
  this.keyDestination = this.options.keyDestination || this.keySource || this.key;
497
513
 
498
514
  this.model = this.options.model || this.instance.constructor;
515
+
499
516
  this.relatedModel = this.options.relatedModel;
517
+
518
+ if ( _.isFunction( this.relatedModel ) && !( this.relatedModel.prototype instanceof Backbone.RelationalModel ) ) {
519
+ this.relatedModel = _.result( this, 'relatedModel' );
520
+ }
500
521
  if ( _.isString( this.relatedModel ) ) {
501
522
  this.relatedModel = Backbone.Relational.store.getObjectByName( this.relatedModel );
502
523
  }
@@ -528,7 +549,7 @@
528
549
 
529
550
  // Explicitly clear 'keySource', to prevent a leaky abstraction if 'keySource' differs from 'key'.
530
551
  if ( this.keySource !== this.key ) {
531
- this.instance.unset( this.keySource, { silent: true } );
552
+ delete this.instance.attributes[ this.keySource ];
532
553
  }
533
554
 
534
555
  // Add this Relation to instance._relations
@@ -829,6 +850,9 @@
829
850
 
830
851
  // Handle a custom 'collectionType'
831
852
  this.collectionType = this.options.collectionType;
853
+ if ( _.isFunction( this.collectionType ) && this.collectionType !== Backbone.Collection && !( this.collectionType.prototype instanceof Backbone.Collection ) ) {
854
+ this.collectionType = _.result( this, 'collectionType' );
855
+ }
832
856
  if ( _.isString( this.collectionType ) ) {
833
857
  this.collectionType = Backbone.Relational.store.getObjectByName( this.collectionType );
834
858
  }
@@ -1064,6 +1088,7 @@
1064
1088
  _isInitialized: false,
1065
1089
  _deferProcessing: false,
1066
1090
  _queue: null,
1091
+ _attributeChangeFired: false, // Keeps track of `change` event firing under some conditions (like nested `set`s)
1067
1092
 
1068
1093
  subModelTypeAttribute: 'type',
1069
1094
  subModelTypes: null,
@@ -1128,7 +1153,9 @@
1128
1153
  // Determine if the `change` event is still valid, now that all relations are populated
1129
1154
  var changed = true;
1130
1155
  if ( eventName === 'change' ) {
1131
- changed = dit.hasChanged();
1156
+ // `hasChanged` may have gotten reset by nested calls to `set`.
1157
+ changed = dit.hasChanged() || dit._attributeChangeFired;
1158
+ dit._attributeChangeFired = false;
1132
1159
  }
1133
1160
  else {
1134
1161
  var attr = eventName.slice( 7 ),
@@ -1137,7 +1164,7 @@
1137
1164
  if ( rel ) {
1138
1165
  // If `attr` is a relation, `change:attr` get triggered from `Relation.onChange`.
1139
1166
  // These take precedence over `change:attr` events triggered by `Model.set`.
1140
- // The relation set a fourth attribute to `true`. If this attribute is present,
1167
+ // The relation sets a fourth attribute to `true`. If this attribute is present,
1141
1168
  // continue triggering this event; otherwise, it's from `Model.set` and should be stopped.
1142
1169
  changed = ( args[ 4 ] === true );
1143
1170
 
@@ -1152,6 +1179,9 @@
1152
1179
  delete dit.changed[ attr ];
1153
1180
  }
1154
1181
  }
1182
+ else if ( changed ) {
1183
+ dit._attributeChangeFired = true;
1184
+ }
1155
1185
  }
1156
1186
 
1157
1187
  changed && Backbone.Model.prototype.trigger.apply( dit, args );
@@ -1172,7 +1202,7 @@
1172
1202
  this.acquire(); // Setting up relations often also involve calls to 'set', and we only want to enter this function once
1173
1203
  this._relations = {};
1174
1204
 
1175
- _.each( this.relations || [], function( rel ) {
1205
+ _.each( _.result( this, 'relations' ) || [], function( rel ) {
1176
1206
  Backbone.Relational.store.initializeRelation( this, rel, options );
1177
1207
  }, this );
1178
1208
 
@@ -1188,11 +1218,16 @@
1188
1218
  updateRelations: function( options ) {
1189
1219
  if ( this._isInitialized && !this.isLocked() ) {
1190
1220
  _.each( this._relations, function( rel ) {
1191
- // Update from data in `rel.keySource` if set, or `rel.key` otherwise
1221
+ // Update from data in `rel.keySource` if data got set in there, or `rel.key` otherwise
1192
1222
  var val = this.attributes[ rel.keySource ] || this.attributes[ rel.key ];
1193
1223
  if ( rel.related !== val ) {
1194
1224
  this.trigger( 'relational:change:' + rel.key, this, val, options || {} );
1195
1225
  }
1226
+
1227
+ // Explicitly clear 'keySource', to prevent a leaky abstraction if 'keySource' differs from 'key'.
1228
+ if ( rel.keySource !== rel.key ) {
1229
+ delete rel.instance.attributes[ rel.keySource ];
1230
+ }
1196
1231
  }, this );
1197
1232
  }
1198
1233
  },
@@ -1244,7 +1279,7 @@
1244
1279
  var setUrl,
1245
1280
  requests = [],
1246
1281
  rel = this.getRelation( key ),
1247
- idsToFetch = rel && ( rel.keyIds || ( ( rel.keyId || rel.keyId === 0 ) ? [ rel.keyId ] : [] ) );
1282
+ idsToFetch = rel && ( ( rel.keyIds && rel.keyIds.slice( 0 ) ) || ( ( rel.keyId || rel.keyId === 0 ) ? [ rel.keyId ] : [] ) );
1248
1283
 
1249
1284
  // On `refresh`, add the ids for current models in the relation to `idsToFetch`
1250
1285
  if ( refresh ) {
@@ -1329,11 +1364,19 @@
1329
1364
  // Go through all splits and return the final result
1330
1365
  var splits = attr.split( '.' );
1331
1366
  var result = _.reduce(splits, function( model, split ) {
1332
- if ( !( model instanceof Backbone.Model ) ) {
1333
- throw new Error( 'Attribute must be an instanceof Backbone.Model. Is: ' + model + ', currentSplit: ' + split );
1367
+ if ( _.isNull(model) || _.isUndefined( model ) ) {
1368
+ // Return undefined if the path cannot be expanded
1369
+ return undefined;
1370
+ }
1371
+ else if ( model instanceof Backbone.Model ) {
1372
+ return Backbone.Model.prototype.get.call( model, split );
1373
+ }
1374
+ else if ( model instanceof Backbone.Collection ) {
1375
+ return Backbone.Collection.prototype.at.call( model, split )
1376
+ }
1377
+ else {
1378
+ throw new Error( 'Attribute must be an instanceof Backbone.Model or Backbone.Collection. Is: ' + model + ', currentSplit: ' + split );
1334
1379
  }
1335
-
1336
- return Backbone.Model.prototype.get.call( model, split );
1337
1380
  }, this );
1338
1381
 
1339
1382
  if ( originalResult !== undefined && result !== undefined ) {
@@ -1389,30 +1432,6 @@
1389
1432
  return result;
1390
1433
  },
1391
1434
 
1392
- unset: function( attribute, options ) {
1393
- Backbone.Relational.eventQueue.block();
1394
-
1395
- var result = Backbone.Model.prototype.unset.apply( this, arguments );
1396
- this.updateRelations( options );
1397
-
1398
- // Try to run the global queue holding external events
1399
- Backbone.Relational.eventQueue.unblock();
1400
-
1401
- return result;
1402
- },
1403
-
1404
- clear: function( options ) {
1405
- Backbone.Relational.eventQueue.block();
1406
-
1407
- var result = Backbone.Model.prototype.clear.apply( this, arguments );
1408
- this.updateRelations( options );
1409
-
1410
- // Try to run the global queue holding external events
1411
- Backbone.Relational.eventQueue.unblock();
1412
-
1413
- return result;
1414
- },
1415
-
1416
1435
  clone: function() {
1417
1436
  var attributes = _.clone( this.attributes );
1418
1437
  if ( !_.isUndefined( attributes[ this.idAttribute ] ) ) {
@@ -1569,57 +1588,92 @@
1569
1588
  * @return {Backbone.Model}
1570
1589
  */
1571
1590
  build: function( attributes, options ) {
1572
- var model = this;
1573
-
1574
1591
  // 'build' is a possible entrypoint; it's possible no model hierarchy has been determined yet.
1575
1592
  this.initializeModelHierarchy();
1576
1593
 
1577
1594
  // Determine what type of (sub)model should be built if applicable.
1578
- // Lookup the proper subModelType in 'this._subModels'.
1579
- if ( this._subModels && this.prototype.subModelTypeAttribute in attributes ) {
1580
- var subModelTypeAttribute = attributes[ this.prototype.subModelTypeAttribute ];
1581
- var subModelType = this._subModels[ subModelTypeAttribute ];
1595
+ var model = this._findSubModelType(this, attributes) || this;
1596
+
1597
+ return new model( attributes, options );
1598
+ },
1599
+
1600
+ /**
1601
+ * Determines what type of (sub)model should be built if applicable.
1602
+ * Looks up the proper subModelType in 'this._subModels', recursing into
1603
+ * types until a match is found. Returns the applicable 'Backbone.Model'
1604
+ * or null if no match is found.
1605
+ * @param {Backbone.Model} type
1606
+ * @param {Object} attributes
1607
+ * @return {Backbone.Model}
1608
+ */
1609
+ _findSubModelType: function (type, attributes) {
1610
+ if ( type._subModels && type.prototype.subModelTypeAttribute in attributes ) {
1611
+ var subModelTypeAttribute = attributes[type.prototype.subModelTypeAttribute];
1612
+ var subModelType = type._subModels[subModelTypeAttribute];
1582
1613
  if ( subModelType ) {
1583
- model = subModelType;
1614
+ return subModelType;
1615
+ } else {
1616
+ // Recurse into subModelTypes to find a match
1617
+ for ( subModelTypeAttribute in type._subModels ) {
1618
+ subModelType = this._findSubModelType(type._subModels[subModelTypeAttribute], attributes);
1619
+ if ( subModelType ) {
1620
+ return subModelType;
1621
+ }
1622
+ }
1584
1623
  }
1585
1624
  }
1586
-
1587
- return new model( attributes, options );
1625
+ return null;
1588
1626
  },
1589
1627
 
1590
1628
  /**
1591
1629
  *
1592
1630
  */
1593
1631
  initializeModelHierarchy: function() {
1594
- // If we're here for the first time, try to determine if this modelType has a 'superModel'.
1595
- if ( _.isUndefined( this._superModel ) || _.isNull( this._superModel ) ) {
1596
- Backbone.Relational.store.setupSuperModel( this );
1597
-
1598
- // If a superModel has been found, copy relations from the _superModel if they haven't been
1599
- // inherited automatically (due to a redefinition of 'relations').
1600
- // Otherwise, make sure we don't get here again for this type by making '_superModel' false so we fail
1601
- // the isUndefined/isNull check next time.
1602
- if ( this._superModel && this._superModel.prototype.relations ) {
1603
- // Find relations that exist on the `_superModel`, but not yet on this model.
1632
+ // Inherit any relations that have been defined in the parent model.
1633
+ this.inheritRelations();
1634
+
1635
+ // If we came here through 'build' for a model that has 'subModelTypes' then try to initialize the ones that
1636
+ // haven't been resolved yet.
1637
+ if ( this.prototype.subModelTypes ) {
1638
+ var resolvedSubModels = _.keys(this._subModels);
1639
+ var unresolvedSubModels = _.omit(this.prototype.subModelTypes, resolvedSubModels);
1640
+ _.each( unresolvedSubModels, function( subModelTypeName ) {
1641
+ var subModelType = Backbone.Relational.store.getObjectByName( subModelTypeName );
1642
+ subModelType && subModelType.initializeModelHierarchy();
1643
+ });
1644
+ }
1645
+ },
1646
+
1647
+ inheritRelations: function() {
1648
+ // Bail out if we've been here before.
1649
+ if (!_.isUndefined( this._superModel ) && !_.isNull( this._superModel )) {
1650
+ return;
1651
+ }
1652
+ // Try to initialize the _superModel.
1653
+ Backbone.Relational.store.setupSuperModel( this );
1654
+
1655
+ // If a superModel has been found, copy relations from the _superModel if they haven't been inherited automatically
1656
+ // (due to a redefinition of 'relations').
1657
+ if ( this._superModel ) {
1658
+ // The _superModel needs a chance to initialize its own inherited relations before we attempt to inherit relations
1659
+ // from the _superModel. You don't want to call 'initializeModelHierarchy' because that could cause sub-models of
1660
+ // this class to inherit their relations before this class has had chance to inherit it's relations.
1661
+ this._superModel.inheritRelations();
1662
+ if ( this._superModel.prototype.relations ) {
1663
+ // Find relations that exist on the '_superModel', but not yet on this model.
1604
1664
  var inheritedRelations = _.select( this._superModel.prototype.relations || [], function( superRel ) {
1605
1665
  return !_.any( this.prototype.relations || [], function( rel ) {
1606
1666
  return superRel.relatedModel === rel.relatedModel && superRel.key === rel.key;
1607
1667
  }, this );
1608
1668
  }, this );
1609
-
1669
+
1610
1670
  this.prototype.relations = inheritedRelations.concat( this.prototype.relations );
1611
1671
  }
1612
- else {
1613
- this._superModel = false;
1614
- }
1615
1672
  }
1616
-
1617
- // If we came here through 'build' for a model that has 'subModelTypes', and not all of them have been resolved yet, try to resolve each.
1618
- if ( this.prototype.subModelTypes && _.keys( this.prototype.subModelTypes ).length !== _.keys( this._subModels ).length ) {
1619
- _.each( this.prototype.subModelTypes || [], function( subModelTypeName ) {
1620
- var subModelType = Backbone.Relational.store.getObjectByName( subModelTypeName );
1621
- subModelType && subModelType.initializeModelHierarchy();
1622
- });
1673
+ // Otherwise, make sure we don't get here again for this type by making '_superModel' false so we fail the
1674
+ // isUndefined/isNull check next time.
1675
+ else {
1676
+ this._superModel = false;
1623
1677
  }
1624
1678
  },
1625
1679
 
@@ -1638,7 +1692,7 @@
1638
1692
  findOrCreate: function( attributes, options ) {
1639
1693
  options || ( options = {} );
1640
1694
  var parsedAttributes = ( _.isObject( attributes ) && options.parse && this.prototype.parse ) ?
1641
- this.prototype.parse( attributes ) : attributes;
1695
+ this.prototype.parse( _.clone( attributes ) ) : attributes;
1642
1696
 
1643
1697
  // Try to find an instance of 'this' model type in the store
1644
1698
  var model = Backbone.Relational.store.find( this, parsedAttributes );
@@ -1647,8 +1701,9 @@
1647
1701
  // If not, create an instance (unless 'options.create' is false).
1648
1702
  if ( _.isObject( attributes ) ) {
1649
1703
  if ( model && options.merge !== false ) {
1650
- // Make sure `options.collection` doesn't cascade to nested models
1704
+ // Make sure `options.collection` and `options.url` doesn't cascade to nested models
1651
1705
  delete options.collection;
1706
+ delete options.url;
1652
1707
 
1653
1708
  model.set( parsedAttributes, options );
1654
1709
  }
@@ -1658,6 +1713,22 @@
1658
1713
  }
1659
1714
 
1660
1715
  return model;
1716
+ },
1717
+
1718
+ /**
1719
+ * Find an instance of `this` type in 'Backbone.Relational.store'.
1720
+ * - If `attributes` is a string or a number, `find` will just query the `store` and return a model if found.
1721
+ * - If `attributes` is an object and is found in the store, the model will be updated with `attributes` unless `options.update` is `false`.
1722
+ * @param {Object|String|Number} attributes Either a model's id, or the attributes used to create or update a model.
1723
+ * @param {Object} [options]
1724
+ * @param {Boolean} [options.merge=true]
1725
+ * @param {Boolean} [options.parse=false]
1726
+ * @return {Backbone.RelationalModel}
1727
+ */
1728
+ find: function( attributes, options ) {
1729
+ options || ( options = {} );
1730
+ options.create = false;
1731
+ return this.findOrCreate( attributes, options );
1661
1732
  }
1662
1733
  });
1663
1734
  _.extend( Backbone.RelationalModel.prototype, Backbone.Semaphore );
@@ -1765,14 +1836,14 @@
1765
1836
  return remove.apply( this, arguments );
1766
1837
  }
1767
1838
 
1768
- models = _.isArray( models ) ? models.slice() : [ models ];
1839
+ models = _.isArray( models ) ? models.slice( 0 ) : [ models ];
1769
1840
  options || ( options = {} );
1770
1841
 
1771
1842
  var toRemove = [];
1772
1843
 
1773
1844
  //console.debug('calling remove on coll=%o; models=%o, options=%o', this, models, options );
1774
1845
  _.each( models, function( model ) {
1775
- model = this.get( model ) || this.get( model.cid );
1846
+ model = this.get( model ) || ( model && this.get( model.cid ) );
1776
1847
  model && toRemove.push( model );
1777
1848
  }, this );
1778
1849
 
@@ -1827,7 +1898,7 @@
1827
1898
  return trigger.apply( this, arguments );
1828
1899
  }
1829
1900
 
1830
- if ( eventName === 'add' || eventName === 'remove' || eventName === 'reset' ) {
1901
+ if ( eventName === 'add' || eventName === 'remove' || eventName === 'reset' || eventName === 'sort' ) {
1831
1902
  var dit = this,
1832
1903
  args = arguments;
1833
1904
 
metadata CHANGED
@@ -1,30 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: backbone-relational-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.5
5
- prerelease:
4
+ version: 0.8.6
6
5
  platform: ruby
7
6
  authors:
8
7
  - Peter Marsh
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-11 00:00:00.000000000 Z
11
+ date: 2013-08-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: railties
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '3.1'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '3.1'
30
27
  description: Backbone-relational provides one-to-one, one-to-many and many-to-one
@@ -35,41 +32,34 @@ executables: []
35
32
  extensions: []
36
33
  extra_rdoc_files: []
37
34
  files:
38
- - lib/backbone-relational-rails.rb
39
35
  - lib/backbone-relational-rails/version.rb
36
+ - lib/backbone-relational-rails.rb
40
37
  - vendor/assets/javascripts/backbone-relational.js
41
38
  - LICENSE
42
39
  - README.md
43
40
  homepage: http://github.com/petedmarsh/backbone-relational-rails
44
41
  licenses:
45
42
  - MIT
43
+ metadata: {}
46
44
  post_install_message:
47
45
  rdoc_options: []
48
46
  require_paths:
49
47
  - lib
50
48
  - vendor
51
49
  required_ruby_version: !ruby/object:Gem::Requirement
52
- none: false
53
50
  requirements:
54
- - - ! '>='
51
+ - - '>='
55
52
  - !ruby/object:Gem::Version
56
53
  version: '0'
57
- segments:
58
- - 0
59
- hash: -3926763858083606606
60
54
  required_rubygems_version: !ruby/object:Gem::Requirement
61
- none: false
62
55
  requirements:
63
- - - ! '>='
56
+ - - '>='
64
57
  - !ruby/object:Gem::Version
65
58
  version: '0'
66
- segments:
67
- - 0
68
- hash: -3926763858083606606
69
59
  requirements: []
70
60
  rubyforge_project:
71
- rubygems_version: 1.8.24
61
+ rubygems_version: 2.0.3
72
62
  signing_key:
73
- specification_version: 3
63
+ specification_version: 4
74
64
  summary: Backbone-relational packaged for Rails
75
65
  test_files: []