rails_validation_api 1.3.1 → 1.3.2

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
  SHA256:
3
- metadata.gz: edbb13c19498b3622d49408d4272d09ab4db30e5ac4b7dd3241d50c51418c6ff
4
- data.tar.gz: 1918970f159bc98525e5edfcf9f585a5d5d28a9cd2c3b545fc1fa08b938f3d09
3
+ metadata.gz: 7421ffbec471297d9389570c5a9a55fb29299d3f7c81b1fba6ab7d28ac73b02f
4
+ data.tar.gz: d638855345a78a2e30c26adc084e80c1e3c880fbf182c3192fdce2d286107b02
5
5
  SHA512:
6
- metadata.gz: bafbb02191b0f332c5854eb5ae3e33b2f62263c78f5a0648d9d9f80a606b7c3bccb792ae377da3ce74b5d98fef81e4681b4e0f7242b725c3c402d2f7fb66bf8b
7
- data.tar.gz: 0a6a7546cd9b49575eeed5518e434e8448713c0f8652f764b4865b23b9f2a0b7d5a4e34c45242a226df3933c94c70fb7ec5ed39d27ababf7188efcad448a7db7
6
+ metadata.gz: 82a93eb25f444801cac1d7445781f505a8700901fa5acd9d2447622264503743163633d36147aa3424bf8fef0fa22ecf8513dcf6f1da15d1989ad5cef7ecb76d
7
+ data.tar.gz: f1f1de6215e20cf18ab0f21148c21f4f8ab81c09ce08059eb645f22884d9d0e9f326aaf13ee8970e8fe1541c2ea282b89ce36bd35bfba9ec48d05f11567edeba
@@ -12,7 +12,7 @@ module RailsValidationApi
12
12
  attr_reader :errors
13
13
 
14
14
  def initialize(params, rules)
15
- self.params = params.is_a?(ActionController::Parameters) ? params.to_unsafe_h : params
15
+ self.params = (defined?(ActionController::Parameters) && params.is_a?(ActionController::Parameters)) ? params.to_unsafe_h : params
16
16
  @rules = rules
17
17
  @errors = []
18
18
  end
@@ -20,8 +20,8 @@ module RailsValidationApi
20
20
  def validate
21
21
  return false if @rules.nil? || @rules.empty?
22
22
 
23
- @rules.each do |rule_name, rule|
24
- validate_field(rule_name)
23
+ @rules.each do |rule, _|
24
+ validate_field(rule)
25
25
  end
26
26
  if @errors.any?
27
27
  @errors.each do |error|
@@ -69,6 +69,8 @@ module RailsValidationApi
69
69
  # Validate nested items if present (for Hash/Array fields)
70
70
  if items && params[field].is_a?(Hash)
71
71
  validate_nested_items(field, items, params[field])
72
+ elsif items && params[field].is_a?(Array)
73
+ validate_nested_array_items(field, items, params[field])
72
74
  end
73
75
  end
74
76
 
@@ -78,22 +80,102 @@ module RailsValidationApi
78
80
  items.each do |item_rule|
79
81
  next unless item_rule.is_a?(Hash)
80
82
 
