hungryform 0.0.7 → 0.0.8

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
  SHA1:
3
- metadata.gz: 39175652aa112a3085607dd1732fbce6a18c8346
4
- data.tar.gz: 498c9429cddebc710586b04a567fc2971988f0ef
3
+ metadata.gz: 25ffe91aae5e6e1817a43a158fc9d7bd7343b59b
4
+ data.tar.gz: 8c04ae6d5245c30ce22e2f4e48dd18c83f5f4288
5
5
  SHA512:
6
- metadata.gz: 2513481ab882a6262f40ebb689c5c94fc708c5c00625ab614cf92d36805a86802f4fb2c1c299fa209b40e383989248dd3257f8651cffae7ed38c476d585fea9a
7
- data.tar.gz: 06c0805c025591833781ce40a039622b2e01831333a8f72ffeef29a420cdb3c5c409fff3df2252b1ee393786d4f51640c555970762acb2cd5448eb3d9eb5f6cc
6
+ metadata.gz: e12e8aa25f40d6449b7ae034d8701ebb11b4dc78095532eb8824c9a5abd31ab277f37ada50a11c0b6ebc6fd80f103cbfd15216008d33b915672fa87e8c700101
7
+ data.tar.gz: a602d7919da04118f13d67e50b09cdc3edced4eb9c3c1b2f39407e82471915c68f64b08c23f5ce0a37b61de1a801e9d89388fe16f062a1e6301759e318243e41
@@ -20,34 +20,65 @@ module HungryForm
20
20
  self.required = false
21
21
  end
22
22
 
23
- # Leave only the attributes that are being methods of the HungryForm::Validator class
24
- @validation_rules = @attributes.select { |key, _| HungryForm::Validator.singleton_class.instance_methods(false).include?(key) }
23
+ # Determine validation attributes
24
+ # They can be only the methods of the HungryForm::Validator class
25
+ # or methods of the Validator module of the current class
26
+ methods = HungryForm::Validator.singleton_class.instance_methods(false)
27
+ if self.class.const_defined?(:Validator)
28
+ methods += self.class.const_get(:Validator).instance_methods(false)
29
+ end
30
+
31
+ @validation_rules = @attributes.select { |key, _| methods.include?(key) }
25
32
  @attributes.delete_if { |key, _| @validation_rules.key?(key) }
26
33
 
27
34
  set_value
28
35
  end
29
36
 
37
+ # Element valid?
38
+ # Performs element validation
30
39
  def valid?
31
40
  clear_error
32
- is_valid = true
33
41
  return true unless visible?
34
42
 
35
43
  @validation_rules.each do |key, rule|
36
- self.error = HungryForm::Validator.send(key, self, rule) || ''
44
+ validate_rule(key, rule)
45
+
37
46
  unless error.empty?
38
47
  self.error = "This field #{error}"
39
- is_valid = false
40
- break
48
+ return false
41
49
  end
42
50
  end
43
51
 
44
- is_valid
52
+ true
45
53
  end
46
54
 
55
+ # Element invalid?
56
+ # Performs elemen validation
47
57
  def invalid?
48
58
  !valid?
49
59
  end
50
60
 
61
+ # Validate a particular validation rule
62
+ # Searches for the validation attribute in the Validator module
63
+ # of the element's class or in the global Validator module
64
+ #
65
+ # Sample:
66
+ # text_field :txt, :required => true
67
+ # will search for the "required" singleton method
68
+ # in the HungryForm::Elements::TextField::Validator and in the
69
+ # HungryGorm::Validator
70
+ def validate_rule(attribute, rule)
71
+ if self.class.const_defined?(:Validator)
72
+ validator = self.class.const_get(:Validator)
73
+ end
74
+
75
+ if validator.nil? || !validator.singleton_class.instance_methods(false).include?(attribute)
76
+ validator = HungryForm::Validator
77
+ end
78
+
79
+ self.error = validator.send(attribute, self, rule) || ''
80
+ end
81
+
51
82
  def set_value
52
83
  self.value = resolver.params[name] || attributes.delete(:value)
53
84
  end
@@ -2,12 +2,28 @@ module HungryForm
2
2
  module Elements
3
3
  class CheckboxField < Base::ActiveElement
4
4
  def set_value
5
- super
5
+ self.value = resolver.params[name] || attributes.delete(:value)
6
6
 
7
- if resolver.params.key?(name)
8
- self.attributes[:checked] = 'checked'
7
+ if value == 0
8
+ attributes.delete(:checked)
9
9
  else
10
- self.attributes[:checked] = ''
10
+ self.value = 1
11
+ self.attributes[:checked] = true
12
+ end
13
+ end
14
+
15
+ def checked?
16
+ !!attributes[:checked]
17
+ end
18
+
19
+ # Overriding the Validator methods
20
+ module Validator
21
+ def self.required(element, rule)
22
+ if rule.respond_to? :call
23
+ rule.call(element)
24
+ else
25
+ 'is required' if element.value == 0 && rule
26
+ end
11
27
  end
