low_loop 0.3.2 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 13f02bd5602a0a6f93f9fdf80a937c0bc8adf20bbb2ad30fbd4860475011e02f
4
- data.tar.gz: 4023be91bfbcab20c048dd54201fa80fc3926ab83d17c4d90d52c92dd839155c
3
+ metadata.gz: 3d9fa2d555e127ad470c1eb71573c076d3484b08b833e184aa5c052b0de5a6af
4
+ data.tar.gz: 7a56cc04f846739e4dd957f66d6d558e40ab98c1fc69408fe82a6675f6101dec
5
5
  SHA512:
6
- metadata.gz: 9b8974c79439798a63e993f9002fa08829f754a6e2d3b31083f9ee6b7613d8398cd57074d284c14be74fb70bf7bdf26f4bfba33bd5fe65feddb39d14188efca3
7
- data.tar.gz: d55c83e3bf308b5a569e48c5ffb7333df45d240ba67c220faf27795d6c297076faa95c8e53340daab1c13e07705fc4d6f67fab19b73893a9f815046ad5b2205d
6
+ metadata.gz: 1e6d8044eee477441056a43a895c1314cbe14e99d170244ed9d75477c50b614c5ea29a6ac2dd245172dab8870cdca6d70bfec5b9c4ca2065dce8468be5b12e8c
7
+ data.tar.gz: 1923f95b047d33bccd17fe9b48b63a84dfa80ac30497d25b5989bdffdf1ff50f554898b0e2a5d7fcdc4ceda175f02f4da6dff6dca0c60d94f063a5801d45e9f2
@@ -9,7 +9,7 @@ module Low
9
9
 
10
10
  # TODO: For RouteEvent/FileEvent parse and provide query params as attributes on the event.
11
11
  def initialize(file:, request: nil)
12
- super()
12
+ super(key: self.class)
13
13
 
14
14
  @file = file
15
15
  @request = request
data/lib/low_loop.rb CHANGED
@@ -10,19 +10,21 @@ require_relative 'factories/response_factory'
10
10
  require_relative 'requests/request_parser'
11
11
  require_relative 'responses/response_builder'
12
12
  require_relative 'servers/file_server'
13
+ require_relative 'support/low_frame'
13
14
 
14
15
  class LowLoop
15
16
  include Observers
16
17
 
17
18
  attr_reader :config
18
19
 
19
- def initialize(config:, router: nil)
20
+ def initialize(config:, router: nil, renderer: nil, show_output: true)
20
21
  @config = config
22
+ @frame = LowFrame.new(renderer:, fps: 30, show_output:)
21
23
 
22
- observers << Low::FileServer.new(web_root: config.web_root, content_types: config.content_types)
23
- observers << router if router
24
+ observers(Low::Events::RequestEvent) << Low::FileServer.new(web_root: config.web_root, content_types: config.content_types)
25
+ observers(Low::Events::RequestEvent) << router if router
24
26
 
25
- observers.push(self, action: :mirror) if config.mirror_mode
27
+ observers.push(Low::Events::RequestEvent, action: :mirror) if config.mirror_mode
26
28
  end
27
29
 
28
30
  def start
@@ -34,9 +36,11 @@ class LowLoop
34
36
  loop do
35
37
  socket = server.accept
36
38
 
39
+ @frame.render if @frame.renderer
40
+
37
41
  Fiber.schedule do
38
42
  request = Low::RequestParser.parse(socket:, host: config.host, port: config.port)
39
- response_event = take(event: Low::Events::RequestEvent.new(request:))
43
+ response_event = Low::Events::RequestEvent.take(request:)
40
44
  response = response_event.response
41
45
 
42
46
  Low::ResponseBuilder.respond(config:, socket:, response:)
@@ -16,6 +16,13 @@ module Low
16
16
 
17
17
  OpenStruct.new(config_data)
18
18
  end
19
+
20
+ def parse_boolean(value)
21
+ return true if value == '1'
22
+ return false if value == '0'
23
+
24
+ nil
25
+ end
19
26
  end
20
27
  end
21
28
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'io/console'
4
+
5
+ class LowFrame
6
+ attr_reader :screen_size, :renderer
7
+
8
+ def initialize(renderer:, fps: 30, show_output: true)
9
+ @renderer = renderer
10
+ @show_output = show_output
11
+
12
+ # Millisecond duration of each frame. We lose a small amount of precision dropping the decimal.
13
+ @frame_time = ((1.0 / fps) * 1000).to_i
14
+
15
+ row_count, column_count = IO.console.winsize
16
+ @screen_size = { row_count:, column_count: }
17
+
18
+ @last_frame = nil
19
+
20
+ setup if renderer && show_output
21
+ end
22
+
23
+ def render
24
+ if @last_frame.nil? || (current_timestamp - @last_frame) >= @frame_time
25
+ system 'clear' if @show_output
26
+
27
+ @last_frame = current_timestamp
28
+ @renderer.render(screen_size: @screen_size)
29
+ end
30
+ end
31
+
32
+ def setup
33
+ print "\e[?25l" # Hide cursor.
34
+ system 'clear'
35
+ end
36
+
37
+ def reset
38
+ print "\e[?25h\e[0m" # Show cursor and reset colors.
39
+ end
40
+
41
+ def exit
42
+ trap('INT') {
43
+ reset
44
+ system 'clear'
45
+ exit
46
+ }
47
+ end
48
+
49
+ private
50
+
51
+ def current_timestamp
52
+ Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
53
+ end
54
+ end
data/lib/version.rb CHANGED
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Low
4
4
  module Loop
5
- VERSION = '0.3.2'
5
+ VERSION = '0.4.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: low_loop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi
@@ -124,7 +124,7 @@ files:
124
124
  - lib/servers/file_server.rb
125
125
  - lib/states/file_state.rb
126
126
  - lib/support/config_loader.rb
127
- - lib/support/config_support.rb
127
+ - lib/support/low_frame.rb
128
128
  - lib/version.rb
129
129
  homepage: https://github.com/low-rb/low_loop
130
130
  licenses: []
@@ -145,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
147
  requirements: []
148
- rubygems_version: 3.7.2
148
+ rubygems_version: 4.0.6
149
149
  specification_version: 4
150
150
  summary: An event-driven event loop
151
151
  test_files: []
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Low
4
- module ConfigSupport
5
- class << self
6
- def parse_boolean(value)
7
- return true if value == '1'
8
- return false if value == '0'
9
-
10
- nil
11
- end
12
- end
13
- end
14
- end