bborn-desert 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +50 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +316 -0
- data/Rakefile +77 -0
- data/VERSION.yml +2 -0
- data/generators/desert_plugin/USAGE +14 -0
- data/generators/desert_plugin/desert_plugin_generator.rb +73 -0
- data/generators/desert_plugin/templates/desert_routes.rb +4 -0
- data/generators/desert_plugin/templates/empty_file +0 -0
- data/generators/desert_plugin/templates/plugin_migration.rb +11 -0
- data/generators/desert_plugin/templates/spec_helper.rb +8 -0
- data/init.rb +0 -0
- data/lib/desert.rb +14 -0
- data/lib/desert/manager.rb +131 -0
- data/lib/desert/plugin.rb +74 -0
- data/lib/desert/plugin_migrations.rb +11 -0
- data/lib/desert/plugin_migrations/1.2/extensions/schema_statements.rb +34 -0
- data/lib/desert/plugin_migrations/1.2/migrator.rb +33 -0
- data/lib/desert/plugin_migrations/2.1/extensions/schema_statements.rb +39 -0
- data/lib/desert/plugin_migrations/2.1/migrator.rb +35 -0
- data/lib/desert/plugin_migrations/migrator.rb +29 -0
- data/lib/desert/plugin_templates.rb +13 -0
- data/lib/desert/plugin_templates/1.2.0/action_mailer.rb +21 -0
- data/lib/desert/plugin_templates/1.2.0/action_view.rb +53 -0
- data/lib/desert/plugin_templates/1.99.0/action_mailer.rb +25 -0
- data/lib/desert/plugin_templates/1.99.0/action_view.rb +38 -0
- data/lib/desert/plugin_templates/2.0.0/action_mailer.rb +23 -0
- data/lib/desert/plugin_templates/2.0.2/action_view.rb +26 -0
- data/lib/desert/plugin_templates/2.1.0/action_view.rb +15 -0
- data/lib/desert/plugin_templates/2.2.0/action_mailer.rb +23 -0
- data/lib/desert/plugin_templates/2.2.0/action_view.rb +10 -0
- data/lib/desert/plugin_templates/action_controller.rb +12 -0
- data/lib/desert/plugin_templates/action_view.rb +17 -0
- data/lib/desert/rails.rb +10 -0
- data/lib/desert/rails/1.2.0/initializer.rb +20 -0
- data/lib/desert/rails/2.0.0/plugin.rb +22 -0
- data/lib/desert/rails/dependencies.rb +87 -0
- data/lib/desert/rails/migration.rb +36 -0
- data/lib/desert/rails/route_set.rb +23 -0
- data/lib/desert/ruby.rb +2 -0
- data/lib/desert/ruby/object.rb +34 -0
- data/lib/desert/supported_rails_versions.rb +12 -0
- data/lib/desert/tasks.rb +4 -0
- data/lib/desert/version_checker.rb +34 -0
- metadata +105 -0
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            module Desert #:nodoc:
         | 
| 2 | 
            +
              module PluginMigrations
         | 
| 3 | 
            +
                class Migrator < ActiveRecord::Migrator
         | 
| 4 | 
            +
                  class << self
         | 
| 5 | 
            +
                    def current_version #:nodoc:
         | 
| 6 | 
            +
                      result = ActiveRecord::Base.connection.select_one("SELECT version FROM #{schema_migrations_table_name} WHERE plugin_name = '#{current_plugin.name}' order by version desc")
         | 
| 7 | 
            +
                      if result
         | 
| 8 | 
            +
                        result['version'].to_i
         | 
| 9 | 
            +
                      else
         | 
| 10 | 
            +
                        # There probably isn't an entry for this plugin in the migration info table.
         | 
| 11 | 
            +
                        0
         | 
| 12 | 
            +
                      end
         | 
| 13 | 
            +
                    end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    def get_all_versions
         | 
| 16 | 
            +
                      ActiveRecord::Base.connection.select_values("SELECT version FROM #{schema_migrations_table_name} where plugin_name='#{current_plugin.name}'").map(&:to_i).sort
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def record_version_state_after_migrating(version)
         | 
