falcon 0.36.0 → 0.36.5
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 +4 -4
- data/lib/falcon/adapters/early_hints.rb +8 -0
- data/lib/falcon/adapters/input.rb +32 -11
- data/lib/falcon/adapters/output.rb +20 -1
- data/lib/falcon/adapters/rack.rb +59 -32
- data/lib/falcon/adapters/response.rb +23 -1
- data/lib/falcon/adapters/rewindable.rb +10 -3
- data/lib/falcon/command.rb +2 -0
- data/lib/falcon/command/host.rb +13 -2
- data/lib/falcon/command/paths.rb +4 -0
- data/lib/falcon/command/proxy.rb +17 -1
- data/lib/falcon/command/redirect.rb +15 -1
- data/lib/falcon/command/serve.rb +22 -15
- data/lib/falcon/command/supervisor.rb +15 -1
- data/lib/falcon/command/top.rb +16 -0
- data/lib/falcon/command/virtual.rb +21 -0
- data/lib/falcon/configuration.rb +69 -7
- data/lib/falcon/controller/host.rb +12 -0
- data/lib/falcon/controller/proxy.rb +13 -0
- data/lib/falcon/controller/redirect.rb +7 -0
- data/lib/falcon/controller/serve.rb +14 -1
- data/lib/falcon/controller/virtual.rb +28 -2
- data/lib/falcon/endpoint.rb +8 -0
- data/lib/falcon/{configuration/proxy.rb → environments.rb} +9 -5
- data/lib/falcon/environments/application.rb +68 -0
- data/lib/falcon/{configuration/application.rb → environments/lets_encrypt_tls.rb} +21 -20
- data/lib/falcon/{configuration/lets_encrypt_tls.rb → environments/proxy.rb} +13 -6
- data/lib/falcon/{configuration → environments}/rack.rb +14 -2
- data/lib/falcon/{configuration → environments}/self_signed_tls.rb +9 -1
- data/lib/falcon/{configuration → environments}/supervisor.rb +19 -5
- data/lib/falcon/{configuration → environments}/tls.rb +39 -5
- data/lib/falcon/extensions/openssl.rb +1 -0
- data/lib/falcon/middleware/proxy.rb +26 -5
- data/lib/falcon/middleware/redirect.rb +11 -0
- data/lib/falcon/{verbose.rb → middleware/verbose.rb} +34 -26
- data/lib/falcon/proxy_endpoint.rb +21 -0
- data/lib/falcon/server.rb +8 -2
- data/lib/falcon/service/application.rb +9 -0
- data/lib/falcon/service/generic.rb +18 -0
- data/lib/falcon/service/proxy.rb +6 -0
- data/lib/falcon/service/supervisor.rb +14 -2
- data/lib/falcon/services.rb +21 -0
- data/lib/falcon/tls.rb +4 -2
- data/lib/falcon/version.rb +1 -1
- data/lib/rack/handler/falcon.rb +7 -1
- metadata +20 -77
- data/.editorconfig +0 -5
- data/.github/FUNDING.yml +0 -3
- data/.github/workflows/development.yml +0 -45
- data/.gitignore +0 -14
- data/.rspec +0 -3
- data/.travis.yml +0 -41
- data/Gemfile +0 -16
- data/README.md +0 -316
- data/examples/beer/config.ru +0 -57
- data/examples/beer/falcon.rb +0 -8
- data/examples/benchmark/config.ru +0 -39
- data/examples/benchmark/falcon.rb +0 -6
- data/examples/csv/config.ru +0 -31
- data/examples/google/falcon.rb +0 -14
- data/examples/hello/config.ru +0 -22
- data/examples/hello/falcon.rb +0 -24
- data/examples/hello/preload.rb +0 -7
- data/examples/internet/config.ru +0 -54
- data/examples/memory/allocations.rb +0 -39
- data/examples/memory/config.ru +0 -14
- data/examples/push/client.rb +0 -29
- data/examples/push/config.ru +0 -28
- data/examples/push/index.html +0 -14
- data/examples/push/script.js +0 -2
- data/examples/push/style.css +0 -4
- data/examples/redis/Gemfile +0 -9
- data/examples/redis/config.ru +0 -28
- data/examples/sequel/Gemfile +0 -4
- data/examples/sequel/config.ru +0 -8
- data/examples/sequel/data.sqlite3 +0 -0
- data/examples/server/standalone.rb +0 -27
- data/examples/sinatra/Gemfile +0 -7
- data/examples/sinatra/Gemfile.lock +0 -53
- data/examples/sinatra/config.ru +0 -16
- data/examples/trailers/config.ru +0 -34
- data/examples/trailers/falcon.rb +0 -8
- data/falcon.gemspec +0 -45
- data/gems/rack1.gemfile +0 -4
- data/gems/rack3.gemfile +0 -4
- data/logo-square.afdesign +0 -0
- data/logo.afdesign +0 -0
- data/logo.svg +0 -107
- data/server.rb +0 -21
- data/tasks/benchmark.rake +0 -103
@@ -22,7 +22,13 @@
|
|
22
22
|
|
23
23
|
module Falcon
|
24
24
|
module Service
|
25
|
+
# Captures the stateful behaviour of a specific service.
|
26
|
+
# Specifies the interfaces required by derived classes.
|
27
|
+
#
|
28
|
+
# Designed to be invoked within an {Async::Controller::Container}.
|
25
29
|
class Generic
|
30
|
+
# Convert the given environment into a service if possible.
|
31
|
+
# @parameter environment [Build::Environment] The environment to use to construct the service.
|
26
32
|
def self.wrap(environment)
|
27
33
|
evaluator = environment.evaluator
|
28
34
|
service = evaluator.service || self
|
@@ -30,29 +36,41 @@ module Falcon
|
|
30
36
|
return service.new(environment)
|
31
37
|
end
|
32
38
|
|
39
|
+
# Initialize the service from the given environment.
|
40
|
+
# @parameter environment [Build::Environment]
|
33
41
|
def initialize(environment)
|
34
42
|
@environment = environment
|
35
43
|
@evaluator = @environment.evaluator
|
36
44
|
end
|
37
45
|
|
46
|
+
# Whether the service environment contains the specified keys.
|
47
|
+
# This is used for matching environment configuration to service behaviour.
|
38
48
|
def include?(keys)
|
39
49
|
keys.all?{|key| @environment.include?(key)}
|
40
50
|
end
|
41
51
|
|
52
|
+
# The name of the service.
|
53
|
+
# e.g. `myapp.com`.
|
42
54
|
def name
|
43
55
|
@evaluator.name
|
44
56
|
end
|
45
57
|
|
58
|
+
# The logger to use for this service.
|
59
|
+
# @returns [Console::Logger]
|
46
60
|
def logger
|
47
61
|
return Async.logger # .with(name: name)
|
48
62
|
end
|
49
63
|
|
64
|
+
# Start the service.
|
50
65
|
def start
|
51
66
|
end
|
52
67
|
|
68
|
+
# Setup the service into the specified container.
|
69
|
+
# @parameter container [Async::Container::Generic]
|
53
70
|
def setup(container)
|
54
71
|
end
|
55
72
|
|
73
|
+
# Stop the service.
|
56
74
|
def stop
|
57
75
|
end
|
58
76
|
end
|
data/lib/falcon/service/proxy.rb
CHANGED
@@ -32,26 +32,32 @@ module Falcon
|
|
32
32
|
"#{self.class} for #{self.authority}"
|
33
33
|
end
|
34
34
|
|
35
|
+
# The host that this proxy will receive connections for.
|
35
36
|
def authority
|
36
37
|
@evaluator.authority
|
37
38
|
end
|
38
39
|
|
40
|
+
# The upstream endpoint that this proxy will connect to.
|
39
41
|
def endpoint
|
40
42
|
@evaluator.endpoint
|
41
43
|
end
|
42
44
|
|
45
|
+
# The {OpenSSL::SSL::SSLContext} that will be used for incoming connections.
|
43
46
|
def ssl_context
|
44
47
|
@evaluator.ssl_context
|
45
48
|
end
|
46
49
|
|
50
|
+
# The root
|
47
51
|
def root
|
48
52
|
@evaluator.root
|
49
53
|
end
|
50
54
|
|
55
|
+
# The protocol this proxy will use to talk to the upstream host.
|
51
56
|
def protocol
|
52
57
|
endpoint.protocol
|
53
58
|
end
|
54
59
|
|
60
|
+
# The scheme this proxy will use to talk to the upstream host.
|
55
61
|
def scheme
|
56
62
|
endpoint.scheme
|
57
63
|
end
|
@@ -28,33 +28,41 @@ require 'async/io/shared_endpoint'
|
|
28
28
|
|
29
29
|
module Falcon
|
30
30
|
module Service
|
31
|
+
# Implements a host supervisor which can restart the host services and provide various metrics about the running processes.
|
31
32
|
class Supervisor < Generic
|
33
|
+
# Initialize the supervisor using the given environment.
|
34
|
+
# @parameter environment [Build::Environment]
|
32
35
|
def initialize(environment)
|
33
36
|
super
|
34
37
|
|
35
38
|
@bound_endpoint = nil
|
36
39
|
end
|
37
40
|
|
41
|
+
# The endpoint which the supervisor will bind to.
|
42
|
+
# Typically a unix pipe in the same directory as the host.
|
38
43
|
def endpoint
|
39
44
|
@evaluator.endpoint
|
40
45
|
end
|
41
46
|
|
47
|
+
# Restart the process group that the supervisor belongs to.
|
42
48
|
def do_restart(message)
|
43
49
|
# Tell the parent of this process group to spin up a new process group/container.
|
44
50
|
# Wait for that to start accepting new connections.
|
45
51
|
# Stop accepting connections.
|
46
52
|
# Wait for existing connnections to drain.
|
47
53
|
# Terminate this process group.
|
48
|
-
|
49
54
|
signal = message[:signal] || :INT
|
50
55
|
|
51
56
|
Process.kill(signal, Process.ppid)
|
52
57
|
end
|
53
58
|
|
59
|
+
# Capture process metrics relating to the process group that the supervisor belongs to.
|
54
60
|
def do_metrics(message)
|
55
|
-
Process::Metrics.capture(pid: Process.ppid, ppid: Process.ppid)
|
61
|
+
Process::Metrics::General.capture(pid: Process.ppid, ppid: Process.ppid)
|
56
62
|
end
|
57
63
|
|
64
|
+
# Handle an incoming request.
|
65
|
+
# @parameter message [Hash] The decoded message.
|
58
66
|
def handle(message)
|
59
67
|
case message[:please]
|
60
68
|
when 'restart'
|
@@ -64,6 +72,7 @@ module Falcon
|
|
64
72
|
end
|
65
73
|
end
|
66
74
|
|
75
|
+
# Bind the supervisor to the specified endpoint.
|
67
76
|
def start
|
68
77
|
Async.logger.info(self) {"Binding to #{self.endpoint}..."}
|
69
78
|
|
@@ -74,6 +83,8 @@ module Falcon
|
|
74
83
|
super
|
75
84
|
end
|
76
85
|
|
86
|
+
# Start the supervisor process which accepts connections from the bound endpoint and processes JSON formatted messages.
|
87
|
+
# @parameter container [Async::Container::Generic]
|
77
88
|
def setup(container)
|
78
89
|
container.run(name: self.name, restart: true, count: 1) do |instance|
|
79
90
|
Async do
|
@@ -93,6 +104,7 @@ module Falcon
|
|
93
104
|
super
|
94
105
|
end
|
95
106
|
|
107
|
+
# Release the bound endpoint.
|
96
108
|
def stop
|
97
109
|
@bound_endpoint&.close
|
98
110
|
@bound_endpoint = nil
|
data/lib/falcon/services.rb
CHANGED
@@ -23,7 +23,19 @@
|
|
23
23
|
require_relative 'service/generic'
|
24
24
|
|
25
25
|
module Falcon
|
26
|
+
# Represents one or more services associated with a host.
|
27
|
+
#
|
28
|
+
# The services model allows falcon to manage one more more service associated with a given host. Some examples of services include:
|
29
|
+
#
|
30
|
+
# - Rack applications wrapped by {Service::Application}.
|
31
|
+
# - Host supervisor implemented in {Service::Supervisor}.
|
32
|
+
# - Proxy services wrapped by {Service::Proxy}.
|
33
|
+
#
|
34
|
+
# The list of services is typically generated from the user supplied `falcon.rb` configuration file, which is loaded into an immutable {Configuration} instance, which is mapped into a list of services.
|
26
35
|
class Services
|
36
|
+
# Initialize the services from the given configuration.
|
37
|
+
#
|
38
|
+
# @parameter configuration [Configuration]
|
27
39
|
def initialize(configuration)
|
28
40
|
@named = {}
|
29
41
|
|
@@ -34,14 +46,19 @@ module Falcon
|
|
34
46
|
end
|
35
47
|
end
|
36
48
|
|
49
|
+
# Enumerate all named services.
|
37
50
|
def each(&block)
|
38
51
|
@named.each_value(&block)
|
39
52
|
end
|
40
53
|
|
54
|
+
# Add a named service.
|
55
|
+
#
|
56
|
+
# @parameter service [Service]
|
41
57
|
def add(service)
|
42
58
|
@named[service.name] = service
|
43
59
|
end
|
44
60
|
|
61
|
+
# Start all named services.
|
45
62
|
def start
|
46
63
|
@named.each do |name, service|
|
47
64
|
Async.logger.debug(self) {"Starting #{name}..."}
|
@@ -49,6 +66,9 @@ module Falcon
|
|
49
66
|
end
|
50
67
|
end
|
51
68
|
|
69
|
+
# Setup all named services into the given container.
|
70
|
+
#
|
71
|
+
# @parameter container [Async::Container::Generic]
|
52
72
|
def setup(container)
|
53
73
|
@named.each do |name, service|
|
54
74
|
Async.logger.debug(self) {"Setup #{name} into #{container}..."}
|
@@ -58,6 +78,7 @@ module Falcon
|
|
58
78
|
return container
|
59
79
|
end
|
60
80
|
|
81
|
+
# Stop all named services.
|
61
82
|
def stop
|
62
83
|
failed = false
|
63
84
|
|
data/lib/falcon/tls.rb
CHANGED
@@ -24,8 +24,10 @@ require_relative 'extensions/openssl'
|
|
24
24
|
|
25
25
|
module Falcon
|
26
26
|
module TLS
|
27
|
-
#
|
28
|
-
#
|
27
|
+
# The list of supported ciphers.
|
28
|
+
#
|
29
|
+
# We follow "Intermediate compatibility" as oulined here:
|
30
|
+
# <https://wiki.mozilla.org/Security/Server_Side_TLS>
|
29
31
|
SERVER_CIPHERS = [
|
30
32
|
# TLS 1.3:
|
31
33
|
"TLS_AES_128_GCM_SHA256",
|
data/lib/falcon/version.rb
CHANGED
data/lib/rack/handler/falcon.rb
CHANGED
@@ -9,10 +9,14 @@ require 'async/io/host_endpoint'
|
|
9
9
|
|
10
10
|
module Rack
|
11
11
|
module Handler
|
12
|
+
# The falcon adaptor for the `rackup` executable.
|
12
13
|
module Falcon
|
13
|
-
|
14
|
+
# The default scheme.
|
15
|
+
SCHEME = "http"
|
14
16
|
NAME = :falcon
|
15
17
|
|
18
|
+
# Generate an endpoint for the given `rackup` options.
|
19
|
+
# @returns [Async::IO::Endpoint]
|
16
20
|
def self.endpoint_for(**options)
|
17
21
|
host = options[:Host] || 'localhost'
|
18
22
|
port = Integer(options[:Port] || 9292)
|
@@ -20,6 +24,8 @@ module Rack
|
|
20
24
|
return Async::IO::Endpoint.tcp(host, port)
|
21
25
|
end
|
22
26
|
|
27
|
+
# Run the specified app using the given options:
|
28
|
+
# @parameter app [Object] The rack middleware.
|
23
29
|
def self.run(app, **options)
|
24
30
|
endpoint = endpoint_for(**options)
|
25
31
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: falcon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.36.
|
4
|
+
version: 0.36.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.52.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.52.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: async-http-cache
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,14 +142,14 @@ dependencies:
|
|
142
142
|
requirements:
|
143
143
|
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 0.
|
145
|
+
version: 0.2.0
|
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
|
-
version: 0.
|
152
|
+
version: 0.2.0
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: async-rspec
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -248,21 +248,7 @@ dependencies:
|
|
248
248
|
- - "~>"
|
249
249
|
- !ruby/object:Gem::Version
|
250
250
|
version: '3.6'
|
251
|
-
|
252
|
-
name: bake-bundler
|
253
|
-
requirement: !ruby/object:Gem::Requirement
|
254
|
-
requirements:
|
255
|
-
- - ">="
|
256
|
-
- !ruby/object:Gem::Version
|
257
|
-
version: '0'
|
258
|
-
type: :development
|
259
|
-
prerelease: false
|
260
|
-
version_requirements: !ruby/object:Gem::Requirement
|
261
|
-
requirements:
|
262
|
-
- - ">="
|
263
|
-
- !ruby/object:Gem::Version
|
264
|
-
version: '0'
|
265
|
-
description:
|
251
|
+
description:
|
266
252
|
email:
|
267
253
|
- samuel.williams@oriontransfer.co.nz
|
268
254
|
executables:
|
@@ -271,48 +257,9 @@ executables:
|
|
271
257
|
extensions: []
|
272
258
|
extra_rdoc_files: []
|
273
259
|
files:
|
274
|
-
- ".editorconfig"
|
275
|
-
- ".github/FUNDING.yml"
|
276
|
-
- ".github/workflows/development.yml"
|
277
|
-
- ".gitignore"
|
278
|
-
- ".rspec"
|
279
|
-
- ".travis.yml"
|
280
|
-
- Gemfile
|
281
|
-
- README.md
|
282
260
|
- bake/falcon/supervisor.rb
|
283
261
|
- bin/falcon
|
284
262
|
- bin/falcon-host
|
285
|
-
- examples/beer/config.ru
|
286
|
-
- examples/beer/falcon.rb
|
287
|
-
- examples/benchmark/config.ru
|
288
|
-
- examples/benchmark/falcon.rb
|
289
|
-
- examples/csv/config.ru
|
290
|
-
- examples/google/falcon.rb
|
291
|
-
- examples/hello/config.ru
|
292
|
-
- examples/hello/falcon.rb
|
293
|
-
- examples/hello/preload.rb
|
294
|
-
- examples/internet/config.ru
|
295
|
-
- examples/memory/allocations.rb
|
296
|
-
- examples/memory/config.ru
|
297
|
-
- examples/push/client.rb
|
298
|
-
- examples/push/config.ru
|
299
|
-
- examples/push/index.html
|
300
|
-
- examples/push/script.js
|
301
|
-
- examples/push/style.css
|
302
|
-
- examples/redis/Gemfile
|
303
|
-
- examples/redis/config.ru
|
304
|
-
- examples/sequel/Gemfile
|
305
|
-
- examples/sequel/config.ru
|
306
|
-
- examples/sequel/data.sqlite3
|
307
|
-
- examples/server/standalone.rb
|
308
|
-
- examples/sinatra/Gemfile
|
309
|
-
- examples/sinatra/Gemfile.lock
|
310
|
-
- examples/sinatra/config.ru
|
311
|
-
- examples/trailers/config.ru
|
312
|
-
- examples/trailers/falcon.rb
|
313
|
-
- falcon.gemspec
|
314
|
-
- gems/rack1.gemfile
|
315
|
-
- gems/rack3.gemfile
|
316
263
|
- lib/falcon.rb
|
317
264
|
- lib/falcon/adapters/early_hints.rb
|
318
265
|
- lib/falcon/adapters/input.rb
|
@@ -330,22 +277,24 @@ files:
|
|
330
277
|
- lib/falcon/command/top.rb
|
331
278
|
- lib/falcon/command/virtual.rb
|
332
279
|
- lib/falcon/configuration.rb
|
333
|
-
- lib/falcon/configuration/application.rb
|
334
|
-
- lib/falcon/configuration/lets_encrypt_tls.rb
|
335
|
-
- lib/falcon/configuration/proxy.rb
|
336
|
-
- lib/falcon/configuration/rack.rb
|
337
|
-
- lib/falcon/configuration/self_signed_tls.rb
|
338
|
-
- lib/falcon/configuration/supervisor.rb
|
339
|
-
- lib/falcon/configuration/tls.rb
|
340
280
|
- lib/falcon/controller/host.rb
|
341
281
|
- lib/falcon/controller/proxy.rb
|
342
282
|
- lib/falcon/controller/redirect.rb
|
343
283
|
- lib/falcon/controller/serve.rb
|
344
284
|
- lib/falcon/controller/virtual.rb
|
345
285
|
- lib/falcon/endpoint.rb
|
286
|
+
- lib/falcon/environments.rb
|
287
|
+
- lib/falcon/environments/application.rb
|
288
|
+
- lib/falcon/environments/lets_encrypt_tls.rb
|
289
|
+
- lib/falcon/environments/proxy.rb
|
290
|
+
- lib/falcon/environments/rack.rb
|
291
|
+
- lib/falcon/environments/self_signed_tls.rb
|
292
|
+
- lib/falcon/environments/supervisor.rb
|
293
|
+
- lib/falcon/environments/tls.rb
|
346
294
|
- lib/falcon/extensions/openssl.rb
|
347
295
|
- lib/falcon/middleware/proxy.rb
|
348
296
|
- lib/falcon/middleware/redirect.rb
|
297
|
+
- lib/falcon/middleware/verbose.rb
|
349
298
|
- lib/falcon/proxy_endpoint.rb
|
350
299
|
- lib/falcon/server.rb
|
351
300
|
- lib/falcon/service/application.rb
|
@@ -354,18 +303,12 @@ files:
|
|
354
303
|
- lib/falcon/service/supervisor.rb
|
355
304
|
- lib/falcon/services.rb
|
356
305
|
- lib/falcon/tls.rb
|
357
|
-
- lib/falcon/verbose.rb
|
358
306
|
- lib/falcon/version.rb
|
359
307
|
- lib/rack/handler/falcon.rb
|
360
|
-
- logo-square.afdesign
|
361
|
-
- logo.afdesign
|
362
|
-
- logo.svg
|
363
|
-
- server.rb
|
364
|
-
- tasks/benchmark.rake
|
365
308
|
homepage: https://github.com/socketry/falcon
|
366
309
|
licenses: []
|
367
310
|
metadata: {}
|
368
|
-
post_install_message:
|
311
|
+
post_install_message:
|
369
312
|
rdoc_options: []
|
370
313
|
require_paths:
|
371
314
|
- lib
|
@@ -373,7 +316,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
373
316
|
requirements:
|
374
317
|
- - "~>"
|
375
318
|
- !ruby/object:Gem::Version
|
376
|
-
version: '2.
|
319
|
+
version: '2.5'
|
377
320
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
378
321
|
requirements:
|
379
322
|
- - ">="
|
@@ -381,7 +324,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
381
324
|
version: '0'
|
382
325
|
requirements: []
|
383
326
|
rubygems_version: 3.1.2
|
384
|
-
signing_key:
|
327
|
+
signing_key:
|
385
328
|
specification_version: 4
|
386
329
|
summary: A fast, asynchronous, rack-compatible web server.
|
387
330
|
test_files: []
|