Class: RuboCop::Cop::Badge

Inherits:
Object
  • Object
show all
Defined in:
lib/rubocop/cop/badge.rb

Overview

Identifier of all cops containing a department and cop name.

All cops are identified by their badge. For example, the badge for ‘RuboCop::Cop::Layout::IndentationStyle` is `Layout/IndentationStyle`. Badges can be parsed as either `Department/CopName` or just `CopName` to allow for badge references in source files that omit the department for RuboCop to infer.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(class_name_parts) ⇒ Badge

Returns a new instance of Badge.



34
35
36
37
38
39
# File 'lib/rubocop/cop/badge.rb', line 34

def initialize(class_name_parts)
  department_parts = class_name_parts[0...-1]
  @department = (department_parts.join('/').to_sym unless department_parts.empty?)
  @department_name = @department&.to_s
  @cop_name = class_name_parts.last
end

Instance Attribute Details

#cop_nameObject (readonly)

Returns the value of attribute cop_name.



13
14
15
# File 'lib/rubocop/cop/badge.rb', line 13

def cop_name
  @cop_name
end

#departmentObject (readonly)

Returns the value of attribute department.



13
14
15
# File 'lib/rubocop/cop/badge.rb', line 13

def department
  @department
end

#department_nameObject (readonly)

Returns the value of attribute department_name.



13
14
15
# File 'lib/rubocop/cop/badge.rb', line 13

def department_name
  @department_name
end

Class Method Details

.camel_case(name_part) ⇒ Object



27
28
29
30
31
32
# File 'lib/rubocop/cop/badge.rb', line 27

def self.camel_case(name_part)
  return 'RSpec' if name_part == 'rspec'
  return name_part unless name_part.match?(/^[a-z]|_[a-z]/)

  name_part.gsub(/^[a-z]|_[a-z]/) { |match| match[-1, 1].upcase }
end

.for(class_name) ⇒ Object



15
16
17
18
19
# File 'lib/rubocop/cop/badge.rb', line 15

def self.for(class_name)
  parts = class_name.split('::')
  name_deep_enough = parts.length >= 4
  new(name_deep_enough ? parts[2..] : parts.last(2))
end

.parse(identifier) ⇒ Object



23
24
25
# File 'lib/rubocop/cop/badge.rb', line 23

def self.parse(identifier)
  @parse_cache[identifier] ||= new(identifier.split('/').map! { |i| camel_case(i) })
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



41
42
43
# File 'lib/rubocop/cop/badge.rb', line 41

def ==(other)
  hash == other.hash
end

#hashObject



46
47
48
49
# File 'lib/rubocop/cop/badge.rb', line 46

def hash
  # Do hashing manually to reduce Array allocations.
  department.hash ^ cop_name.hash # rubocop:disable Security/CompoundHash
end

#match?(other) ⇒ Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/rubocop/cop/badge.rb', line 51

def match?(other)
  cop_name == other.cop_name && (!qualified? || department == other.department)
end

#qualified?Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/rubocop/cop/badge.rb', line 59

def qualified?
  !department.nil?
end

#to_sObject



55
56
57
# File 'lib/rubocop/cop/badge.rb', line 55

def to_s
  @to_s ||= qualified? ? "#{department}/#{cop_name}" : cop_name
end

#with_department(department) ⇒ Object



63
64
65
# File 'lib/rubocop/cop/badge.rb', line 63

def with_department(department)
  self.class.new([department.to_s.split('/'), cop_name].flatten)
end