lownode 0.5.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: baff3ab2842de9d3e8a395ab89cb68bac58bbd0916f55981cfd53f71d44c3cf8
4
+ data.tar.gz: 508ba8d387fbc7a94002a5e3f5d405c42d78c4d6763f3522f715cd200737a0cb
5
+ SHA512:
6
+ metadata.gz: b5685b9ac1b58d7f29fc0c557b14ed25ef9c75576e72f71552b4974199d465e2da12818fe71a0f73008059493797ca1a42ccc2dd19c3a3078e3eb54c5a44a2dc
7
+ data.tar.gz: bb79da2d930fc5a743952eb8ac4a9864a4a44d92abf05cf7385306d458ee36ad5d6c5b81bffd69645abf14952de66e506eba845afeb9efd4b4879065a54cd7e3
data/lib/lownode.rb ADDED
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'observers'
4
+ require 'lowtype'
5
+ require 'lowevent'
6
+ require 'lowloop' # TODO: ResponseFactory should be done in LowLoop, which is where the class lives already anyway.
7
+
8
+ require_relative 'templates/renderer'
9
+
10
+ class LowNode
11
+ extend Observers
12
+
13
+ include LowType
14
+ include Low::Events
15
+ include Low::Types
16
+ include Low::Templates::Renderer
17
+
18
+ attr_reader :event
19
+
20
+ def initialize(event: nil)
21
+ @event = event
22
+ end
23
+
24
+ # TODO: Rename "handle" method/action to more specific "route" and maybe split out into module too.
25
+ def handle(event:)
26
+ nil
27
+ end
28
+
29
+ class << self
30
+ def handle(event:)
31
+ new(event:).handle(event:)
32
+ end
33
+
34
+ def inherited(child)
35
+ child.include LowType
36
+ increase_count
37
+ end
38
+
39
+ def count
40
+ @count ||= 0
41
+ end
42
+
43
+ def increase_count
44
+ @count = count + 1
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'template'
4
+
5
+ module Low
6
+ module Templates
7
+ # Use the Method Factory pattern to ".render -> .new -> #initialize -> #render" a LowNode.
8
+ module Renderer
9
+ # Antlers hook.
10
+ # When render() contains RBX/Antlers then dirload builds a template to render with instead.
11
+ # When lowevent is required then Antlers will send an event keyword argument as well.
12
+ def render_template(parent_binding: nil, slot_node: nil, props: {}, event: nil, **kwargs)
13
+ template = self.class.template
14
+
15
+ # NOTE: We currently set local variables on this local binding, not the receiver's binding.
16
+ # TODO: Should we create an "instance_binding" method on LowNode and use that binding instead?
17
+ current_binding = binding
18
+
19
+ template.params.each do |param|
20
+ # The event keyword is already a local variable on this binding.
21
+ next if param == :event
22
+
23
+ variable = props[param] || kwargs[param] || raise(ArgumentError, "Missing argument: '#{param}'")
24
+ current_binding.local_variable_set(param, variable)
25
+ end
26
+
27
+ template.engine.render(ast: template.ast, current_binding:, parent_binding:, slot_node:)
28
+ end
29
+
30
+ def self.included(base)
31
+ base.extend(ClassMethods)
32
+ end
33
+
34
+ module ClassMethods
35
+ # Accepts all arguments but only sends arguments required by the sub class.
36
+ def render(**)
37
+ # GOAL: Make return value configurable; ResponseEvent, Response, or body.
38
+ body = response_body(**)
39
+
40
+ return if body.nil? || body == ''
41
+
42
+ # TODO: ResponseFactory should be done in LowLoop, which is where the class lives already anyway.
43
+ response = Low::ResponseFactory.html(body:)
44
+ Low::Events::ResponseEvent.new(response:).tap(&:branch)
45
+ end
46
+
47
+ # Dirload hook.
48
+ def template
49
+ @template
50
+ end
51
+
52
+ # Dirload hook.
53
+ def build_template(template:, params:, engine:, namespace:)
54
+ @template = Template.new(template:, params:, engine:, namespace:)
55
+ end
56
+
57
+ private
58
+
59
+ def response_body(**kwargs)
60
+ node = new(**kwargs)
61
+
62
+ return node.render_template(**kwargs) if @template
63
+ return node.render(**kwargs) if node.method(:render).arity > 0
64
+
65
+ node.render
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Low
4
+ module Templates
5
+ class Template
6
+ attr_reader :template, :params, :namespace, :engine, :ast
7
+
8
+ def initialize(template:, params:, namespace:, engine:)
9
+ @template = template
10
+ @params = params
11
+ @namespace = namespace
12
+
13
+ @engine = engine
14
+ @ast = engine.ast(template:, namespace:)
15
+ end
16
+ end
17
+ end
18
+ end
data/lib/version.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Low
4
+ module Node
5
+ VERSION = '0.5.2'
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lownode
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.2
5
+ platform: ruby
6
+ authors:
7
+ - maedi
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 2026-10-17 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: lowevent
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: lowloop
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: lowtype
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.5'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.5'
54
+ - !ruby/object:Gem::Dependency
55
+ name: antlers
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: observers
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ email:
83
+ - maediprichard@gmail.com
84
+ executables: []
85
+ extensions: []
86
+ extra_rdoc_files: []
87
+ files:
88
+ - lib/lownode.rb
89
+ - lib/templates/renderer.rb
90
+ - lib/templates/template.rb
91
+ - lib/version.rb
92
+ homepage: https://github.com/low-rb/lownode
93
+ licenses: []
94
+ metadata:
95
+ homepage_uri: https://github.com/low-rb/lownode
96
+ source_code_uri: https://github.com/low-rb/lownode/src/branch/main
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: 3.3.0
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubygems_version: 3.6.2
112
+ specification_version: 4
113
+ summary: Flexible building blocks
114
+ test_files: []