| 21 | 
            +
                    sm_table = self.class.schema_migrations_table_name
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    if down?
         | 
| 24 | 
            +
                      ActiveRecord::Base.connection.update("DELETE FROM #{sm_table} WHERE version = '#{version}' AND plugin_name = '#{current_plugin.name}'")
         | 
| 25 | 
            +
                    else
         | 
| 26 | 
            +
                      ActiveRecord::Base.connection.insert("INSERT INTO #{sm_table} (plugin_name, version) VALUES ('#{current_plugin.name}', '#{version}')")
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  def migrated
         | 
| 31 | 
            +
                    self.class.get_all_versions
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            module Desert #:nodoc:
         | 
| 2 | 
            +
              module PluginMigrations
         | 
| 3 | 
            +
                # Responsible for migrating plugins.  PluginMigrations.Migrator.current_plugin
         | 
| 4 | 
            +
                # indicates which plugin is currently being migrated
         | 
| 5 | 
            +
                class Migrator < ActiveRecord::Migrator
         | 
| 6 | 
            +
                  # We need to be able to set the current plugin being migrated.
         | 
| 7 | 
            +
                  cattr_accessor :current_plugin
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  class << self
         | 
| 10 | 
            +
                    # Runs the migrations from a plugin, up (or down) to the version given
         | 
| 11 | 
            +
                    def migrate_plugin(plugin, version = nil)
         | 
| 12 | 
            +
                      self.current_plugin = plugin
         | 
| 13 | 
            +
                      if ActiveRecord::Base.connection.respond_to?(:initialize_schema_migrations_table)
         | 
| 14 | 
            +
                        ActiveRecord::Base.connection.initialize_schema_migrations_table
         | 
| 15 | 
            +
                      end
         | 
| 16 | 
            +
                      migrate(plugin.migration_path, version)
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def schema_info_table_name #:nodoc:
         | 
| 20 | 
            +
                      ActiveRecord::Base.table_name_prefix + 'plugin_schema_info' + ActiveRecord::Base.table_name_suffix
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                    
         | 
| 23 | 
            +
                    def schema_migrations_table_name
         | 
| 24 | 
            +
                      ActiveRecord::Base.table_name_prefix + 'plugin_schema_migrations' + ActiveRecord::Base.table_name_suffix
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            dir = File.dirname(__FILE__)
         | 
| 2 | 
            +
            require "#{dir}/plugin_templates/action_controller"
         | 
| 3 | 
            +
            if Desert::VersionChecker.rails_version_is_below_1990?
         | 
| 4 | 
            +
              require "#{dir}/plugin_templates/1.2.0/action_mailer"
         | 
| 5 | 
            +
            elsif Desert::VersionChecker.rails_version_is_below_rc2?
         | 
| 6 | 
            +
              require "#{dir}/plugin_templates/1.99.0/action_mailer"
         | 
| 7 | 
            +
            elsif Desert::VersionChecker.rails_version_is_below_220?
         | 
| 8 | 
            +
              require "#{dir}/plugin_templates/2.0.0/action_mailer"
         | 
| 9 | 
            +
            else
         | 
| 10 | 
            +
              require "#{dir}/plugin_templates/2.2.0/action_mailer"
         | 
| 11 | 
            +
            end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            require "#{dir}/plugin_templates/action_view"
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module ActionMailer #:nodoc
         | 
| 2 | 
            +
              class Base #:nodoc:
         | 
| 3 | 
            +
                private
         | 
| 4 | 
            +
                  def template_path_with_plugin_routing
         | 
| 5 | 
            +
                    template_paths = [template_path_without_plugin_routing]
         | 
| 6 | 
            +
                    Desert::Manager.plugins.reverse.each do |plugin|
         | 
| 7 | 
            +
                      template_paths << "#{plugin.templates_path}/#{mailer_name}"
         | 
| 8 | 
            +
                    end
         | 
