class RuboCop::Schema::Generator

Attributes

schema[R]

@return Hash

Public Class Methods

new(specs, document_loader) click to toggle source

@param [Array<Spec>] specs @param [DocumentLoader] document_loader

# File lib/rubocop/schema/generator.rb, line 20
def initialize(specs, document_loader)
  @specs  = specs
  @loader = document_loader
  @schema = template('schema')
  @props  = @schema.fetch('properties')
  generate
end

Private Instance Methods

apply_cop_info(info) click to toggle source
# File lib/rubocop/schema/generator.rb, line 62
def apply_cop_info(info)
  info.each do |cop_name, cop_info|
    schema           = CopSchema.new(cop_info).as_json
    @props[cop_name] = @props.key?(cop_name) ? merge_schemas(@props[cop_name], schema) : schema
  end
end
department_info(spec, department) click to toggle source

@param [Spec] spec @param [String] department @return [CopInfo]

# File lib/rubocop/schema/generator.rb, line 80
def department_info(spec, department)
  description = "'#{department}' department"
  description << " (#{spec.short_name} extension)" if spec.short_name

  CopInfo.new(
    name:        department,
    description: description
  )
end
generate() click to toggle source
# File lib/rubocop/schema/generator.rb, line 30
def generate
  @specs.each &method(:generate_spec)
  @props.delete 'AllCops' unless @specs.any? { |s| s.name == 'rubocop' }
end
generate_spec(spec) click to toggle source
# File lib/rubocop/schema/generator.rb, line 35
def generate_spec(spec)
  info_map = read_docs(spec)
  read_defaults(spec).each do |name, cop_info|
    info_map[name] = info_map.key?(name) ? CopInfoMerger.merge(info_map[name], cop_info) : cop_info
  end
  apply_cop_info info_map
end
merge_schemas(old, new) click to toggle source

@param [Hash] old @param [Hash] new

# File lib/rubocop/schema/generator.rb, line 71
def merge_schemas(old, new)
  deep_merge(old, new) do |merged|
    merged.delete 'type' if merged.key? '$ref'
  end
end
read_defaults(spec) click to toggle source
# File lib/rubocop/schema/generator.rb, line 55
def read_defaults(spec)
  defaults = @loader.defaults(spec) or
    return {}

  DefaultsRipper.new(defaults).cops.map { |cop_info| [cop_info.name, cop_info] }.to_h
end
read_docs(spec) click to toggle source
# File lib/rubocop/schema/generator.rb, line 43
def read_docs(spec)
  {}.tap do |info_map|
    AsciiDoc::Index.new(@loader.doc(spec)).department_names.each do |department|
      info_map[department] = department_info(spec, department)

      AsciiDoc::Department.new(@loader.doc(spec, department)).cops.each do |cop_info|
        info_map[cop_info.name] = CopInfo.new(**cop_info.to_h)
      end
    end
  end
end