class Openapi3Parser::NodeFactory::Paths

Constants

PATH_REGEX

Public Class Methods

new(context) click to toggle source
Calls superclass method Openapi3Parser::NodeFactory::Map::new
# File lib/openapi3_parser/node_factory/paths.rb, line 23
def initialize(context)
  factory = NodeFactory::OptionalReference.new(NodeFactory::PathItem)

  super(context,
        allow_extensions: true,
        value_factory: factory,
        validate: :validate)
end

Private Instance Methods

build_node(data, node_context) click to toggle source
# File lib/openapi3_parser/node_factory/paths.rb, line 34
def build_node(data, node_context)
  Node::Paths.new(data, node_context)
end
conflicting_paths(paths) click to toggle source
# File lib/openapi3_parser/node_factory/paths.rb, line 60
def conflicting_paths(paths)
  potential_conflicts = paths.each_with_object({}) do |path, memo|
    without_params = path.gsub(/{.*?}/, "")
    memo[path] = without_params if path != without_params
  end

  grouped_paths = potential_conflicts.group_by(&:last)
                                     .map { |_k, v| v.map(&:first) }

  grouped_paths.select { |group| group.size > 1 }.flatten
end
validate(validatable) click to toggle source
# File lib/openapi3_parser/node_factory/paths.rb, line 38
def validate(validatable)
  paths = validatable.input.keys.reject do |key|
    NodeFactory::EXTENSION_REGEX =~ key
  end
  validate_paths(validatable, paths)
end
validate_paths(validatable, paths) click to toggle source
# File lib/openapi3_parser/node_factory/paths.rb, line 45
def validate_paths(validatable, paths)
  invalid_paths = paths.reject { |p| PATH_REGEX.match(p) }
  unless invalid_paths.empty?
    joined = invalid_paths.map { |p| "'#{p}'" }.join(", ")
    validatable.add_error("There are invalid paths: #{joined}")
  end

  conflicts = conflicting_paths(paths)

  return if conflicts.empty?

  joined = conflicts.map { |p| "'#{p}'" }.join(", ")
  validatable.add_error("There are paths that conflict: #{joined}")
end