@@ -14,6 +14,7 @@ def initialize(allow_empty:, expected_type:)
1414 self . allow_empty = allow_empty
1515 self . expected_type = expected_type
1616 self . optional_keys = [ ]
17+ self . strict_keys = [ ]
1718 self . original_key_type = { }
1819
1920 self . default = MissingValidation . new
@@ -32,7 +33,11 @@ def add(key, val, optional: false)
3233
3334 normalized_key = normalize_key ( key )
3435 __getobj__ [ normalized_key ] = val
35- optional_keys << normalized_key if optional
36+ if optional == :loose
37+ strict_keys << normalized_key
38+ else
39+ optional_keys << normalized_key if optional
40+ end
3641 original_key_type [ normalized_key ] = key . class
3742
3843 self
@@ -87,11 +92,16 @@ def delete(key)
8792 #
8893 # @return [Array<Symbol>] required keys
8994 #
90- def required
95+ def required ( loose : )
9196 clone . tap do |cloned |
9297 optional_keys . each do |key |
9398 cloned . delete ( key )
9499 end
100+ if loose
101+ strict_keys . each do |key |
102+ cloned . delete ( key )
103+ end
104+ end
95105 end
96106 end
97107
@@ -113,6 +123,9 @@ def merge(rules)
113123 if rules . respond_to? ( :optional_keys , true )
114124 optional_keys . push ( *rules . send ( :optional_keys ) )
115125 end
126+ if rules . respond_to? ( :strict_keys , true )
127+ strict_keys . push ( *rules . send ( :strict_keys ) )
128+ end
116129
117130 self
118131 end
@@ -123,7 +136,7 @@ def inspect(indent = 0)
123136 return "#{ prefix } [Error]Depth limit reached[/Error]" if indent > 5_000
124137
125138 [
126- "#{ prefix } [Rules n=#{ keys . length } optional=#{ optional_keys . length } allow_empty=#{ allow_empty? } ]" ,
139+ "#{ prefix } [Rules n=#{ keys . length } optional=#{ optional_keys . length } strict= #{ strict_keys . length } allow_empty=#{ allow_empty? } ]" ,
127140 "#{ prefix } #{ inspect_format_attribute ( indent , '*' , default ) } " ,
128141 *keys . map { |key | "#{ prefix } #{ inspect_format_attribute ( indent , key ) } " } ,
129142 "#{ prefix } [/Rules]"
@@ -162,7 +175,7 @@ def default=(input_default)
162175
163176 private
164177
165- attr_accessor :allow_empty , :optional_keys , :original_key_type
178+ attr_accessor :allow_empty , :strict_keys , : optional_keys, :original_key_type
166179 attr_writer :expected_type
167180
168181 def normalize_key ( key )
0 commit comments