ilex 0.1.6 → 0.1.7

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: 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: []