| 9 | 
            +
                    "{#{template_paths * ','}}"
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                  alias_method_chain :template_path, :plugin_routing
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def initialize_template_class(assigns)
         | 
| 14 | 
            +
                    view_path = File.dirname(Dir["#{template_path}/#{@template}.*"].first)
         | 
| 15 | 
            +
                    returning(template = ActionView::Base.new(view_path, assigns, self)) do
         | 
| 16 | 
            +
                      template.extend ApplicationHelper
         | 
| 17 | 
            +
                      template.extend self.class.master_helper_module
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            module ActionView
         | 
| 2 | 
            +
              class Base
         | 
| 3 | 
            +
                attr_reader :view_paths
         | 
| 4 | 
            +
                def initialize_with_desert(base_path = nil, assigns_for_first_render = {}, controller = nil)
         | 
| 5 | 
            +
                  initialize_without_desert(base_path, assigns_for_first_render, controller)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  @view_paths = [base_path]
         | 
| 8 | 
            +
                  Desert::Manager.plugins_and_app.reverse.each do |plugin|
         | 
| 9 | 
            +
                    @view_paths << plugin.templates_path
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
                alias_method_chain :initialize, :desert
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                private
         | 
| 15 | 
            +
                def full_path_template_exists?(path, extension)
         | 
| 16 | 
            +
                  file_path = "#{path}.#{extension}"
         | 
| 17 | 
            +
                  @@method_names.has_key?(file_path) || FileTest.exists?(file_path)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def find_template_extension_for(template_path)
         | 
| 21 | 
            +
                  view_paths.each do |view_path|
         | 
| 22 | 
            +
                    full_path = "#{view_path}/#{template_path}"
         | 
| 23 | 
            +
                    if match = @@template_handlers.find { |k,| full_path_template_exists?(template_path, k) }
         | 
| 24 | 
            +
                      return match.first.to_sym
         | 
| 25 | 
            +
                    elsif full_path_template_exists?(full_path, :rhtml)
         | 
| 26 | 
            +
                      return :rhtml
         | 
| 27 | 
            +
                    elsif full_path_template_exists?(full_path, :rxml)
         | 
| 28 | 
            +
                      return :rxml
         | 
| 29 | 
            +
                    elsif full_path_template_exists?(full_path, :rjs)
         | 
| 30 | 
            +
                      return :rjs
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                  raise ActionViewError, "No rhtml, rxml, rjs or delegate template found for #{template_path} in #{@base_path}"
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def full_template_path_with_plugin_routing(template_path, extension)
         | 
| 37 | 
            +
                  full_template_path = full_template_path_without_plugin_routing(template_path, extension)
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  unless File.exist?(full_template_path)
         | 
| 40 | 
            +
                    # Look through the plugins for the template
         | 
| 41 | 
            +
                    Desert::Manager.plugins.reverse.each do |plugin|
         | 
| 42 | 
            +
                      if plugin_template_path = plugin.find_template("#{template_path}.#{extension}")
         | 
| 43 | 
            +
                        full_template_path = plugin_template_path
         | 
| 44 | 
            +
                        break
         | 
| 45 | 
            +
                      end
         | 
| 46 | 
            +
                    end
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  full_template_path
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
                alias_method_chain :full_template_path, :plugin_routing
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            module ActionMailer #:nodoc
         | 
| 2 | 
            +
              class Base #:nodoc:
         | 
| 3 | 
            +
                private
         | 
| 4 | 
            +
                  def template_path_with_plugin_routing
         | 
| 5 | 
            +
                    result = nil
         | 
| 6 | 
            +
                    Desert::Manager.plugins_and_app.reverse.each do |plugin|
         | 
| 7 | 
            +
                      relative_path = "#{plugin.templates_path}/#{mailer_name}"
         | 
| 8 | 
            +
                      unless Dir["#{relative_path}/#{@template}.*"].empty?
         | 
| 9 | 
            +
                        result = relative_path
         | 
| 10 | 
            +
                        break
         | 
| 11 | 
            +
                      end
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
                    result || template_path_without_plugin_routing
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                  alias_method_chain :template_path, :plugin_routing
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  def initialize_template_class(assigns)
         | 
