lib/rubocop/cop/rspec_file_name.rb in rubocop-rspec-1.0.rc1 vs lib/rubocop/cop/rspec_file_name.rb in rubocop-rspec-1.0.rc2
- old
+ new
@@ -1,15 +1,15 @@
# encoding: utf-8
module Rubocop
module Cop
# Checks the path of the spec file and enforces that it reflects the
- # described class/module.
+ # described class/module and its optionally called out method.
#
# @example
- # class/method_spec.rb
- # class_spec.rb
+ # my_class/method_spec.rb # describe MyClass, '#method'
+ # my_class_spec.rb # describe MyClass
class RSpecFileName < Cop
include RSpec::TopLevelDescribe
MESSAGE = 'Spec path should end with `%s`'
METHOD_STRING_MATCHER = /^[\#\.].+/
@@ -17,36 +17,31 @@
def on_top_level_describe(node, args)
return unless single_top_level_describe?
object = const_name(args.first)
return unless object
- glob_matcher = matcher(object, args[1])
- return if source_filename =~ regexp_from_glob(glob_matcher)
+ path_matcher = matcher(object, args[1])
+ return if source_filename =~ regexp_from_glob(path_matcher)
- add_offense(node, :expression, format(MESSAGE, glob_matcher))
+ add_offense(node, :expression, format(MESSAGE, path_matcher))
end
private
def matcher(object, method)
- method_string = method ? method.children.first.gsub(/\W+/, '') : nil
- path = [File.join(path_parts(object)), method_string].compact.join('_')
+ path = File.join(object.split('::').map { |p| camel_to_underscore(p) })
+ path += '*' + method.children.first.gsub(/\W+/, '') if method
+
"#{path}*_spec.rb"
end
- def path_parts(object)
- object.split('::').map do |part|
- camel_to_underscore(part)
- end
- end
-
def source_filename
processed_source.buffer.name
end
def camel_to_underscore(string)
string.dup.tap do |result|
- result.gsub!(/([^A-Z])([A-Z]+)/, '\\1_\\2')
+ result.gsub!(/([^A-Z])([A-Z]+)/, '\\1_\\2')
result.gsub!(/([A-Z]{2,})([A-Z][^A-Z]+)/, '\\1_\\2')
result.downcase!
end
end