81
- item_field = item_rule[:field]
82
- item_type = item_rule[:type]
83
- item_opts = item_rule[:opts] || []
84
-
85
- next unless item_field && item_type
86
-
87
- # Create a temporary validator for nested validation
88
- temp_validator = self.class.new(nested_params, {})
89
- item_opts.each do |opt|
90
- next unless opt.is_a?(Hash)
83
+ # Check if this is a nested validation rule (not a regular field validation)
84
+ if item_rule.keys.any? { |k| k.to_s.end_with?('_validate') }
85
+ # Handle nested validation rules
86
+ item_rule.each do |rule_name, rule_config|
87
+ next unless rule_name.to_s.end_with?('_validate') && rule_config.is_a?(Hash)
88
+
89
+ nested_field = rule_config[:field]
90
+ nested_type = rule_config[:type]
91
+ nested_opts = rule_config[:opts] || []
92
+ nested_items = rule_config[:items]
93
+
94
+ if nested_field && nested_type && nested_params[nested_field]
95
+ # Create a temporary validator for the nested rule
96
+ temp_validator = self.class.new(nested_params, {})
97
+
98
+ # Validate the nested field
99
+ nested_opts.each do |opt|
100
+ next unless opt.is_a?(Hash)
101
+
102
+ begin
103
+ temp_validator.param! nested_field, nested_type, **opt
104
+ rescue RailsParam::InvalidParameterError => e
105
+ message = (e.message).include?(nested_type.to_s) ? e.message : opt[:message]
106
+ @errors << { field: "#{parent_field}.#{nested_field}", message: message }
107
+ end
108
+ end
109
+
110
+ # Handle nested items if present
111
+ if nested_items && nested_params[nested_field].is_a?(Array)
112
+ validate_nested_array_items("#{parent_field}.#{nested_field}", nested_items, nested_params[nested_field])
113
+ end
114
+ end
115
+ end
116
+ else
117
+ # Handle regular item validation
118
+ item_field = item_rule[:field]
119
+ item_type = item_rule[:type]
120
+ item_opts = item_rule[:opts] || []
121
+
122
+ next unless item_field && item_type
123
+
124
+ # Create a temporary validator for nested validation
125
+ temp_validator = self.class.new(nested_params, {})
126
+ item_opts.each do |opt|
127
+ next unless opt.is_a?(Hash)
128
+
129
+ begin
130
+ temp_validator.param! item_field, item_type, **opt
131
+ rescue RailsParam::InvalidParameterError => e
132
+ message = (e.message).include?(item_type.to_s) ? e.message : opt[:message]
133
+ @errors << { field: "#{parent_field}.#{item_field}", message: message }
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
91
139
 
92
- begin
93
- temp_validator.param! item_field, item_type, **opt
94
- rescue RailsParam::InvalidParameterError => e
95
- message = (e.message).include?(item_type.to_s) ? e.message : opt[:message]
96
- @errors << { field: "#{parent_field}.#{item_field}", message: message }
140
+ def validate_nested_array_items(parent_field, items, array_params)
141
+ return unless items.is_a?(Array) && array_params.is_a?(Array)
142
+
143
+ array_params.each_with_index do |array_item, array_index|
144
+ next unless array_item.is_a?(Hash)
145
+
146
+ items.each do |item_rule|
147
+ next unless item_rule.is_a?(Hash)
148
+
149
+ item_field = item_rule[:field]
150
+ item_type = item_rule[:type]
151
+ item_opts = item_rule[:opts] || []
152
+
153
+ next unless item_field && item_type
154
+
155
+ # Create a temporary validator for nested validation
156
+ temp_validator = self.class.new(array_item, {})
157
+ item_opts.each do |opt|
158
+ next unless opt.is_a?(Hash)
159
+
160
+ begin
161
+ # Handle nested array validation within hash items
162
+ if item_type == Array && opt[:type]
163
+ temp_validator.param! item_field, item_type do |nested_array_param, nested_index|
164
+ begin
165
+ nested_array_param.param! nested_index, opt[:type], **opt.except(:type)
166
+ rescue RailsParam::InvalidParameterError => e
167
+ message = (e.message).include?(item_type.to_s) ? e.message : opt[:message]
168
+ # message = opt[:message] || e.message || "Invalid value at index #{nested_index} for #{item_field}"
169
+ @errors << { field: "#{parent_field}[#{array_index}].#{item_field}[#{nested_index}]", message: message }
170
+ end
171
+ end
172
+ else
173
+ temp_validator.param! item_field, item_type, **opt
174
+ end
175
+ rescue RailsParam::InvalidParameterError => e
176
+ message = (e.message).include?(item_type.to_s) ? e.message : opt[:message]
177
+ @errors << { field: "#{parent_field}[#{array_index}].#{item_field}", message: message }
178
+ end
97
179
  end
98
180
  end
99
181
  end
@@ -1,3 +1,3 @@
1
1
  module RailsValidationApi
2
- VERSION = "1.3.1"
2
+ VERSION = "1.3.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_validation_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Linh Nguyen Quang
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-07-07 00:00:00.000000000 Z
11
+ date: 2025-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport