parsley_simple_form 0.0.4 → 0.1.1
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 +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
|