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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +6 -5
  3. data/README.md +20 -0
  4. data/lib/rbexy.rb +27 -10
  5. data/lib/rbexy/ast_transformer.rb +21 -0
  6. data/lib/rbexy/component.rb +12 -18
  7. data/lib/rbexy/component/backtrace_cleaner.rb +59 -0
  8. data/lib/rbexy/component_context.rb +18 -0
  9. data/lib/rbexy/component_resolver.rb +60 -0
  10. data/lib/rbexy/configuration.rb +19 -1
  11. data/lib/rbexy/lexer.rb +20 -14
  12. data/lib/rbexy/nodes.rb +15 -141
  13. data/lib/rbexy/nodes/abstract_attr.rb +12 -0
  14. data/lib/rbexy/nodes/abstract_element.rb +13 -0
  15. data/lib/rbexy/nodes/abstract_node.rb +58 -0
  16. data/lib/rbexy/nodes/component_element.rb +69 -0
  17. data/lib/rbexy/nodes/component_prop.rb +29 -0
  18. data/lib/rbexy/nodes/declaration.rb +15 -0
  19. data/lib/rbexy/nodes/expression.rb +15 -0
  20. data/lib/rbexy/nodes/expression_group.rb +55 -0
  21. data/lib/rbexy/nodes/html_attr.rb +13 -0
  22. data/lib/rbexy/nodes/html_element.rb +48 -0
  23. data/lib/rbexy/nodes/newline.rb +9 -0
  24. data/lib/rbexy/nodes/raw.rb +23 -0
  25. data/lib/rbexy/nodes/root.rb +19 -0
  26. data/lib/rbexy/nodes/text.rb +15 -0
  27. data/lib/rbexy/nodes/util.rb +9 -0
  28. data/lib/rbexy/parser.rb +22 -16
  29. data/lib/rbexy/rails/component_template_resolver.rb +3 -3
  30. data/lib/rbexy/rails/controller_helper.rb +5 -4
  31. data/lib/rbexy/rails/engine.rb +1 -11
  32. data/lib/rbexy/refinements.rb +5 -0
  33. data/lib/rbexy/refinements/array.rb +9 -0
  34. data/lib/rbexy/refinements/array/find_map.rb +13 -0
  35. data/lib/rbexy/refinements/array/insert_between_types.rb +26 -0
  36. data/lib/rbexy/refinements/array/map_type_when_neighboring_type.rb +26 -0
  37. data/lib/rbexy/runtime.rb +17 -23
  38. data/lib/rbexy/template.rb +12 -0
  39. data/lib/rbexy/version.rb +1 -1
  40. data/rbexy.gemspec +4 -4
  41. metadata +49 -38
  42. data/example.rb +0 -113
  43. data/lib/rbexy/component_providers/namespaced_rbexy_provider.rb +0 -20
  44. data/lib/rbexy/component_providers/rbexy_provider.rb +0 -21
  45. data/lib/rbexy/component_providers/view_component_provider.rb +0 -21
  46. data/lib/rbexy/component_tag_builder.rb +0 -19
  47. data/lib/rbexy/hash_mash.rb +0 -15
  48. data/lib/rbexy/output_buffer.rb +0 -10
  49. data/lib/rbexy/view_context_helper.rb +0 -11
@@ -0,0 +1,12 @@
1
+ module Rbexy
2
+ class Template
3
+ attr_reader :source, :identifier
4
+
5
+ Anonymous = Class.new(String).new.freeze
6
+
7
+ def initialize(source, identifier = Anonymous)
8
+ @source = source
9
+ @identifier = identifier
10
+ end
11
+ end
12
+ end
@@ -1,3 +1,3 @@
1
1
  module Rbexy
2
- VERSION = "0.3.1"
2
+ VERSION = "2.0.0.beta1"
3
3
  end
@@ -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", ">= 5.0", "< 7.0"
29
- spec.add_dependency "actionview", ">= 5.0", "< 7.0"
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", ">= 5.0", "< 7.0"
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.3.1
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: 2020-10-29 00:00:00.000000000 Z
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: '5.0'
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: '5.0'
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: '5.0'
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: '5.0'
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: '5.0'
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: '5.0'
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/component_providers/namespaced_rbexy_provider.rb
228
- - lib/rbexy/component_providers/rbexy_provider.rb
229
- - lib/rbexy/component_providers/view_component_provider.rb
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/output_buffer.rb
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: '0'
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
@@ -1,15 +0,0 @@
1
- module Rbexy
2
- class HashMash < Hash
3
- def initialize(hash)
4
- replace(hash)
5
- end
6
-
7
- def method_missing(meth, *args, &block)
8
- if has_key?(meth)
9
- self[meth]
10
- else
11
- super
12
- end
13
- end
14
- end
15
- end
@@ -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
@@ -1,11 +0,0 @@
1
- module Rbexy
2
- module ViewContextHelper
3
- def rbexy_tag
4
- @rbexy_tag ||= Runtime.create_tag_builder(self)
5
- end
6
-
7
- def rbexy_context
8
- @rbexy_context ||= [{}]
9
- end
10
- end
11
- end