tipi 0.54 → 0.56

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
  SHA256:
3
- metadata.gz: 9d233f020bba51d04d83ad3bc0af0fba949a4988ed206cb3eb27c6cb66e9d581
4
- data.tar.gz: 7462a9e229e3d78dbed4ffac92029b6fa117df683b425102f6de259eab8adc2c
3
+ metadata.gz: 358e5c2ab73c2404872237b4dbd53907f0523a3803f7bdbcbc256508b59130fa
4
+ data.tar.gz: 7e1d49d54ee1317ec137ff66014a619108e2c28a276f1374db9632b212ae405c
5
5
  SHA512:
6
- metadata.gz: d0fff68a7a6848dbaf6a3b5f846ada34542b532bc42d79821c47981354214c914130fda8192ffe12bc334554264297000afe82742388713de87356e17e6dc8a6
7
- data.tar.gz: d8e9c715aace1b1dc26a78a5463016f4d0a65c552fa865a8b471ccb60955abd350304d1ae7db1ddaeebd4577ded25b048078c3e4fe39abe5e32385cbb5eddae3
6
+ metadata.gz: 86e328e8fd7c6185dd027a47a592675cc59ca4e53aeeb80847b5e8b931df1011561b086414599512fe230e28a6d3a8c4cb5226be6279628dada1cfb5f6503528
7
+ data.tar.gz: fa4cdfd25fc5790fb06cf770b7791d830b9f3c9ce751f1cf8fd25ca28fc56e839766a4c5d886b20515192d753e02f28596d20a97268fd7485bc9329fa792ab85
@@ -8,15 +8,15 @@ jobs:
8
8
  fail-fast: false
9
9
  matrix:
10
10
  os: [ubuntu-latest, macos-latest]
11
- ruby: ['3.0', '3.1', '3.2', 'head']
11
+ ruby: ['3.2', '3.3', '3.4', 'head']
12
12
 
13
13
  name: >-
14
14
  ${{matrix.os}}, ${{matrix.ruby}}
15
15
 
16
16
  runs-on: ${{matrix.os}}
17
17
 
18
- env:
19
- POLYPHONY_LIBEV: "1"
18
+ # env:
19
+ # POLYPHONY_LIBEV: "1"
20
20
 
21
21
  steps:
