entangled 1.0.0 → 1.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 649b29eea5ea0dc9eace2894d0148d56da8f399d
4
- data.tar.gz: 4f953eb1346e25e18dd454eb3d242a61c4a5de29
3
+ metadata.gz: 5db877e73b773137a344a30a7fbd60e4b776a2f4
4
+ data.tar.gz: 87bace7bd139ef2f1390781a6fee8a1cfd0d71ed
5
5
  SHA512:
6
- metadata.gz: 817952ec954be7ace05c7600198f8b8d816ba80fed675ffbbda7072251fa8f74372b38d9ecd169872dfa995f2879273c23baf2f70b12aaf2504d68f617dd8a94
7
- data.tar.gz: c31e873d11650270025a0bf8cd8e55fb182fb06f235ae302493dcb9ba7bdcba84c9e56dc66d542d7d15a768623cac3c74e41d2c46c0e75fc6d9096c38d0761f3
6
+ metadata.gz: 7694fc7b3b96bd12798ffe79c06c12d98f5a862d6311ca890276b558fd9dbdafe810f7207a199f49e1867fcd3f2cf2a43def59366ddd83dc0aa0e6c649047811
7
+ data.tar.gz: bc01db80bf25ad69bcb20374262d485394421d17c681e6e408c84157bfda087ba0dc7591327dac045308ab6bb217c892f59b03a36aea2db9a72a85573a08dfb3
data/README.md CHANGED
@@ -6,7 +6,7 @@ Real time is important. Users have come to expect real time behavior from every
6
6
 
7
7
  Entangled stores and syncs data from ActiveRecord instantly across every device. It is a layer behind your models and controllers that pushes updates to all connected clients in real time. It is cross-browser compatible and offers real time validations.
8
8
 
