rails_validation_api 0.1.4 → 1.2.0

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: 3c8b2ee85dd44f77049f9ea0fdb831032bdbab38cc9136d8f2f4c5f8172fc206
4
- data.tar.gz: 9001029cc5ed6f29c384baae405d8c8c5512b54c231972664d62614fbbed881f
3
+ metadata.gz: b2e0c05e2f9557b374836280b8519994e5975e1863e690cc37ca3371a1124d89
4
+ data.tar.gz: bc433ab541ae2b18f683c61b2f3070d3e97966b77592ec10bc65cad19d9f27aa
5
5
  SHA512:
6
- metadata.gz: d843949e5f13289add4f81f971b75d0d72f85ea0e05583ee6382b900c7e243de9e8882bcca6a33fd3958c35b204b276697e8cf95381358be2e593febc5d8e237
7
- data.tar.gz: f9c4981c1dd5388cd0ee0f5736907bf0f6fca226fc96a0bacd9dec975f835ca317801d7add913cfc733a0eca9a9e6c101eae6f90dce4e40be126f420bf42a7f8
6
+ metadata.gz: 88d8a71badbcadf927b7c44768a30843ed4d6c5d4ed333c20d4a9ca410cdc1fa5cec0ddc5229eb0cccf781ab3d78ddb5e611be72179c48ef6e13b1eafbc3ce88
7
+ data.tar.gz: 9f8cecae3ccc4fb1648e7afaf8e130ad351aa1ca3fe59d647ae8711d40388d9b24b29bc2da763f9bc7e7c1e4034b51c2d17392201225eda53ee4877de5fbdccd
@@ -2,12 +2,9 @@ require "date"
2
2
  require "time"
3
3
  require "bigdecimal"
4
4
  require "active_support/all"
5
- require "rails_param"
6
-
5
+ require "debug"
7
6
  module RailsValidationApi
8
7
  class Validator
9
- include RailsParam
10
-
11
8
  attr_accessor :params
12
9
  attr_reader :errors
13
10
 
@@ -20,13 +17,13 @@ module RailsValidationApi
20
17
  def validate
21
18
  return false if @rules.nil? || @rules.empty?
22
19
 
23
- @rules.each do |rule_name, rule|
24
- validate_field(rule_name)
20
+ @rules.each do |rule, _|
21
+ validate_field(rule)
25
22
  end
26
23
  if @errors.any?
27
- @errors.each do |error|
28
- raise RailsValidationApi::Error.new(error[:field], :unprocessable_entity, error[:message])
29
- end
24
+ # Only raise the first error to match expected behavior
25
+ first_error = @errors.first
26
+ raise RailsValidationApi::Error.new(first_error[:field], :unprocessable_entity, first_error[:message])
30
27
  end
31
28
  end
32
29
 
@@ -42,21 +39,37 @@ module RailsValidationApi
42
39
 
43
40
  return unless field && type
44
41
 
42
+ # Get the field value from params
43
+ value = params[field]
44
+
45
45
  # Validate the main field
46
46
  opts.each do |opt|
47
47
  next unless opt.is_a?(Hash)
48
48
 
49
- begin
50
- param! field, type, **opt
51
- rescue RailsParam::InvalidParameterError => e
52
- message = (e.message).include?(type.to_s) ? e.message : opt[:message]
49
+ # Check if field is required and missing
50
+ if opt[:required] && (value.nil? || (value.is_a?(String) && value.empty?))
51
+ message = opt[:message] || "Parameter #{field} is required"
53
52
  @errors << { field: field, message: message }
53
+ next
54
54
  end
55
+
56
+ # Skip further validation if field is not required and is nil/empty
57
+ next if !opt[:required] && (value.nil? || (value.is_a?(String) && value.empty?))
58
+
59
+ # Type validation
60
+ unless value.nil? || valid_type?(value, type)
61
+ message = opt[:message] || "Parameter #{field} must be of type #{type}"
62
+ @errors << { field: field, message: message }
63
+ next
64
+ end
65
+
66
+ # Additional validations
67
+ validate_options(field, value, opt)
55
68
  end
56
69
 
57
70
  # Validate nested items if present (for Hash/Array fields)
58
- if items && params[field].is_a?(Hash)
59
- validate_nested_items(field, items, params[field])
71
+ if items && value.is_a?(Hash)
72
+ validate_nested_items(field, items, value)
60
73
  end
