formalist 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +7 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +21 -0
  5. data/.yardopts +1 -0
  6. data/CHANGELOG.md +62 -0
  7. data/Gemfile +1 -2
  8. data/bin/console +13 -0
  9. data/formalist.gemspec +33 -0
  10. data/lib/formalist/definition.rb +65 -0
  11. data/lib/formalist/element/class_interface.rb +7 -59
  12. data/lib/formalist/element.rb +37 -19
  13. data/lib/formalist/elements/attr.rb +8 -20
  14. data/lib/formalist/elements/compound_field.rb +5 -4
  15. data/lib/formalist/elements/field.rb +5 -12
  16. data/lib/formalist/elements/group.rb +6 -5
  17. data/lib/formalist/elements/many.rb +28 -29
  18. data/lib/formalist/elements/section.rb +6 -10
  19. data/lib/formalist/elements/standard/multi_upload_field.rb +8 -0
  20. data/lib/formalist/elements/standard/rich_text_area.rb +40 -0
  21. data/lib/formalist/elements/standard/search_multi_selection_field.rb +20 -0
  22. data/lib/formalist/elements/standard/search_selection_field.rb +20 -0
  23. data/lib/formalist/elements/standard/tags_field.rb +16 -0
  24. data/lib/formalist/elements/standard/upload_field.rb +8 -0
  25. data/lib/formalist/elements/standard.rb +4 -0
  26. data/lib/formalist/form/validity_check.rb +54 -0
  27. data/lib/formalist/form.rb +49 -17
  28. data/lib/formalist/rich_text/embedded_form_compiler.rb +86 -0
  29. data/lib/formalist/rich_text/embedded_forms_container/mixin.rb +42 -0
  30. data/lib/formalist/rich_text/embedded_forms_container/registration.rb +30 -0
  31. data/lib/formalist/rich_text/embedded_forms_container.rb +9 -0
  32. data/lib/formalist/rich_text/rendering/embedded_form_renderer.rb +25 -0
  33. data/lib/formalist/rich_text/rendering/html_compiler.rb +100 -0
  34. data/lib/formalist/rich_text/rendering/html_renderer.rb +186 -0
  35. data/lib/formalist/rich_text/validity_check.rb +48 -0
  36. data/lib/formalist/types.rb +8 -7
  37. data/lib/formalist/version.rb +1 -1
  38. metadata +54 -31
  39. data/Gemfile.lock +0 -105
  40. data/lib/formalist/element/definition.rb +0 -55
  41. data/lib/formalist/element/permitted_children.rb +0 -46
  42. data/lib/formalist/form/definition_context.rb +0 -69
  43. data/lib/formalist/form/result.rb +0 -24
  44. data/spec/examples.txt +0 -8
  45. data/spec/integration/dependency_injection_spec.rb +0 -54
  46. data/spec/integration/form_spec.rb +0 -104
  47. data/spec/spec_helper.rb +0 -109
  48. data/spec/support/constants.rb +0 -11
  49. data/spec/unit/elements/standard/check_box_spec.rb +0 -33
