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