client_side_validations 7.0.1 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a667f554594c134de2b2ab3e77679337a8bfcb22
4
- data.tar.gz: fd9fd106426a734c79c9a6f9e3bc96877b4bd152
3
+ metadata.gz: f49979931218b2246d124cd4a5e1829cb86443de
4
+ data.tar.gz: 9b4587a126d31aa338aed01dbf98df62445724be
5
5
  SHA512:
6
- metadata.gz: 378f957247dbfab1182963dadb3adf802cb4e79b2a2570af0d9507f3e94b2c7d87fe93002300542f4613b5d7a235f52dded3e906d358fdade2903ae36842ba4d
7
- data.tar.gz: 04f88efc2d59603ea7189d1aefeda34f3e7678cbecfffed791df36612f35582c940ed4ef6df82b0db1d6e4da1d54023dc2d3722a99dda6ccbd4ebb72b608a790
6
+ metadata.gz: b60d2af0e7c814f60930d6b82fa18185c13e38c8939ca23c1396e1ecaf9881054d1bef455196302daaa7b0e73245adf8d3e3462a77531225978ae6d4e77891ed
7
+ data.tar.gz: d6a4c75565e0bf8343a7c07e7935c135e76fb8bce76623702a583ff021aa849da91547d086f4f75b6f509ebc46311d7cb19e38d7c10edcd2fe722ce5dcc10d29
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 8.0.0 (2017-01-22)
4
+
5
+ * Change internals to get 4.0 score on Code Climate
6
+
3
7
  ## 7.0.1 (2017-01-22)
4
8
 
5
9
  * Fix `rails.validations` asset not found error
@@ -7,54 +7,46 @@ module ClientSideValidations
7
7
  end
8
8
 
9
9
  def form_for(record, options = {}, &block)
10
- raise ArgumentError, 'Missing block' unless block_given?
11
- if options[:validate]
10
+ return super unless options[:validate]
12
11
 
13
- # Always turn off HTML5 Validations
14
- options[:html] ||= {}
15
- options[:html][:novalidate] = 'novalidate'
12
+ # Always turn off HTML5 Validations
13
+ options[:html] ||= {}
14
+ options[:html][:novalidate] = 'novalidate'
16
15
 
17
- case record
18
- when String, Symbol
19
- raise ClientSideValidations::ActionView::Helpers::FormHelper::Error, 'Using form_for(:name, @resource) is not supported with ClientSideValidations. Please use form_for(@resource, as: :name) instead.'
20
- else
21
- object = record.is_a?(Array) ? record.last : record
22
- object_name = options[:as] || model_name_from_record_or_class(object).param_key
23
- end
16
+ case record
17
+ when String, Symbol
18
+ raise ClientSideValidations::ActionView::Helpers::FormHelper::Error, 'Using form_for(:name, @resource) is not supported with ClientSideValidations. Please use form_for(@resource, as: :name) instead.'
19
+ else
20
+ object = record.is_a?(Array) ? record.last : record
21
+ object_name = options[:as] || model_name_from_record_or_class(object).param_key
24
22
  end
25
23
 
26
24
  @validators = {}
27
25
 
28
- # Order matters here. Rails mutates the options object
29
- html_id = options[:html][:id] if options[:html]
30
- form = super(record, options, &block)
31
- options[:id] = html_id if html_id
26
+ # Order matters here. Rails mutates the `options` object
27
+ form = super
32
28
 
33
- build_bound_validators options
34
- builder = instantiate_builder(object_name, object, options) if object_name && object
35
- script = client_side_form_settings(object, options, builder)
29
+ build_bound_validators! options
30
+ builder = instantiate_builder(object_name, object, options)
31
+ script = client_side_form_settings(options, builder)
36
32
 
37
- # Because of the load order requirement above this sub is necessary
38
- # Would be nice to not do this
39
- script = insert_validators_into_script(script)
40
-
41
- # rubocop:disable OutputSafety
42
- # TODO: check if html_safe is really needed here
43
33
  if assign_script_to_content_for(options[:validate], script)
44
- form.html_safe
34
+ form
45
35
  else
46
- "#{form}#{script}".html_safe
36
+ # rubocop:disable OutputSafety
37
+ [form, script].join.html_safe
38
+ # rubocop:enable OutputSafety
47
39
  end
48
- # rubocop:enable OutputSafety
49
40
  end
50
41
 
51
42
  def assign_script_to_content_for(name, script)
43
+ return false unless name && name != true
44
+
52
45
  # rubocop:disable OutputSafety
53
- # TODO: check if html_safe is really needed here
54
- return unless name && name != true
55
46
  content_for name, script.html_safe