22
22
  - name: Setup machine
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## 0.56 2025-10-21
2
+
3
+ - Update localhost, acme-client, websocket, http-2, extralite, qeweney, rack, bundler dependencies (#35)
4
+ - Drop support for Ruby 3.1 (#35)
5
+ - Add support for Ruby 3.3 and 3.4 (#35)
6
+
7
+
8
+ ## 0.55 2023-07-29
9
+
10
+ - Simplify HTTP/1 exception handling
11
+ - Update H1P dependency
12
+ - Update Extralite dependency (#28)
13
+
1
14
  ## 0.54 2023-05-28
2
15
 
3
16
  - Use `H1P.send_response` for sending response
data/Gemfile.lock CHANGED
@@ -1,67 +1,85 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tipi (0.54)
5
- acme-client (~> 2.0.9)
6
- ever (~> 0.1)
7
- extralite (~> 1.25)
8
- h1p (~> 0.6.1)
9
- http-2 (~> 0.11)
10
- localhost (~> 1.1.4)
11
- msgpack (~> 1.4.2)
12
- polyphony (~> 1.0.2)
13
- qeweney (~> 0.18)
14
- rack (>= 2.0.8, < 2.3.0)
15
- websocket (~> 1.2.8)
4
+ tipi (0.56)
5
+ acme-client (~> 2.0.26)
6
+ base64 (~> 0.3)
7
+ ever (~> 0.2)
8
+ extralite (~> 2.13)
9
+ h1p (~> 1.1)
10
+ http-2 (~> 1.1)
11
+ localhost (~> 1.6.0)
12
+ msgpack (~> 1.8.0)
13
+ mutex_m (~> 0.3)
14
+ polyphony (~> 1.4)
15
+ qeweney (~> 0.24)
16
+ rack (>= 2.0.8, < 3.3.0)
17
+ websocket (~> 1.2.11)
16
18
 
17
19
  GEM
18
20
  remote: https://rubygems.org/
19
21
  specs:
20
- acme-client (2.0.13)
22
+ acme-client (2.0.26)
23
+ base64 (~> 0.2)
21
24
  faraday (>= 1.0, < 3.0.0)
22
25
  faraday-retry (>= 1.0, < 3.0.0)
23
- cuba (3.9.3)
24
- rack (>= 1.6.0)
26
+ base64 (0.3.0)
27
+ cuba (4.0.3)
28
+ rack (>= 3.0.0)
29
+ rack-session (>= 2.0.0)
25
30
  docile (1.4.0)
26
- escape_utils (1.2.2)
31
+ escape_utils (1.3.0)
27
32
  ever (0.2)
28
- extralite (1.26)
29
- faraday (2.7.5)
30
- faraday-net_http (>= 2.0, < 3.1)
31
- ruby2_keywords (>= 0.0.4)
32
- faraday-net_http (3.0.2)
33
- faraday-retry (2.1.0)
33
+ extralite (2.13)
34
+ faraday (2.14.0)
35
+ faraday-net_http (>= 2.0, < 3.5)
36
+ json
37
+ logger
38
+ faraday-net_http (3.4.1)
39
+ net-http (>= 0.5.0)
40
+ faraday-retry (2.3.2)
34
41
  faraday (~> 2.0)
35
- h1p (0.6.1)
36
- http-2 (0.11.0)
37
- json (2.6.3)
38
- localhost (1.1.10)
39
- memory_profiler (1.0.1)
40
- minitest (5.11.3)
41
- msgpack (1.4.5)
42
- polyphony (1.0.2)
43
- qeweney (0.18)
44
- escape_utils (~> 1.2.1)
45
- rack (2.2.7)
46
- rake (13.0.6)
47
- ruby2_keywords (0.0.5)
48
- simplecov (0.17.1)
42
+ h1p (1.1)
43
+ http-2 (1.1.1)
44
+ json (2.15.1)
45
+ localhost (1.6.0)
46
+ logger (1.7.0)
47
+ memory_profiler (1.1.0)
48
+ minitest (5.26.0)
49
+ msgpack (1.8.0)
50
+ mutex_m (0.3.0)
51
+ net-http (0.6.0)
52
+ uri
53
+ ostruct (0.6.3)
54
+ polyphony (1.4)
55
+ qeweney (0.24)
56
+ escape_utils (= 1.3.0)
57
+ rack (3.2.3)
58
+ rack-session (2.1.1)
59
+ base64 (>= 0.1.0)
60
+ rack (>= 3.0.0)
61
+ rake (13.3.0)
62
+ simplecov (0.22.0)
49
63
  docile (~> 1.1)
50
- json (>= 1.8, < 3)
51
- simplecov-html (~> 0.10.0)
52
- simplecov-html (0.10.2)
53
- websocket (1.2.9)
64
+ simplecov-html (~> 0.11)
65
+ simplecov_json_formatter (~> 0.1)
66
+ simplecov-html (0.12.3)
67
+ simplecov_json_formatter (0.1.4)
68
+ uri (1.0.4)
69
+ websocket (1.2.11)
54
70
 
55
71
  PLATFORMS
56
72
  ruby
57
73
 
58
74
  DEPENDENCIES
59
- cuba (~> 3.9.3)
60
- memory_profiler (~> 1.0.0)
61
- minitest (~> 5.11.3)
62
- rake (~> 13.0.6)
63
- simplecov (~> 0.17.1)
75
+ cuba (~> 4.0.3)
76
+ logger (~> 1.7)
77
+ memory_profiler (~> 1.1.0)
78
+ minitest (~> 5.26.0)
79
+ ostruct (~> 0.3)
80
+ rake (~> 13.3.0)
81
+ simplecov (~> 0.22.0)
64
82
  tipi!
65
83
 
66
84
  BUNDLED WITH
67
- 2.3.3
85
+ 2.7.2
data/TODO.md CHANGED
@@ -1,52 +1,12 @@
1
- ## Add an API for reading a request body chunk into an IO (pipe)
1
+ ## Rethink design
2
2
 
3
- ```ruby
4
- # currently
5
- chunk = req.next_chunk
6
- # or
7
- req.each_chunk { |c| do_something(c) }
3
+ - Remove DF code
4
+ - Remove non-Polyphony code
8
5
 
9
- # what we'd like to do
10
- r, w = IO.pipe
11
- len = req.splice_chunk(w)
12
- sock << "Here comes a chunk of #{len} bytes\n"
13
- sock.splice(r, len)
6
+ # Miscellaneous
14
7
 
15
- # or:
16
- r, w = IO.pipe
17
- req.splice_each_chunk(w) do |len|
18
- sock << "Here comes a chunk of #{len} bytes\n"
19
- sock.splice(r, len)
20
- end
21
- ```
22
-
23
- # HTTP/1.1 parser
24
-
25
- - httparser.rb is not actively updated
26
- - the httparser.rb C parser code comes originally from https://github.com/nodejs/llhttp
27
- - there's a Ruby gem https://github.com/metabahn/llhttp, but its API is too low-level
28
- (lots of callbacks, headers need to be retained across callbacks)
29
- - the basic idea is to import the C-code, then build a parser object with the following
30
- callbacks:
31
-
32
- ```ruby
33
- on_headers_complete(headers)
34
- on_body_chunk(chunk)
35
- on_message_complete
36
- ```
37
-
38
- - The llhttp gem's C-code is here: https://github.com/metabahn/llhttp/tree/main/mri
39
-
40
- - Actually, if you do a C extension, instead of a callback-based API, we can
41
- design a blocking API:
42
-
43
- ```ruby
44
- parser = Tipi::HTTP1::Parser.new
45
- parser.each_request(socket) do |headers|
46
- request = Request.new(normalize_headers(headers))
47
- handle_request(request)
48
- end
49
- ```
8
+ - Try using `TCP_DEFER_ACCEPT` with Polyphony on io_uring - does it provide any
9
+ performance benefit?
50
10
 
51
11
  # What about HTTP/2?
52
12
 
@@ -61,26 +21,8 @@ end
61
21
  ```
62
22
 
63
23
 
64
-
65
- # DF
66
-
67
- - Add attack protection for IP-address HTTP host:
68
-
69
- ```ruby
70
- IPV4_REGEXP = /^\d+\.\d+\.\d+\.\d+$/.freeze
71
-
72
- def is_attack_request?(req)
73
- return true if req.host =~ IPV4_REGEXP && req.query[:q] != 'ping'
74
- end
75
- ```
76
-
77
- - Add attack route to Qeweney routing API
78
-
79
-
80
-
81
24
  # Roadmap
82
25
 
83
- - Update README (get rid of non-http stuff)
84
26
  - Improve Rack spec compliance, add tests
85
27
  - Homogenize HTTP 1 and HTTP 2 headers - downcase symbols
86
28
 
@@ -14,7 +14,7 @@ module Tipi
14
14
 
15
15
  def app
16
16
  return @app if @app
17
-
17
+
18
18
  raise 'No app define. The app to run should be set using `Tipi.app = ...`'
19
19
  end
20
20
 
@@ -38,10 +38,10 @@ module Tipi
38
38
  # TODO: find out how Terminate can leak like that (it's supposed to be
39
39
  # caught in Fiber#run)
40
40
  end
41
- trap('SIGTERM') { supervisor.terminate(true) }
41
+ trap('SIGTERM') { supervisor.terminate(graceful: true) }
42
42
  trap('SIGINT') do
43
43
  trap('SIGINT') { exit! }
44
- supervisor.terminate(true)
44
+ supervisor.terminate(graceful: true)
45
45
  end
46
46
 
47
47
  supervisor.await
@@ -51,10 +51,10 @@ module Tipi
51
51
 
52
52
  def run_worker
53
53
  server = start_server(@service)
54
- trap('SIGTERM') { server&.terminate(true) }
54
+ trap('SIGTERM') { server&.terminate(graceful: true) }
55
55
  trap('SIGINT') do
56
56
  trap('SIGINT') { exit! }
57
- server&.terminate(true)
57
+ server&.terminate(graceful: true)
58
58
  end
59
59
  raise 'Server not started' unless server
60
60
  server.await
@@ -292,7 +292,7 @@ module Tipi
292
292
  fiber.attach_all_children_to(supervisor)
293
293
 
294
294
  # terminating the supervisor will
295
- supervisor.terminate(true)
295
+ supervisor.terminate(graceful: true)
296
296
  end
297
297
 
298
298
  def add_connection_headers(app)
@@ -295,10 +295,10 @@ module Tipi
295
295
  # TODO: find out how Terminate can leak like that (it's supposed to be
296
296
  # caught in Fiber#run)
297
297
  end
298
- # trap('SIGTERM') { supervisor.terminate(true) }
298
+ # trap('SIGTERM') { supervisor.terminate(graceful: true) }
299
299
  # trap('SIGINT') do
300
300
  # trap('SIGINT') { exit! }
301
- # supervisor.terminate(true)
301
+ # supervisor.terminate(graceful: true)
302
302
  # end
303
303
 
304
304
  # supervisor.await
@@ -577,7 +577,7 @@ module Tipi
577
577
  fiber.attach_all_children_to(supervisor)
578
578
 
579
579
  # terminating the supervisor will
580
- supervisor.terminate(true)
580
+ supervisor.terminate(graceful: true)
581
581
  end
582
582
 
583
583
  def add_connection_headers(app)
@@ -162,7 +162,7 @@ module DigitalFabric
162
162
  # puts "Received shutdown message (#{@requests.size} pending requests)"
163
163
  # puts " (Long running requests: #{@long_running_requests.size})"
164
164
  @shutdown = true
165
- @long_running_requests.values.each { |f| f.terminate(true) }
165
+ @long_running_requests.values.each { |f| f.terminate(graceful: true) }
166
166
  end
167
167
 
168
168
  def recv_http_request(msg)
@@ -27,13 +27,8 @@ module Tipi
27
27
  # upgraded
28
28
  break if handle_request(headers, &block)
29
29
  end
30
- rescue H1P::Error, ArgumentError
31
- # an ArgumentError might be raised in the parser if an invalid input
32
- # string is given as the HTTP method (String#upcase will raise on invalid HTTP string)
33
- #
34
- # ignore
35
- rescue SystemCallError, IOError
36
- # ignore
30
+ rescue SystemCallError, IOError, H1P::Error
31
+ # connection or parser error, ignore
37
32
  ensure
38
33
  finalize_client_loop
39
34
  end
@@ -160,7 +155,7 @@ module Tipi
160
155
  # response API
161
156
 
162
157
  CRLF = "\r\n"
163
-
158
+
164
159
  # Sends response including headers and body. Waits for the request to complete
165
160
  # if not yet completed. The body is sent using chunked transfer encoding.
166
161
  # @param request [Qeweney::Request] HTTP request
@@ -68,7 +68,7 @@ module Tipi
68
68
  # TODO: we'll want to get some kind of signal from the new controller once it's ready
69
69
  sleep 1
70
70
 
71
- old_watcher.terminate(true)
71
+ old_watcher.terminate(graceful: true)
72
72
  end
73
73
  end
74
74
  end
data/lib/tipi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tipi
4
- VERSION = '0.54'
4
+ VERSION = '0.56'
5
5
  end
data/test/helper.rb CHANGED
@@ -13,7 +13,7 @@ require 'polyphony'
13
13
 
14
14
  ::Exception.__disable_sanitized_backtrace__ = true
15
15
 
16
- class MiniTest::Test
16
+ class Minitest::Test
17
17
  def setup
18
18
  # trace "* setup #{self.name}"
19
19
  Fiber.current.setup_main_fiber
@@ -9,10 +9,10 @@ class String
9
9
  end
10
10
  end
11
11
 
12
- class HTTP1ServerTest < MiniTest::Test
12
+ class HTTP1ServerTest < Minitest::Test
13
13
  def teardown
14
14
  @server&.interrupt if @server&.alive?
15
- snooze
15
+ sleep 0.01
16
16
  super
17
17
  end
18
18
 
@@ -67,11 +67,13 @@ class HTTP1ServerTest < MiniTest::Test
67
67
 
68
68
  connection << "GET / HTTP/1.0\r\nConnection: keep-alive\r\n\r\n"
69
69
  response = connection.readpartial(8192)
70
+ sleep 0.01
70
71
  assert !connection.eof?
71
72
  assert_equal("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nHi", response)
72
73
 
73
74
  connection << "GET / HTTP/1.1\r\n\r\n"
74
75
  response = connection.readpartial(8192)
76
+ sleep 0.01
75
77
  assert !connection.eof?
76
78
  expected = <<~HTTP.crlf_lines.chomp
77
79
  HTTP/1.1 200 OK
@@ -83,6 +85,7 @@ class HTTP1ServerTest < MiniTest::Test
83
85
 
84
86
  connection << "GET / HTTP/1.0\r\n\r\n"
85
87
  response = connection.readpartial(8192)
88
+ sleep 0.01
86
89
  assert connection.eof?
87
90
  assert_equal("HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nHi", response)
88
91
  end
@@ -191,6 +194,7 @@ class HTTP1ServerTest < MiniTest::Test
191
194
 
192
195
  connection << "GET / HTTP/1.1\r\n\r\n"
193
196
  response = connection.readpartial(8192)
197
+ sleep 0.01
194
198
  assert !connection.eof?
195
199
  expected = <<~HTTP.crlf_lines.chomp
196
200
  HTTP/1.1 200 OK
@@ -209,6 +213,7 @@ class HTTP1ServerTest < MiniTest::Test
209
213
 
210
214
  snooze
211
215
  response = connection.readpartial(8192)
216
+ snooze
212
217
  assert !connection.eof?
213
218
  expected = <<~HTTP.crlf_lines
214
219
  HTTP/1.1 101 Switching Protocols
data/test/test_request.rb CHANGED
@@ -9,7 +9,7 @@ class String
9
9
  end
10
10
  end
11
11
 
12
- class RequestHeadersTest < MiniTest::Test
12
+ class RequestHeadersTest < Minitest::Test
13
13
  def teardown
14
14
  @server&.interrupt if @server&.alive?
15
15
  snooze
data/tipi.gemspec CHANGED
@@ -18,29 +18,35 @@ Gem::Specification.new do |s|
18
18
  s.rdoc_options = ["--title", "tipi", "--main", "README.md"]
19
19
  s.extra_rdoc_files = ["README.md"]
20
20
  s.require_paths = ["lib"]
21
- s.required_ruby_version = '>= 2.7'
21
+ s.required_ruby_version = '>= 3.2'
22
22
 
23
23
  s.executables = ['tipi']
24
24
 
25
- s.add_runtime_dependency 'polyphony', '~>1.0.2'
26
- s.add_runtime_dependency 'ever', '~>0.1'
27
- s.add_runtime_dependency 'qeweney', '~>0.18'
28
- s.add_runtime_dependency 'extralite', '~>1.25'
29
- s.add_runtime_dependency 'h1p', '~>0.6.1'
25
+ s.add_runtime_dependency 'base64', '~>0.3'
26
+ s.add_runtime_dependency 'mutex_m', '~>0.3'
30
27
 
31
- s.add_runtime_dependency 'http-2', '~>0.11'
32
- s.add_runtime_dependency 'rack', '>=2.0.8', '<2.3.0'
33
- s.add_runtime_dependency 'websocket', '~>1.2.8'
34
- s.add_runtime_dependency 'acme-client', '~>2.0.9'
35
- s.add_runtime_dependency 'localhost', '~>1.1.4'
28
+ s.add_runtime_dependency 'polyphony', '~>1.4'
29
+ s.add_runtime_dependency 'ever', '~>0.2'
30
+ s.add_runtime_dependency 'qeweney', '~>0.24'
31
+ s.add_runtime_dependency 'extralite', '~>2.13'
32
+ s.add_runtime_dependency 'h1p', '~>1.1'
33
+
34
+ s.add_runtime_dependency 'http-2', '~>1.1'
35
+ s.add_runtime_dependency 'rack', '>=2.0.8', '<3.3.0'
36
+ s.add_runtime_dependency 'websocket', '~>1.2.11'
37
+ s.add_runtime_dependency 'acme-client', '~>2.0.26'
38
+ s.add_runtime_dependency 'localhost', '~>1.6.0'
36
39
 
37
40
  # for digital fabric
38
- s.add_runtime_dependency 'msgpack', '~>1.4.2'
41
+ s.add_runtime_dependency 'msgpack', '~>1.8.0'
42
+
43
+ s.add_development_dependency 'logger', '~>1.7'
44
+ s.add_development_dependency 'ostruct', '~>0.3'
39
45
 
40
- s.add_development_dependency 'rake', '~>13.0.6'
41
- s.add_development_dependency 'minitest', '~>5.11.3'
42
- s.add_development_dependency 'simplecov', '~>0.17.1'
43
- s.add_development_dependency 'memory_profiler', '~>1.0.0'
46
+ s.add_development_dependency 'rake', '~>13.3.0'
47
+ s.add_development_dependency 'minitest', '~>5.26.0'
48
+ s.add_development_dependency 'simplecov', '~>0.22.0'
49
+ s.add_development_dependency 'memory_profiler', '~>1.1.0'
44
50
 
45
- s.add_development_dependency 'cuba', '~>3.9.3'
51
+ s.add_development_dependency 'cuba', '~>4.0.3'
46
52
  end
metadata CHANGED
@@ -1,99 +1,126 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tipi
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.54'
4
+ version: '0.56'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-05-28 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: base64
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.3'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.3'
26
+ - !ruby/object:Gem::Dependency
27
+ name: mutex_m
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.3'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.3'
13
40
  - !ruby/object:Gem::Dependency
14
41
  name: polyphony
15
42
  requirement: !ruby/object:Gem::Requirement
16
43
  requirements:
17
44
  - - "~>"
18
45
  - !ruby/object:Gem::Version
19
- version: 1.0.2
46
+ version: '1.4'
20
47
  type: :runtime
21
48
  prerelease: false
22
49
  version_requirements: !ruby/object:Gem::Requirement
23
50
  requirements:
24
51
  - - "~>"
25
52
  - !ruby/object:Gem::Version
26
- version: 1.0.2
53
+ version: '1.4'
27
54
  - !ruby/object:Gem::Dependency
28
55
  name: ever
29
56
  requirement: !ruby/object:Gem::Requirement
30
57
  requirements:
31
58
  - - "~>"
32
59
  - !ruby/object:Gem::Version
33
- version: '0.1'
60
+ version: '0.2'
34
61
  type: :runtime
35
62
  prerelease: false
36
63
  version_requirements: !ruby/object:Gem::Requirement
37
64
  requirements:
38
65
  - - "~>"
39
66
  - !ruby/object:Gem::Version
40
- version: '0.1'
67
+ version: '0.2'
41
68
  - !ruby/object:Gem::Dependency
42
69
  name: qeweney
43
70
  requirement: !ruby/object:Gem::Requirement
44
71
  requirements:
45
72
  - - "~>"
46
73
  - !ruby/object:Gem::Version
47
- version: '0.18'
74
+ version: '0.24'
48
75
  type: :runtime
49
76
  prerelease: false
50
77
  version_requirements: !ruby/object:Gem::Requirement
51
78
  requirements:
52
79
  - - "~>"
53
80
  - !ruby/object:Gem::Version
54
- version: '0.18'
81
+ version: '0.24'
55
82
  - !ruby/object:Gem::Dependency
56
83
  name: extralite
57
84
  requirement: !ruby/object:Gem::Requirement
58
85
  requirements:
59
86
  - - "~>"
60
87
  - !ruby/object:Gem::Version
61
- version: '1.25'
88
+ version: '2.13'
62
89
  type: :runtime
63
90
  prerelease: false
64
91
  version_requirements: !ruby/object:Gem::Requirement
65
92
  requirements:
66
93
  - - "~>"
67
94
  - !ruby/object:Gem::Version
68
- version: '1.25'
95
+ version: '2.13'
69
96
  - !ruby/object:Gem::Dependency
70
97
  name: h1p
71
98
  requirement: !ruby/object:Gem::Requirement
72
99
  requirements:
73
100
  - - "~>"
74
101
  - !ruby/object:Gem::Version
75
- version: 0.6.1
102
+ version: '1.1'
76
103
  type: :runtime
77
104
  prerelease: false
78
105
  version_requirements: !ruby/object:Gem::Requirement
79
106
  requirements:
80
107
  - - "~>"
81
108
  - !ruby/object:Gem::Version
82
- version: 0.6.1
109
+ version: '1.1'
83
110
  - !ruby/object:Gem::Dependency
84
111
  name: http-2
85
112
  requirement: !ruby/object:Gem::Requirement
86
113
  requirements:
87
114
  - - "~>"
88
115
  - !ruby/object:Gem::Version
89
- version: '0.11'
116
+ version: '1.1'
90
117
  type: :runtime
91
118
  prerelease: false
92
119
  version_requirements: !ruby/object:Gem::Requirement
93
120
  requirements:
94
121
  - - "~>"
95
122
  - !ruby/object:Gem::Version
96
- version: '0.11'
123
+ version: '1.1'
97
124
  - !ruby/object:Gem::Dependency
98
125
  name: rack
99
126
  requirement: !ruby/object:Gem::Requirement
@@ -103,7 +130,7 @@ dependencies:
103
130
  version: 2.0.8
104
131
  - - "<"
105
132
  - !ruby/object:Gem::Version
106
- version: 2.3.0
133
+ version: 3.3.0
107
134
  type: :runtime
108
135
  prerelease: false
109
136
  version_requirements: !ruby/object:Gem::Requirement
@@ -113,134 +140,161 @@ dependencies:
113
140
  version: 2.0.8
114
141
  - - "<"
115
142
  - !ruby/object:Gem::Version
116
- version: 2.3.0
143
+ version: 3.3.0
117
144
  - !ruby/object:Gem::Dependency
118
145
  name: websocket
119
146
  requirement: !ruby/object:Gem::Requirement
120
147
  requirements:
121
148
  - - "~>"
122
149
  - !ruby/object:Gem::Version
123
- version: 1.2.8
150
+ version: 1.2.11
124
151
  type: :runtime
125
152
  prerelease: false
126
153
  version_requirements: !ruby/object:Gem::Requirement
127
154
  requirements:
128
155
  - - "~>"
129
156
  - !ruby/object:Gem::Version
130
- version: 1.2.8
157
+ version: 1.2.11
131
158
  - !ruby/object:Gem::Dependency
132
159
  name: acme-client
133
160
  requirement: !ruby/object:Gem::Requirement
134
161
  requirements:
135
162
  - - "~>"
136
163
  - !ruby/object:Gem::Version
137
- version: 2.0.9
164
+ version: 2.0.26
138
165
  type: :runtime
139
166
  prerelease: false
140
167
  version_requirements: !ruby/object:Gem::Requirement
141
168
  requirements:
142
169
  - - "~>"
143
170
  - !ruby/object:Gem::Version
144
- version: 2.0.9
171
+ version: 2.0.26
145
172
  - !ruby/object:Gem::Dependency
146
173
  name: localhost
147
174
  requirement: !ruby/object:Gem::Requirement
148
175
  requirements:
149
176
  - - "~>"
150
177
  - !ruby/object:Gem::Version
151
- version: 1.1.4
178
+ version: 1.6.0
152
179
  type: :runtime
153
180
  prerelease: false
154
181
  version_requirements: !ruby/object:Gem::Requirement
155
182
  requirements:
156
183
  - - "~>"
157
184
  - !ruby/object:Gem::Version
158
- version: 1.1.4
185
+ version: 1.6.0
159
186
  - !ruby/object:Gem::Dependency
160
187
  name: msgpack
161
188
  requirement: !ruby/object:Gem::Requirement
162
189
  requirements:
163
190
  - - "~>"
164
191
  - !ruby/object:Gem::Version
165
- version: 1.4.2
192
+ version: 1.8.0
166
193
  type: :runtime
167
194
  prerelease: false
168
195
  version_requirements: !ruby/object:Gem::Requirement
169
196
  requirements:
170
197
  - - "~>"
171
198
  - !ruby/object:Gem::Version
172
- version: 1.4.2
199
+ version: 1.8.0
200
+ - !ruby/object:Gem::Dependency
201
+ name: logger
202
+ requirement: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - "~>"
205
+ - !ruby/object:Gem::Version
206
+ version: '1.7'
207
+ type: :development
208
+ prerelease: false
209
+ version_requirements: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - "~>"
212
+ - !ruby/object:Gem::Version
213
+ version: '1.7'
214
+ - !ruby/object:Gem::Dependency
215
+ name: ostruct
216
+ requirement: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - "~>"
219
+ - !ruby/object:Gem::Version
220
+ version: '0.3'
221
+ type: :development
222
+ prerelease: false
223
+ version_requirements: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - "~>"
226
+ - !ruby/object:Gem::Version
227
+ version: '0.3'
173
228
  - !ruby/object:Gem::Dependency
174
229
  name: rake
175
230
  requirement: !ruby/object:Gem::Requirement
176
231
  requirements:
177
232
  - - "~>"
178
233
  - !ruby/object:Gem::Version
179
- version: 13.0.6
234
+ version: 13.3.0
180
235
  type: :development
181
236
  prerelease: false
182
237
  version_requirements: !ruby/object:Gem::Requirement
183
238
  requirements:
184
239
  - - "~>"
185
240
  - !ruby/object:Gem::Version
186
- version: 13.0.6
241
+ version: 13.3.0
187
242
  - !ruby/object:Gem::Dependency
188
243
  name: minitest
189
244
  requirement: !ruby/object:Gem::Requirement
190
245
  requirements:
191
246
  - - "~>"
192
247
  - !ruby/object:Gem::Version
193
- version: 5.11.3
248
+ version: 5.26.0
194
249
  type: :development
195
250
  prerelease: false
196
251
  version_requirements: !ruby/object:Gem::Requirement
197
252
  requirements:
198
253
  - - "~>"
199
254
  - !ruby/object:Gem::Version
200
- version: 5.11.3
255
+ version: 5.26.0
201
256
  - !ruby/object:Gem::Dependency
202
257
  name: simplecov
203
258
  requirement: !ruby/object:Gem::Requirement
204
259
  requirements:
205
260
  - - "~>"
206
261
  - !ruby/object:Gem::Version
207
- version: 0.17.1
262
+ version: 0.22.0
208
263
  type: :development
209
264
  prerelease: false
210
265
  version_requirements: !ruby/object:Gem::Requirement
211
266
  requirements:
212
267
  - - "~>"
213
268
  - !ruby/object:Gem::Version
214
- version: 0.17.1
269
+ version: 0.22.0
215
270
  - !ruby/object:Gem::Dependency
216
271
  name: memory_profiler
217
272
  requirement: !ruby/object:Gem::Requirement
218
273
  requirements:
219
274
  - - "~>"
220
275
  - !ruby/object:Gem::Version
221
- version: 1.0.0
276
+ version: 1.1.0
222
277
  type: :development
223
278
  prerelease: false
224
279
  version_requirements: !ruby/object:Gem::Requirement
225
280
  requirements:
226
281
  - - "~>"
227
282
  - !ruby/object:Gem::Version
228
- version: 1.0.0
283
+ version: 1.1.0
229
284
  - !ruby/object:Gem::Dependency
230
285
  name: cuba
231
286
  requirement: !ruby/object:Gem::Requirement
232
287
  requirements:
233
288
  - - "~>"
234
289
  - !ruby/object:Gem::Version
235
- version: 3.9.3
290
+ version: 4.0.3
236
291
  type: :development
237
292
  prerelease: false
238
293
  version_requirements: !ruby/object:Gem::Requirement
239
294
  requirements:
240
295
  - - "~>"
241
296
  - !ruby/object:Gem::Version
242
- version: 3.9.3
243
- description:
297
+ version: 4.0.3
244
298
  email: sharon@noteflakes.com
245
299
  executables:
246
300
  - tipi
@@ -358,7 +412,6 @@ metadata:
358
412
  documentation_uri: https://www.rubydoc.info/gems/tipi
359
413
  homepage_uri: https://github.com/digital-fabric/tipi
360
414
  changelog_uri: https://github.com/digital-fabric/tipi/blob/master/CHANGELOG.md
361
- post_install_message:
362
415
  rdoc_options:
363
416
  - "--title"
364
417
  - tipi
@@ -370,15 +423,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
370
423
  requirements:
371
424
  - - ">="
372
425
  - !ruby/object:Gem::Version
373
- version: '2.7'
426
+ version: '3.2'
374
427
  required_rubygems_version: !ruby/object:Gem::Requirement
375
428
  requirements:
376
429
  - - ">="
377
430
  - !ruby/object:Gem::Version
378
431
  version: '0'
379
432
  requirements: []
380
- rubygems_version: 3.4.1
381
- signing_key:
433
+ rubygems_version: 3.6.9
382
434
  specification_version: 4
383
435
  summary: Tipi - the All-in-one Web Server for Ruby Apps
384
436
  test_files: []