9
- Currently, Entangled runs on Rails 4.2 and Ruby 2.0. In the front end, libraries are available in [plain JavaScript](https://github.com/dchacke/entangled-js) and for [Angular](https://github.com/dchacke/entangled-angular).
9
+ Currently, Entangled runs on Rails 4.2 and Ruby >= 2.0.0. In the front end, libraries are available in [plain JavaScript](https://github.com/dchacke/entangled-js) and for [Angular](https://github.com/dchacke/entangled-angular).
10
10
 
11
11
  ## Installation
12
12
  Add this line to your application's Gemfile:
@@ -236,7 +236,7 @@ class ChildrenController < ApplicationController
236
236
  # Fetch children of specific parent
237
237
  def index
238
238
  broadcast do
239
- @children = Parent.find(params[:parent_id]).children
239
+ @children = Child.where(parent_id: params[:parent_id])
240
240
  end
241
241
  end
242
242
 
@@ -270,6 +270,10 @@ The gem relies heavily on convention over configuration and currently only works
270
270
  ## Development Priorities
271
271
  The following features are to be implemented next:
272
272
 
273
+ - Run RSpec on Codeship against multiple Ruby versions
274
+ - Do not build channels for nil parents
275
+ - Make prefix of create path `create_message` instead of `create_messages`
276
+ - Add something like `spec.required_ruby_version = '>= 2.0.0'` to gemspec, see http://guides.rubygems.org/specification-reference/#required_ruby_version=, and then try downloading gem
273
277
  - Support `belongsTo` in front end
274
278
  - Support `has_one` association in back end and front end
275
279
  - Add offline capabilities
data/entangled.gemspec CHANGED
@@ -4,6 +4,8 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'entangled/version'
5
5
 
6
6
  Gem::Specification.new do |s|
7
+ s.required_ruby_version = '>= 2.0.0'
8
+
7
9
  s.name = "entangled"
8
10
  s.version = Entangled::VERSION
9
11
  s.authors = ["Dennis Charles Hackethal"]
@@ -1,3 +1,3 @@
1
1
  module Entangled
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -3,83 +3,131 @@ angular.module('entangled', [])
3
3
 
4
4
  // Register service and call it 'Entangled'
5
5
  .factory('Entangled', function() {
6
- // Every response coming from the server will be wrapped
7
- // in a Resource constructor to represent a CRUD-able
8
- // resource that can be saved and destroyed using the
9
- // methods $save(), $destroy, and others. A Resource also
10
- // stores the socket's URL it was retrieved from so it
11
- // can be reused for other requests.
12
- function Resource(params, webSocketUrl, hasMany) {
13
- // Assign properties
14
- for (var key in params) {
15
- // Skip inherent object properties
16
- if (params.hasOwnProperty(key)) {
17
- this[key] = params[key];
6
+ return function() {
7
+ // Every response coming from the server will be wrapped
8
+ // in a Resource constructor to represent a CRUD-able
9
+ // resource that can be saved and destroyed using the
10
+ // methods $save(), $destroy, and others. A Resource also
11
+ // stores the socket's URL it was retrieved from so it
12
+ // can be reused for other requests.
13
+ function Resource(params, webSocketUrl, hasMany) {
14
+ // Assign properties
15
+ for (var key in params) {
16
+ // Skip inherent object properties
17
+ if (params.hasOwnProperty(key)) {
18
+ this[key] = params[key];
19
+ }
18
20
  }
19
- }
20
21
 
21
- // Assign socket URL
22
- this.webSocketUrl = webSocketUrl;
22
+ // Assign socket URL
23
+ this.webSocketUrl = webSocketUrl;
23
24
 
24
- // Assign has many relationship
25
- if (hasMany) {
26
- this[hasMany] = function() {
27
- return new Entangled(this.webSocketUrl + '/' + this.id + '/' + hasMany);
28
- };
29
- }
30
- };
31
-
32
- // $save() will send a request to the server
33
- // to either create a new record or update
34
- // an existing, depending on whether or not
35
- // an id is present.
36
- Resource.prototype.$save = function(callback) {
37
- if (this.id) {
38
- // Update
39
- var socket = new WebSocket(this.webSocketUrl + '/' + this.id + '/update');
40
- socket.onopen = function() {
41
- socket.send(JSON.stringify(this));
42
- }.bind(this);
25
+ // Assign has many relationship
26
+ if (hasMany) {
27
+ this[hasMany] = function() {
28
+ return new Entangled(this.webSocketUrl + '/' + this.id + '/' + hasMany);
29
+ };
30
+ }
31
+ };
43
32
 
44
- // Receive updated resource from server
45
- socket.onmessage = function(event) {
46
- if (event.data) {
47
- var data = JSON.parse(event.data);
33
+ // $save() will send a request to the server
34
+ // to either create a new record or update
35
+ // an existing, depending on whether or not
36
+ // an id is present.
37
+ Resource.prototype.$save = function(callback) {
38
+ if (this.id) {
39
+ // Update
40
+ var socket = new WebSocket(this.webSocketUrl + '/' + this.id + '/update');
41
+ socket.onopen = function() {
42
+ socket.send(JSON.stringify(this));
43
+ }.bind(this);
44
+
45
+ // Receive updated resource from server
46
+ socket.onmessage = function(event) {
47
+ if (event.data) {
48
+ var data = JSON.parse(event.data);
49
+
50
+ // Assign/override new data (such as updated_at, etc)
51
+ if (data.resource) {
52
+ for (key in data.resource) {
53
+ this[key] = data.resource[key];
54
+ }
55
+ }
56
+ }
48
57
 
49
- // Assign/override new data (such as updated_at, etc)
50
- if (data.resource) {
51
- for (key in data.resource) {
52
- this[key] = data.resource[key];
58
+ // Assign has many association. The association
59
+ // can only be available to a persisted record
60
+ this[this.hasMany] = new Entangled(this.webSocketUrl + '/' + this.id + '/' + this.hasMany);
61
+
62
+ // Pass 'this' to callback for create
63
+ // function so this the create function
64
+ // can pass the created resource to its
65
+ // own callback; not needed for $save per se
66
+ if (callback) callback(this);
67
+ }.bind(this);
68
+ } else {
69
+ // Create
70
+ var socket = new WebSocket(this.webSocketUrl + '/create');
71
+
72
+ // Send attributes to server
73
+ socket.onopen = function() {
74
+ socket.send(JSON.stringify(this));
75
+ }.bind(this);
76
+
77
+ // Receive saved resource from server
78
+ socket.onmessage = function(event) {
79
+ if (event.data) {
80
+ var data = JSON.parse(event.data);
81
+
82
+ // Assign/override new data (such as id, created_at,
83
+ // updated_at, etc)
84
+ if (data.resource) {
85
+ for (key in data.resource) {
86
+ this[key] = data.resource[key];
87
+ }
53
88
  }
54
89
  }
90
+
91
+ // Pass 'this' to callback for create
92
+ // function so this the create function
93
+ // can pass the created resource to its
94
+ // own callback; not needed for $save per se
95
+ if (callback) callback(this);
96
+ }.bind(this);
97
+ }
98
+ };
99
+
100
+ // $update() updates a record in place
101
+ Resource.prototype.$update = function(params, callback) {
102
+ // Update object in memory
103
+ for (var key in params) {
104
+ // Skip inherent object properties
105
+ if (params.hasOwnProperty(key)) {
106
+ this[key] = params[key];
55
107
  }
108
+ }
56
109
 
57
- // Assign has many association. The association
58
- // can only be available to a persisted record
59
- this[this.hasMany] = new Entangled(this.webSocketUrl + '/' + this.id + '/' + this.hasMany);
110
+ // Save object
111
+ this.$save(callback);
112
+ };
60
113
 
61
- // Pass 'this' to callback for create
62
- // function so this the create function
63
- // can pass the created resource to its
64
- // own callback; not needed for $save per se
65
- if (callback) callback(this);
66
- }.bind(this);
67
- } else {
68
- // Create
69
- var socket = new WebSocket(this.webSocketUrl + '/create');
114
+ // $destroy() will send a request to the server to
115
+ // destroy an existing record.
116
+ Resource.prototype.$destroy = function(callback) {
117
+ var socket = new WebSocket(this.webSocketUrl + '/' + this.id + '/destroy');
70
118
 
71
- // Send attributes to server
72
119
  socket.onopen = function() {
73
- socket.send(JSON.stringify(this));
74
- }.bind(this);
120
+ // It's fine to send an empty message since the
121
+ // socket's URL contains all the information
122
+ // needed to destroy the record (the id).
123
+ socket.send(null);
124
+ };
75
125
 
76
- // Receive saved resource from server
77
126
  socket.onmessage = function(event) {
78
127
  if (event.data) {
79
128
  var data = JSON.parse(event.data);
80
129
 
81
- // Assign/override new data (such as id, created_at,
82
- // updated_at, etc)
130
+ // Assign/override new data
83
131
  if (data.resource) {
84
132
  for (key in data.resource) {
85
133
  this[key] = data.resource[key];
@@ -87,214 +135,168 @@ angular.module('entangled', [])
87
135
  }
88
136
  }
89
137
 
90
- // Pass 'this' to callback for create
91
- // function so this the create function
92
- // can pass the created resource to its
93
- // own callback; not needed for $save per se
94
138
  if (callback) callback(this);
95
139
  }.bind(this);
96
- }
97
- };
98
-
99
- // $update() updates a record in place
100
- Resource.prototype.$update = function(params, callback) {
101
- // Update object in memory
102
- for (var key in params) {
103
- // Skip inherent object properties
104
- if (params.hasOwnProperty(key)) {
105
- this[key] = params[key];
106
- }
107
- }
108
-
109
- // Save object
110
- this.$save(callback);
111
- };
112
-
113
- // $destroy() will send a request to the server to
114
- // destroy an existing record.
115
- Resource.prototype.$destroy = function(callback) {
116
- var socket = new WebSocket(this.webSocketUrl + '/' + this.id + '/destroy');
117
-
118
- socket.onopen = function() {
119
- // It's fine to send an empty message since the
120
- // socket's URL contains all the information
121
- // needed to destroy the record (the id).
122
- socket.send(null);
123
140
  };
124
141
 
125
- socket.onmessage = function(event) {
126
- if (event.data) {
127
- var data = JSON.parse(event.data);
142
+ // $valid() checks if any errors are attached to the object
143
+ // and return false if so, false otherwise. This doesn't actually
144
+ // invoke server side validations, so it should only be used
145
+ // after calling $save() to check if the record was successfully
146
+ // stored in the database
147
+ Resource.prototype.$valid = function() {
148
+ return !(this.errors && Object.keys(this.errors).length);
149
+ };
128
150
 
129
- // Assign/override new data
130
- if (data.resource) {
131
- for (key in data.resource) {
132
- this[key] = data.resource[key];
133
- }
134
- }
151
+ // $invalid() returns the opposite of $valid()
152
+ Resource.prototype.$invalid = function() {
153
+ return !this.$valid();
154
+ };
155
+
156
+ // $persisted() checks if the record was successfully stored
157
+ // in the back end's database
158
+ Resource.prototype.$persisted = function() {
159
+ return !!this.id;
160
+ };
161
+
162
+ // Resources wraps all individual Resource objects
163
+ // in a collection.
164
+ function Resources(resources, webSocketUrl, hasMany) {
165
+ this.all = [];
166
+
167
+ for (var i = 0; i < resources.length; i++) {
168
+ var resource = new Resource(resources[i], webSocketUrl, hasMany);
169
+ this.all.push(resource);
135
170
  }
171
+ };
172
+
173
+ // Entangled is the heart of this service. It contains
174
+ // several methods to instantiate a new Resource,
175
+ // retrieve an existing Resource from the server,
176
+ // and retrieve a collection of existing Resources
177
+ // from the server.
178
+ //
179
+ // Entangled is a constructor that takes the URL
180
+ // of the index action on the server where the
181
+ // Resources can be retrieved.
182
+ function Entangled(webSocketUrl) {
183
+ // Store the root URL that sockets
184
+ // will connect to
185
+ this.webSocketUrl = webSocketUrl;
186
+ };
187
+
188
+ // hasMany() adds the appropriate association and
189
+ // sets up websockets accordingly
190
+ Entangled.prototype.hasMany = function(resources) {
191
+ this.hasMany = resources;
192
+ };
136
193
 
137
- if (callback) callback(this);
138
- }.bind(this);
139
- };
140
-
141
- // $valid() checks if any errors are attached to the object
142
- // and return false if so, false otherwise. This doesn't actually
143
- // invoke server side validations, so it should only be used
144
- // after calling $save() to check if the record was successfully
145
- // stored in the database
146
- Resource.prototype.$valid = function() {
147
- return !(this.errors && Object.keys(this.errors).length);
148
- };
149
-
150
- // $invalid() returns the opposite of $valid()
151
- Resource.prototype.$invalid = function() {
152
- return !this.$valid();
153
- };
154
-
155
- // $persisted() checks if the record was successfully stored
156
- // in the back end's database
157
- Resource.prototype.$persisted = function() {
158
- return !!this.id;
159
- };
160
-
161
- // Resources wraps all individual Resource objects
162
- // in a collection.
163
- function Resources(resources, webSocketUrl, hasMany) {
164
- this.all = [];
165
-
166
- for (var i = 0; i < resources.length; i++) {
167
- var resource = new Resource(resources[i], webSocketUrl, hasMany);
168
- this.all.push(resource);
169
- }
170
- };
171
-
172
- // Entangled is the heart of this service. It contains
173
- // several methods to instantiate a new Resource,
174
- // retrieve an existing Resource from the server,
175
- // and retrieve a collection of existing Resources
176
- // from the server.
177
- //
178
- // Entangled is a constructor that takes the URL
179
- // of the index action on the server where the
180
- // Resources can be retrieved.
181
- function Entangled(webSocketUrl) {
182
- // Store the root URL that sockets
183
- // will connect to
184
- this.webSocketUrl = webSocketUrl;
185
- };
186
-
187
- // hasMany() adds the appropriate association and
188
- // sets up websockets accordingly
189
- Entangled.prototype.hasMany = function(resources) {
190
- this.hasMany = resources;
191
- };
192
-
193
- // Function to instantiate a new Resource, optionally
194
- // with given parameters
195
- Entangled.prototype.new = function(params) {
196
- return new Resource(params, this.webSocketUrl, this.hasMany);
197
- };
198
-
199
- // Retrieve all Resources from the root of the socket's
200
- // URL
201
- Entangled.prototype.all = function(callback) {
202
- var socket = new WebSocket(this.webSocketUrl);
203
-
204
- socket.onmessage = function(event) {
205
- // If the message from the server isn't empty
206
- if (event.data.length) {
207
- // Convert message to JSON
208
- var data = JSON.parse(event.data);
209
-
210
- // If the collection of Resources was sent
211
- if (data.resources) {
212
- // Store retrieved Resources in property
213
- this.resources = new Resources(data.resources, socket.url, this.hasMany);
214
- } else if (data.action) {
215
- if (data.action === 'create') {
216
- // If new Resource was created, add it to the
217
- // collection
218
- this.resources.all.push(new Resource(data.resource, socket.url, this.hasMany));
219
- } else if (data.action === 'update') {
220
- // If an existing Resource was updated,
221
- // update it in the collection as well
222
- var index;
223
-
224
- for (var i = 0; i < this.resources.all.length; i++) {
225
- if (this.resources.all[i].id === data.resource.id) {
226
- index = i;
194
+ // Function to instantiate a new Resource, optionally
195
+ // with given parameters
196
+ Entangled.prototype.new = function(params) {
197
+ return new Resource(params, this.webSocketUrl, this.hasMany);
198
+ };
199
+
200
+ // Retrieve all Resources from the root of the socket's
201
+ // URL
202
+ Entangled.prototype.all = function(callback) {
203
+ var socket = new WebSocket(this.webSocketUrl);
204
+
205
+ socket.onmessage = function(event) {
206
+ // If the message from the server isn't empty
207
+ if (event.data.length) {
208
+ // Convert message to JSON
209
+ var data = JSON.parse(event.data);
210
+
211
+ // If the collection of Resources was sent
212
+ if (data.resources) {
213
+ // Store retrieved Resources in property
214
+ this.resources = new Resources(data.resources, socket.url, this.hasMany);
215
+ } else if (data.action) {
216
+ if (data.action === 'create') {
217
+ // If new Resource was created, add it to the
218
+ // collection
219
+ this.resources.all.push(new Resource(data.resource, socket.url, this.hasMany));
220
+ } else if (data.action === 'update') {
221
+ // If an existing Resource was updated,
222
+ // update it in the collection as well
223
+ var index;
224
+
225
+ for (var i = 0; i < this.resources.all.length; i++) {
226
+ if (this.resources.all[i].id === data.resource.id) {
227
+ index = i;
228
+ }
227
229
  }
228
- }
229
230
 
230
- this.resources.all[index] = new Resource(data.resource, socket.url, this.hasMany);
231
- } else if (data.action === 'destroy') {
232
- // If a Resource was destroyed, remove it
233
- // from Resources as well
234
- var index;
231
+ this.resources.all[index] = new Resource(data.resource, socket.url, this.hasMany);
232
+ } else if (data.action === 'destroy') {
233
+ // If a Resource was destroyed, remove it
234
+ // from Resources as well
235
+ var index;
235
236
 
236
- for (var i = 0; i < this.resources.all.length; i++) {
237
- if (this.resources.all[i].id === data.resource.id) {
238
- index = i;
237
+ for (var i = 0; i < this.resources.all.length; i++) {
238
+ if (this.resources.all[i].id === data.resource.id) {
239
+ index = i;
240
+ }
239
241
  }
240
- }
241
242
 
242
- this.resources.all.splice(index, 1);
243
- } else {
244
- console.log('Something else other than CRUD happened...');
245
- console.log(data);
243
+ this.resources.all.splice(index, 1);
244
+ } else {
245
+ console.log('Something else other than CRUD happened...');
246
+ console.log(data);
247
+ }
246
248
  }
247
249
  }
248
- }
249
250
 
250
- // Run the callback and pass in the
251
- // resulting collection
252
- callback(this.resources.all);
253
- }.bind(this);
254
- };
255
-
256
- // Instantiate and persist a record in one go
257
- Entangled.prototype.create = function(params, callback) {
258
- var resource = this.new(params);
259
- resource.$save(callback);
260
- };
261
-
262
- // Find an individual Resource on the server
263
- Entangled.prototype.find = function(id, callback) {
264
- var webSocketUrl = this.webSocketUrl;
265
- var socket = new WebSocket(webSocketUrl + '/' + id);
266
-
267
- socket.onmessage = function(event) {
268
- // If the message from the server isn't empty
269
- if (event.data.length) {
270
- // Parse message and convert to JSON
271
- var data = JSON.parse(event.data);
272
-
273
- if (data.resource && !data.action) {
274
- // If the Resource was sent from the server,
275
- // store it
276
- this.resource = new Resource(data.resource, webSocketUrl, this.hasMany);
277
- } else if (data.action) {
278
- if (data.action === 'update') {
279
- // If the stored Resource was updated,
280
- // update it here as well
251
+ // Run the callback and pass in the
252
+ // resulting collection
253
+ callback(this.resources.all);
254
+ }.bind(this);
255
+ };
256
+
257
+ // Instantiate and persist a record in one go
258
+ Entangled.prototype.create = function(params, callback) {
259
+ var resource = this.new(params);
260
+ resource.$save(callback);
261
+ };
262
+
263
+ // Find an individual Resource on the server
264
+ Entangled.prototype.find = function(id, callback) {
265
+ var webSocketUrl = this.webSocketUrl;
266
+ var socket = new WebSocket(webSocketUrl + '/' + id);
267
+
268
+ socket.onmessage = function(event) {
269
+ // If the message from the server isn't empty
270
+ if (event.data.length) {
271
+ // Parse message and convert to JSON
272
+ var data = JSON.parse(event.data);
273
+
274
+ if (data.resource && !data.action) {
275
+ // If the Resource was sent from the server,
276
+ // store it
281
277
  this.resource = new Resource(data.resource, webSocketUrl, this.hasMany);
282
- } else if (data.action === 'destroy') {
283
- // If the stored Resource was destroyed,
284
- // remove it from here as well
285
- this.resource = undefined;
278
+ } else if (data.action) {
279
+ if (data.action === 'update') {
280
+ // If the stored Resource was updated,
281
+ // update it here as well
282
+ this.resource = new Resource(data.resource, webSocketUrl, this.hasMany);
283
+ } else if (data.action === 'destroy') {
284
+ // If the stored Resource was destroyed,
285
+ // remove it from here as well
286
+ this.resource = undefined;
287
+ }
288
+ } else {
289
+ console.log('Something else other than CRUD happened...');
290
+ console.log(data);
286
291
  }
287
- } else {
288
- console.log('Something else other than CRUD happened...');
289
- console.log(data);
290
292
  }
291
- }
292
293
 
293
- // Run callback with retrieved Resource
294
- callback(this.resource);
295
- }.bind(this);
296
- };
294
+ // Run callback with retrieved Resource
295
+ callback(this.resource);
296
+ }.bind(this);
297
+ };
297
298
 
298
- // Return Entangled object as Angular service
299
- return Entangled;
299
+ // Return Entangled object as Angular service
300
+ return Entangled;
301
+ }();
300
302
  });
metadata CHANGED
@@ -1,167 +1,167 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: entangled
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dennis Charles Hackethal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-29 00:00:00.000000000 Z
11
+ date: 2015-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.7'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.7'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: '10.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec-rails
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '3.2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: shoulda-matchers
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: '2.6'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '2.6'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sqlite3
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ~>
74
74
  - !ruby/object:Gem::Version
75
75
  version: '1.3'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: byebug
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ~>
88
88
  - !ruby/object:Gem::Version
89
89
  version: '3.5'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ~>
95
95
  - !ruby/object:Gem::Version
96
96
  version: '3.5'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: bourne
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - ~>
102
102
  - !ruby/object:Gem::Version
103
103
  version: '1.6'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - ~>
109
109
  - !ruby/object:Gem::Version
110
110
  version: '1.6'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: puma
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - ~>
116
116
  - !ruby/object:Gem::Version
117
117
  version: '2.11'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - ~>
123
123
  - !ruby/object:Gem::Version
124
124
  version: '2.11'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: tubesock
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - "~>"
129
+ - - ~>
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0.2'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - "~>"
136
+ - - ~>
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0.2'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rails
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - "~>"
143
+ - - ~>
144
144
  - !ruby/object:Gem::Version
145
145
  version: '4.2'
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - "~>"
150
+ - - ~>
151
151
  - !ruby/object:Gem::Version
152
152
  version: '4.2'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: redis
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - "~>"
157
+ - - ~>
158
158
  - !ruby/object:Gem::Version
159
159
  version: '3.2'
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - "~>"
164
+ - - ~>
165
165
  - !ruby/object:Gem::Version
166
166
  version: '3.2'
167
167
  description: Makes Rails real time through websockets as a gem in the backend and
@@ -172,7 +172,7 @@ executables: []
172
172
  extensions: []
173
173
  extra_rdoc_files: []
174
174
  files:
175
- - ".gitignore"
175
+ - .gitignore
176
176
  - Gemfile
177
177
  - LICENSE.txt
178
178
  - README.md
@@ -275,17 +275,17 @@ require_paths:
275
275
  - lib
276
276
  required_ruby_version: !ruby/object:Gem::Requirement
277
277
  requirements:
278
- - - ">="
278
+ - - '>='
279
279
  - !ruby/object:Gem::Version
280
- version: '0'
280
+ version: 2.0.0
281
281
  required_rubygems_version: !ruby/object:Gem::Requirement
282
282
  requirements:
283
- - - ">="
283
+ - - '>='
284
284
  - !ruby/object:Gem::Version
285
285
  version: '0'
286
286
  requirements: []
287
287
  rubyforge_project:
288
- rubygems_version: 2.2.2
288
+ rubygems_version: 2.4.6
289
289
  signing_key:
290
290
  specification_version: 4
291
291
  summary: Makes Rails real time through websockets.