rbexy 0.3.1 → 2.0.0.beta1
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/Gemfile.lock +6 -5
- data/README.md +20 -0
- data/lib/rbexy.rb +27 -10
- data/lib/rbexy/ast_transformer.rb +21 -0
- data/lib/rbexy/component.rb +12 -18
- data/lib/rbexy/component/backtrace_cleaner.rb +59 -0
- data/lib/rbexy/component_context.rb +18 -0
- data/lib/rbexy/component_resolver.rb +60 -0
- data/lib/rbexy/configuration.rb +19 -1
- data/lib/rbexy/lexer.rb +20 -14
- data/lib/rbexy/nodes.rb +15 -141
- data/lib/rbexy/nodes/abstract_attr.rb +12 -0
- data/lib/rbexy/nodes/abstract_element.rb +13 -0
- data/lib/rbexy/nodes/abstract_node.rb +58 -0
- data/lib/rbexy/nodes/component_element.rb +69 -0
- data/lib/rbexy/nodes/component_prop.rb +29 -0
- data/lib/rbexy/nodes/declaration.rb +15 -0
- data/lib/rbexy/nodes/expression.rb +15 -0
- data/lib/rbexy/nodes/expression_group.rb +55 -0
- data/lib/rbexy/nodes/html_attr.rb +13 -0
- data/lib/rbexy/nodes/html_element.rb +48 -0
- data/lib/rbexy/nodes/newline.rb +9 -0
- data/lib/rbexy/nodes/raw.rb +23 -0
- data/lib/rbexy/nodes/root.rb +19 -0
- data/lib/rbexy/nodes/text.rb +15 -0
- data/lib/rbexy/nodes/util.rb +9 -0
- data/lib/rbexy/parser.rb +22 -16
- data/lib/rbexy/rails/component_template_resolver.rb +3 -3
- data/lib/rbexy/rails/controller_helper.rb +5 -4
- data/lib/rbexy/rails/engine.rb +1 -11
- data/lib/rbexy/refinements.rb +5 -0
- data/lib/rbexy/refinements/array.rb +9 -0
- data/lib/rbexy/refinements/array/find_map.rb +13 -0
- data/lib/rbexy/refinements/array/insert_between_types.rb +26 -0
- data/lib/rbexy/refinements/array/map_type_when_neighboring_type.rb +26 -0
- data/lib/rbexy/runtime.rb +17 -23
- data/lib/rbexy/template.rb +12 -0
- data/lib/rbexy/version.rb +1 -1
- data/rbexy.gemspec +4 -4
- metadata +49 -38
- data/example.rb +0 -113
- data/lib/rbexy/component_providers/namespaced_rbexy_provider.rb +0 -20
- data/lib/rbexy/component_providers/rbexy_provider.rb +0 -21
- data/lib/rbexy/component_providers/view_component_provider.rb +0 -21
- data/lib/rbexy/component_tag_builder.rb +0 -19
- data/lib/rbexy/hash_mash.rb +0 -15
- data/lib/rbexy/output_buffer.rb +0 -10
- data/lib/rbexy/view_context_helper.rb +0 -11
data/lib/rbexy/version.rb
CHANGED
data/rbexy.gemspec
CHANGED
@@ -25,11 +25,10 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
26
|
spec.require_paths = ["lib"]
|
27
27
|
|
28
|
-
spec.add_dependency "activesupport", ">=
|
29
|
-
spec.add_dependency "actionview", ">=
|
30
|
-
spec.add_dependency "railties", ">= 5.0", "< 7.0"
|
28
|
+
spec.add_dependency "activesupport", ">= 6.0", "< 7.0"
|
29
|
+
spec.add_dependency "actionview", ">= 6.0", "< 7.0"
|
31
30
|
|
32
|
-
spec.add_development_dependency "rails", ">=
|
31
|
+
spec.add_development_dependency "rails", ">= 6.0", "< 7.0"
|
33
32
|
spec.add_development_dependency "rspec", "~> 3.9"
|
34
33
|
spec.add_development_dependency "guard-rspec", "~> 4.7", ">= 4.7.3"
|
35
34
|
spec.add_development_dependency "rspec-rails", "~> 4.0", ">= 4.0.1"
|
@@ -37,4 +36,5 @@ Gem::Specification.new do |spec|
|
|
37
36
|
spec.add_development_dependency "rake"
|
38
37
|
spec.add_development_dependency "pry-byebug"
|
39
38
|
spec.add_development_dependency "sqlite3"
|
39
|
+
spec.add_development_dependency "memory_profiler", "~> 0.9.14"
|
40
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbexy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 2.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Giancola
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '6.0'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: '7.0'
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
29
|
+
version: '6.0'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '7.0'
|
@@ -36,7 +36,7 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - ">="
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
39
|
+
version: '6.0'
|
40
40
|
- - "<"
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: '7.0'
|
@@ -46,27 +46,7 @@ dependencies:
|
|
46
46
|
requirements:
|
47
47
|
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '
|
50
|
-
- - "<"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '7.0'
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: railties
|
55
|
-
requirement: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - ">="
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: '5.0'
|
60
|
-
- - "<"
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '7.0'
|
63
|
-
type: :runtime
|
64
|
-
prerelease: false
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
66
|
-
requirements:
|
67
|
-
- - ">="
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '5.0'
|
49
|
+
version: '6.0'
|
70
50
|
- - "<"
|
71
51
|
- !ruby/object:Gem::Version
|
72
52
|
version: '7.0'
|
@@ -76,7 +56,7 @@ dependencies:
|
|
76
56
|
requirements:
|
77
57
|
- - ">="
|
78
58
|
- !ruby/object:Gem::Version
|
79
|
-
version: '
|
59
|
+
version: '6.0'
|
80
60
|
- - "<"
|
81
61
|
- !ruby/object:Gem::Version
|
82
62
|
version: '7.0'
|
@@ -86,7 +66,7 @@ dependencies:
|
|
86
66
|
requirements:
|
87
67
|
- - ">="
|
88
68
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
69
|
+
version: '6.0'
|
90
70
|
- - "<"
|
91
71
|
- !ruby/object:Gem::Version
|
92
72
|
version: '7.0'
|
@@ -200,6 +180,20 @@ dependencies:
|
|
200
180
|
- - ">="
|
201
181
|
- !ruby/object:Gem::Version
|
202
182
|
version: '0'
|
183
|
+
- !ruby/object:Gem::Dependency
|
184
|
+
name: memory_profiler
|
185
|
+
requirement: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - "~>"
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: 0.9.14
|
190
|
+
type: :development
|
191
|
+
prerelease: false
|
192
|
+
version_requirements: !ruby/object:Gem::Requirement
|
193
|
+
requirements:
|
194
|
+
- - "~>"
|
195
|
+
- !ruby/object:Gem::Version
|
196
|
+
version: 0.9.14
|
203
197
|
description:
|
204
198
|
email:
|
205
199
|
- patbenatar@gmail.com
|
@@ -221,26 +215,43 @@ files:
|
|
221
215
|
- bin/console
|
222
216
|
- bin/setup
|
223
217
|
- docker-compose.yml
|
224
|
-
- example.rb
|
225
218
|
- lib/rbexy.rb
|
219
|
+
- lib/rbexy/ast_transformer.rb
|
226
220
|
- lib/rbexy/component.rb
|
227
|
-
- lib/rbexy/
|
228
|
-
- lib/rbexy/
|
229
|
-
- lib/rbexy/
|
230
|
-
- lib/rbexy/component_tag_builder.rb
|
221
|
+
- lib/rbexy/component/backtrace_cleaner.rb
|
222
|
+
- lib/rbexy/component_context.rb
|
223
|
+
- lib/rbexy/component_resolver.rb
|
231
224
|
- lib/rbexy/configuration.rb
|
232
|
-
- lib/rbexy/hash_mash.rb
|
233
225
|
- lib/rbexy/lexer.rb
|
234
226
|
- lib/rbexy/nodes.rb
|
235
|
-
- lib/rbexy/
|
227
|
+
- lib/rbexy/nodes/abstract_attr.rb
|
228
|
+
- lib/rbexy/nodes/abstract_element.rb
|
229
|
+
- lib/rbexy/nodes/abstract_node.rb
|
230
|
+
- lib/rbexy/nodes/component_element.rb
|
231
|
+
- lib/rbexy/nodes/component_prop.rb
|
232
|
+
- lib/rbexy/nodes/declaration.rb
|
233
|
+
- lib/rbexy/nodes/expression.rb
|
234
|
+
- lib/rbexy/nodes/expression_group.rb
|
235
|
+
- lib/rbexy/nodes/html_attr.rb
|
236
|
+
- lib/rbexy/nodes/html_element.rb
|
237
|
+
- lib/rbexy/nodes/newline.rb
|
238
|
+
- lib/rbexy/nodes/raw.rb
|
239
|
+
- lib/rbexy/nodes/root.rb
|
240
|
+
- lib/rbexy/nodes/text.rb
|
241
|
+
- lib/rbexy/nodes/util.rb
|
236
242
|
- lib/rbexy/parser.rb
|
237
243
|
- lib/rbexy/rails.rb
|
238
244
|
- lib/rbexy/rails/component_template_resolver.rb
|
239
245
|
- lib/rbexy/rails/controller_helper.rb
|
240
246
|
- lib/rbexy/rails/engine.rb
|
247
|
+
- lib/rbexy/refinements.rb
|
248
|
+
- lib/rbexy/refinements/array.rb
|
249
|
+
- lib/rbexy/refinements/array/find_map.rb
|
250
|
+
- lib/rbexy/refinements/array/insert_between_types.rb
|
251
|
+
- lib/rbexy/refinements/array/map_type_when_neighboring_type.rb
|
241
252
|
- lib/rbexy/runtime.rb
|
253
|
+
- lib/rbexy/template.rb
|
242
254
|
- lib/rbexy/version.rb
|
243
|
-
- lib/rbexy/view_context_helper.rb
|
244
255
|
- rbexy.gemspec
|
245
256
|
homepage: https://github.com/patbenatar/rbexy
|
246
257
|
licenses:
|
@@ -260,9 +271,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
260
271
|
version: 2.3.0
|
261
272
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
262
273
|
requirements:
|
263
|
-
- - "
|
274
|
+
- - ">"
|
264
275
|
- !ruby/object:Gem::Version
|
265
|
-
version:
|
276
|
+
version: 1.3.1
|
266
277
|
requirements: []
|
267
278
|
rubygems_version: 3.1.2
|
268
279
|
signing_key:
|
data/example.rb
DELETED
@@ -1,113 +0,0 @@
|
|
1
|
-
require "bundler"
|
2
|
-
Bundler.require
|
3
|
-
|
4
|
-
require "active_support/all"
|
5
|
-
require "action_view/helpers"
|
6
|
-
require "action_view/context"
|
7
|
-
require "action_view/buffers"
|
8
|
-
|
9
|
-
template_string = <<-RBX
|
10
|
-
# A comment here
|
11
|
-
<div>
|
12
|
-
<h1 {**{ class: "myClass" }} {**splat_attrs}>Hello world</h1>
|
13
|
-
<div {**{ class: "myClass" }}></div>
|
14
|
-
Some words
|
15
|
-
# A comment here
|
16
|
-
# A comment here
|
17
|
-
<p>Lorem ipsum</p>
|
18
|
-
<input type="submit" value={@ivar_val} disabled />
|
19
|
-
{true && <p>Is true</p>}
|
20
|
-
{false && <p>Is false</p>}
|
21
|
-
{true ? <p {**{ class: "myClass" }}>Ternary is {'true'.upcase}</p> : <p>Ternary is false</p>}
|
22
|
-
<Button prop1="val1" prop2={true && "val2"} multi-word-prop="value">the content</Button>
|
23
|
-
<Forms.TextField label={->(n) { <label id={n}>Something</label> }} note={<p>the note</p>} />
|
24
|
-
<ul>
|
25
|
-
# A comment here
|
26
|
-
{["hi", "there", "nick"].map { |val| <li>{val}</li> }}
|
27
|
-
</ul>
|
28
|
-
<p
|
29
|
-
class="something">Text</p>
|
30
|
-
<input
|
31
|
-
class="foobar"
|
32
|
-
/>
|
33
|
-
<div
|
34
|
-
with="lots"
|
35
|
-
of="attributes"
|
36
|
-
>
|
37
|
-
Content
|
38
|
-
</div>
|
39
|
-
# comment
|
40
|
-
</div>
|
41
|
-
# comment
|
42
|
-
RBX
|
43
|
-
|
44
|
-
module Components
|
45
|
-
class ButtonComponent
|
46
|
-
def initialize(prop1:, prop2:, multi_word_prop:)
|
47
|
-
@prop1 = prop1
|
48
|
-
@prop2 = prop2
|
49
|
-
@multi_word_prop = multi_word_prop
|
50
|
-
end
|
51
|
-
|
52
|
-
def render
|
53
|
-
# Render it yourself, call one of Rails view helpers (link_to,
|
54
|
-
# content_tag, etc), or use a template file. Be sure to render
|
55
|
-
# children by yielding to the given block.
|
56
|
-
"<button class=\"#{[@prop1, @prop2, @multi_word_prop].join("-")}\">#{yield}</button>"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
module Forms
|
61
|
-
class TextFieldComponent
|
62
|
-
def initialize(label:, note:, **attrs)
|
63
|
-
@label = label
|
64
|
-
@note = note
|
65
|
-
end
|
66
|
-
|
67
|
-
def render
|
68
|
-
"#{@label.call(2)} <input type=\"text\" />#{@note}"
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
class ComponentProvider
|
75
|
-
def match?(name)
|
76
|
-
find(name) != nil
|
77
|
-
end
|
78
|
-
|
79
|
-
def render(context, name, **attrs, &block)
|
80
|
-
props = attrs.transform_keys { |k| ActiveSupport::Inflector.underscore(k.to_s).to_sym }
|
81
|
-
find(name).new(**props).render(&block)
|
82
|
-
end
|
83
|
-
|
84
|
-
private
|
85
|
-
|
86
|
-
def find(name)
|
87
|
-
ActiveSupport::Inflector.constantize("Components::#{name}Component")
|
88
|
-
rescue NameError => e
|
89
|
-
raise e unless e.message =~ /constant/
|
90
|
-
nil
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
class MyRuntime < Rbexy::Runtime
|
95
|
-
def initialize(component_provider)
|
96
|
-
super(component_provider)
|
97
|
-
@ivar_val = "ivar value"
|
98
|
-
end
|
99
|
-
|
100
|
-
def splat_attrs
|
101
|
-
{
|
102
|
-
key1: "val1",
|
103
|
-
key2: "val2"
|
104
|
-
}
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
puts "=============== Compiled ruby code ==============="
|
109
|
-
code = Rbexy.compile(template_string)
|
110
|
-
puts code
|
111
|
-
|
112
|
-
puts "=============== Result of eval ==============="
|
113
|
-
puts MyRuntime.new(ComponentProvider.new).evaluate(code)
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Rbexy
|
2
|
-
module ComponentProviders
|
3
|
-
class NamespacedRbexyProvider < Rbexy::ComponentProviders::RbexyProvider
|
4
|
-
attr_reader :namespaces
|
5
|
-
|
6
|
-
def initialize(*namespaces)
|
7
|
-
@namespaces = namespaces
|
8
|
-
end
|
9
|
-
|
10
|
-
def find(name)
|
11
|
-
namespaces.each do |namespace|
|
12
|
-
result = super("#{namespace}::#{name}")
|
13
|
-
return result if result != nil
|
14
|
-
end
|
15
|
-
|
16
|
-
super
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Rbexy
|
2
|
-
module ComponentProviders
|
3
|
-
class RbexyProvider
|
4
|
-
def match?(name)
|
5
|
-
name =~ /^[A-Z]/ && find(name) != nil
|
6
|
-
end
|
7
|
-
|
8
|
-
def render(context, name, **attrs, &block)
|
9
|
-
props = attrs.transform_keys { |k| ActiveSupport::Inflector.underscore(k.to_s).to_sym }
|
10
|
-
find(name).new(context, **props).render(&block)
|
11
|
-
end
|
12
|
-
|
13
|
-
def find(name)
|
14
|
-
ActiveSupport::Inflector.constantize("#{name}Component")
|
15
|
-
rescue NameError => e
|
16
|
-
raise e unless e.message =~ /wrong constant name/ || e.message =~ /uninitialized constant/
|
17
|
-
nil
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Rbexy
|
2
|
-
module ComponentProviders
|
3
|
-
class ViewComponentProvider
|
4
|
-
def match?(name)
|
5
|
-
name =~ /^[A-Z]/ && find(name) != nil
|
6
|
-
end
|
7
|
-
|
8
|
-
def render(context, name, **attrs, &block)
|
9
|
-
props = attrs.transform_keys { |k| ActiveSupport::Inflector.underscore(k.to_s).to_sym }
|
10
|
-
find(name).new(**props).render_in(context, &block)
|
11
|
-
end
|
12
|
-
|
13
|
-
def find(name)
|
14
|
-
ActiveSupport::Inflector.constantize("#{name}Component")
|
15
|
-
rescue NameError => e
|
16
|
-
raise e unless e.message =~ /wrong constant name/ || e.message =~ /uninitialized constant/
|
17
|
-
nil
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Rbexy
|
2
|
-
class ComponentTagBuilder < ActionView::Helpers::TagHelper::TagBuilder
|
3
|
-
attr_reader :component_provider
|
4
|
-
|
5
|
-
def initialize(context, component_provider)
|
6
|
-
super(context)
|
7
|
-
@component_provider = component_provider
|
8
|
-
end
|
9
|
-
|
10
|
-
def method_missing(called, *args, **attrs, &block)
|
11
|
-
component_name = called.to_s.gsub("__", "::")
|
12
|
-
if component_provider.match?(component_name)
|
13
|
-
component_provider.render(@view_context, component_name, **attrs, &block)
|
14
|
-
else
|
15
|
-
super
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
data/lib/rbexy/hash_mash.rb
DELETED
data/lib/rbexy/output_buffer.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
require "active_support/core_ext/string/output_safety"
|
2
|
-
|
3
|
-
module Rbexy
|
4
|
-
class OutputBuffer < ActiveSupport::SafeBuffer
|
5
|
-
def <<(content)
|
6
|
-
value = content.is_a?(Array) ? content.join.html_safe : content
|
7
|
-
super([nil, false].include?(value) ? "" : value.to_s)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|