litecable 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -1
  3. data/LICENSE.txt +1 -1
  4. data/README.md +24 -22
  5. data/lib/lite_cable.rb +22 -2
  6. data/lib/lite_cable/anycable.rb +14 -12
  7. data/lib/lite_cable/broadcast_adapters.rb +35 -0
  8. data/lib/lite_cable/broadcast_adapters/any_cable.rb +11 -0
  9. data/lib/lite_cable/broadcast_adapters/base.rb +17 -0
  10. data/lib/lite_cable/broadcast_adapters/memory.rb +11 -0
  11. data/lib/lite_cable/config.rb +5 -4
  12. data/lib/lite_cable/connection/subscriptions.rb +2 -2
  13. data/lib/lite_cable/server.rb +0 -6
  14. data/lib/lite_cable/server/client_socket/base.rb +9 -15
  15. data/lib/lite_cable/version.rb +1 -1
  16. metadata +18 -76
  17. data/.gem_release.yml +0 -3
  18. data/.gitignore +0 -40
  19. data/.rubocop.yml +0 -53
  20. data/.travis.yml +0 -16
  21. data/Gemfile +0 -4
  22. data/Rakefile +0 -10
  23. data/bin/console +0 -14
  24. data/bin/setup +0 -8
  25. data/examples/sinatra/Gemfile +0 -19
  26. data/examples/sinatra/Procfile +0 -3
  27. data/examples/sinatra/README.md +0 -35
  28. data/examples/sinatra/app.rb +0 -53
  29. data/examples/sinatra/assets/app.css +0 -169
  30. data/examples/sinatra/assets/cable.js +0 -584
  31. data/examples/sinatra/assets/reset.css +0 -223
  32. data/examples/sinatra/chat.rb +0 -40
  33. data/examples/sinatra/config.ru +0 -21
  34. data/examples/sinatra/config/environment.rb +0 -18
  35. data/examples/sinatra/views/index.slim +0 -8
  36. data/examples/sinatra/views/layout.slim +0 -15
  37. data/examples/sinatra/views/login.slim +0 -8
  38. data/examples/sinatra/views/resetcss.slim +0 -224
  39. data/examples/sinatra/views/room.slim +0 -68
  40. data/litecable.gemspec +0 -39
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: edbe33668bf263f5af67a29240b2d2fc105c2ccf9e98735f4327ae14d965d2d9
4
- data.tar.gz: b6f84ccc2bdbee995028ad821176a41925c2fedaf83142ccf6dd41dafaf21b65
3
+ metadata.gz: 47a04414eade53832c4b900305ca3a034999724c0cabd6aceacb908192a6124f
4
+ data.tar.gz: 24c67d2cacbb5f64b5b7d63293c7fdbe143797d0102b732983fc78028469dfc9
5
5
  SHA512:
6
- metadata.gz: 31be4a35bd51711f7cf3677c0a96b749d60133fe7a91cd54aff2ca82f59ee095bd8362a65483d5b2902160fbad1975b060948aae74b292ce10c314e81976c168
7
- data.tar.gz: 9cf99b623c1df22104374dbc947e08d694d279e7aae612a3274886433306868f5a75f8fdd096c5cd398319d85d9966b7cf682a424178e0168988a1c81fea014d
6
+ metadata.gz: eb63ada090f884f750828b7c116d1066a020c87ab043d929e4ad46b035299c95972acf1d458813a34da797273e0656fc7613977cfef24c6e0765a7a8dece9a6a
7
+ data.tar.gz: 75314e320e2ed5f18e34c4038d467aef14e73f9b0e4fe01f61955369a52ee28e246e62662a94c3e1d1b9f7ea9999049f8d58e5f7af80479fc88a97b91055720e
@@ -1,5 +1,24 @@
1
1
  # Change log
2
2
 
3
+ ## 0.7.0 (2020-01-07)
4
+
5
+ - Refactor AnyCable integration ([@palkan][])
6
+
7
+ Now you only need to set AnyCable broadcast adapter:
8
+
9
+ ```ruby
10
+ LiteCable.broadcast_adapter = :any_cable
11
+ ```
12
+
13
+ ```sh
14
+ # or via env/config
15
+ LITECABLE_BROADCAST_ADAPTER=any_cable ruby my_app.rb
16
+ ```
17
+
18
+ - Adapterize broadcast adapters ([@palkan][])
19
+
20
+ - Drop Ruby 2.4 support ([palkan][])
21
+
3
22
  ## 0.6.0 (2019-04-12) 🚀
4
23
 