61
74
  end
62
75
 
@@ -72,19 +85,77 @@ module RailsValidationApi
72
85
 
73
86
  next unless item_field && item_type
74
87
 
75
- # Create a temporary validator for nested validation
76
- temp_validator = self.class.new(nested_params, {})
88
+ # Validate nested field
89
+ value = nested_params[item_field]
77
90
  item_opts.each do |opt|
78
91
  next unless opt.is_a?(Hash)
79
92
 
80
- begin
81
- temp_validator.param! item_field, item_type, **opt
82
- rescue RailsParam::InvalidParameterError => e
83
- message = (e.message).include?(item_type.to_s) ? e.message : opt[:message]
93
+ # Check if field is required and missing
94
+ if opt[:required] && (value.nil? || (value.is_a?(String) && value.empty?))
95
+ message = opt[:message] || "Parameter #{parent_field}.#{item_field} is required"
96
+ @errors << { field: "#{parent_field}.#{item_field}", message: message }
97
+ next
98
+ end
99
+
100
+ # Skip further validation if field is not required and is nil/empty
101
+ next if !opt[:required] && (value.nil? || (value.is_a?(String) && value.empty?))
102
+
103
+ # Type validation
104
+ unless value.nil? || valid_type?(value, item_type)
105
+ message = opt[:message] || "Parameter #{parent_field}.#{item_field} must be of type #{item_type}"
84
106
  @errors << { field: "#{parent_field}.#{item_field}", message: message }
107
+ next
85
108
  end
109
+
110
+ # Additional validations
111
+ validate_options("#{parent_field}.#{item_field}", value, opt)
86
112
  end
87
113
  end
88
114
  end
115
+
116
+ def valid_type?(value, type)
117
+ case type
118
+ when String
119
+ value.is_a?(String)
120
+ when Integer
121
+ value.is_a?(Integer)
122
+ when Float
123
+ value.is_a?(Float) || value.is_a?(Integer)
124
+ when Hash
125
+ value.is_a?(Hash)
126
+ when Array
127
+ value.is_a?(Array)
128
+ when TrueClass, FalseClass
129
+ value.is_a?(TrueClass) || value.is_a?(FalseClass)
130
+ else
131
+ value.is_a?(type)
132
+ end
133
+ end
134
+
135
+ def validate_options(field, value, opt)
136
+ # Handle min validation
137
+ if opt[:min] && value.respond_to?(:to_i) && value.to_i < opt[:min]
138
+ message = opt[:message] || "Parameter #{field} must be at least #{opt[:min]}"
139
+ @errors << { field: field, message: message }
140
+ end
141
+
142
+ # Handle max validation
143
+ if opt[:max] && value.respond_to?(:to_i) && value.to_i > opt[:max]
144
+ message = opt[:message] || "Parameter #{field} must be at most #{opt[:max]}"
145
+ @errors << { field: field, message: message }
146
+ end
147
+
148
+ # Handle format validation
149
+ if opt[:format] && value.is_a?(String) && !(value =~ opt[:format])
150
+ message = opt[:message] || "Parameter #{field} format is invalid"
151
+ @errors << { field: field, message: message }
152
+ end
153
+
154
+ # Handle blank validation
155
+ if opt[:blank] == false && value.is_a?(String) && value.strip.empty?
156
+ message = opt[:message] || "Parameter #{field} cannot be blank"
157
+ @errors << { field: field, message: message }
158
+ end
159
+ end
89
160
  end
90
161
  end
@@ -1,3 +1,3 @@
1
1
  module RailsValidationApi
2
- VERSION = "0.1.4"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -3,8 +3,11 @@
3
3
  require "logger"
4
4
  require "active_model"
5
5
  require "active_support"
6
- require "rails_param"
7
6
  require "active_support/core_ext/hash"
7
+ require "date"
8
+ require "time"
9
+ require "bigdecimal"
10
+ require "rails_param"
8
11
  require_relative "rails_validation_api/dsl"
9
12
  require_relative "rails_validation_api/validator"
10
13
  require "active_support/concern"
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: 0.1.4
4
+ version: 1.2.0
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-04 00:00:00.000000000 Z
11
+ date: 2025-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
69
83
  description: Rails Validation API provides a powerful DSL for validating request parameters
70
84
  in Rails applications. Features include automatic validator loading based on controller/action
71
85
  names, nested parameter validation, custom error handling, and seamless integration