lib/schemacop/v3/array_node.rb in schemacop-3.0.16 vs lib/schemacop/v3/array_node.rb in schemacop-3.0.17

- old
+ new

@@ -8,11 +8,11 @@ ].freeze supports_children def self.allowed_options - super + ATTRIBUTES + %i[additional_items] + super + ATTRIBUTES + %i[additional_items reject filter] end def self.dsl_methods super + NodeRegistry.dsl_methods(false) + %i[dsl_add dsl_list dsl_cont] end @@ -78,11 +78,14 @@ def _validate(data, result:) super_data = super return if super_data.nil? - # Validate length # + # Preprocess + super_data = preprocess_array(super_data) + + # Validate length length = super_data.size if options[:min_items] && length < options[:min_items] result.error "Array has #{length} items but needs at least #{options[:min_items]}." end @@ -161,13 +164,39 @@ else result << value_item end end - return result + return preprocess_array(result) end protected + + def preprocess_array(value) + # Handle filter + if options[:filter] + block = Proc.new(&options[:filter]) + + value = value.filter do |item| + block.call(item) + rescue NoMethodError + true + end + end + + # Handle reject + if options[:reject] + block = Proc.new(&options[:reject]) + + value = value.reject do |item| + block.call(item) + rescue NoMethodError + false + end + end + + return value + end def list? list_item.present? end