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