| 18 | 
            +
                    view_path = File.dirname(Dir["#{template_path}/#{@template}.*"].first)
         | 
| 19 | 
            +
                    returning(template = ActionView::Base.new([view_path], assigns, self)) do
         | 
| 20 | 
            +
                      template.extend ApplicationHelper
         | 
| 21 | 
            +
                      template.extend self.class.master_helper_module
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            module ActionView #:nodoc:
         | 
| 2 | 
            +
              class Base #:nodoc:
         | 
| 3 | 
            +
                def initialize_with_desert_plugins(*args)
         | 
| 4 | 
            +
                  initialize_without_desert_plugins *args
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  Desert::Manager.plugins.reverse.each do |plugin|
         | 
| 7 | 
            +
                    view_paths << plugin.templates_path
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
                alias_method_chain :initialize, :desert_plugins
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                def find_template_extension_from_handler(template_path, formatted = nil)
         | 
| 13 | 
            +
                  checked_template_path = formatted ? "#{template_path}.#{template_format}" : template_path
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  view_paths.each do |view_path|
         | 
| 16 | 
            +
                    template_handler_preferences.each do |template_type|
         | 
| 17 | 
            +
                      extensions =
         | 
| 18 | 
            +
                        case template_type
         | 
| 19 | 
            +
                        when :javascript
         | 
| 20 | 
            +
                          [:rjs]
         | 
| 21 | 
            +
                        when :delegate
         | 
| 22 | 
            +
                          @@template_handlers.keys
         | 
| 23 | 
            +
                        else
         | 
| 24 | 
            +
                          [template_type]
         | 
| 25 | 
            +
                        end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                      extensions.each do |extension|
         | 
| 28 | 
            +
                        file_path = File.join(view_path, "#{checked_template_path}.#{extension}")
         | 
| 29 | 
            +
                        if File.exist?(file_path)
         | 
| 30 | 
            +
                          return formatted ? "#{template_format}.#{extension}" : extension.to_s
         | 
| 31 | 
            +
                        end
         | 
| 32 | 
            +
                      end
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                  nil
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            module ActionMailer #:nodoc
         | 
| 2 | 
            +
              class Base #:nodoc:
         | 
| 3 | 
            +
                private
         | 
| 4 | 
            +
                  def template_path_with_plugin_routing
         | 
| 5 | 
            +
                    template_paths = [template_path_without_plugin_routing]
         | 
| 6 | 
            +
                    Desert::Manager.plugins.reverse.each do |plugin|
         | 
| 7 | 
            +
                      template_paths << "#{plugin.templates_path}/#{mailer_name}"
         | 
| 8 | 
            +
                    end
         | 
| 9 | 
            +
                    "{#{template_paths * ','}}"
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                  alias_method_chain :template_path, :plugin_routing
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def initialize_template_class(assigns)
         | 
| 14 | 
            +
                    view_paths = Dir[template_path].collect do |path|
         | 
| 15 | 
            +
                      File.dirname(path)
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                    returning(template = ActionView::Base.new(view_paths, assigns, self)) do
         | 
| 18 | 
            +
                      template.extend ApplicationHelper
         | 
| 19 | 
            +
                      template.extend self.class.master_helper_module
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,26 @@ | |
| 1 | 
            +
            module ActionView #:nodoc:
         | 
| 2 | 
            +
              class Base #:nodoc:
         | 
| 3 | 
            +
                def initialize_with_desert_plugins(*args)
         | 
| 4 | 
            +
                  initialize_without_desert_plugins *args
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  Desert::Manager.plugins.reverse.each do |plugin|
         | 
| 7 | 
            +
                    append_view_path plugin.templates_path
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
                alias_method_chain :initialize, :desert_plugins
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                def find_template_extension_from_handler(template_path, formatted = nil)
         | 
| 13 | 
            +
                  checked_template_path = formatted ? "#{template_path}.#{template_format}" : template_path
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  view_paths.each do |view_path|
         | 