56
- true
57
47
  # rubocop:enable OutputSafety
48
+
49
+ true
58
50
  end
59
51
 
60
52
  def apply_form_for_options!(record, object, options)
@@ -63,15 +55,19 @@ module ClientSideValidations
63
55
  end
64
56
 
65
57
  def fields_for(record_or_name_or_array, record_object = nil, options = {}, &block)
58
+ # Order matters here. Rails mutates the `options` object
66
59
  output = super
67
- build_bound_validators options
60
+
61
+ build_bound_validators! options
62
+
68
63
  output
69
64
  end
70
65
 
71
66
  private
72
67
 
73
- def build_bound_validators(options)
68
+ def build_bound_validators!(options)
74
69
  return unless @validators
70
+
75
71
  options[:validators].each do |key, value|
76
72
  if @validators.key?(key)
77
73
  @validators[key].merge! value
@@ -81,17 +77,6 @@ module ClientSideValidations
81
77
  end
82
78
  end
83
79
 
84
- def insert_validators_into_script(script)
85
- # There is probably a more performant way of doing this
86
- # But using String#sub has some issues. Undocumented "features"
87
- if script
88
- script = script.split(/"validator_hash"/)
89
- script = "#{script[0]}#{construct_validators.to_json}#{script[1]}"
90
- end
91
-
92
- script
93
- end
94
-
95
80
  def construct_validators
96
81
  @validators.each_with_object({}) do |object_opts, validator_hash|
97
82
  option_hash = object_opts[1].each_with_object({}) do |attr, result|
@@ -113,27 +98,21 @@ module ClientSideValidations
113
98
  end
114
99
  end
115
100
 
116
- def client_side_form_settings(object, options, builder)
117
- return unless options[:validate]
118
- var_name =
119
- if options[:id]
120
- options[:id]
121
- elsif object.respond_to?(:persisted?) && object.persisted?
122
- options[:as] ? "edit_#{options[:as]}" : [options[:namespace], dom_id(object, :edit)].compact.join('_'.freeze)
123
- else
124
- options[:as] ? "new_#{options[:as]}" : [options[:namespace], dom_id(object)].compact.join('_'.freeze)
125
- end
101
+ def client_side_form_settings(options, builder)
102
+ javascript_tag "if(window.ClientSideValidations===undefined)window.ClientSideValidations={};window.ClientSideValidations.disabled_validators=#{ClientSideValidations::Config.disabled_validators.to_json};window.ClientSideValidations.number_format=#{number_format.to_json};if(window.ClientSideValidations.patterns===undefined)window.ClientSideValidations.patterns = {};window.ClientSideValidations.patterns.numericality=#{numericality_patterns};#{"if(window.ClientSideValidations.remote_validators_prefix===undefined)window.ClientSideValidations.remote_validators_prefix='#{ClientSideValidations::Config.root_path.sub(%r{/+\Z}, '')}';" if ClientSideValidations::Config.root_path.present?}if(window.ClientSideValidations.forms===undefined)window.ClientSideValidations.forms={};window.ClientSideValidations.forms['#{options[:html]['id']}'] = #{builder.client_side_form_settings(options, self).merge(validators: construct_validators).to_json};"
103
+ end
126
104
 
127
- number_format =
105
+ def number_format
106
+ @number_format ||=
128
107
  if ClientSideValidations::Config.number_format_with_locale && defined?(I18n)
129
- I18n.t('number.format').slice(:separator, :delimiter)
108
+ I18n.t('number.format').slice :separator, :delimiter
130
109
  else
131
110
  { separator: '.', delimiter: ',' }
132
111
  end
112
+ end
133
113
 
134
- patterns = { numericality: "/^(-|\\+)?(?:\\d+|\\d{1,3}(?:\\#{number_format[:delimiter]}\\d{3})+)(?:\\#{number_format[:separator]}\\d*)?$/" }
135
-
136
- javascript_tag "if(window.ClientSideValidations===undefined)window.ClientSideValidations={};window.ClientSideValidations.disabled_validators=#{ClientSideValidations::Config.disabled_validators.to_json};window.ClientSideValidations.number_format=#{number_format.to_json};if(window.ClientSideValidations.patterns===undefined)window.ClientSideValidations.patterns = {};window.ClientSideValidations.patterns.numericality=#{patterns[:numericality]};#{"if(window.ClientSideValidations.remote_validators_prefix===undefined)window.ClientSideValidations.remote_validators_prefix='#{ClientSideValidations::Config.root_path.sub(%r{/+\Z}, '')}';" if ClientSideValidations::Config.root_path.present?}if(window.ClientSideValidations.forms===undefined)window.ClientSideValidations.forms={};window.ClientSideValidations.forms['#{var_name}'] = #{builder.client_side_form_settings(options, self).merge(validators: 'validator_hash').to_json};"
114
+ def numericality_patterns
115
+ "/^(-|\\+)?(?:\\d+|\\d{1,3}(?:\\#{number_format[:delimiter]}\\d{3})+)(?:\\#{number_format[:separator]}\\d*)?$/"
137
116
  end
