formalist 0.1.0 → 0.2.0
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 +3 -0
- data/Gemfile.lock +21 -9
- data/README.md +5 -2
- data/lib/formalist/display_adapters.rb +4 -0
- data/lib/formalist/display_adapters/textarea.rb +14 -0
- data/lib/formalist/form.rb +10 -9
- data/lib/formalist/form/result.rb +34 -3
- data/lib/formalist/form/result/attr.rb +3 -3
- data/lib/formalist/form/result/component.rb +3 -3
- data/lib/formalist/form/result/field.rb +2 -2
- data/lib/formalist/form/result/group.rb +3 -3
- data/lib/formalist/form/result/many.rb +11 -15
- data/lib/formalist/form/result/section.rb +3 -3
- data/lib/formalist/form/validated_result.rb +35 -0
- data/lib/formalist/validation/value_rules_compiler.rb +4 -0
- data/lib/formalist/version.rb +1 -1
- data/spec/examples.txt +5 -6
- data/spec/integration/display_adapters_spec.rb +10 -4
- data/spec/integration/form_spec.rb +13 -4
- data/spec/integration/validation_spec.rb +18 -15
- data/spec/unit/output_compiler_spec.rb +21 -2
- metadata +8 -7
- data/spec/integration/new_spec.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80737e639f603683df1a3527b2a1978591169aa0
|
4
|
+
data.tar.gz: db8cc08289a1b651ee40f763245b5a917a08b6f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca4062cdf2586ed0d562ae40e8163542453180fcf35d9310ae72c5eb050ee70a62110d972e25474be9644547dc475b0718d740a477fee965daca92b7e6866726
|
7
|
+
data.tar.gz: 45c7fe326a700e1afe77207438bb9e6b400687516a8229d25a6d981e290e211b493f93ca62ef1a72b8bc20951dd43abcd885c298973f1348f38d8952f11cf39d
|
data/Gemfile
CHANGED
@@ -3,6 +3,9 @@ source "https://rubygems.org"
|
|
3
3
|
# Gem dependencies are specified in formalist.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
+
# Lock to a version of dry-v that'll offer the AST/error message structures we expect
|
7
|
+
gem "dry-validation", git: "https://github.com/dryrb/dry-validation", ref: "6447302f3b53766b29f29230831890a5cc3822e0"
|
8
|
+
|
6
9
|
group :tools do
|
7
10
|
gem "pry"
|
8
11
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,23 @@
|
|
1
|
+
GIT
|
2
|
+
remote: https://github.com/dryrb/dry-validation
|
3
|
+
revision: 6447302f3b53766b29f29230831890a5cc3822e0
|
4
|
+
ref: 6447302f3b53766b29f29230831890a5cc3822e0
|
5
|
+
specs:
|
6
|
+
dry-validation (0.6.0)
|
7
|
+
dry-configurable (~> 0.1, >= 0.1.3)
|
8
|
+
dry-container (~> 0.2, >= 0.2.8)
|
9
|
+
dry-data (~> 0.5, >= 0.5.0)
|
10
|
+
dry-equalizer (~> 0.2)
|
11
|
+
dry-logic (~> 0.1, >= 0.1.4)
|
12
|
+
|
1
13
|
PATH
|
2
14
|
remote: .
|
3
15
|
specs:
|
4
|
-
formalist (0.
|
16
|
+
formalist (0.2.0)
|
5
17
|
dry-configurable
|
6
18
|
dry-container
|
7
19
|
dry-data (>= 0.4.2)
|
8
|
-
dry-validation
|
20
|
+
dry-validation (~> 0.6.0)
|
9
21
|
inflecto
|
10
22
|
|
11
23
|
GEM
|
@@ -18,23 +30,22 @@ GEM
|
|
18
30
|
coderay (1.1.0)
|
19
31
|
diff-lcs (1.2.5)
|
20
32
|
docile (1.1.5)
|
21
|
-
dry-configurable (0.1.
|
33
|
+
dry-configurable (0.1.3)
|
22
34
|
thread_safe
|
23
|
-
dry-container (0.2.
|
24
|
-
dry-configurable (
|
35
|
+
dry-container (0.2.8)
|
36
|
+
dry-configurable (~> 0.1, >= 0.1.3)
|
25
37
|
thread_safe
|
26
|
-
dry-data (0.
|
38
|
+
dry-data (0.5.1)
|
27
39
|
dry-configurable (~> 0.1)
|
28
40
|
dry-container (~> 0.2)
|
29
41
|
dry-equalizer (~> 0.2)
|
42
|
+
dry-logic (~> 0.1)
|
30
43
|
inflecto (~> 0.0.0, >= 0.0.2)
|
31
44
|
kleisli (~> 0.2)
|
32
45
|
thread_safe (~> 0.3)
|
33
46
|
dry-equalizer (0.2.0)
|
34
|
-
dry-
|
35
|
-
dry-configurable (~> 0.1)
|
47
|
+
dry-logic (0.1.4)
|
36
48
|
dry-container (~> 0.2, >= 0.2.6)
|
37
|
-
dry-data (~> 0.4, >= 0.4.2)
|
38
49
|
dry-equalizer (~> 0.2)
|
39
50
|
inflecto (0.0.2)
|
40
51
|
json (1.8.3)
|
@@ -84,6 +95,7 @@ PLATFORMS
|
|
84
95
|
DEPENDENCIES
|
85
96
|
bundler (~> 1.10)
|
86
97
|
byebug
|
98
|
+
dry-validation!
|
87
99
|
formalist!
|
88
100
|
pry
|
89
101
|
rake (~> 10.4.2)
|
data/README.md
CHANGED
@@ -6,13 +6,16 @@
|
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
9
|
-
Add
|
9
|
+
Add these lines to your application’s `Gemfile`:
|
10
10
|
|
11
11
|
```ruby
|
12
|
+
gem "dry-validation", git: "https://github.com/dryrb/dry-validation", ref: "6447302f3b53766b29f29230831890a5cc3822e0"
|
12
13
|
gem "formalist"
|
13
14
|
```
|
14
15
|
|
15
|
-
|
16
|
+
The dry-validation dependency is a temporary lock to a version that offers the AST/error message structures we expect. You should be able to remove this after future releases of formalist and dry-validation.
|
17
|
+
|
18
|
+
Run `bundle` to install the gems.
|
16
19
|
|
17
20
|
## Contributing
|
18
21
|
|
@@ -1,12 +1,16 @@
|
|
1
1
|
require "dry-container"
|
2
2
|
require "formalist/display_adapters/default"
|
3
|
+
require "formalist/display_adapters/radio"
|
3
4
|
require "formalist/display_adapters/select"
|
5
|
+
require "formalist/display_adapters/textarea"
|
4
6
|
|
5
7
|
module Formalist
|
6
8
|
class DisplayAdapters
|
7
9
|
extend Dry::Container::Mixin
|
8
10
|
|
9
11
|
register DEFAULT_DISPLAY_ADAPTER, Default.new
|
12
|
+
register "radio", Radio.new
|
10
13
|
register "select", Select.new
|
14
|
+
register "textarea", Textarea.new
|
11
15
|
end
|
12
16
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Formalist
|
2
|
+
class DisplayAdapters
|
3
|
+
class Textarea
|
4
|
+
PERMITTED_TYPES = %w[
|
5
|
+
string
|
6
|
+
].freeze
|
7
|
+
|
8
|
+
def call(field)
|
9
|
+
raise ArgumentError, "field type must be one of #{PERMITTED_TYPES.join(', ')}" unless PERMITTED_TYPES.include?(field.type)
|
10
|
+
field.to_display_variant("textarea")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/formalist/form.rb
CHANGED
@@ -21,24 +21,25 @@ module Formalist
|
|
21
21
|
end
|
22
22
|
|
23
23
|
# @api private
|
24
|
-
attr_reader :
|
24
|
+
attr_reader :schema
|
25
25
|
|
26
26
|
# @api private
|
27
|
-
attr_reader :
|
27
|
+
attr_reader :elements
|
28
28
|
|
29
|
-
def initialize(schema
|
29
|
+
def initialize(schema)
|
30
30
|
definition_compiler = DefinitionCompiler.new(self.class.display_adapters)
|
31
|
+
|
31
32
|
@elements = definition_compiler.call(self.class.elements)
|
32
33
|
@schema = schema
|
33
34
|
end
|
34
35
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
rules = schema ? schema.rules.map(&:to_ary) : []
|
39
|
-
errors = validate && schema ? schema.(input).messages : {}
|
36
|
+
def build(input)
|
37
|
+
Result.new(schema, elements, input)
|
38
|
+
end
|
40
39
|
|
41
|
-
|
40
|
+
def receive(form_post)
|
41
|
+
input = schema.(form_post).output
|
42
|
+
build(input)
|
42
43
|
end
|
43
44
|
end
|
44
45
|
end
|
@@ -1,14 +1,45 @@
|
|
1
|
+
require "formalist/form/validated_result"
|
2
|
+
|
1
3
|
module Formalist
|
2
4
|
class Form
|
3
5
|
class Result
|
6
|
+
# @api private
|
7
|
+
attr_reader :input
|
8
|
+
|
9
|
+
# @api private
|
10
|
+
attr_reader :schema
|
11
|
+
|
12
|
+
# @api private
|
4
13
|
attr_reader :elements
|
5
14
|
|
6
|
-
|
15
|
+
# @api public
|
16
|
+
attr_reader :validation
|
17
|
+
|
18
|
+
def initialize(schema, elements, input)
|
19
|
+
@input = input
|
20
|
+
@schema = schema
|
7
21
|
@elements = elements
|
22
|
+
@validation = schema.(input)
|
23
|
+
end
|
24
|
+
|
25
|
+
def output
|
26
|
+
validation.output
|
27
|
+
end
|
28
|
+
|
29
|
+
def success?
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
def messages
|
34
|
+
{}
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_ast
|
38
|
+
elements.map { |el| el.(output, schema.rules.map(&:to_ary), messages).to_ast }
|
8
39
|
end
|
9
40
|
|
10
|
-
def
|
11
|
-
|
41
|
+
def validate
|
42
|
+
ValidatedResult.new(self)
|
12
43
|
end
|
13
44
|
end
|
14
45
|
end
|
@@ -40,7 +40,7 @@ module Formalist
|
|
40
40
|
# 1. Child form elements
|
41
41
|
#
|
42
42
|
# @example "metadata" attr
|
43
|
-
# attr.
|
43
|
+
# attr.to_ast # =>
|
44
44
|
# # [:attr, [
|
45
45
|
# # :metadata,
|
46
46
|
# # [
|
@@ -53,7 +53,7 @@ module Formalist
|
|
53
53
|
# # ]]
|
54
54
|
#
|
55
55
|
# @return [Array] the attribute as an array.
|
56
|
-
def
|
56
|
+
def to_ast
|
57
57
|
# Errors, if the attr hash is present and its members have errors:
|
58
58
|
# {:meta=>[[{:pages=>[["pages is missing"], nil]}], {}]}
|
59
59
|
|
@@ -66,7 +66,7 @@ module Formalist
|
|
66
66
|
definition.name,
|
67
67
|
value_predicates,
|
68
68
|
local_errors,
|
69
|
-
children.map(&:
|
69
|
+
children.map(&:to_ast),
|
70
70
|
]]
|
71
71
|
end
|
72
72
|
|
@@ -28,7 +28,7 @@ module Formalist
|
|
28
28
|
# 1. Child form elements
|
29
29
|
#
|
30
30
|
# @example
|
31
|
-
# component.
|
31
|
+
# component.to_ast # =>
|
32
32
|
# # [:component, [
|
33
33
|
# # [
|
34
34
|
# # [:some_config_name, :some_config_value]
|
@@ -39,10 +39,10 @@ module Formalist
|
|
39
39
|
# # ]]
|
40
40
|
#
|
41
41
|
# @return [Array] the component as an array.
|
42
|
-
def
|
42
|
+
def to_ast
|
43
43
|
[:component, [
|
44
44
|
definition.config.to_a,
|
45
|
-
children.map(&:
|
45
|
+
children.map(&:to_ast),
|
46
46
|
]]
|
47
47
|
end
|
48
48
|
end
|
@@ -38,7 +38,7 @@ module Formalist
|
|
38
38
|
# 1. Field configuration
|
39
39
|
#
|
40
40
|
# @example "email" field
|
41
|
-
# field.
|
41
|
+
# field.to_ast # =>
|
42
42
|
# # [:field, [
|
43
43
|
# # :email,
|
44
44
|
# # "string",
|
@@ -57,7 +57,7 @@ module Formalist
|
|
57
57
|
# # ]]
|
58
58
|
#
|
59
59
|
# @return [Array] the field as an array.
|
60
|
-
def
|
60
|
+
def to_ast
|
61
61
|
# errors looks like this
|
62
62
|
# {:field_name => [["pages is missing", "another error message"], nil]}
|
63
63
|
|
@@ -28,7 +28,7 @@ module Formalist
|
|
28
28
|
# 1. Child form elements
|
29
29
|
#
|
30
30
|
# @example
|
31
|
-
# group.
|
31
|
+
# group.to_ast # =>
|
32
32
|
# # [:group, [
|
33
33
|
# # [
|
34
34
|
# # [:some_config_name, :some_config_value]
|
@@ -39,10 +39,10 @@ module Formalist
|
|
39
39
|
# # ]]
|
40
40
|
#
|
41
41
|
# @return [Array] the group as an array.
|
42
|
-
def
|
42
|
+
def to_ast
|
43
43
|
[:group, [
|
44
44
|
definition.config.to_a,
|
45
|
-
children.map(&:
|
45
|
+
children.map(&:to_ast),
|
46
46
|
]]
|
47
47
|
end
|
48
48
|
end
|
@@ -46,7 +46,7 @@ module Formalist
|
|
46
46
|
# none, if there is no or empty input data)
|
47
47
|
#
|
48
48
|
# @example "locations" collection
|
49
|
-
# many.
|
49
|
+
# many.to_ast # =>
|
50
50
|
# # [:many, [
|
51
51
|
# # :locations,
|
52
52
|
# # [[:predicate, [:min_size?, [3]]]],
|
@@ -73,7 +73,7 @@ module Formalist
|
|
73
73
|
# # ]]
|
74
74
|
#
|
75
75
|
# @return [Array] the collection as an array.
|
76
|
-
def
|
76
|
+
def to_ast
|
77
77
|
local_errors = errors.select { |e| e.is_a?(String) }
|
78
78
|
|
79
79
|
[:many, [
|
@@ -81,8 +81,8 @@ module Formalist
|
|
81
81
|
value_predicates,
|
82
82
|
local_errors,
|
83
83
|
definition.config.to_a,
|
84
|
-
child_template.map(&:
|
85
|
-
children.map { |el_list| el_list.map(&:
|
84
|
+
child_template.map(&:to_ast),
|
85
|
+
children.map { |el_list| el_list.map(&:to_ast) },
|
86
86
|
]]
|
87
87
|
end
|
88
88
|
|
@@ -97,24 +97,20 @@ module Formalist
|
|
97
97
|
|
98
98
|
def build_children
|
99
99
|
# child errors looks like this:
|
100
|
-
#
|
101
|
-
#
|
102
|
-
#
|
103
|
-
#
|
104
|
-
#
|
105
|
-
#
|
100
|
+
# [
|
101
|
+
# {:rating=>[["rating must be greater than or equal to 1"], 0]},
|
102
|
+
# {:summary=>"Great", :rating=>0},
|
103
|
+
# {:summary=>[["summary must be filled"], ""]},
|
104
|
+
# {:summary=>"", :rating=>1}
|
105
|
+
# ]
|
106
106
|
#
|
107
107
|
# or local errors:
|
108
108
|
# {:links=>[["links is missing"], nil]}
|
109
109
|
|
110
|
-
child_errors = errors
|
110
|
+
child_errors = errors.each_slice(2).to_a
|
111
111
|
|
112
112
|
input.map { |child_input|
|
113
113
|
local_child_errors = child_errors.select { |e|
|
114
|
-
e.is_a?(Hash)
|
115
|
-
}.map { |e|
|
116
|
-
e[definition.name]
|
117
|
-
}.detect { |e|
|
118
114
|
e[1] == child_input
|
119
115
|
}.to_a.dig(0, 0) || {}
|
120
116
|
|
@@ -29,7 +29,7 @@ module Formalist
|
|
29
29
|
# 1. Child form elements
|
30
30
|
#
|
31
31
|
# @example "content" section
|
32
|
-
# section.
|
32
|
+
# section.to_ast # =>
|
33
33
|
# # [:section, [
|
34
34
|
# # :content,
|
35
35
|
# # [
|
@@ -41,11 +41,11 @@ module Formalist
|
|
41
41
|
# # ]]
|
42
42
|
#
|
43
43
|
# @return [Array] the section as an array.
|
44
|
-
def
|
44
|
+
def to_ast
|
45
45
|
[:section, [
|
46
46
|
definition.name,
|
47
47
|
definition.config.to_a,
|
48
|
-
children.map(&:
|
48
|
+
children.map(&:to_ast),
|
49
49
|
]]
|
50
50
|
end
|
51
51
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
3
|
+
module Formalist
|
4
|
+
class Form
|
5
|
+
class ValidatedResult
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def_delegators :@result,
|
9
|
+
:input,
|
10
|
+
:schema,
|
11
|
+
:elements,
|
12
|
+
:validation,
|
13
|
+
:output
|
14
|
+
|
15
|
+
# @api private
|
16
|
+
attr_reader :result
|
17
|
+
|
18
|
+
def initialize(result)
|
19
|
+
@result = result
|
20
|
+
end
|
21
|
+
|
22
|
+
def success?
|
23
|
+
validation.success?
|
24
|
+
end
|
25
|
+
|
26
|
+
def messages
|
27
|
+
validation.messages
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_ast
|
31
|
+
elements.map { |el| el.(output, schema.rules.map(&:to_ary), messages).to_ast }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/formalist/version.rb
CHANGED
data/spec/examples.txt
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
example_id | status | run_time |
|
2
2
|
------------------------------------------------ | ------ | --------------- |
|
3
|
-
./spec/integration/display_adapters_spec.rb[1:1] | passed | 0.
|
4
|
-
./spec/integration/display_adapters_spec.rb[1:2] | passed | 0.
|
5
|
-
./spec/integration/form_spec.rb[1:1] | passed | 0.
|
6
|
-
./spec/integration/
|
7
|
-
./spec/
|
8
|
-
./spec/unit/output_compiler_spec.rb[1:1] | passed | 0.00049 seconds |
|
3
|
+
./spec/integration/display_adapters_spec.rb[1:1] | passed | 0.00184 seconds |
|
4
|
+
./spec/integration/display_adapters_spec.rb[1:2] | passed | 0.00228 seconds |
|
5
|
+
./spec/integration/form_spec.rb[1:1] | passed | 0.00232 seconds |
|
6
|
+
./spec/integration/validation_spec.rb[1:1] | passed | 0.00607 seconds |
|
7
|
+
./spec/unit/output_compiler_spec.rb[1:1] | passed | 0.00276 seconds |
|
@@ -1,12 +1,18 @@
|
|
1
1
|
RSpec.describe "Display adapters" do
|
2
|
+
let(:schema) {
|
3
|
+
Class.new(Dry::Validation::Schema) do
|
4
|
+
key(:temperature_unit)
|
5
|
+
end.new
|
6
|
+
}
|
7
|
+
|
2
8
|
subject(:form) {
|
3
9
|
Class.new(Formalist::Form) do
|
4
10
|
field :temperature_unit, type: "string", display: "select", option_values: [%w[c c], %w[f f]]
|
5
|
-
end.new
|
11
|
+
end.new(schema)
|
6
12
|
}
|
7
13
|
|
8
14
|
it "outputs an AST" do
|
9
|
-
expect(form.({}).
|
15
|
+
expect(form.build({}).to_ast).to eq [
|
10
16
|
[:field, [
|
11
17
|
:temperature_unit,
|
12
18
|
"string",
|
@@ -39,9 +45,9 @@ RSpec.describe "Display adapters" do
|
|
39
45
|
|
40
46
|
field :name, type: "string", display: "custom"
|
41
47
|
field :email, type: "string"
|
42
|
-
end.new
|
48
|
+
end.new(schema)
|
43
49
|
|
44
|
-
expect(form.({}).
|
50
|
+
expect(form.build({}).to_ast).to eq [
|
45
51
|
[:field, [:name, "string", "custom", nil, [], [], []]],
|
46
52
|
[:field, [:email, "string", "default", nil, [], [], []]],
|
47
53
|
]
|
@@ -1,20 +1,29 @@
|
|
1
1
|
RSpec.describe Formalist::Form do
|
2
|
+
let(:schema) {
|
3
|
+
Class.new(Dry::Validation::Schema) do
|
4
|
+
key(:title, &:str?)
|
5
|
+
key(:rating, &:int?)
|
6
|
+
end.new
|
7
|
+
}
|
8
|
+
|
2
9
|
subject(:form) {
|
3
10
|
Class.new(Formalist::Form) do
|
4
11
|
component do |c|
|
5
12
|
c.field :title, type: "string"
|
6
13
|
c.field :rating, type: "int"
|
7
14
|
end
|
8
|
-
end.new
|
15
|
+
end.new(schema)
|
9
16
|
}
|
10
17
|
|
11
18
|
it "outputs an AST" do
|
12
|
-
|
19
|
+
ast = form.build(title: "Aurora", rating: 10).to_ast
|
20
|
+
|
21
|
+
expect(form.build(title: "Aurora", rating: 10).to_ast).to eq [
|
13
22
|
[:component, [
|
14
23
|
[],
|
15
24
|
[
|
16
|
-
[:field, [:title, "string", "default", "Aurora", [], [], []]],
|
17
|
-
[:field, [:rating, "int", "default", 10, [], [], []]]
|
25
|
+
[:field, [:title, "string", "default", "Aurora", [[:predicate, [:str?, []]]], [], []]],
|
26
|
+
[:field, [:rating, "int", "default", 10, [[:predicate, [:int?, []]]], [], []]]
|
18
27
|
],
|
19
28
|
]],
|
20
29
|
]
|
@@ -16,9 +16,12 @@ RSpec.describe "Form validation" do
|
|
16
16
|
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
# TODO: uncomment/fix the "meta" related sections (here and below) once
|
20
|
+
# we have a clarification on dryrb/dry-validation#58.
|
21
|
+
#
|
22
|
+
# key(:meta) do |meta|
|
23
|
+
# meta.key(:pages) { |pages| pages.filled? }
|
24
|
+
# end
|
22
25
|
end.new
|
23
26
|
}
|
24
27
|
|
@@ -32,10 +35,10 @@ RSpec.describe "Form validation" do
|
|
32
35
|
review.field :rating, type: "int"
|
33
36
|
end
|
34
37
|
|
35
|
-
attr :meta do |meta|
|
36
|
-
|
37
|
-
end
|
38
|
-
end.new(schema
|
38
|
+
# attr :meta do |meta|
|
39
|
+
# meta.field :pages, type: "int"
|
40
|
+
# end
|
41
|
+
end.new(schema)
|
39
42
|
}
|
40
43
|
|
41
44
|
it "includes validation rules and errors in the AST" do
|
@@ -44,7 +47,7 @@ RSpec.describe "Form validation" do
|
|
44
47
|
meta: {pages: nil}
|
45
48
|
}
|
46
49
|
|
47
|
-
expect(form.
|
50
|
+
expect(form.build(input).validate.to_ast).to eq [
|
48
51
|
[:field, [:title, "string", "default", nil, [[:predicate, [:filled?, []]]], ["title is missing"], []]],
|
49
52
|
[:field, [:rating, "int", "default", nil, [[:and, [[:predicate, [:gteq?, [1]]], [:predicate, [:lteq?, [10]]]]]], ["rating is missing", "rating must be greater than or equal to 1", "rating must be less than or equal to 10"], []]],
|
50
53
|
[:many, [:reviews,
|
@@ -71,13 +74,13 @@ RSpec.describe "Form validation" do
|
|
71
74
|
]
|
72
75
|
],
|
73
76
|
]],
|
74
|
-
[:attr, [:meta,
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
]]
|
77
|
+
# [:attr, [:meta,
|
78
|
+
# [],
|
79
|
+
# [],
|
80
|
+
# [
|
81
|
+
# [:field, [:pages, "int", "default", nil, [[:predicate, [:filled?, []]]], ["pages must be filled"], []]]
|
82
|
+
# ],
|
83
|
+
# ]]
|
81
84
|
]
|
82
85
|
end
|
83
86
|
end
|
@@ -1,6 +1,25 @@
|
|
1
1
|
RSpec.describe Formalist::OutputCompiler do
|
2
2
|
subject(:compiler) { Formalist::OutputCompiler.new }
|
3
3
|
|
4
|
+
let(:schema) {
|
5
|
+
Class.new(Dry::Validation::Schema) do
|
6
|
+
key(:title, &:str?)
|
7
|
+
key(:rating, &:int?)
|
8
|
+
|
9
|
+
key(:reviews) do |reviews|
|
10
|
+
reviews.each do |review|
|
11
|
+
review.key(:description, &:str?)
|
12
|
+
review.key(:rating, &:int?)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
key(:meta) do |meta|
|
17
|
+
meta.key(:pages, &:int?)
|
18
|
+
meta.key(:publisher, &:str?)
|
19
|
+
end
|
20
|
+
end.new
|
21
|
+
}
|
22
|
+
|
4
23
|
let(:form) {
|
5
24
|
Class.new(Formalist::Form) do
|
6
25
|
field :title, type: "string"
|
@@ -19,7 +38,7 @@ RSpec.describe Formalist::OutputCompiler do
|
|
19
38
|
end
|
20
39
|
end
|
21
40
|
end
|
22
|
-
end.new
|
41
|
+
end.new(schema)
|
23
42
|
}
|
24
43
|
|
25
44
|
let(:input) {
|
@@ -43,7 +62,7 @@ RSpec.describe Formalist::OutputCompiler do
|
|
43
62
|
}
|
44
63
|
}
|
45
64
|
|
46
|
-
let(:ast) { form.
|
65
|
+
let(:ast) { form.build(input).to_ast }
|
47
66
|
|
48
67
|
it "works" do
|
49
68
|
expect(compiler.call(ast)).to eq input
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: formalist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Riley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-configurable
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: dry-validation
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.6.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.6.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: inflecto
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -196,6 +196,7 @@ files:
|
|
196
196
|
- lib/formalist/display_adapters/default.rb
|
197
197
|
- lib/formalist/display_adapters/radio.rb
|
198
198
|
- lib/formalist/display_adapters/select.rb
|
199
|
+
- lib/formalist/display_adapters/textarea.rb
|
199
200
|
- lib/formalist/form.rb
|
200
201
|
- lib/formalist/form/definition.rb
|
201
202
|
- lib/formalist/form/definition/attr.rb
|
@@ -212,6 +213,7 @@ files:
|
|
212
213
|
- lib/formalist/form/result/group.rb
|
213
214
|
- lib/formalist/form/result/many.rb
|
214
215
|
- lib/formalist/form/result/section.rb
|
216
|
+
- lib/formalist/form/validated_result.rb
|
215
217
|
- lib/formalist/output_compiler.rb
|
216
218
|
- lib/formalist/validation/collection_rules_compiler.rb
|
217
219
|
- lib/formalist/validation/predicate_list_compiler.rb
|
@@ -220,7 +222,6 @@ files:
|
|
220
222
|
- spec/examples.txt
|
221
223
|
- spec/integration/display_adapters_spec.rb
|
222
224
|
- spec/integration/form_spec.rb
|
223
|
-
- spec/integration/new_spec.rb
|
224
225
|
- spec/integration/validation_spec.rb
|
225
226
|
- spec/spec_helper.rb
|
226
227
|
- spec/unit/output_compiler_spec.rb
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# require "pp"
|
2
|
-
|
3
|
-
# RSpec.describe Formalist::Form do
|
4
|
-
# subject(:form) {
|
5
|
-
# Class.new(Formalist::Form) do
|
6
|
-
# field :title, type: "string"
|
7
|
-
# field :rating, type: "int"
|
8
|
-
|
9
|
-
# section :clever do |clever|
|
10
|
-
# clever.field :more, type: "string"
|
11
|
-
# end
|
12
|
-
# end.new
|
13
|
-
# }
|
14
|
-
|
15
|
-
# it "works" do
|
16
|
-
# # puts
|
17
|
-
# # p form
|
18
|
-
# # p form.class.elements
|
19
|
-
# # p form.class.elements.first
|
20
|
-
|
21
|
-
# # byebug
|
22
|
-
|
23
|
-
# # puts
|
24
|
-
|
25
|
-
# # pp form.elements
|
26
|
-
# end
|
27
|
-
# end
|