| 16 | 
            +
                    self.class.template_handler_extensions.each do |extension|
         | 
| 17 | 
            +
                      file_path = File.join(view_path, "#{checked_template_path}.#{extension}")
         | 
| 18 | 
            +
                      if File.exist?(file_path)
         | 
| 19 | 
            +
                        return formatted ? "#{template_format}.#{extension}" : extension.to_s
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                  nil
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            module ActionView #:nodoc:
         | 
| 2 | 
            +
              class TemplateFinder #:nodoc:
         | 
| 3 | 
            +
                def initialize_with_desert_plugins(*args)
         | 
| 4 | 
            +
                  begin
         | 
| 5 | 
            +
                    initialize_without_desert_plugins *args
         | 
| 6 | 
            +
                  rescue ActionView::TemplateFinder::InvalidViewPath
         | 
| 7 | 
            +
                    # Desert will add the missing paths next
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
                  Desert::Manager.plugins.reverse.each do |plugin|
         | 
| 10 | 
            +
                    append_view_path plugin.templates_path
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
                alias_method_chain :initialize, :desert_plugins
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
            end
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            module ActionMailer #:nodoc
         | 
| 2 | 
            +
              class Base #:nodoc:
         | 
| 3 | 
            +
                private
         | 
| 4 | 
            +
                  def template_path_with_plugin_routing
         | 
| 5 | 
            +
                    template_paths = [template_path_without_plugin_routing]
         | 
| 6 | 
            +
                    Desert::Manager.plugins.reverse.each do |plugin|
         | 
| 7 | 
            +
                      template_paths << "#{plugin.templates_path}/#{mailer_name}"
         | 
| 8 | 
            +
                    end
         | 
| 9 | 
            +
                    "{#{template_paths * ','}}"
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                  alias_method_chain :template_path, :plugin_routing
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def initialize_template_class(assigns)
         | 
| 14 | 
            +
                    self.view_paths = Dir[template_path].collect do |path|
         | 
| 15 | 
            +
                      File.dirname(path)
         | 
| 16 | 
            +
                    end if self.view_paths.empty?
         | 
| 17 | 
            +
                    returning(template = ActionView::Base.new(view_paths, assigns, self)) do
         | 
| 18 | 
            +
                      template.extend ApplicationHelper
         | 
| 19 | 
            +
                      template.extend self.class.master_helper_module
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,10 @@ | |
| 1 | 
            +
            ActionView::Base.class_eval do
         | 
| 2 | 
            +
              def initialize_with_desert_plugins(*args)
         | 
| 3 | 
            +
                initialize_without_desert_plugins *args
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                Desert::Manager.plugins.reverse.each do |plugin|
         | 
| 6 | 
            +
                  view_paths << plugin.templates_path
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
              alias_method_chain :initialize, :desert_plugins
         | 
| 10 | 
            +
            end
         | 
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            module ActionController #:nodoc:
         | 
| 2 | 
            +
              module Layout #:nodoc:
         | 
| 3 | 
            +
                module ClassMethods #:nodoc:
         | 
| 4 | 
            +
                  private
         | 
| 5 | 
            +
                    def layout_list_with_plugin_routing
         | 
| 6 | 
            +
                      plugin_layouts = Desert::Manager.layout_paths.join(",")
         | 
| 7 | 
            +
                      layout_list_without_plugin_routing + Dir["{#{plugin_layouts}}/**/*"]
         | 
| 8 | 
            +
                    end
         | 
| 9 | 
            +
                    alias_method_chain :layout_list, :plugin_routing
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
            end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            dir = File.dirname(__FILE__)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            if ActionView.const_defined?(:TemplateFinder)
         | 
| 4 | 
            +
              require "#{dir}/2.1.0/action_view"
         | 
| 5 | 
            +
            else
         | 
| 6 | 
            +
              if ActionView::Base.private_instance_methods.include?('find_template_extension_from_handler')
         | 
| 7 | 
            +
                if ActionView::Base.instance_methods.include?('template_handler_preferences')
         | 
