Module: WhyClasses::DisableComments

Defined in:
lib/why_classes/disable_comments.rb

Overview

Honours inline suppression comments:

# why-classes:disable RuleA, RuleB      (whole file)
# why-classes:disable-line RuleA        (that line only)

A bare disable/disable-line with no rule names (or all) suppresses every rule.

Defined Under Namespace

Classes: Directives

Constant Summary collapse

DIRECTIVE =
/#\s*why-classes:disable(?<line>-line)?\s*(?<rules>[\w:,\s]*)$/

Class Method Summary collapse

Class Method Details

.filter(offenses, comments) ⇒ Object



47
48
49
50
# File 'lib/why_classes/disable_comments.rb', line 47

def filter(offenses, comments)
  directives = parse(comments)
  offenses.select { |offense| directives.allow?(offense) }
end

.parse(comments) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/why_classes/disable_comments.rb', line 28

def parse(comments)
  file_rules = []
  line_rules = Hash.new { |h, k| h[k] = [] }

  comments.each do |comment|
    match = DIRECTIVE.match(comment.text)
    next unless match

    names = rule_names(match[:rules])
    if match[:line]
      line_rules[comment.location.line].concat(names)
    else
      file_rules.concat(names)
    end
  end

  Directives.new(file_rules: file_rules.uniq, line_rules: line_rules.transform_values(&:uniq))
end

.rule_names(raw) ⇒ Object



52
53
54
55
56
57
# File 'lib/why_classes/disable_comments.rb', line 52

def rule_names(raw)
  names = raw.to_s.split(/[,\s]+/).reject(&:empty?)
  return [:all] if names.empty? || names.include?("all")

  names
end