12
28
  end
13
29
  end
@@ -45,18 +45,18 @@ module HungryForm
45
45
 
46
46
  arguments = [arguments] unless arguments.is_a?(Array)
47
47
 
48
- arguments = arguments[0..1].map { |name| get_value(name) }
49
- return false if arguments.any?(&:nil?)
48
+ values = arguments[0..1].map { |name| get_value(name) }
49
+ return false if values.any?(&:nil?)
50
50
 
51
51
  case operator
52
52
  when :eq
53
- return arguments[0].to_s == arguments[1].to_s
53
+ return values[0].to_s == values[1].to_s
54
54
  when :lt
55
- return arguments[0].to_f < arguments[1].to_f
55
+ return values[0].to_f < values[1].to_f
56
56
  when :gt
57
- return arguments[0].to_f > arguments[1].to_f
57
+ return values[0].to_f > values[1].to_f
58
58
  when :set
59
- return !arguments[0].empty?
59
+ return !values[0].empty?
60
60
  end
61
61
  end
62
62
  end
@@ -1,3 +1,3 @@
1
1
  module HungryForm
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -10,21 +10,47 @@ describe HungryForm::Elements::CheckboxField do
10
10
  subject { HungryForm::Elements::CheckboxField.new(:element_name, group, resolver, options) {} }
11
11
 
12
12
  it_behaves_like 'an element'
13
- it_behaves_like 'an active element'
13
+ it_behaves_like 'a hashable element'
14
14
 
15
- describe "#set_value" do
16
- context "when resolver contains the element name" do
17
- before { resolver_options[:params] = {"group_element_name" => "on"} }
15
+ describe ".new" do
16
+ it "should have empty error" do
17
+ expect(subject.error).to eq ""
18
+ end
18
19
 
19
- it "should be checked" do
20
- expect(subject.attributes[:checked]).to eq 'checked'
21
- end
20
+ it "should not be required if its parent is not visible" do
21
+ group_options[:visible] = false
22
+ options[:required] = true
23
+ expect(subject.required?).to eq false
22
24
  end
25
+ end
26
+
27
+ describe "#valid?" do
28
+ context "when required" do
29
+ before(:each) { options[:required] = true }
30
+
31
+ it "is valid" do
32
+ subject.value = 1
33
+ expect(subject.valid?).to eq true
34
+ expect(subject.error).to eq ''
35
+ end
23
36
 
24
- context "when resolver doesn't contain the element name" do
25
- it "should not be cheched" do
26
- expect(subject.attributes[:checked]).to eq ''
37
+ it "is invalid" do
38
+ subject.value = 0
39
+ expect(subject.valid?).to eq false
40
+ expect(subject.error).to eq 'This field is required'
27
41
  end
28
42
  end
29
43
  end
44
+
45
+ describe "#set_value" do
46
+ it "should be checked" do
47
+ resolver_options[:params] = { "group_element_name" => 1 }
48
+ expect(subject.checked?).to eq true
49
+ end
50
+
51
+ it "should not be checked" do
52
+ resolver_options[:params] = { "group_element_name" => 0 }
53
+ expect(subject.checked?).to eq false
54
+ end
55
+ end
30
56
  end
@@ -1,4 +1,6 @@
1
1
  RSpec.shared_examples "an active element" do
2
+ it_behaves_like 'a hashable element'
3
+
2
4
  describe ".new" do
3
5
  it "should have empty error" do
4
6
  expect(subject.error).to eq ""
@@ -42,11 +44,4 @@ RSpec.shared_examples "an active element" do
42
44
  end
43
45
  end
44
46
  end
45
-
46
- describe "#to_hash" do
47
- it 'should include required, value and error' do
48
- options.merge!(value: '', required: true)
49
- expect(subject.to_hash).to include(:required, :value, :error)
50
- end
51
- end
52
47
  end
@@ -0,0 +1,8 @@
1
+ RSpec.shared_examples "a hashable element" do
2
+ describe "#to_hash" do
3
+ it 'should include required, value and error' do
4
+ options.merge!(value: '', required: true)
5
+ expect(subject.to_hash).to include(:required, :value, :error)
6
+ end
7
+ end
8
+ end
@@ -3,6 +3,8 @@ require "spec_helper"
3
3
  describe HungryForm::Resolver do
4
4
  let(:resolver_params) { {:params => {}} }
5
5
  subject(:resolver) { HungryForm::Resolver.new(resolver_params) }
6
+ let(:group_options) { {} }
7
+ let(:group) { HungryForm::Elements::Group.new(:group, nil, resolver, group_options) {} }
6
8
 
7
9
  describe ".new" do
8
10
  it "should initialize resolver empty params" do
