parsley_simple_form 0.0.4 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/README.md +2 -0
- data/lib/parsley_simple_form/action_view_extensions/form_helper.rb +4 -2
- data/lib/parsley_simple_form/concerns/range_concern.rb +29 -0
- data/lib/parsley_simple_form/concerns/type_sensitive_concern.rb +28 -0
- data/lib/parsley_simple_form/constraints/basics/equalto_constraint.rb +2 -2
- data/lib/parsley_simple_form/constraints/basics/max_constraint.rb +23 -0
- data/lib/parsley_simple_form/constraints/basics/maxcheck_constraint.rb +23 -0
- data/lib/parsley_simple_form/constraints/basics/maxlength_constraint.rb +20 -0
- data/lib/parsley_simple_form/constraints/basics/min_constraint.rb +22 -0
- data/lib/parsley_simple_form/constraints/basics/mincheck_constraint.rb +23 -0
- data/lib/parsley_simple_form/constraints/basics/minlength_constraint.rb +20 -0
- data/lib/parsley_simple_form/constraints/basics/notblank_constraint.rb +1 -1
- data/lib/parsley_simple_form/constraints/basics/range_constraint.rb +21 -0
- data/lib/parsley_simple_form/constraints/basics/rangecheck_constraint.rb +25 -0
- data/lib/parsley_simple_form/constraints/basics/rangelength_constraint.rb +21 -0
- data/lib/parsley_simple_form/constraints/basics/regexp_constraint.rb +23 -0
- data/lib/parsley_simple_form/constraints/basics/required_constraint.rb +1 -1
- data/lib/parsley_simple_form/constraints/basics/type_constraint.rb +5 -14
- data/lib/parsley_simple_form/form_builder.rb +16 -27
- data/lib/parsley_simple_form/railtie.rb +1 -0
- data/lib/parsley_simple_form/version.rb +1 -1
- data/test/dummy/log/test.log +4129 -0
- data/test/form_builder/constraints_test.rb +139 -0
- data/test/form_builder/type_test.rb +60 -0
- data/test/form_helper_test.rb +1 -1
- data/test/support/i18n_helper.rb +7 -0
- data/test/support/models.rb +1 -0
- data/test/test_helper.rb +1 -2
- metadata +33 -17
- data/test/form_builder_test.rb +0 -57
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
OTQxZWNiZDI2NTVhN2JmZjMyMGJkMWZmMzQ3YjRiY2U4NDZiNjc1NzNlZGE2
|
10
|
-
NmJhY2E1ODY2YjQ2NmFkZTY0ZDU1Njk4MDhhYTY5NTgwYTZjNDU4YWExNjBj
|
11
|
-
MTcyZDYxYzI4YjU1MDhmMmUyM2YxNWFlZDE1ZTU0NGQ3MTdmNGQ=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NTk3ODhiYjU0NjMxZjc3OTcwYjJhMWFlY2FlNjljOTNkN2MyYzRiZmNmNzI0
|
14
|
-
NDQ0OGViMzNlZDBmMjdhOGViMmRmM2FhMDI5MDdhZDJhNGY3ODBjNTJjY2Nk
|
15
|
-
NWM2MDM5MWZkNzQ3ZjEyMjAwYzRhNjNmOGU3OThlNTM3ZWNmZWE=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 498d675fb0132664462eebbacbf3212f36fddebd
|
4
|
+
data.tar.gz: b32c8da052886cd4cea4d805fb56770280c73afa
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: da7808982c5475eb2b84378fcbb207c837457efcfb6c341513c37ab361fd9798a854016829ab57ccc6445180a183bc5c22164750aeba6a67e5ed6fc6edf00b25
|
7
|
+
data.tar.gz: 73d7e41f7d44efc54dc1c7a7975967f35624f9fab5fa5c8b2da5faccc4fb4ede7ae0b6a4b1b0cc2d8e6c07163b2d5aafa877ce9060c80f2b3e6d9a51f6aecaab
|
data/README.md
CHANGED
@@ -21,6 +21,8 @@ This code:
|
|
21
21
|
|
22
22
|
Automatically adds required constraint to inputs which are required attributes, and validates equality of `password` and `password_confirmation`.
|
23
23
|
|
24
|
+
Don't forget to add parsley.js to your project. You can do it adding the gem [parsley-rails](https://github.com/mekishizufu/parsley-rails) to project's Gemfile (we don't recommend this approach) or use a package manager like [Bower](https://github.com/bower/bower).
|
25
|
+
|
24
26
|
Contributions
|
25
27
|
-------------
|
26
28
|
|
@@ -5,8 +5,10 @@ module ParsleySimpleForm
|
|
5
5
|
options = args.extract_options!
|
6
6
|
options[:builder] = ParsleySimpleForm::FormBuilder
|
7
7
|
options[:html] = {} if options[:html].nil?
|
8
|
-
options[:html][:"data-validate"] = "parsley"
|
9
|
-
options[:html][:novalidate] = true
|
8
|
+
#options[:html][:"data-validate"] = "parsley"
|
9
|
+
#options[:html][:novalidate] = true
|
10
|
+
options[:html][:'data-parsley-validate'] = true
|
11
|
+
options[:html][:'data-parsley-namespace'] = "data-parsley-" #to HTML5 valid
|
10
12
|
simple_form_for(object, *(args << options), &block)
|
11
13
|
end
|
12
14
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Concerns
|
3
|
+
module RangeConcern
|
4
|
+
private
|
5
|
+
def parse_range(range)
|
6
|
+
{
|
7
|
+
:string => range_to_string(range),
|
8
|
+
:min => min_range(range),
|
9
|
+
:max => max_range(range)
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def range_to_string(range)
|
14
|
+
return "[#{range.min},#{range.max}]" if range.is_a?(Range)
|
15
|
+
range
|
16
|
+
end
|
17
|
+
|
18
|
+
def min_range(range)
|
19
|
+
return range.min if range.is_a?(Range)
|
20
|
+
range.match(/\[(\d),(\d)\]/)[1]
|
21
|
+
end
|
22
|
+
|
23
|
+
def max_range(range)
|
24
|
+
return range.max if range.is_a?(Range)
|
25
|
+
range.match(/\[(\d),(\d)\]/)[2]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Concerns
|
3
|
+
module TypeSensitiveConcern
|
4
|
+
TYPES_CONSTRAINTS = %w(email url urlstrict digits number alphanum dateIso)
|
5
|
+
HTML_NATIVE_TYPES = %w(email url number tel)
|
6
|
+
|
7
|
+
TYPE_MAP = {
|
8
|
+
'decimal' => 'number',
|
9
|
+
'integer' => 'digits'
|
10
|
+
}
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
private
|
15
|
+
def mapped_type
|
16
|
+
if @mapped_type.nil?
|
17
|
+
@mapped_type = type
|
18
|
+
@mapped_type = TYPE_MAP[type] unless TYPE_MAP[type].nil?
|
19
|
+
end
|
20
|
+
@mapped_type
|
21
|
+
end
|
22
|
+
|
23
|
+
def type
|
24
|
+
@type ||= @form_builder.find_input(@form_builder.attribute_name, @options, &@block).input_type.to_s
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -14,8 +14,8 @@ module ParsleySimpleForm
|
|
14
14
|
attr_equalto = @options[:equalto]
|
15
15
|
input = @form_builder.find_input(attr_equalto, @options, &@block)
|
16
16
|
{
|
17
|
-
:'data-equalto' => '#' + input_id(attr_equalto, @options, &@block),
|
18
|
-
:'data-equalto-message' =>
|
17
|
+
:'data-parsley-equalto' => '#' + input_id(attr_equalto, @options, &@block),
|
18
|
+
:'data-parsley-equalto-message' =>
|
19
19
|
I18n::translate('form_validation.message.equalto', field_name: input.object.class.human_attribute_name(input.attribute_name))
|
20
20
|
}
|
21
21
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Constraints
|
3
|
+
module Basics
|
4
|
+
class MaxConstraint < Constraints::BaseConstraint
|
5
|
+
include Concerns::TypeSensitiveConcern
|
6
|
+
|
7
|
+
def match?
|
8
|
+
return false if @options.nil?
|
9
|
+
@input_html = @options[:input_html]
|
10
|
+
@max = @options[:max] || @input_html[:max]
|
11
|
+
!@options[:max].nil? || (!@input_html[:max].nil? && mapped_type.to_s == 'number')
|
12
|
+
end
|
13
|
+
|
14
|
+
def html_attributes
|
15
|
+
attributes = {:'data-parsley-max-message' => I18n::translate('form_validation.message.max', max: @max)}
|
16
|
+
attributes.merge!({:type => 'number', :max => @max}) if (@input_html[:max].nil? || !mapped_type.to_s == 'number')
|
17
|
+
attributes
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Constraints
|
3
|
+
module Basics
|
4
|
+
class MaxcheckConstraint < Constraints::BaseConstraint
|
5
|
+
|
6
|
+
def match?
|
7
|
+
return false if @options.nil?
|
8
|
+
!@options[:maxcheck].nil?
|
9
|
+
end
|
10
|
+
|
11
|
+
def html_attributes
|
12
|
+
attributes = {
|
13
|
+
:'data-parsley-maxcheck' => @options[:maxcheck],
|
14
|
+
:'data-parsley-maxcheck-message' => I18n::translate('form_validation.message.maxcheck', maxcheck: @options[:maxcheck])
|
15
|
+
}
|
16
|
+
attributes.merge!({:'data-parsley-group' => @options[:check_group]}) unless @options[:check_group].nil?
|
17
|
+
attributes
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Constraints
|
3
|
+
module Basics
|
4
|
+
class MaxLengthConstraint < Constraints::BaseConstraint
|
5
|
+
|
6
|
+
def match?
|
7
|
+
!@options[:maxlength].nil?
|
8
|
+
end
|
9
|
+
|
10
|
+
def html_attributes
|
11
|
+
{
|
12
|
+
:'data-parsley-maxlength' => @options[:maxlength],
|
13
|
+
:'data-parsley-maxlength-message' => I18n::translate('form_validation.message.maxlength', maxlength: @options[:maxlength])
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Constraints
|
3
|
+
module Basics
|
4
|
+
class MinConstraint < Constraints::BaseConstraint
|
5
|
+
include Concerns::TypeSensitiveConcern
|
6
|
+
|
7
|
+
def match?
|
8
|
+
return false if @options.nil?
|
9
|
+
@min = @options[:min]
|
10
|
+
|
11
|
+
@input_html = @options[:input_html]
|
12
|
+
!@options[:min].nil? || (!@input_html[:min].nil? && mapped_type == 'number')
|
13
|
+
end
|
14
|
+
|
15
|
+
def html_attributes
|
16
|
+
attributes = {:'data-parsley-min-message' => I18n::translate('form_validation.message.min', min: @min)}
|
17
|
+
attributes.merge({:type => 'number', :min => @min}) if (@input_html[:min].nil? || !mapped_type == 'number')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Constraints
|
3
|
+
module Basics
|
4
|
+
class MincheckConstraint < Constraints::BaseConstraint
|
5
|
+
|
6
|
+
def match?
|
7
|
+
return false if @options.nil?
|
8
|
+
!@options[:mincheck].nil?
|
9
|
+
end
|
10
|
+
|
11
|
+
def html_attributes
|
12
|
+
attributes = {
|
13
|
+
:'data-parsley-mincheck' => @options[:mincheck],
|
14
|
+
:'data-parsley-mincheck-message' => I18n::translate('form_validation.message.mincheck', mincheck: @options[:mincheck])
|
15
|
+
}
|
16
|
+
attributes.merge!({:'data-parsley-group' => @options[:check_group]}) unless @options[:check_group].nil?
|
17
|
+
attributes
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Constraints
|
3
|
+
module Basics
|
4
|
+
class MinLengthConstraint < Constraints::BaseConstraint
|
5
|
+
|
6
|
+
def match?
|
7
|
+
!@options[:minlength].nil?
|
8
|
+
end
|
9
|
+
|
10
|
+
def html_attributes
|
11
|
+
{
|
12
|
+
:'data-parsley-minlength' => @options[:minlength],
|
13
|
+
:'data-parsley-minlength-message' => I18n::translate('form_validation.message.minlength', minlength: @options[:minlength])
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Constraints
|
3
|
+
module Basics
|
4
|
+
class RangeConstraint < Constraints::BaseConstraint
|
5
|
+
include Concerns::RangeConcern
|
6
|
+
|
7
|
+
def match?
|
8
|
+
!@options[:range].nil?
|
9
|
+
end
|
10
|
+
|
11
|
+
def html_attributes
|
12
|
+
range = parse_range(@options[:range])
|
13
|
+
{
|
14
|
+
:'data-parsley-range' => range[:string],
|
15
|
+
:'data-parsley-range-message' => I18n::translate('form_validation.message.range', min: range[:min], max: range[:max])
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Constraints
|
3
|
+
module Basics
|
4
|
+
class RangecheckConstraint < Constraints::BaseConstraint
|
5
|
+
include Concerns::RangeConcern
|
6
|
+
|
7
|
+
def match?
|
8
|
+
return false if @options.nil?
|
9
|
+
!@options[:rangecheck].nil?
|
10
|
+
end
|
11
|
+
|
12
|
+
def html_attributes
|
13
|
+
range = parse_range(@options[:rangecheck])
|
14
|
+
attributes = {
|
15
|
+
:'data-parsley-rangecheck' => range[:string],
|
16
|
+
:'data-parsley-rangecheck-message' => I18n::translate('form_validation.message.ragecheck', min: range[:min], max: range[:max])
|
17
|
+
}
|
18
|
+
attributes.merge!({:'data-parsley-group' => @options[:check_group]}) unless @options[:check_group].nil?
|
19
|
+
attributes
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Constraints
|
3
|
+
module Basics
|
4
|
+
class RangeLengthConstraint < Constraints::BaseConstraint
|
5
|
+
include Concerns::RangeConcern
|
6
|
+
|
7
|
+
def match?
|
8
|
+
!@options[:rangelength].nil?
|
9
|
+
end
|
10
|
+
|
11
|
+
def html_attributes
|
12
|
+
range = parse_range(@options[:rangelength])
|
13
|
+
{
|
14
|
+
:'data-parsley-rangelength' => range[:string],
|
15
|
+
:'data-parsley-rangelength-message' => I18n::translate('form_validation.message.rangelength', min: range[:min], max: range[:max])
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ParsleySimpleForm
|
2
|
+
module Constraints
|
3
|
+
module Basics
|
4
|
+
class RegexpConstraint < Constraints::BaseConstraint
|
5
|
+
def match?
|
6
|
+
return false if @options.nil?
|
7
|
+
|
8
|
+
if @options[:regexp].nil?
|
9
|
+
@regexp = @options[:input_html][:regexp] unless @options[:input_html].nil?
|
10
|
+
else
|
11
|
+
@regexp = @options[:regexp]
|
12
|
+
end
|
13
|
+
!@regexp.nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def html_attributes
|
17
|
+
{:'data-parsley-regexp-message' => I18n::translate('form_validation.message.regexp'),
|
18
|
+
:pattern => @regexp}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -15,7 +15,7 @@ module ParsleySimpleForm
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def html_attributes
|
18
|
-
{"data-required-message".to_sym => I18n::translate('form_validation.message.required')}
|
18
|
+
{"data-parsley-required-message".to_sym => I18n::translate('form_validation.message.required')}
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
@@ -2,26 +2,17 @@ module ParsleySimpleForm
|
|
2
2
|
module Constraints
|
3
3
|
module Basics
|
4
4
|
class TypeConstraint < Constraints::BaseConstraint
|
5
|
-
|
6
|
-
|
7
|
-
TYPE_MAP = {
|
8
|
-
'decimal' => 'number'
|
9
|
-
}
|
5
|
+
include Concerns::TypeSensitiveConcern
|
10
6
|
|
11
7
|
def match?
|
12
|
-
TYPES_CONSTRAINTS.include?(type)
|
8
|
+
TYPES_CONSTRAINTS.include?(type) or !TYPE_MAP[type].nil?
|
13
9
|
end
|
14
10
|
|
15
11
|
def html_attributes
|
16
|
-
|
17
|
-
{"data-type
|
18
|
-
|
19
|
-
|
20
|
-
private
|
21
|
-
def type
|
22
|
-
@type ||= @form_builder.find_input(@form_builder.attribute_name, @options, &@block).input_type.to_s
|
12
|
+
attributes = {"data-parsley-type-#{mapped_type}-message".to_sym => I18n::translate("form_validation.message.#{mapped_type}")}
|
13
|
+
attributes.merge!({"data-parsley-type" => mapped_type}) unless HTML_NATIVE_TYPES.include?(mapped_type)
|
14
|
+
attributes
|
23
15
|
end
|
24
|
-
|
25
16
|
end
|
26
17
|
end
|
27
18
|
end
|
@@ -2,14 +2,14 @@ require 'simple_form'
|
|
2
2
|
|
3
3
|
module ParsleySimpleForm
|
4
4
|
class FormBuilder < SimpleForm::FormBuilder
|
5
|
-
attr_reader :attribute_name
|
5
|
+
attr_reader :attribute_name
|
6
6
|
|
7
7
|
def input(attribute_name, options = {}, &block)
|
8
8
|
@attribute_name = attribute_name
|
9
9
|
@options = options
|
10
10
|
@block = block
|
11
11
|
@options[:input_html] ||= {}
|
12
|
-
@options[:input_html].merge!
|
12
|
+
@options[:input_html].merge! parsley_html
|
13
13
|
super(@attribute_name, @options, &@block)
|
14
14
|
end
|
15
15
|
|
@@ -18,38 +18,27 @@ module ParsleySimpleForm
|
|
18
18
|
end
|
19
19
|
|
20
20
|
private
|
21
|
-
def
|
22
|
-
message = {}
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
def parsley_html
|
22
|
+
message = {}
|
23
|
+
|
24
|
+
basic_constraints.each do |constraint|
|
25
|
+
message.merge! check_constraint(constraint)
|
26
|
+
end
|
27
27
|
message
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
31
|
-
|
32
|
-
return
|
30
|
+
def check_constraint(constraint)
|
31
|
+
constraint_checker = constraint.new(self,@options,&@block)
|
32
|
+
return constraint_checker.html_attributes if constraint_checker.match?
|
33
33
|
{}
|
34
34
|
end
|
35
35
|
|
36
|
-
def
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
def basic_constraints
|
37
|
+
# dinamically load all classes of Constraints::Basics module
|
38
|
+
Constraints::Basics.constants
|
39
|
+
.select { |c| Constraints::Basics.const_get(c).is_a?(Class) }
|
40
|
+
.map { |c| Constraints::Basics.const_get(c) }
|
40
41
|
end
|
41
42
|
|
42
|
-
def message_notblank
|
43
|
-
notblank = Constraints::Basics::NotBlankConstraint.new(self,@options,&@block)
|
44
|
-
return notblank.html_attributes if notblank.match?
|
45
|
-
{}
|
46
|
-
end
|
47
|
-
|
48
|
-
#f.input :password_confirm, :equalto => :password
|
49
|
-
def message_equalto
|
50
|
-
equalto = Constraints::Basics::EqualtoConstraint.new(self,@options,&@block)
|
51
|
-
return equalto.html_attributes if equalto.match?
|
52
|
-
{}
|
53
|
-
end
|
54
43
|
end
|
55
44
|
end
|