5
24
  - Drop Ruby 2.3 support ([@palkan][])
@@ -10,7 +29,7 @@
10
29
 
11
30
  ## 0.4.1 (2017-02-04)
12
31
 
13
- - Use `websocket-ruby` with subprotocols support ([@palkan][])
32
+ - Use `websocket-ruby` with sub-protocols support ([@palkan][])
14
33
 
15
34
  ## 0.4.0 (2017-01-29)
16
35
 
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017 palkan
3
+ Copyright (c) 2017-2020 palkan
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- [![Gem Version](https://badge.fury.io/rb/litecable.svg)](https://rubygems.org/gems/litecable) [![Build Status](https://travis-ci.org/palkan/litecable.svg?branch=master)](https://travis-ci.org/palkan/litecable)
1
+ [![Gem Version](https://badge.fury.io/rb/litecable.svg)](https://rubygems.org/gems/litecable)
2
+ [![Build](https://github.com/palkan/litecable/workflows/Build/badge.svg)](https://github.com/palkan/litecable/actions)
2
3
 
3
4
  # Lite Cable
4
5
 
@@ -25,17 +26,11 @@ Add this line to your application's Gemfile:
25
26
  gem "litecable"
26
27
  ```
27
28
 
28
- And then execute:
29
-
30
- $ bundle
31
-
32
- Or install it yourself as:
33
-
34
- $ gem install litecable
29
+ And run `bundle install`.
35
30
 
36
31
  ## Usage
37
32
 
38
- Please, checkout [Action Cable guides](http://guides.rubyonrails.org/action_cable_overview.html) for general information. Lite Cable aims to be compatible with Action Cable as much as possible without the loss of simplicity and _ligthness_.
33
+ Please, checkout [Action Cable guides](http://guides.rubyonrails.org/action_cable_overview.html) for general information. Lite Cable aims to be compatible with Action Cable as much as possible without the loss of simplicity and _lightness_.
39
34
 
40
35
  You can use Action Cable javascript client without any change (precompiled version can be found [here](https://github.com/palkan/litecable/tree/master/examples/sinatra/assets/cable.js)).
41
36
 
@@ -83,24 +78,32 @@ end
83
78
 
84
79
  ### Using with AnyCable
85
80
 
86
- Lite Cable is AnyCable-compatible out-of-the-box. You should write a simple server script:
81
+ Lite Cable is AnyCable-compatible out-of-the-box:
82
+
83
+ - Set broadcast adapter to AnyCable:
87
84
 
88
85
  ```ruby
89
- #!/usr/bin/env ruby
86
+ LiteCable.broadcast_adapter = :any_cable
87
+ ```
90
88
 
91
- require "my_app"
92
- require "rack"
93
- require "anycable"
89
+ You can also do this via configuration, e.g., env var (`LITECABLE_BROADCAST_ADAPTER=any_cable`) or `broadcast_adapter: any_cable` in a YAML config.
94
90
 
95
- # Turn AnyCable compatibility mode
96
- LiteCable.anycable!
91
+ - Configure connection factory:
97
92
 
98
- Anycable.connection_factory = MyApp::Connection
93
+ ```ruby
94
+ AnyCable.connection_factory = MyApp::Connection
95
+ ```
96
+
97
+ Then run AnyCable along with the app:
99
98
 
100
- Anycable::Server.start
99
+ ```sh
100
+ bundle exec anycable
101
+
102
+ # add -r option to load the app if it's not ./config/anycable.rb or ./config/environment.rb
103
+ bundle exec anycable -r ./my_app.rb
101
104
  ```
102
105
 
103
- And then run this script along with your application. See [Sinatra example](https://github.com/palkan/litecable/tree/master/examples/sinatra) for more.
106
+ See [Sinatra example](https://github.com/palkan/litecable/tree/master/examples/sinatra) for more.
104
107
 
105
108
  ### Configuration
106
109
 
@@ -120,9 +123,8 @@ See [config](https://github.com/palkan/litecable/blob/master/lib/lite_cable/conf
120
123
 
121
124
  ## Contributing
122
125
 
123
- Bug reports and pull requests are welcome on GitHub at https://github.com/anycable/litecable.
126
+ Bug reports and pull requests are welcome on GitHub at [https://github.com/palkan/litecable](https://github.com/palkan/litecable).
124
127
 
125
128
  ## License
126
129
 
127
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
128
-
130
+ The gem is available as open source under the terms of the [MIT License](./LICENSE.txt).
@@ -15,6 +15,7 @@ module LiteCable
15
15
  require "lite_cable/channel"
16
16
  require "lite_cable/coders"
17
17
  require "lite_cable/config"
18
+ require "lite_cable/broadcast_adapters"
18
19
  require "lite_cable/anycable"
19
20
 
20
21
  class << self
@@ -23,8 +24,27 @@ module LiteCable
23
24
  end
24
25
 
25
26
  # Broadcast encoded message to the stream
26
- def broadcast(*args)
27
- LiteCable::Server.broadcast(*args)
27
+ def broadcast(stream, message, coder: LiteCable.config.coder)
28
+ broadcast_adapter.broadcast(stream, message, coder: coder)
29
+ end
30
+
31
+ def broadcast_adapter
32
+ return @broadcast_adapter if defined?(@broadcast_adapter)
33
+ self.broadcast_adapter = LiteCable.config.broadcast_adapter.to_sym
34
+ @broadcast_adapter
35
+ end
36
+
37
+ def broadcast_adapter=(adapter)
38
+ if adapter.is_a?(Symbol) || adapter.is_a?(Array)
39
+ adapter = BroadcastAdapters.lookup_adapter(adapter)
40
+ end
41
+
42
+ unless adapter.respond_to?(:broadcast)
43
+ raise ArgumentError, "BroadcastAdapter must implement #broadcast method. " \
44
+ "#{adapter.class} doesn't implement it."
45
+ end
46
+
47
+ @broadcast_adapter = adapter
28
48
  end
29
49
  end
30
50
  end
@@ -3,14 +3,6 @@
3
3
  module LiteCable # :nodoc:
4
4
  # AnyCable extensions
5
5
  module AnyCable
6
- module Broadcasting # :nodoc:
7
- def broadcast(stream, message, coder: nil)
8
- coder ||= LiteCable.config.coder
9
- # FIXME: after anycable 0.6.0 release
10
- Anycable.broadcast stream, coder.encode(message)
11
- end
12
- end
13
-
14
6
  module Connection # :nodoc:
15
7
  def self.extended(base)
16
8
  base.prepend InstanceMethods
@@ -20,9 +12,6 @@ module LiteCable # :nodoc:
20
12
  new(socket, options)
21
13
  end
22
14
 
23
- # Backward compatibility with AnyCable <= 0.4
24
- alias create call
25
-
26
15
  module InstanceMethods # :nodoc:
27
16
  def initialize(socket, subscriptions: nil, **hargs)
28
17
  super(socket, **hargs)
@@ -64,6 +53,19 @@ module LiteCable # :nodoc:
64
53
  # Patch Lite Cable with AnyCable functionality
65
54
  def self.anycable!
66
55
  LiteCable::Connection::Base.extend LiteCable::AnyCable::Connection
67
- LiteCable.singleton_class.prepend LiteCable::AnyCable::Broadcasting
56
+ end
57
+ end
58
+
59
+ if defined?(AnyCable)
60
+ AnyCable.configure_server do
61
+ # Make sure broadcast adapter is valid
62
+ require "lite_cable/broadcast_adapters/any_cable"
63
+ unless LiteCable::BroadcastAdapters::AnyCable === LiteCable.broadcast_adapter
64
+ raise "You should use :any_cable broadcast adapter (current: #{LiteCable.broadcast_adapter.class}). " \
65
+ "Set it via LITECABLE_BROADCAST_ADAPTER=any_cable or in the code/YML."
66
+ end
67
+
68
+ # Turn AnyCable compatibility mode for anycable RPC server automatically
69
+ LiteCable.anycable!
68
70
  end
69
71
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "lite_cable/broadcast_adapters/base"
4
+
5
+ module LiteCable
6
+ module BroadcastAdapters # :nodoc:
7
+ module_function
8
+
9
+ # rubocop: disable Metrics/AbcSize, Metrics/MethodLength
10
+ def lookup_adapter(args)
11
+ adapter, options = Array(args)
12
+ path_to_adapter = "lite_cable/broadcast_adapters/#{adapter}"
13
+ adapter_class_name = adapter.to_s.split("_").map(&:capitalize).join
14
+
15
+ unless BroadcastAdapters.const_defined?(adapter_class_name, false)
16
+ begin
17
+ require path_to_adapter
18
+ rescue LoadError => e
19
+ # We couldn't require the adapter itself.
20
+ if e.path == path_to_adapter
21
+ raise e.class, "Couldn't load the '#{adapter}' broadcast adapter for LiteCable",
22
+ e.backtrace
23
+ # Bubbled up from the adapter require.
24
+ else
25
+ raise e.class, "Error loading the '#{adapter}' broadcast adapter for LiteCable",
26
+ e.backtrace
27
+ end
28
+ end
29
+ end
30
+
31
+ BroadcastAdapters.const_get(adapter_class_name, false).new(**(options || {}))
32
+ end
33
+ # rubocop: enable Metrics/AbcSize, Metrics/MethodLength
34
+ end
35
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LiteCable
4
+ module BroadcastAdapters
5
+ class AnyCable < Base
6
+ def broadcast(stream, message, coder:)
7
+ ::AnyCable.broadcast stream, coder.encode(message)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # frozen_string_literal: true
4
+
5
+ module LiteCable
6
+ module BroadcastAdapters
7
+ class Base
8
+ def initialize(**options)
9
+ @options = options
10
+ end
11
+
12
+ private
13
+
14
+ attr_reader :options
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LiteCable
4
+ module BroadcastAdapters
5
+ class Memory < Base
6
+ def broadcast(stream, message, coder:)
7
+ Server.subscribers_map.broadcast stream, message, coder
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "anyway"
3
+ require "anyway_config"
4
4
  require "logger"
5
5
 
6
6
  module LiteCable
@@ -12,8 +12,9 @@ module LiteCable
12
12
  config_name :litecable
13
13
 
14
14
  attr_config :logger,
15
- coder: Coders::JSON,
16
- identifier_coder: Coders::Raw,
17
- log_level: Logger::INFO
15
+ coder: Coders::JSON,
16
+ broadcast_adapter: :memory,
17
+ identifier_coder: Coders::Raw,
18
+ log_level: Logger::INFO
18
19
  end
19
20
  end
@@ -53,9 +53,9 @@ module LiteCable
53
53
  def execute_command(data)
54
54
  command = data.delete("command")
55
55
  case command
56
- when "subscribe" then add(data["identifier"])
56
+ when "subscribe" then add(data["identifier"])
57
57
  when "unsubscribe" then remove(data["identifier"])
58
- when "message" then perform_action(data["identifier"], data["data"])
58
+ when "message" then perform_action(data["identifier"], data["data"])
59
59
  else
60
60
  raise UnknownCommandError, "Command not found #{command}"
61
61
  end
@@ -15,12 +15,6 @@ module LiteCable
15
15
 
16
16
  class << self
17
17
  attr_accessor :subscribers_map
18
-
19
- # Broadcast encoded message to the stream
20
- def broadcast(stream, message, coder: nil)
21
- coder ||= LiteCable.config.coder
22
- subscribers_map.broadcast stream, message, coder
23
- end
24
18
  end
25
19
 
26
20
  self.subscribers_map = SubscribersMap.new
@@ -17,10 +17,10 @@ module LiteCable
17
17
  @version = version
18
18
  @active = true
19
19
 
20
- @open_handlers = []
20
+ @open_handlers = []
21
21
  @message_handlers = []
22
- @close_handlers = []
23
- @error_handlers = []
22
+ @close_handlers = []
23
+ @error_handlers = []
24
24
 
25
25
  @close_on_error = true
26
26
  end
@@ -70,13 +70,11 @@ module LiteCable
70
70
  @open_handlers.each(&:call)
71
71
  each_frame do |data|
72
72
  @message_handlers.each do |h|
73
- begin
74
- h.call(data)
75
- rescue => e # rubocop: disable Style/RescueStandardError
76
- log(:error, "Socket receive failed: #{e}")
77
- @error_handlers.each { |eh| eh.call(e, data) }
78
- close if close_on_error
79
- end
73
+ h.call(data)
74
+ rescue => e # rubocop: disable Style/RescueStandardError
75
+ log(:error, "Socket receive failed: #{e}")
76
+ @error_handlers.each { |eh| eh.call(e, data) }
77
+ close if close_on_error
80
78
  end
81
79
  end
82
80
  ensure
@@ -137,11 +135,7 @@ module LiteCable
137
135
  framebuffer = WebSocket::Frame::Incoming::Server.new(version: version)
138
136
 
139
137
  while IO.select([socket])
140
- if socket.respond_to?(:recvfrom)
141
- data, _addrinfo = socket.recvfrom(2000)
142
- else
143
- data, _addrinfo = socket.readpartial(2000), socket.peeraddr
144
- end
138
+ data = socket.respond_to?(:recv) ? socket.recv(2000) : socket.readpartial(2000)
145
139
  break if data.empty?
146
140
 
147
141
  framebuffer << data
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LiteCable
4
- VERSION = "0.6.0"
4
+ VERSION = "0.7.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: litecable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - palkan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-12 00:00:00.000000000 Z
11
+ date: 2020-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: anyway_config
@@ -72,26 +72,26 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 1.0.0
75
+ version: '1.1'
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
- version: 1.0.0
82
+ version: '1.1'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: puma
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '3.6'
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.6'
97
97
  - !ruby/object:Gem::Dependency
@@ -150,48 +150,6 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: 0.3.8
153
- - !ruby/object:Gem::Dependency
154
- name: rubocop
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: 0.65.0
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - "~>"
165
- - !ruby/object:Gem::Version
166
- version: 0.65.0
167
- - !ruby/object:Gem::Dependency
168
- name: rubocop-md
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: '0.2'
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - "~>"
179
- - !ruby/object:Gem::Version
180
- version: '0.2'
181
- - !ruby/object:Gem::Dependency
182
- name: standard
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - "~>"
186
- - !ruby/object:Gem::Version
187
- version: 0.0.36
188
- type: :development
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - "~>"
193
- - !ruby/object:Gem::Version
194
- version: 0.0.36
195
153
  - !ruby/object:Gem::Dependency
196
154
  name: pry-byebug
197
155
  requirement: !ruby/object:Gem::Requirement
@@ -214,35 +172,15 @@ executables: []
214
172
  extensions: []
215
173
  extra_rdoc_files: []
216
174
  files:
217
- - ".gem_release.yml"
218
- - ".gitignore"
219
- - ".rspec"
220
- - ".rubocop.yml"
221
- - ".travis.yml"
222
175
  - CHANGELOG.md
223
- - Gemfile
224
176
  - LICENSE.txt
225
177
  - README.md
226
- - Rakefile
227
- - bin/console
228
- - bin/setup
229
- - examples/sinatra/Gemfile
230
- - examples/sinatra/Procfile
231
- - examples/sinatra/README.md
232
- - examples/sinatra/app.rb
233
- - examples/sinatra/assets/app.css
234
- - examples/sinatra/assets/cable.js
235
- - examples/sinatra/assets/reset.css
236
- - examples/sinatra/chat.rb
237
- - examples/sinatra/config.ru
238
- - examples/sinatra/config/environment.rb
239
- - examples/sinatra/views/index.slim
240
- - examples/sinatra/views/layout.slim
241
- - examples/sinatra/views/login.slim
242
- - examples/sinatra/views/resetcss.slim
243
- - examples/sinatra/views/room.slim
244
178
  - lib/lite_cable.rb
245
179
  - lib/lite_cable/anycable.rb
180
+ - lib/lite_cable/broadcast_adapters.rb
181
+ - lib/lite_cable/broadcast_adapters/any_cable.rb
182
+ - lib/lite_cable/broadcast_adapters/base.rb
183
+ - lib/lite_cable/broadcast_adapters/memory.rb
246
184
  - lib/lite_cable/channel.rb
247
185
  - lib/lite_cable/channel/base.rb
248
186
  - lib/lite_cable/channel/registry.rb
@@ -268,11 +206,15 @@ files:
268
206
  - lib/lite_cable/server/subscribers_map.rb
269
207
  - lib/lite_cable/version.rb
270
208
  - lib/litecable.rb
271
- - litecable.gemspec
272
209
  homepage: https://github.com/palkan/litecable
273
210
  licenses:
274
211
  - MIT
275
- metadata: {}
212
+ metadata:
213
+ bug_tracker_uri: http://github.com/palkan/litecable/issues
214
+ changelog_uri: https://github.com/palkan/litecable/blob/master/CHANGELOG.md
215
+ documentation_uri: http://github.com/palkan/litecable
216
+ homepage_uri: http://github.com/palkan/litecable
217
+ source_code_uri: http://github.com/palkan/litecable
276
218
  post_install_message:
277
219
  rdoc_options: []
278
220
  require_paths:
@@ -281,14 +223,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
281
223
  requirements:
282
224
  - - ">="
283
225
  - !ruby/object:Gem::Version
284
- version: 2.4.0
226
+ version: 2.5.0
285
227
  required_rubygems_version: !ruby/object:Gem::Requirement
286
228
  requirements:
287
229
  - - ">="
288
230
  - !ruby/object:Gem::Version
289
231
  version: '0'
290
232
  requirements: []
291
- rubygems_version: 3.0.2
233
+ rubygems_version: 3.0.6
292
234
  signing_key:
293
235
  specification_version: 4
294
236
  summary: Fat-free ActionCable implementation