ilex 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4f98672db74bb9e94ee80eb636e5878900d5a348fd4879633d5e44dcbc289053
4
- data.tar.gz: 6cccb6d5f4a506995fe4549f249ba0cd5150d8e3b26955985f1a5b25d9d4b359
3
+ metadata.gz: e1cef48991c440c63571d00490a85cfdd407e6b7c2efbdd560660948ed47bd57
4
+ data.tar.gz: 925406a78b7b417f82b979294b66254847a7d352cecf4e0ab9b739fdb82eefd9
5
5
  SHA512:
6
- metadata.gz: 97243cd6826be3e81e93dd847adcbc50a36045865bc67c325524a4945dc7690479a9a15037b061edfd7b2c18c377ebda444d80a44b009a8afca2c2b78a022d81
7
- data.tar.gz: db12e3bb02e3e7277bbf2a15e40839616b64b283733fe9ba1cf17bf28029383ca9b2c246aaa7eef2ddaa56a1cd5f0c1009605d040853133416e3d64732f92a87
6
+ metadata.gz: 7e56764de81c18320e29c3753c959ad146aca5b5ccdfc7aedb1c5ddbddaece23be2010b1c58b905332ca72597f9cec2b974910e009b93ed423bdd960b1ed787c
7
+ data.tar.gz: 6992772c2f5ac33665a01c182e11f4f3e7655f6d5cf9625c8c25fc7e7c11784922364e2849ab275ad7ed7c6031b867a461ff6f2eb61904c65129a1147c3170b9
data/.versionrc.json CHANGED
@@ -1,7 +1,7 @@
1
- {
2
- "skip": {
3
- "tag": true
4
- },
5
- "NAME": "Ilex",
6
- "VERSION": "0.1.6"
7
- }
1
+ {
2
+ "skip": {
3
+ "tag": true
4
+ },
5
+ "NAME": "Ilex",
6
+ "VERSION": "0.1.6"
7
+ }
data/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [0.1.7](https://github.com/joshleblanc/ilex/compare/v0.1.6...v0.1.7) (2021-06-16)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * try and convert component arrays into strings ([13e0438](https://github.com/joshleblanc/ilex/commit/13e0438d1da6ebd0bc0b46c9ca7cc6828bd99a7f))
11
+
5
12
  ### [0.1.6](https://github.com/joshleblanc/cedar/compare/v0.1.5...v0.1.6) (2021-04-18)
6
13
 
7
14
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ilex (0.1.6)
4
+ ilex (0.1.7)
5
5
  arbre
6
6
  rails (>= 5.2, < 7.0)
7
7
 
@@ -91,6 +91,8 @@ GEM
91
91
  nio4r (2.5.7)
92
92
  nokogiri (1.11.2-x64-mingw32)
93
93
  racc (~> 1.4)
94
+ nokogiri (1.11.2-x86_64-linux)
95
+ racc (~> 1.4)
94
96
  parallel (1.20.1)
95
97
  parser (3.0.0.0)
96
98
  ast (~> 2.4.1)
@@ -164,6 +166,7 @@ GEM
164
166
 
165
167
  PLATFORMS
166
168
  x64-mingw32
169
+ x86_64-linux
167
170
 
168
171
  DEPENDENCIES
169
172
  ilex!
data/lib/ilex.rb CHANGED
@@ -7,6 +7,7 @@ require_relative "ilex/component_wardens"
7
7
  require_relative "ilex/context"
8
8
  require_relative "ilex/component"
9
9
  require_relative "ilex/arbre_ext/element"
10
+ require_relative "ilex/arbre_ext/element/builder_methods"
10
11
  require_relative "ilex/rails_ext/action_view/base"
11
12
  require_relative "ilex/engine"
12
13
 
@@ -1,27 +1,27 @@
1
- module Ilex
2
- module ArbreExt
3
- module Element
4
- ruby2_keywords def method_missing(name, *args, &block)
5
- if current_arbre_element.respond_to?(name)
6
- current_arbre_element.send name, *args, &block
7
- elsif assigns && assigns.has_key?(name)
8
- assigns[name]
9
- elsif helpers.respond_to?(name)
10
- helper_capture(name, *args, &block)
11
- else
12
- super
13
- end
14
- end
15
-
16
- # The helper might have a block that builds Arbre elements
17
- # which will be rendered (#to_s) inside ActionView::Base#capture.
18
- # We do not want such elements added to self, so we push a dummy
19
- # current_arbre_element.
20
- def helper_capture(name, *args, &block)
21
- s = ""
22
- within(Element.new) { s = helpers.send(name, *args, &block) }
23
- s.is_a?(Element) ? s.to_s : s
24
- end
25
- end
26
- end
27
- end
1
+ module Ilex
2
+ module ArbreExt
3
+ module Element
4
+ ruby2_keywords def method_missing(name, *args, &block)
5
+ if current_arbre_element.respond_to?(name)
6
+ current_arbre_element.send name, *args, &block
7
+ elsif assigns && assigns.has_key?(name)
8
+ assigns[name]
9
+ elsif helpers.respond_to?(name)
10
+ helper_capture(name, *args, &block)
11
+ else
12
+ super
13
+ end
14
+ end
15
+
16
+ # The helper might have a block that builds Arbre elements
17
+ # which will be rendered (#to_s) inside ActionView::Base#capture.
18
+ # We do not want such elements added to self, so we push a dummy
19
+ # current_arbre_element.
20
+ def helper_capture(name, *args, &block)
21
+ s = ""
22
+ within(Element.new) { s = helpers.send(name, *args, &block) }
23
+ s.is_a?(Element) ? s.to_s : s
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ module Ilex
2
+ module ArbreExt
3
+ module Element
4
+ module BuilderMethods
5
+ private
6
+
7
+ def append_return_block(tag)
8
+ return nil if current_arbre_element.children?
9
+ return unless appendable_tag?(tag)
10
+
11
+ current_arbre_element << if tag.is_a? Array
12
+ Arbre::HTML::TextNode.from_string(tag.join.html_safe)
13
+ else
14
+ Arbre::HTML::TextNode.from_string(tag.to_s)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,49 +1,49 @@
1
- # frozen_string_literal: true
2
-
3
- module Ilex
4
-
5
- ##
6
- # InlineRender provides a `render` dsl to your components
7
- # which will render any arbre tree within.
8
- #
9
- # It will also convert snake case component names to component instances
10
- # for example, this would be equivalent to `ButtonComponent.new(label: "Test")`
11
- #
12
- # ```ruby
13
- # render do
14
- # div do
15
- # button label: "Test"
16
- # end
17
- # end
18
- # ```
19
- module Component
20
- include Arbre::HTML
21
-
22
- def render(*args, &blk)
23
- define_method :call do
24
- ctx = Context.new(self)
25
- ctx.instance_eval(&blk).to_s
26
- end
27
- end
28
-
29
- def find_component(name, base_module = nil)
30
- target = if base_module
31
- base_module
32
- else
33
- self
34
- end
35
-
36
- if target.const_defined?(name)
37
- target.const_get(name)
38
- else
39
- if target.superclass.respond_to?(:find_component)
40
- target.superclass.find_component(name)
41
- else
42
- adjusted_name = name.chomp("Component").underscore
43
- raise(NameError, "undefined local variable or method `#{adjusted_name}` for #{self}")
44
- end
45
-
46
- end
47
- end
48
- end
49
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Ilex
4
+
5
+ ##
6
+ # InlineRender provides a `render` dsl to your components
7
+ # which will render any arbre tree within.
8
+ #
9
+ # It will also convert snake case component names to component instances
10
+ # for example, this would be equivalent to `ButtonComponent.new(label: "Test")`
11
+ #
12
+ # ```ruby
13
+ # render do
14
+ # div do
15
+ # button label: "Test"
16
+ # end
17
+ # end
18
+ # ```
19
+ module Component
20
+ include Arbre::HTML
21
+
22
+ def render(*args, &blk)
23
+ define_method :call do
24
+ ctx = Context.new(self)
25
+ ctx.instance_eval(&blk).to_s
26
+ end
27
+ end
28
+
29
+ def find_component(name, base_module = nil)
30
+ target = if base_module
31
+ base_module
32
+ else
33
+ self
34
+ end
35
+
36
+ if target.const_defined?(name)
37
+ target.const_get(name)
38
+ else
39
+ if target.superclass.respond_to?(:find_component)
40
+ target.superclass.find_component(name)
41
+ else
42
+ adjusted_name = name.chomp("Component").underscore
43
+ raise(NameError, "undefined local variable or method `#{adjusted_name}` for #{self}")
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,65 +1,65 @@
1
- # frozen_string_literal: true
2
-
3
- module Ilex
4
- ##
5
- # A ComponentWarden is responsible for locating potential components
6
- # given a snake_case representation of that component.
7
- #
8
- # If a component exists, the warden is also responsible for calling the correct
9
- # instantiation method, depending if the component is a collection or not
10
- class ComponentWarden
11
- def initialize(component, string)
12
- @component = component
13
- @input = string.to_s
14
-
15
- @collection = @input.end_with? "_collection"
16
- @nested = @input.include? "__"
17
-
18
- process_input!(@input)
19
- end
20
-
21
- def collection?
22
- @collection
23
- end
24
-
25
- def nested?
26
- @nested
27
- end
28
-
29
- def component_name
30
- "#{@input}_component".camelize
31
- end
32
-
33
- def component_class
34
- @component_class ||= @component.class.find_component(component_name, @base_module)
35
- end
36
-
37
- def exists?
38
- component_class.present?
39
- end
40
-
41
- def new(*args, &block)
42
- return nil unless exists?
43
-
44
- if collection?
45
- component_class.with_collection(*args)
46
- else
47
- component_class.new(*args)
48
- end
49
- end
50
-
51
- private
52
-
53
- def process_input!(input)
54
- @input.chomp! "_collection"
55
- @input.chomp! "_component"
56
-
57
- if nested?
58
- parts = @input.split("__")
59
- @input = parts.pop
60
-
61
- @base_module = parts.map(&:camelize).join("::").constantize
62
- end
63
- end
64
- end
65
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Ilex
4
+ ##
5
+ # A ComponentWarden is responsible for locating potential components
6
+ # given a snake_case representation of that component.
7
+ #
8
+ # If a component exists, the warden is also responsible for calling the correct
9
+ # instantiation method, depending if the component is a collection or not
10
+ class ComponentWarden
11
+ def initialize(component, string)
12
+ @component = component
13
+ @input = string.to_s
14
+
15
+ @collection = @input.end_with? "_collection"
16
+ @nested = @input.include? "__"
17
+
18
+ process_input!(@input)
19
+ end
20
+
21
+ def collection?
22
+ @collection
23
+ end
24
+
25
+ def nested?
26
+ @nested
27
+ end
28
+
29
+ def component_name
30
+ "#{@input}_component".camelize
31
+ end
32
+
33
+ def component_class
34
+ @component_class ||= @component.class.find_component(component_name, @base_module)
35
+ end
36
+
37
+ def exists?
38
+ component_class.present?
39
+ end
40
+
41
+ def new(*args, &block)
42
+ return nil unless exists?
43
+
44
+ if collection?
45
+ component_class.with_collection(*args)
46
+ else
47
+ component_class.new(*args)
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def process_input!(input)
54
+ @input.chomp! "_collection"
55
+ @input.chomp! "_component"
56
+
57
+ if nested?
58
+ parts = @input.split("__")
59
+ @input = parts.pop
60
+
61
+ @base_module = parts.map(&:camelize).join("::").constantize
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,18 +1,18 @@
1
- # frozen_string_literal: true
2
-
3
- module Ilex
4
- ##
5
- # Thin wrapper around a hash of component wardens
6
- # such that the default is always an instance of ComponentWarden
7
- class ComponentWardens
8
- def initialize(component)
9
- @wardens = Hash.new do |hash, key|
10
- hash[key] = ComponentWarden.new(component, key)
11
- end
12
- end
13
-
14
- def [](key)
15
- @wardens[key]
16
- end
17
- end
18
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Ilex
4
+ ##
5
+ # Thin wrapper around a hash of component wardens
6
+ # such that the default is always an instance of ComponentWarden
7
+ class ComponentWardens
8
+ def initialize(component)
9
+ @wardens = Hash.new do |hash, key|
10
+ hash[key] = ComponentWarden.new(component, key)
11
+ end
12
+ end
13
+
14
+ def [](key)
15
+ @wardens[key]
16
+ end
17
+ end
18
+ end
data/lib/ilex/context.rb CHANGED
@@ -1,62 +1,62 @@
1
- # frozen_string_literal: true
2
-
3
- module Ilex
4
- ##
5
- # Inject a component's instance variables into arbre's default context
6
- # as well as provide implicit handling of snake-cased component names as
7
- # tags
8
- class Context < Arbre::Context
9
-
10
- def initialize(component, &blk)
11
- @component = component
12
-
13
-
14
- # Copy all of the instance variables from the component to the context,
15
- # so we have access to them when rendering
16
- @component.instance_variables.each do |iv|
17
- instance_variable_set(iv, @component.instance_variable_get(iv))
18
- end
19
-
20
- super({}, component, &blk)
21
- end
22
-
23
- def content
24
- @component.send :content
25
- end
26
-
27
- def component_wardens
28
- @component_wardens ||= ComponentWardens.new(@component)
29
- end
30
-
31
- # This is overriding arbre::rails::rendering
32
- # It performs the same actions, but returns html_safe on a passed block
33
- #
34
- # Not 100% sure this is needed, but view_components won't render their
35
- # contents without it, when rendered in an arbre tree
36
- def render(*args)
37
- rendered = helpers.render(*args) do
38
- yield.html_safe if block_given?
39
- end
40
- case rendered
41
- when Arbre::Context
42
- current_arbre_element.add_child rendered
43
- else
44
- text_node rendered
45
- end
46
- end
47
-
48
- def respond_to_missing?(method, include_all)
49
- @component.respond_to?(method) || component_wardens[method].exists? || super
50
- end
51
-
52
- def method_missing(method, *args, &content_block)
53
- if @component.respond_to?(method)
54
- @component.send(method, *args, &content_block)
55
- elsif component_wardens[method].exists?
56
- render component_wardens[method].new(*args), &content_block
57
- else
58
- super
59
- end
60
- end
61
- end
62
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Ilex
4
+ ##
5
+ # Inject a component's instance variables into arbre's default context
6
+ # as well as provide implicit handling of snake-cased component names as
7
+ # tags
8
+ class Context < Arbre::Context
9
+
10
+ def initialize(component, &blk)
11
+ @component = component
12
+
13
+
14
+ # Copy all of the instance variables from the component to the context,
15
+ # so we have access to them when rendering
16
+ @component.instance_variables.each do |iv|
17
+ instance_variable_set(iv, @component.instance_variable_get(iv))
18
+ end
19
+
20
+ super({}, component, &blk)
21
+ end
22
+
23
+ def content
24
+ @component.send :content
25
+ end
26
+
27
+ def component_wardens
28
+ @component_wardens ||= ComponentWardens.new(@component)
29
+ end
30
+
31
+ # This is overriding arbre::rails::rendering
32
+ # It performs the same actions, but returns html_safe on a passed block
33
+ #
34
+ # Not 100% sure this is needed, but view_components won't render their
35
+ # contents without it, when rendered in an arbre tree
36
+ def render(*args)
37
+ rendered = helpers.render(*args) do
38
+ yield.html_safe if block_given?
39
+ end
40
+ case rendered
41
+ when Arbre::Context
42
+ current_arbre_element.add_child rendered
43
+ else
44
+ text_node rendered
45
+ end
46
+ end
47
+
48
+ def respond_to_missing?(method, include_all)
49
+ @component.respond_to?(method) || component_wardens[method].exists? || super
50
+ end
51
+
52
+ def method_missing(method, *args, &content_block)
53
+ if @component.respond_to?(method)
54
+ @component.send(method, *args, &content_block)
55
+ elsif component_wardens[method].exists?
56
+ render component_wardens[method].new(*args), &content_block
57
+ else
58
+ super
59
+ end
60
+ end
61
+ end
62
+ end
data/lib/ilex/engine.rb CHANGED
@@ -1,9 +1,10 @@
1
- module Ilex
2
- class Engine < ::Rails::Engine
3
-
4
- config.to_prepare do
5
- ActionView::Base.prepend RailsExt::ActionView::Base
6
- Arbre::Element.prepend ArbreExt::Element
7
- end
8
- end
9
- end
1
+ module Ilex
2
+ class Engine < ::Rails::Engine
3
+
4
+ config.to_prepare do
5
+ ActionView::Base.prepend RailsExt::ActionView::Base
6
+ Arbre::Element.prepend ArbreExt::Element
7
+ Arbre::Element::BuilderMethods.prepend ArbreExt::Element::BuilderMethods
8
+ end
9
+ end
10
+ end
@@ -1,21 +1,21 @@
1
- module Ilex
2
- module RailsExt
3
- module ActionView
4
- module Base
5
- def capture(*args)
6
- value = nil
7
- buffer = with_output_buffer { value = yield(*args) }
8
-
9
- # Override to handle Arbre elements inside helper blocks.
10
- # See https://github.com/rails/rails/issues/17661
11
- # and https://github.com/rails/rails/pull/18024#commitcomment-8975180
12
- value = value.to_s if value.is_a?(Arbre::Element)
13
-
14
- if (string = buffer.presence || value) && string.is_a?(String)
15
- ERB::Util.html_escape string
16
- end
17
- end
18
- end
19
- end
20
- end
21
- end
1
+ module Ilex
2
+ module RailsExt
3
+ module ActionView
4
+ module Base
5
+ def capture(*args)
6
+ value = nil
7
+ buffer = with_output_buffer { value = yield(*args) }
8
+
9
+ # Override to handle Arbre elements inside helper blocks.
10
+ # See https://github.com/rails/rails/issues/17661
11
+ # and https://github.com/rails/rails/pull/18024#commitcomment-8975180
12
+ value = value.to_s if value.is_a?(Arbre::Element)
13
+
14
+ if (string = buffer.presence || value) && string.is_a?(String)
15
+ ERB::Util.html_escape string
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
data/lib/ilex/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ilex
4
- VERSION = "0.1.6"
4
+ VERSION = "0.1.7"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ilex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua LeBlanc
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-18 00:00:00.000000000 Z
11
+ date: 2021-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: arbre
@@ -67,6 +67,7 @@ files:
67
67
  - cedar.gemspec
68
68
  - lib/ilex.rb
69
69
  - lib/ilex/arbre_ext/element.rb
70
+ - lib/ilex/arbre_ext/element/builder_methods.rb
70
71
  - lib/ilex/component.rb
71
72
  - lib/ilex/component_warden.rb
72
73
  - lib/ilex/component_wardens.rb
@@ -82,7 +83,7 @@ metadata:
82
83
  homepage_uri: https://github.com/joshleblanc/ilex
83
84
  source_code_uri: https://github.com/joshleblanc/ilex
84
85
  changelog_uri: https://github.com/joshleblanc/ilex
85
- post_install_message:
86
+ post_install_message:
86
87
  rdoc_options: []
87
88
  require_paths:
88
89
  - lib
@@ -97,8 +98,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
98
  - !ruby/object:Gem::Version
98
99
  version: '0'
99
100
  requirements: []
100
- rubygems_version: 3.1.4
101
- signing_key:
101
+ rubygems_version: 3.2.15
102
+ signing_key:
102
103
  specification_version: 4
103
104
  summary: Provides inline rendering to view components
104
105
  test_files: []