| 8 | 
            +
                  require "#{dir}/1.99.0/action_view"
         | 
| 9 | 
            +
                else
         | 
| 10 | 
            +
                  require "#{dir}/2.0.2/action_view"
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
              elsif ActionView.const_defined?(:PathSet)
         | 
| 13 | 
            +
                require "#{dir}/2.2.0/action_view"
         | 
| 14 | 
            +
              else
         | 
| 15 | 
            +
                require "#{dir}/1.2.0/action_view"
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
    
        data/lib/desert/rails.rb
    ADDED
    
    | @@ -0,0 +1,10 @@ | |
| 1 | 
            +
            dir = File.dirname(__FILE__)
         | 
| 2 | 
            +
            if Desert::VersionChecker.rails_version_is_below_1990?
         | 
| 3 | 
            +
              require "#{dir}/rails/1.2.0/initializer"
         | 
| 4 | 
            +
            else
         | 
| 5 | 
            +
              require "#{dir}/rails/2.0.0/plugin"
         | 
| 6 | 
            +
            end
         | 
| 7 | 
            +
            require "#{dir}/rails/dependencies"
         | 
| 8 | 
            +
            require "#{dir}/rails/migration"
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            require "#{dir}/rails/route_set"
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            module Rails
         | 
| 2 | 
            +
              class Initializer
         | 
| 3 | 
            +
                def load_plugin_with_desert(directory)
         | 
| 4 | 
            +
                  return if Desert::Manager.plugin_exists?(directory)
         | 
| 5 | 
            +
                  plugin = Desert::Manager.register_plugin(directory) do
         | 
| 6 | 
            +
                    load_plugin_without_desert(directory)
         | 
| 7 | 
            +
                  end
         | 
| 8 | 
            +
                  # TODO: Can we use Initializer::Configuration#default_load_paths to do this?
         | 
| 9 | 
            +
                  configuration.controller_paths << plugin.controllers_path
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
                alias_method_chain :load_plugin, :desert
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def require_plugin(plugin_name)
         | 
| 14 | 
            +
                  find_plugins(configuration.plugin_paths).sort.each do |path|
         | 
| 15 | 
            +
                    return load_plugin(path) if File.basename(path) == plugin_name
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                  raise "Plugin '#{plugin_name}' does not exist"
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            class Rails::Plugin
         | 
| 2 | 
            +
              attr_accessor :initializer
         | 
| 3 | 
            +
              def require_plugin(plugin_name)
         | 
| 4 | 
            +
                initializer.configuration.plugin_locators.each do |locator|
         | 
| 5 | 
            +
                  locator.new(initializer).each do |plugin_loader|
         | 
| 6 | 
            +
                    return plugin_loader.load(initializer) if plugin_loader.name.to_s == plugin_name.to_s
         | 
| 7 | 
            +
                  end
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
                raise "Plugin '#{plugin_name}' does not exist"
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def load_with_desert(initializer)
         | 
| 13 | 
            +
                @initializer = initializer
         | 
| 14 | 
            +
                return if Desert::Manager.plugin_exists?(directory)
         | 
| 15 | 
            +
                plugin = Desert::Manager.register_plugin(directory) do
         | 
| 16 | 
            +
                  load_without_desert(initializer)
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
                # TODO: Can we use Initializer::Configuration#default_load_paths to do this?
         | 
| 19 | 
            +
                initializer.configuration.controller_paths << plugin.controllers_path
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
              alias_method_chain :load, :desert
         | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,87 @@ | |
| 1 | 
            +
            dependencies = ActiveSupport.const_defined?(:Dependencies) ? ActiveSupport::Dependencies : Dependencies
         | 
| 2 | 
            +
            dependencies.module_eval do
         | 
| 3 | 
            +
              def load_missing_constant_with_desert(from_mod, const_name)
         | 
| 4 | 
            +
                from_mod = guard_against_anonymous_module(from_mod)
         | 
| 5 | 
            +
                qualified_name = qualified_name_for from_mod, const_name
         | 
