class ApiSchema::ApiVersion

Attributes

configuration[RW]
errors[RW]
imported_versions[RW]
resources[RW]
serializers[RW]

Public Class Methods

new(configuration) click to toggle source
# File lib/api_schema/api_version.rb, line 5
def initialize(configuration)
  @configuration = configuration
  @resources = []
  @serializers = []
  @imported_versions = []
  @errors = {}
end

Public Instance Methods

check_consistency() click to toggle source
# File lib/api_schema/api_version.rb, line 14
def check_consistency
  check_serializers_consistency
  check_resources_consistency
  check_desc_files_consistency

  raise UndefinedSerializersError, error_message  unless errors.empty?
end

Private Instance Methods

add_errors(key, object) click to toggle source
# File lib/api_schema/api_version.rb, line 90
def add_errors(key, object)
  errors[key] ||= []
  errors[key] << object
end
body_error(object) click to toggle source
# File lib/api_schema/api_version.rb, line 112
def body_error(object)
  "There is no '#{object.body_param}' body parameter defined for #{object.base_path}
   resource. Please define it with 'request_body' method"
end
check_desc_files_consistency() click to toggle source
# File lib/api_schema/api_version.rb, line 39
def check_desc_files_consistency
  resources.each do |resource|
    add_errors(:undefined_desc_file, resource) unless find_or_import_desc_file(resource)
  end
end
check_resources_consistency() click to toggle source
# File lib/api_schema/api_version.rb, line 32
def check_resources_consistency
  resources.each do |resource|
    add_errors(:undefined_body, resource) unless find_or_import(resource.body_param)
    add_errors(:undefined_response, resource) unless find_or_import(resource.resp.model)
  end
end
check_serializers_consistency() click to toggle source
# File lib/api_schema/api_version.rb, line 24
def check_serializers_consistency
  serializers.each do |serializer|
    serializer.prior_references.each do |reference|
      add_errors(:undefined_reference, reference) unless find_or_import(reference.id)
    end
  end
end
desc_file_error(object) click to toggle source
# File lib/api_schema/api_version.rb, line 126
def desc_file_error(object)
  "The file '#{object.desc_file_name}' cannot be found"
end
error_message() click to toggle source
# File lib/api_schema/api_version.rb, line 95
def error_message
  message = errors.reduce([]) do |memo, (key, errors)|
    case key
    when :undefined_body
      memo += errors.map(&self.method(:body_error))
    when :undefined_response
      memo += errors.map(&self.method(:response_error))
    when :undefined_reference
      memo += errors.map(&self.method(:reference_error))
    when :undefined_desc_file
      memo += errors.map(&self.method(:desc_file_error))
    end
  end

  message.join(" \n")
end
find_in_another_version(serializer_id) click to toggle source
# File lib/api_schema/api_version.rb, line 57
def find_in_another_version(serializer_id)
  imported_versions.each do |import|
    version = imported_version(import)
    serializer = find_in_version(version, serializer_id)
    return serializers << serializer if serializer
  end

  false
end
find_in_another_version_desc_file(resource) click to toggle source
# File lib/api_schema/api_version.rb, line 71
def find_in_another_version_desc_file(resource)
  imported_versions.each do |import|
    version = imported_version(import)
    return true if find_in_version_desc_file(version, resource)
  end

  false
end
find_in_version(version, serializer_id) click to toggle source
# File lib/api_schema/api_version.rb, line 67
def find_in_version(version, serializer_id)
  version.serializers.detect { |s| s.id == serializer_id }
end
find_in_version_desc_file(version, resource) click to toggle source
# File lib/api_schema/api_version.rb, line 80
def find_in_version_desc_file(version, resource)
  file_path = "#{version.configuration.descriptions_path}/#{resource.desc_file_name}.md"
  return resource.desc_file_path = file_path if File.file?(file_path)
end
find_or_import(serializer_id) click to toggle source
# File lib/api_schema/api_version.rb, line 51
def find_or_import(serializer_id)
  return true unless serializer_id
  return true if find_in_version(self, serializer_id)
  return true if find_in_another_version(serializer_id)
end
find_or_import_desc_file(resource) click to toggle source
# File lib/api_schema/api_version.rb, line 45
def find_or_import_desc_file(resource)
  return true unless resource.desc_file_name
  return true if find_in_version_desc_file(self, resource)
  return true if find_in_another_version_desc_file(resource)
end
imported_version(import) click to toggle source
# File lib/api_schema/api_version.rb, line 85
def imported_version(import)
  "#{import.name.capitalize}::#{import.api_version.capitalize}::BaseDocs"
    .constantize.api_version
end
reference_error(object) click to toggle source
# File lib/api_schema/api_version.rb, line 122
def reference_error(object)
  "Reference #{object.id} is not defined"
end
response_error(object) click to toggle source
# File lib/api_schema/api_version.rb, line 117
def response_error(object)
  "There is no '#{object.resp.model}' response defined for '#{object.summary}'
   resource. Please define it with 'serializer' method"
end