@@ -0,0 +1,186 @@
1
+ module Formalist
2
+ module RichText
3
+ module Rendering
4
+ class HTMLRenderer
5
+ # A DraftJS HTML renderer must have the following rendering methods implemented:
6
+ # 1. inline
7
+ # 2. block
8
+ # 3. entity
9
+ # 4. wrapper
10
+ # 5. nodes
11
+
12
+ # block and entity must iterate over the children and yield each of the children back to the compiler
13
+
14
+ BLOCK_ELEMENTS_MAP = {
15
+ "header-one" => "h1",
16
+ "header-two" => "h2",
17
+ "header-three" => "h3",
18
+ "header-four" => "h4",
19
+ "header-five" => "h5",
20
+ "header-six" => "h6",
21
+ "unordered-list-item" => "li",
22
+ "ordered-list-item" => "li",
23
+ "blockquote" => "blockquote",
24
+ "pullquote" => "aside",
25
+ "code-block" => "pre",
26
+ "horizontal-rule" => "hr",
27
+ }.freeze
28
+
29
+ DEFAULT_BLOCK_ELEMENT = "p".freeze
30
+
31
+ INLINE_ELEMENTS_MAP = {
32
+ "bold" => "strong",
33
+ "italic" => "em",
34
+ "strikethrough" => "del",
35
+ "code" => "code",
36
+ "underline" => "u",
37
+ }
38
+
39
+ DEFAULT_INLINE_ELEMENT = "span".freeze
40
+
41
+ def initialize(options = {})
42
+ @options = options
43
+ end
44
+
45
+ # Defines how to handle a list of nodes
46
+ def nodes(nodes)
47
+ nodes = nodes.map { |node| yield(node) } if block_given?
48
+ nodes.join
49
+ end
50
+
51
+ # Defines how to handle a block node
52
+ def block(type, key, children)
53
+ rendered_children = children.map { |child| yield(child) }
54
+
55
+ if type == 'atomic'
56
+ block_atomic(key, rendered_children)
57
+ else
58
+ render_block_element(type, rendered_children)
59
+ end
60
+ end
61
+
62
+ # Defines how to handle a list of blocks with a list type
63
+ def wrapper(type, children)
64
+ type_for_method = type.gsub("-", "_")
65
+
66
+ rendered_children = children.map { |child| yield(child) }
67
+
68
+ send(:"wrapper_#{type_for_method}", rendered_children)
69
+ end
70
+
71
+ def inline(styles, content)
72
+ return content if styles.nil? || styles.empty?
73
+ out = content
74
+ styles.each do |style|
75
+ out = render_inline_element(style, out)
76
+ end
77
+ out
78
+ end
79
+
80
+ def entity(type, key, data, children)
81
+ rendered_children = children.map { |child| yield(child) }
82
+
83
+ handler = :"entity_#{type.downcase}"
84
+ if respond_to?(handler, _include_private=true)
85
+ send(handler, data, rendered_children)
86
+ else
87
+ rendered_children
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ def block_atomic(key, children)
94
+ children.join
95
+ end
96
+
97
+ def wrapper_unordered_list_item(children)
98
+ html_tag(:ul) do
99
+ children.join
100
+ end
101
+ end
102
+
103
+ def wrapper_ordered_list_item(children)
104
+ html_tag(:ol) do
105
+ children.join
106
+ end
107
+ end
108
+
109
+ def entity_link(data, children)
110
+ link_attrs = {
111
+ href: data[:url]
112
+ }
113
+ link_attrs = link_attrs.merge(
114
+ target: "_blank",
115
+ rel: "noopener"
116
+ ) if data[:newWindow]
117
+ html_tag(:a, link_attrs) do
118
+ children.join
119
+ end
120
+ end
121
+
122
+ def entity_image(data, children)
123
+ html_tag(:img, src: data[:src])
124
+ end
125
+
126
+ def entity_video(data, children)
127
+ html_tag(:video, src: data[:src])
128
+ end
129
+
130
+ def entity_default(attrs, children)
131
+ html_tag(:div, attrs) do
132
+ children.join
133
+ end
134
+ end
135
+
136
+ def render_block_element(type, content)
137
+ elem = BLOCK_ELEMENTS_MAP.fetch(type.downcase, DEFAULT_BLOCK_ELEMENT)
138
+
139
+ html_tag(elem) do
140
+ if content.is_a?(Array)
141
+ content.join
142
+ else
143
+ content
144
+ end
145
+ end
146
+ end
147
+
148
+ def render_inline_element(type, content)
149
+ elem = INLINE_ELEMENTS_MAP.fetch(type.downcase, DEFAULT_INLINE_ELEMENT)
150
+
151
+ html_tag(elem, class: "inline--#{type.downcase}") do
152
+ if content.is_a?(Array)
153
+ content.join
154
+ else
155
+ content
156
+ end
157
+ end
158
+ end
159
+
160
+ def html_tag(tag, options = {})
161
+ options_string = html_options_string(options)
162
+ out = "<#{tag} #{options_string}".strip
163
+
164
+ content = block_given? ? yield : ""
165
+
166
+ if content.nil? || content.empty?
167
+ out << "/>"
168
+ else
169
+ out << ">#{replace_soft_newlines(content)}</#{tag}>"
170
+ end
171
+ end
172
+
173
+ def html_options_string(options)
174
+ opts = options.map do |key, val|
175
+ "#{key}='#{val}'"
176
+ end
177
+ opts.join(" ")
178
+ end
179
+
180
+ def replace_soft_newlines(content)
181
+ content.gsub(/\n/, '<br/>')
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,48 @@
1
+ require "formalist/form/validity_check"
2
+
3
+ module Formalist
4
+ module RichText
5
+ class ValidityCheck
6
+ AST = Struct.new(:ast)
7
+
8
+ def call(ast)
9
+ forms = ast.map { |node| visit(node) }.flatten
10
+
11
+ form_validity_check = Form::ValidityCheck.new
12
+ forms.all? { |form_ast| form_validity_check.(form_ast.ast) }
13
+ end
14
+ alias_method :[], :call
15
+
16
+ private
17
+
18
+ def visit(node)
19
+ name, nodes = node
20
+
21
+ handler = :"visit_#{name}"
22
+
23
+ if respond_to?(handler, true)
24
+ send(handler, nodes)
25
+ else
26
+ []
27
+ end
28
+ end
29
+
30
+ # We need to visit blocks in order to get to the formalist entities nested within them
31
+ def visit_block(node)
32
+ type, id, children = node
33
+
34
+ children.map { |child| visit(child) }
35
+ end
36
+
37
+ def visit_entity(node)
38
+ type, key, mutability, entity_data, children = node
39
+
40
+ if type == "formalist"
41
+ [AST.new(entity_data["form"])]
42
+ else
43
+ []
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -1,7 +1,8 @@
1
- require "dry-types"
2
- require "dry-logic"
1
+ # coding: utf-8
2
+ require "dry/types"
3
3
 
