litecable 0.6.0 → 0.7.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.
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