entangled 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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.