4
- Dry::Types::Predicates.predicate :respond_to? do |method_name, value|
4
+ # TODO: Find a way to avoid registering this globally
5
+ Dry::Logic::Predicates.predicate :respond_to? do |method_name, value|
5
6
  value.respond_to?(method_name)
6
7
  end
7
8
 
@@ -9,8 +10,8 @@ module Formalist
9
10
  module Types
10
11
  include Dry::Types.module
11
12
 
12
- ElementName = Types::Strict::Symbol.constrained(min_size: 1)
13
- OptionsList = Types::Array.member(Formalist::Types::Array.member(Formalist::Types::Strict::String).constrained(size: 2)).constrained(min_size: 1)
13
+ ElementName = Types::Strict::Symbol.constrained(min_size: 1).optional
14
+ OptionsList = Types::Array.of(Formalist::Types::Array.of(Formalist::Types::Strict::String).constrained(size: 2))
14
15
 
15
16
  # The SelectionField and MultiSelectionField require a _somewhat_ specific
16
17
  # data structure:
@@ -20,11 +21,11 @@ module Formalist
20
21
  # It’s expected that `id` is the relational representation of the object.
21
22
  # And label could/should be optional if the form defines a custom
22
23
  # `render_as` attribute
23
- SelectionsList = Formalist::Types::Strict::Array.member(Formalist::Types::Strict::Hash)
24
+ SelectionsList = Formalist::Types::Strict::Array.of(Formalist::Types::Strict::Hash)
24
25
 
25
26
  Validation = Types::Strict::Hash
26
27
 
27
- Dependency = Dry::Types::Definition[Object].new(Object)
28
+ Dependency = Types::Object
28
29
  Function = Dependency.constrained(respond_to: :call)
