aboutsummaryrefslogblamecommitdiffstats
path: root/railties/lib/rails/api/task.rb
blob: 3e32576040a5ffebf5fc95fde95670bf1ce81e98 (plain) (tree)
1
2
3
4
5
6
7
8
9








                            







                                                   
                                     
           




                          






                                    


                                           
           

          



                                   

                                                

          


                           
                                     
           




                         
                       

                                                                       





                          


                                                                         
                              
                                 
                              








                                                                          

                                 






                                           






                                                                                                            















                                                   




                                                     
                  
                                                          
         
       
 
                         
                                 
             
                                                   





                                       


                  
       
 
                             




                                              





                                        










                                                          



         
require 'rdoc/task'

module Rails
  module API
    class Task < RDoc::Task
      RDOC_FILES = {
        'activesupport' => {
          :include => %w(
            README.rdoc
            lib/active_support/**/*.rb
          ),
          :exclude => 'lib/active_support/vendor/*'
        },

        'activerecord' => {
          :include => %w(
            README.rdoc
            lib/active_record/**/*.rb
          )
        },

        'activemodel' => {
          :include => %w(
            README.rdoc
            lib/active_model/**/*.rb
          )
        },

        'actionpack' => {
          :include => %w(
            README.rdoc
            lib/abstract_controller/**/*.rb
            lib/action_controller/**/*.rb
            lib/action_dispatch/**/*.rb
          )
        },

        'actionview' => {
          :include => %w(
            README.rdoc
            lib/action_view/**/*.rb
          ),
          :exclude => 'lib/action_view/vendor/*'
        },

        'actionmailer' => {
          :include => %w(
            README.rdoc
            lib/action_mailer/**/*.rb
          )
        },

        'railties' => {
          :include => %w(
            README.rdoc
            lib/**/*.rb
          ),
          :exclude => 'lib/rails/generators/rails/**/templates/**/*.rb'
        }
      }

      def initialize(name)
        super

        # Every time rake runs this task is instantiated as all the rest.
        # Be lazy computing stuff to have as light impact as possible to
        # the rest of tasks.
        before_running_rdoc do
          load_and_configure_sdoc
          configure_rdoc_files
          setup_horo_variables
        end
      end

      # Hack, ignore the desc calls performed by the original initializer.
      def desc(description)
        # no-op
      end

      def load_and_configure_sdoc
        require 'sdoc'

        self.title    = 'Ruby on Rails API'
        self.rdoc_dir = api_dir

        options << '-m'  << api_main
        options << '-e'  << 'UTF-8'

        options << '-f'  << 'sdoc'
        options << '-T'  << 'rails'
      rescue LoadError
        $stderr.puts %(Unable to load SDoc, please add\n\n    gem 'sdoc', require: false\n\nto the Gemfile.)
        exit 1
      end

      def configure_rdoc_files
        rdoc_files.include(api_main)

        RDOC_FILES.each do |component, cfg|
          cdr = component_root_dir(component)

          Array(cfg[:include]).each do |pattern|
            rdoc_files.include("#{cdr}/#{pattern}")
          end

          Array(cfg[:exclude]).each do |pattern|
            rdoc_files.exclude("#{cdr}/#{pattern}")
          end
        end
      end

      def setup_horo_variables
        ENV['HORO_PROJECT_NAME']    = 'Ruby on Rails'
        ENV['HORO_PROJECT_VERSION'] = rails_version
      end

      def api_main
        component_root_dir('railties') + '/RDOC_MAIN.rdoc'
      end
    end

    class RepoTask < Task
      def load_and_configure_sdoc
        super
        options << '-g' # link to GitHub, SDoc flag
      end

      def component_root_dir(component)
        component
      end

      def api_dir
        'doc/rdoc'
      end
    end

    class EdgeTask < RepoTask
      def rails_version
        "master@#{`git rev-parse HEAD`[0, 7]}"
      end
    end

    class StableTask < RepoTask
      def rails_version
        File.read('RAILS_VERSION').strip
      end
    end

    class AppTask < Task
      def component_root_dir(gem_name)
        $:.grep(%r{#{gem_name}[\w.-]*/lib\z}).first[0..-5]
      end

      def api_dir
        'doc/api'
      end

      def rails_version
        Rails::VERSION::STRING
      end
    end
  end
end