| 6 | 
            +
                path_suffix = qualified_name.underscore
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                if define_constant_with_desert_loading(from_mod, const_name, qualified_name, path_suffix)
         | 
| 9 | 
            +
                  return from_mod.const_get(const_name)
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                if has_parent_module?(from_mod)
         | 
| 13 | 
            +
                  look_for_constant_in_parent_module(from_mod, const_name, qualified_name, path_suffix)
         | 
| 14 | 
            +
                else
         | 
| 15 | 
            +
                  raise NameError, "Constant #{qualified_name} from #{path_suffix}.rb not found"
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
              alias_method_chain :load_missing_constant, :desert
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              def load_once_path?(path)
         | 
| 21 | 
            +
                load_once_paths.any? { |base| File.expand_path(path).starts_with? File.expand_path(base) }
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              def depend_on_with_desert(file_name, swallow_load_errors = false)
         | 
| 25 | 
            +
                successfully_loaded_in_plugin = false
         | 
| 26 | 
            +
                Desert::Manager.files_on_load_path(file_name).each do |file|
         | 
| 27 | 
            +
                  require_or_load(file)
         | 
| 28 | 
            +
                  successfully_loaded_in_plugin = true
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
                begin
         | 
| 31 | 
            +
                  unless successfully_loaded_in_plugin
         | 
| 32 | 
            +
                    require_or_load file_name
         | 
| 33 | 
            +
                    loaded << File.expand_path(file_name)
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                rescue LoadError
         | 
| 36 | 
            +
                  if !swallow_load_errors && !successfully_loaded_in_plugin
         | 
| 37 | 
            +
                    raise
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
              alias_method_chain :depend_on, :desert
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              protected
         | 
| 44 | 
            +
              def define_constant_with_desert_loading(from_mod, const_name, qualified_name, path_suffix)
         | 
| 45 | 
            +
                define_constant_from_file(from_mod, const_name, qualified_name, path_suffix) ||
         | 
| 46 | 
            +
                  define_constant_from_directory(from_mod, const_name, qualified_name, path_suffix)
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              def has_parent_module?(mod)
         | 
| 50 | 
            +
                mod != Object
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              def look_for_constant_in_parent_module(from_mod, const_name, qualified_name, path_suffix)
         | 
| 54 | 
            +
                return from_mod.parent.const_missing(const_name)
         | 
| 55 | 
            +
              rescue NameError => e
         | 
| 56 | 
            +
                raise NameError, "Constant #{qualified_name} from #{path_suffix}.rb not found\n#{e.message}"
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
              def guard_against_anonymous_module(from_mod)
         | 
| 60 | 
            +
                return Object if from_mod.name.blank?
         | 
| 61 | 
            +
                return from_mod
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              def define_constant_from_file(from_mod, const_name, qualified_name, path_suffix)
         | 
| 65 | 
            +
                files = Desert::Manager.files_on_load_path(path_suffix)
         | 
| 66 | 
            +
                files.each do |file|
         | 
| 67 | 
            +
                  require_or_load file
         | 
| 68 | 
            +
                  loaded << file.gsub(/\.rb$/, '')
         | 
| 69 | 
            +
                  next if autoloaded_constants.include?(qualified_name)
         | 
| 70 | 
            +
                  next if load_once_path?(file)
         | 
| 71 | 
            +
                  autoloaded_constants << qualified_name
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
                loaded << File.expand_path(path_suffix)
         | 
| 74 | 
            +
                from_mod.const_defined?(const_name)
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              def define_constant_from_directory(from_mod, const_name, qualified_name, path_suffix)
         | 
| 78 | 
            +
                return false unless Desert::Manager.directory_on_load_path?(path_suffix)
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                if autoloaded_constants.include?(qualified_name)
         | 
| 81 | 
            +
                  raise "Constant #{qualified_name} is already autoloaded but is not defined as a constant"
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
                from_mod.const_set(const_name, Module.new)
         | 
| 84 | 
            +
                autoloaded_constants << qualified_name
         | 
| 85 | 
            +
                return true
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
            end
         |