class Documentation

Constants

PREFER_WORD
RULE_WORD
SIGNAL_WORD

Public Instance Methods

call() click to toggle source
# File lib/ducalis/documentation.rb, line 81
def call
  cops.map do |file|
    present_cop(klass_const_for(file), spec_cases_for(file))
  end.flatten.join("\n")
end
cop_rules() click to toggle source
# File lib/ducalis/documentation.rb, line 72
def cop_rules
  cops.map do |file|
    rules = spec_cases_for(file).select do |desc, _code|
      desc.include?(RULE_WORD)
    end
    [file, rules]
  end
end

Private Instance Methods

allowed?(example) click to toggle source
# File lib/ducalis/documentation.rb, line 131
def allowed?(example)
  desc, _code = example
  desc.include?(RULE_WORD)
end
camelize(snake_case_word) click to toggle source
# File lib/ducalis/documentation.rb, line 141
def camelize(snake_case_word)
  snake_case_word.sub(/^[a-z\d]*/, &:capitalize).tap do |string|
    string.gsub!(%r{(?:_|(/))([a-z\d]*)}i) do
      "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}"
    end
    string.gsub!('/', '::')
  end
end
cops() click to toggle source
# File lib/ducalis/documentation.rb, line 89
def cops
  Dir[File.join(File.dirname(__FILE__), 'cops', '*.rb')].sort
end
klass_const_for(file) click to toggle source
# File lib/ducalis/documentation.rb, line 136
def klass_const_for(file)
  require file
  Ducalis.const_get(camelize(File.basename(file).sub(/.rb$/, '')))
end
mention(it_description) click to toggle source
# File lib/ducalis/documentation.rb, line 110
def mention(it_description)
  it_description.include?(SIGNAL_WORD) ? '# bad' : '# good'
end
message(klass) click to toggle source
# File lib/ducalis/documentation.rb, line 114
def message(klass)
  [
    klass.const_get(:OFFENSE),
    *(klass.const_get(:DETAILS) if klass.const_defined?(:DETAILS))
  ].join("\n")
end
prepare(it_description) click to toggle source
# File lib/ducalis/documentation.rb, line 106
def prepare(it_description)
  it_description.sub("#{RULE_WORD} ", '')
end
present_cop(klass, specs) click to toggle source
# File lib/ducalis/documentation.rb, line 93
def present_cop(klass, specs)
  [
    "## #{klass}\n",                                  # header
    message(klass) + "\n"                             # description
  ] +
    specs.map do |(it, code)|
      [
        prepare(it).to_s, # case description
        "\n```ruby\n#{mention(it)}\n#{code.join("\n")}\n```\n" # code example
      ]
    end
end
spec_cases_for(file) click to toggle source
# File lib/ducalis/documentation.rb, line 121
def spec_cases_for(file)
  source_code = File.read(
    file.sub('/lib/', '/spec/')
        .sub(/.rb$/, '_spec.rb')
  )
  SpecsProcessor.new.tap do |processor|
    processor.process(Parser::CurrentRuby.parse(source_code))
  end.cases.select(&method(:allowed?))
end