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