29
30
  end
30
31
  end
@@ -1,3 +1,3 @@
1
1
  module Formalist
2
- VERSION = "0.3.0".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  end
metadata CHANGED
@@ -1,57 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formalist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Riley
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2016-05-04 00:00:00.000000000 Z
11
+ date: 2018-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-configurable
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '0.7'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '0.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-core
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.4'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.4'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: dry-container
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ">="
45
+ - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '0'
47
+ version: '0.6'
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ">="
52
+ - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '0'
54
+ version: '0.6'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: dry-types
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ">="
59
+ - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '0'
61
+ version: '0.12'
48
62
  type: :runtime
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - ">="
66
+ - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '0'
68
+ version: '0.12'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: inflecto
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +128,14 @@ dependencies:
114
128
  requirements:
115
129
  - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: 0.10.0
131
+ version: 0.13.0
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
136
  - - "~>"
123
137
  - !ruby/object:Gem::Version
124
- version: 0.10.0
138
+ version: 0.13.0
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: yard
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -143,17 +157,22 @@ executables: []
143
157
  extensions: []
144
158
  extra_rdoc_files: []
145
159
  files:
160
+ - ".gitignore"
161
+ - ".rspec"
162
+ - ".travis.yml"
163
+ - ".yardopts"
164
+ - CHANGELOG.md
146
165
  - Gemfile
147
- - Gemfile.lock
148
166
  - LICENSE.md
149
167
  - README.md
150
168
  - Rakefile
169
+ - bin/console
170
+ - formalist.gemspec
151
171
  - lib/formalist.rb
172
+ - lib/formalist/definition.rb
152
173
  - lib/formalist/element.rb
153
174
  - lib/formalist/element/attributes.rb
154
175
  - lib/formalist/element/class_interface.rb
155
- - lib/formalist/element/definition.rb
156
- - lib/formalist/element/permitted_children.rb
157
176
  - lib/formalist/elements.rb
158
177
  - lib/formalist/elements/attr.rb
159
178
  - lib/formalist/elements/compound_field.rb
@@ -170,22 +189,27 @@ files:
170
189
  - lib/formalist/elements/standard/multi_upload_field.rb
171
190
  - lib/formalist/elements/standard/number_field.rb
172
191
  - lib/formalist/elements/standard/radio_buttons.rb
192
+ - lib/formalist/elements/standard/rich_text_area.rb
193
+ - lib/formalist/elements/standard/search_multi_selection_field.rb
194
+ - lib/formalist/elements/standard/search_selection_field.rb
173
195
  - lib/formalist/elements/standard/select_box.rb
174
196
  - lib/formalist/elements/standard/selection_field.rb
197
+ - lib/formalist/elements/standard/tags_field.rb
175
198
  - lib/formalist/elements/standard/text_area.rb
176
199
  - lib/formalist/elements/standard/text_field.rb
177
200
  - lib/formalist/elements/standard/upload_field.rb
178
201
  - lib/formalist/form.rb
179
- - lib/formalist/form/definition_context.rb
180
- - lib/formalist/form/result.rb
202
+ - lib/formalist/form/validity_check.rb
203
+ - lib/formalist/rich_text/embedded_form_compiler.rb
204
+ - lib/formalist/rich_text/embedded_forms_container.rb
205
+ - lib/formalist/rich_text/embedded_forms_container/mixin.rb
206
+ - lib/formalist/rich_text/embedded_forms_container/registration.rb
207
+ - lib/formalist/rich_text/rendering/embedded_form_renderer.rb
208
+ - lib/formalist/rich_text/rendering/html_compiler.rb
209
+ - lib/formalist/rich_text/rendering/html_renderer.rb
210
+ - lib/formalist/rich_text/validity_check.rb
181
211
  - lib/formalist/types.rb
182
212
  - lib/formalist/version.rb
