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