@@ -16,7 +18,7 @@ describe HungryForm::Resolver do
16
18
  end
17
19
 
18
20
  describe "#get_value" do
19
- let(:element) { HungryForm::Elements::Html.new(:html_name, nil, resolver, { value: "value" }) {} }
21
+ let(:element) { HungryForm::Elements::Html.new(:html_name, group, subject, { value: "value" }) {} }
20
22
 
21
23
  it "should get value from lambda param" do
22
24
  value = subject.get_value( ->(el){ "value" } )
@@ -25,7 +27,7 @@ describe HungryForm::Resolver do
25
27
 
26
28
  it "should get value from a form element" do
27
29
  subject.elements[element.name] = element
28
- expect(subject.get_value("html_name")).to eq "value"
30
+ expect(subject.get_value("group_html_name")).to eq "value"
29
31
  end
30
32
 
31
33
  it "should get value from a form params" do
@@ -39,39 +41,41 @@ describe HungryForm::Resolver do
39
41
  end
40
42
 
41
43
  describe "#resolve_dependency" do
42
- it "should resolve EQ dependency" do
43
- dependency = { eq: ["Text", "Text"] }
44
- expect(subject.resolve_dependency(dependency)).to eq true
45
- end
44
+ context "when dependency is of a scalar type" do
45
+ it "should resolve EQ dependency" do
46
+ dependency = { eq: ["Text", "Text"] }
47
+ expect(subject.resolve_dependency(dependency)).to eq true
48
+ end
46
49
 
47
- it "should resolve LT dependency" do
48
- dependency = { lt: ["0", "1"] }
49
- expect(subject.resolve_dependency(dependency)).to eq true
50
- end
50
+ it "should resolve LT dependency" do
51
+ dependency = { lt: ["0", "1"] }
52
+ expect(subject.resolve_dependency(dependency)).to eq true
53
+ end
51
54
 
52
- it "should resolve GT dependency" do
53
- dependency = { gt: ["1", "0"] }
54
- expect(subject.resolve_dependency(dependency)).to eq true
55
- end
55
+ it "should resolve GT dependency" do
56
+ dependency = { gt: ["1", "0"] }
57
+ expect(subject.resolve_dependency(dependency)).to eq true
58
+ end
56
59
 
57
- it "should resolve SET dependency" do
58
- dependency = { set: "1" }
59
- expect(subject.resolve_dependency(dependency)).to eq true
60
- end
60
+ it "should resolve SET dependency" do
61
+ dependency = { set: "1" }
62
+ expect(subject.resolve_dependency(dependency)).to eq true
63
+ end
61
64
 
62
- it "should resolve AND dependency" do
63
- dependency = { and: [{set: "1"}, {set: "1"}] }
64
- expect(subject.resolve_dependency(dependency)).to eq true
65
- end
65
+ it "should resolve AND dependency" do
66
+ dependency = { and: [{set: "1"}, {set: "1"}] }
67
+ expect(subject.resolve_dependency(dependency)).to eq true
68
+ end
66
69
 
67
- it "should resolve OR dependency" do
68
- dependency = { or: [{set: ""}, {set: "1"}] }
69
- expect(subject.resolve_dependency(dependency)).to eq true
70
- end
70
+ it "should resolve OR dependency" do
71
+ dependency = { or: [{set: ""}, {set: "1"}] }
72
+ expect(subject.resolve_dependency(dependency)).to eq true
73
+ end
71
74
 
72
- it "should resolve NOT dependency" do
73
- dependency = { not: {set: ""} }
74
- expect(subject.resolve_dependency(dependency)).to eq true
75
+ it "should resolve NOT dependency" do
76
+ dependency = { not: {set: ""} }
77
+ expect(subject.resolve_dependency(dependency)).to eq true
78
+ end
75
79
  end
76
80
  end
77
81
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hungryform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Bazhutkin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-14 00:00:00.000000000 Z
11
+ date: 2015-05-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -112,6 +112,7 @@ files:
112
112
  - spec/elements/shared_examples/active_element.rb
113
113
  - spec/elements/shared_examples/element.rb
114
114
  - spec/elements/shared_examples/group.rb
115
+ - spec/elements/shared_examples/hashable_element.rb
115
116
  - spec/elements/shared_examples/options_element.rb
116
117
  - spec/elements/text_area_spec.rb
117
118
  - spec/elements/text_field_spec.rb
@@ -153,6 +154,7 @@ test_files:
153
154
  - spec/elements/shared_examples/active_element.rb
154
155
  - spec/elements/shared_examples/element.rb
155
156
  - spec/elements/shared_examples/group.rb
157
+ - spec/elements/shared_examples/hashable_element.rb
156
158
  - spec/elements/shared_examples/options_element.rb
157
159
  - spec/elements/text_area_spec.rb
158
160
  - spec/elements/text_field_spec.rb