Commits

Anonymous committed e053b41

Add ability to specify custom annotation directories

SOURCE_ANNOTATION_DIRECTORIES='dir1,dir2' bundle exec rake notes

Searches app, config, lib, script, test (default)
Also searches dir1, dir2

References: #4536, #4540

Comments (0)

Files changed (2)

railties/lib/rails/source_annotation_extractor.rb

 # of the line (or closing ERB comment tag) is considered to be their text.
 class SourceAnnotationExtractor
   class Annotation < Struct.new(:line, :tag, :text)
+    def self.directories
+      @@directories ||= %w(app config lib script test) + (ENV['SOURCE_ANNOTATION_DIRECTORIES'] || '').split(',')
+    end
 
     # Returns a representation of the annotation that looks like this:
     #
 
   # Returns a hash that maps filenames under +dirs+ (recursively) to arrays
   # with their annotations.
-  def find(dirs=%w(app config lib script test))
+  def find(dirs=Annotation.directories)
     dirs.inject({}) { |h, dir| h.update(find_in(dir)) }
   end
 

railties/test/application/rake/notes_test.rb

         app_file "script/run_something.rb", "# TODO: note in script directory"
         app_file "test/some_test.rb", 1000.times.map { "" }.join("\n") << "# TODO: note in test directory"
 
+        app_file "some_other_dir/blah.rb", "# TODO: note in some_other directory"
+
         boot_rails
 
         require 'rake'
           assert_match /note in lib directory/, output
           assert_match /note in script directory/, output
           assert_match /note in test directory/, output
+          assert_no_match /note in some_other directory/, output
 
           assert_equal 5, lines.size
 
 
       end
 
+      test 'notes finds notes in custom directories' do
+
+        app_file "app/controllers/some_controller.rb", "# TODO: note in app directory"
+        app_file "config/initializers/some_initializer.rb", "# TODO: note in config directory"
+        app_file "lib/some_file.rb", "# TODO: note in lib directory"
+        app_file "script/run_something.rb", "# TODO: note in script directory"
+        app_file "test/some_test.rb", 1000.times.map { "" }.join("\n") << "# TODO: note in test directory"
+
+        app_file "some_other_dir/blah.rb", "# TODO: note in some_other directory"
+
+        boot_rails
+
+        require 'rake'
+        require 'rdoc/task'
+        require 'rake/testtask'
+
+        Rails.application.load_tasks
+
+        Dir.chdir(app_path) do
+          output = `SOURCE_ANNOTATION_DIRECTORIES='some_other_dir' bundle exec rake notes`
+          lines = output.scan(/\[([0-9\s]+)\]/).flatten
+
+          assert_match /note in app directory/, output
+          assert_match /note in config directory/, output
+          assert_match /note in lib directory/, output
+          assert_match /note in script directory/, output
+          assert_match /note in test directory/, output
+
+          assert_match /note in some_other directory/, output
+
+          assert_equal 6, lines.size
+
+          lines.each do |line_number|
+            assert_equal 4, line_number.size
+          end
+        end
+
+      end
+
       private
       def boot_rails
         super