183
- - spec/examples.txt
184
- - spec/integration/dependency_injection_spec.rb
185
- - spec/integration/form_spec.rb
186
- - spec/spec_helper.rb
187
- - spec/support/constants.rb
188
- - spec/unit/elements/standard/check_box_spec.rb
189
213
  homepage: https://github.com/icelab/formalist
190
214
  licenses:
191
215
  - MIT
@@ -198,7 +222,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
198
222
  requirements:
199
223
  - - ">="
200
224
  - !ruby/object:Gem::Version
201
- version: 2.1.0
225
+ version: 2.2.0
202
226
  required_rubygems_version: !ruby/object:Gem::Requirement
203
227
  requirements:
204
228
  - - ">="
@@ -206,9 +230,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
230
  version: '0'
207
231
  requirements: []
208
232
  rubyforge_project:
209
- rubygems_version: 2.4.5
233
+ rubygems_version: 2.7.5
210
234
  signing_key:
211
235
  specification_version: 4
212
236
  summary: Flexible form builder
213
237
  test_files: []
214
- has_rdoc:
data/Gemfile.lock DELETED
@@ -1,105 +0,0 @@
1
- GIT
2
- remote: https://github.com/dryrb/dry-types
3
- revision: 56eba433b066c5f8839e5a81cddc7c955056a71e
4
- branch: master
5
- specs:
6
- dry-types (0.7.1)
7
- concurrent-ruby (~> 1.0)
8
- dry-configurable (~> 0.1)
9
- dry-container (~> 0.3)
10
- dry-equalizer (~> 0.2)
11
- dry-logic (~> 0.2, >= 0.2.0)
12
- inflecto (~> 0.0.0, >= 0.0.2)
13
- kleisli (~> 0.2)
14
-
15
- GIT
16
- remote: https://github.com/dryrb/dry-validation
17
- revision: 2f2ab25b871dde41d4c0f2b259f0c09989f4176b
18
- branch: master
19
- specs:
20
- dry-validation (0.7.4)
21
- concurrent-ruby (~> 1.0)
22
- dry-configurable (~> 0.1, >= 0.1.3)
23
- dry-container (~> 0.2, >= 0.2.8)
24
- dry-equalizer (~> 0.2)
25
- dry-logic (~> 0.2, >= 0.2.2)
26
- dry-types (~> 0.7, >= 0.7.1)
27
-
28
- PATH
29
- remote: .
30
- specs:
31
- formalist (0.3.0)
32
- dry-configurable
33
- dry-container
34
- dry-types
35
- inflecto
36
-
37
- GEM
38
- remote: https://rubygems.org/
39
- specs:
40
- byebug (8.2.4)
41
- codeclimate-test-reporter (0.5.0)
42
- simplecov (>= 0.7.1, < 1.0.0)
43
- coderay (1.1.1)
44
- concurrent-ruby (1.0.1)
45
- diff-lcs (1.2.5)
46
- docile (1.1.5)
47
- dry-auto_inject (0.2.0)
48
- dry-configurable (0.1.4)
49
- concurrent-ruby (~> 1.0)
50
- dry-container (0.3.1)
51
- concurrent-ruby (~> 1.0)
52
- dry-configurable (~> 0.1, >= 0.1.3)
53
- dry-equalizer (0.2.0)
54
- dry-logic (0.2.2)
55
- dry-container (~> 0.2, >= 0.2.6)
56
- dry-equalizer (~> 0.2)
57
- inflecto (0.0.2)
58
- json (1.8.3)
59
- kleisli (0.2.7)
60
- method_source (0.8.2)
61
- pry (0.10.3)
62
- coderay (~> 1.1.0)
63
- method_source (~> 0.8.1)
64
- slop (~> 3.4)
65
- rake (10.4.2)
66
- rspec (3.3.0)
67
- rspec-core (~> 3.3.0)
68
- rspec-expectations (~> 3.3.0)
69
- rspec-mocks (~> 3.3.0)
70
- rspec-core (3.3.2)
71
- rspec-support (~> 3.3.0)
72
- rspec-expectations (3.3.1)
73
- diff-lcs (>= 1.2.0, < 2.0)
74
- rspec-support (~> 3.3.0)
75
- rspec-mocks (3.3.2)
76
- diff-lcs (>= 1.2.0, < 2.0)
77
- rspec-support (~> 3.3.0)
78
- rspec-support (3.3.0)
79
- simplecov (0.10.0)
80
- docile (~> 1.1.0)
81
- json (~> 1.8)
82
- simplecov-html (~> 0.10.0)
83
- simplecov-html (0.10.0)
84
- slop (3.6.0)
85
- yard (0.8.7.6)
86
-
87
- PLATFORMS
88
- ruby
89
-
90
- DEPENDENCIES
91
- bundler (~> 1.10)
92
- byebug
93
- codeclimate-test-reporter
94
- dry-auto_inject
95
- dry-types!
96
- dry-validation!
97
- formalist!
98
- pry
99
- rake (~> 10.4.2)
100
- rspec (~> 3.3.0)
101
- simplecov (~> 0.10.0)
102
- yard
103
-
104
- BUNDLED WITH
105
- 1.10.6
@@ -1,55 +0,0 @@
1
- require "formalist/types"
2
-
3
- module Formalist
4
- class Element
5
- class Definition
6
- Deferred = Struct.new(:name)
7
-
8
- attr_reader :type
9
- attr_reader :args
10
- attr_reader :attributes
11
- attr_reader :children
12
-
13
- def initialize(type, *args, attributes, children)
14
- @type = type
15
- @args = args
16
- @attributes = attributes
17
- @children = children
18
- end
19
-
20
- def ==(other)
21
- # Require a matching type.
22
- return false if type != other.type
23
-
24
- # If there are no primary args, it means that the element has no real
25
- # "identifier" that requires uniqueness, so it's safe to say they don't
26
- # match here.
27
- return false if args.empty?
28
-
29
- # Otherwise, use the primary args as a marker of a definitions
30
- # uniqueness. With the current set of base form elements, the primary
31
- # args only ever contains a name, so this is effectively a uniqueness
32
- # check on the element's name.
33
- args == other.args
34
- end
35
-
36
- def resolve(scope)
37
- resolved_args = args.map { |arg|
38
- arg.is_a?(Deferred) ? scope.send(arg.name) : arg
39
- }
40
-
41
- resolved_attributes = attributes.each_with_object({}) { |(key, val), hsh|
42
- hsh[key] = val.is_a?(Deferred) ? scope.send(val.name) : val
43
- }
44
-
45
- resolved_children = children.map { |c| c.resolve(scope) }
46
-
47
- self.class.new(type, *resolved_args, resolved_attributes, resolved_children)
48
- end
49
-
50
- def call(input, messages)
51
- type.new(*args, attributes, children, input, messages)
52
- end
53
- end
54
- end
55
- end
@@ -1,46 +0,0 @@
1
- require "inflecto"
2
-
3
- module Formalist
4
- class Element
5
- class PermittedChildren
6
- All = Class.new do
7
- def permitted?(*)
8
- true
9
- end
10
- end.new
11
-
12
- None = Class.new do
13
- def permitted?(*)
14
- false
15
- end
16
- end.new
17
-
18
- class Some
19
- attr_reader :permitted_children
20
-
21
- def initialize(children)
22
- @permitted_children = children
23
- end
24
-
25
- def permitted?(child)
26
- permitted_children.any? { |permitted_child|
27
- permitted_child_class = Elements.const_get(Inflecto.camelize(permitted_child))
28
- child.ancestors.include?(permitted_child_class)
29
- }
30
- end
31
- end
32
-
33
- def self.all
34
- All
35
- end
36
-
37
- def self.none
38
- None
39
- end
40
-
41
- def self.[](children)
42
- Some.new(children)
43
- end
44
- end
45
- end
46
- end