backbone-relational-rails 0.8.5 → 0.8.6

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.
@@ -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: []