low_loop 0.3.1 → 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: 3bd2e532e273f35fcbcd9d8e9f0f4b0d9261e536d293908026371412ec11573e
4
- data.tar.gz: 39b83d8235d14d0d7359ea742f1e9c3d4ab4bdd1e0cceca01006950d2d942cc6
3
+ metadata.gz: 3d9fa2d555e127ad470c1eb71573c076d3484b08b833e184aa5c052b0de5a6af
4
+ data.tar.gz: 7a56cc04f846739e4dd957f66d6d558e40ab98c1fc69408fe82a6675f6101dec
5
5
  SHA512:
6
- metadata.gz: 17b1927035f2900208d1cbe6399b7814ec812f19afa1b22734e83995fd7e8f5bbf5d6724403553c55a83ef0779cf7b7bcaa56e56763ee8e2b67814980fab2b53
7
- data.tar.gz: 29b8756fbb3957e9ab50a5748391b745ca244af98cea79ae2d3e9ed8955ec07aa3f7aad9d339a6154270e004b2058592272a8db132717354c6f5af200245f017
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
@@ -9,20 +9,22 @@ require 'observers'
9
9
  require_relative 'factories/response_factory'
10
10
  require_relative 'requests/request_parser'
11
11
  require_relative 'responses/response_builder'
12
+ require_relative 'servers/file_server'
13
+ require_relative 'support/low_frame'
12
14
 
13
15
  class LowLoop
14
16
  include Observers
15
17
 
16
18
  attr_reader :config
17
19
 
18
- def initialize(config:, dependencies: [])
20
+ def initialize(config:, router: nil, renderer: nil, show_output: true)
19
21
  @config = config
22
+ @frame = LowFrame.new(renderer:, fps: 30, show_output:)
20
23
 
21
- dependencies.each do |dependency|
22
- observers << dependency
23
- end
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:)
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ostruct'
4
+ require 'yaml'
5
+
6
+ module Low
7
+ class ConfigLoader
8
+ class << self
9
+ def load(filepath, env = {})
10
+ config_file = YAML.safe_load_file(filepath, symbolize_names: true)
11
+
12
+ # Environment variables override config file.
13
+ config_data = config_file.merge(env) do |_key, old_value, new_value|
14
+ new_value.nil? ? old_value : new_value
15
+ end
16
+
17
+ OpenStruct.new(config_data)
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
26
+ end
27
+ end
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.1'
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.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi
@@ -123,7 +123,8 @@ files:
123
123
  - lib/responses/response_builder.rb
124
124
  - lib/servers/file_server.rb
125
125
  - lib/states/file_state.rb
126
- - lib/support/config_support.rb
126
+ - lib/support/config_loader.rb
127
+ - lib/support/low_frame.rb
127
128
  - lib/version.rb
128
129
  homepage: https://github.com/low-rb/low_loop
129
130
  licenses: []
@@ -144,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
145
  - !ruby/object:Gem::Version
145
146
  version: '0'
146
147
  requirements: []
147
- rubygems_version: 3.7.2
148
+ rubygems_version: 4.0.6
148
149
  specification_version: 4
149
150
  summary: An event-driven event loop
150
151
  test_files: []
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ConfigSupport
4
- class << self
5
- def parse_boolean(value)
6
- return true if value == '1'
7
- return false if value == '0'
8
-
9
- nil
10
- end
11
- end
12
- end