138
117
  end
139
118
  end
@@ -62,22 +62,32 @@ module ClientSideValidations
62
62
  def can_use_for_client_side_validation?(attr, validator, force)
63
63
  return false if validator_turned_off?(attr, validator, force)
64
64
 
65
- # Yeah yeah, #new_record? is not part of ActiveModel :p
66
- result = ((respond_to?(:new_record?) && validator.options[:on] == (new_record? ? :create : :update)) || validator.options[:on].nil?)
65
+ result = check_new_record(validator)
67
66
  result &&= validator.kind != :block
68
67
 
69
68
  if validator.options[:if] || validator.options[:unless]
70
- if validator.options[:if] && validator.options[:if] =~ /changed\?/
71
- result = true
72
- else
73
- result = can_force_validator?(attr, validator, force)
74
- if validator.options[:if]
75
- result &&= run_conditionals(validator.options[:if], :if)
76
- end
77
- if validator.options[:unless]
78
- result &&= run_conditionals(validator.options[:unless], :unless)
79
- end
80
- end
69
+ check_conditionals attr, validator, force
70
+ else
71
+ result
72
+ end
73
+ end
74
+
75
+ # Yeah yeah, #new_record? is not part of ActiveModel :p
76
+ def check_new_record(validator)
77
+ (respond_to?(:new_record?) && validator.options[:on] == (new_record? ? :create : :update)) || validator.options[:on].nil?
78
+ end
79
+
80
+ def check_conditionals(attr, validator, force)
81
+ return true if validator.options[:if] && validator.options[:if] =~ /changed\?/
82
+
83
+ result = can_force_validator?(attr, validator, force)
84
+
85
+ if validator.options[:if]
86
+ result &&= run_conditionals(validator.options[:if], :if)
87
+ end
88
+
89
+ if validator.options[:unless]
90
+ result &&= run_conditionals(validator.options[:unless], :unless)
81
91
  end
82
92
 
83
93
  result
@@ -8,23 +8,30 @@ module ClientSideValidations
8
8
  hash[:id] = model.id unless model.new_record?
9
9
  hash[:allow_blank] = true if options[:allow_blank]
10
10
 
11
+ apply_class_option! hash, model
12
+ apply_scope_option! hash, model
13
+
14
+ hash
15
+ end
16
+
17
+ private
18
+
19
+ def apply_class_option!(hash, model)
11
20
  if options.key?(:client_validations) && options[:client_validations].key?(:class)
12
21
  hash[:class] = options[:client_validations][:class].underscore
13
22
  elsif model.class.name.demodulize != model.class.name
14
23
  hash[:class] = model.class.name.underscore
15
24
  end
25
+ end
16
26
 
17
- if options.key?(:scope) && options[:scope].present?
18
- hash[:scope] = Array.wrap(options[:scope]).inject({}) do |scope_hash, scope_item|
19
- scope_hash.merge!(scope_item => model.send(scope_item))
20
- end
21
- end
27
+ def apply_scope_option!(hash, model)
28
+ return unless options.key?(:scope) && options[:scope].present?
22
29
 
23
- hash
30
+ hash[:scope] = Array.wrap(options[:scope]).inject({}) do |scope_hash, scope_item|
31
+ scope_hash.merge!(scope_item => model.send(scope_item))
32
+ end
24
33
  end
25
34
 
26
- private
27
-
28
35
  def message_type
29
36
  :taken
30
37
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ClientSideValidations
3
- VERSION = '7.0.1'.freeze
3
+ VERSION = '8.0.0'.freeze
4
4
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  /*!
3
- * Client Side Validations - v7.0.1 (https://github.com/DavyJonesLocker/client_side_validations)
3
+ * Client Side Validations - v8.0.0 (https://github.com/DavyJonesLocker/client_side_validations)
4
4
  * Copyright (c) 2017 Geremia Taglialatela, Brian Cardarella
5
5
  * Licensed under MIT (http://opensource.org/licenses/mit-license.php)
6
6
  */
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: client_side_validations
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.1
4
+ version: 8.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geremia Taglialatela