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
    
        data/VERSION.yml
    ADDED
    
    
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            NAME
         | 
| 2 | 
            +
                 desert_plugin - creates a directory structure and starter files for a new desert plugin
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            SYNOPSIS
         | 
| 5 | 
            +
                 desert_plugin [plugin name]
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            DESCRIPTION
         | 
| 8 | 
            +
                 |-- vendor
         | 
| 9 | 
            +
                    `-- plugins
         | 
| 10 | 
            +
                       `-- [plugin name]
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            EXAMPLE
         | 
| 13 | 
            +
                  ./script/generate desert_plugin spiffy
         | 
| 14 | 
            +
             | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            require 'rails_generator'
         | 
| 2 | 
            +
            require 'rails_generator/commands'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            class DesertPluginGenerator < Rails::Generator::NamedBase
         | 
| 5 | 
            +
              def manifest
         | 
| 6 | 
            +
                record do |m|
         | 
| 7 | 
            +
                  m.directory "vendor/plugins/#{file_name}"
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  m.directory "vendor/plugins/#{file_name}/app"
         | 
| 10 | 
            +
                  m.directory "vendor/plugins/#{file_name}/app/controllers"
         | 
| 11 | 
            +
                  m.directory "vendor/plugins/#{file_name}/app/helpers"
         | 
| 12 | 
            +
                  m.directory "vendor/plugins/#{file_name}/app/models"
         | 
| 13 | 
            +
                  m.directory "vendor/plugins/#{file_name}/app/views"
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  m.directory "vendor/plugins/#{file_name}/config"
         | 
| 16 | 
            +
                  m.template "routes.rb", "vendor/plugins/#{file_name}/config/routes.rb"
         | 
| 17 | 
            +
                  m.map_route_from_plugin
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  m.directory "vendor/plugins/#{file_name}/db"
         | 
| 20 | 
            +
                  m.directory "vendor/plugins/#{file_name}/db/migrate"
         | 
| 21 | 
            +
                  # m.template "plugin_migration.rb", "vendor/plugins/#{file_name}/db/migrate/001_init_#{file_name}_plugin.rb" 
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  m.directory "vendor/plugins/#{file_name}/lib"
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  m.directory "vendor/plugins/#{file_name}/spec"
         | 
| 26 | 
            +
                  m.directory "vendor/plugins/#{file_name}/spec/controllers"
         | 
| 27 | 
            +
                  m.directory "vendor/plugins/#{file_name}/spec/fixtures"
         | 
| 28 | 
            +
                  m.directory "vendor/plugins/#{file_name}/spec/models"
         | 
| 29 | 
            +
                  m.directory "vendor/plugins/#{file_name}/spec/views"
         | 
| 30 | 
            +
                  m.file "spec_helper.rb", "vendor/plugins/#{file_name}/spec/spec_helper.rb" 
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  m.directory "vendor/plugins/#{file_name}/tasks"
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  m.file "empty_file", "vendor/plugins/#{file_name}/init.rb"
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            module Desert #:nodoc:
         | 
| 41 | 
            +
              module Generator #:nodoc:
         | 
| 42 | 
            +
                module Commands #:nodoc:
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  module Create
         | 
| 45 | 
            +
                    def map_route_from_plugin
         | 
| 46 | 
            +
                      logger.route "adding map.routes_from_plugin(:#{file_name}) to top of routes.rb"
         | 
| 47 | 
            +
                      sentinel = 'ActionController::Routing::Routes.draw do |map|'
         | 
| 48 | 
            +
                      gsub_file('config/routes.rb', /(#{Regexp.escape(sentinel)})/mi) do |match|
         | 
| 49 | 
            +
                        "#{match}\n  map.routes_from_plugin(:#{file_name})\n"
         | 
| 50 | 
            +
                      end
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  module Destroy
         | 
| 55 | 
            +
                    def map_route_from_plugin
         | 
| 56 | 
            +
                      look_for = "\n  map.routes_from_plugin(:#{file_name})\n"
         | 
| 57 | 
            +
                      logger.route "removing map.routes_from_plugin(:#{file_name}) from routes.rb"
         | 
| 58 | 
            +
                      gsub_file 'config/routes.rb', /(#{Regexp.escape(look_for)})/mi, ''
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  module List
         | 
| 63 | 
            +
                    def map_route_from_plugin
         | 
| 64 | 
            +
                      logger.route "adding map.routes_from_plugin(:#{file_name}) to top of routes.rb"
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
            end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            Rails::Generator::Commands::Create.send   :include,  Desert::Generator::Commands::Create
         | 
| 72 | 
            +
            Rails::Generator::Commands::Destroy.send  :include,  Desert::Generator::Commands::Destroy
         | 
| 73 | 
            +
            Rails::Generator::Commands::List.send     :include,  Desert::Generator::Commands::List
         | 
| 
            File without changes
         | 
| @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            class Init<%= class_name %>Plugin < ActiveRecord::Migration
         | 
| 2 | 
            +
              def self.up
         | 
| 3 | 
            +
                create_table "<%= plural_name %>", :force => true do |t|
         | 
| 4 | 
            +
                  t.column "some_<%= file_name %>_column", :string
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
              end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def self.down
         | 
| 9 | 
            +
                drop_table :<%= plural_name %>
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
            end
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            ENV["RAILS_ENV"] = "test"
         | 
| 2 | 
            +
            require File.expand_path(File.dirname(__FILE__) + "/../../../../config/environment")
         | 
| 3 | 
            +
            require 'spec'
         | 
| 4 | 
            +
            require 'spec/rails'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            Spec::Runner.configure do |config|
         | 
| 7 | 
            +
              config.fixture_path = "#{File.dirname(__FILE__)}/../spec/fixtures"
         | 
| 8 | 
            +
            end
         | 
    
        data/init.rb
    ADDED
    
    | 
            File without changes
         | 
    
        data/lib/desert.rb
    ADDED
    
    | @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            require "active_support"
         | 
| 2 | 
            +
            require "active_record"
         | 
| 3 | 
            +
            require "action_controller"
         | 
| 4 | 
            +
            require "action_mailer"
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            dir = File.dirname(__FILE__)
         | 
| 7 | 
            +
            require "#{dir}/desert/supported_rails_versions"
         | 
| 8 | 
            +
            require "#{dir}/desert/plugin"
         | 
| 9 | 
            +
            require "#{dir}/desert/manager"
         | 
| 10 | 
            +
            require "#{dir}/desert/version_checker"
         | 
| 11 | 
            +
            require "#{dir}/desert/rails"
         | 
| 12 | 
            +
            require "#{dir}/desert/ruby"
         | 
| 13 | 
            +
            require "#{dir}/desert/plugin_migrations"
         | 
| 14 | 
            +
            require "#{dir}/desert/plugin_templates"
         | 
| @@ -0,0 +1,131 @@ | |
| 1 | 
            +
            module Desert
         | 
| 2 | 
            +
              class Manager # nodoc
         | 
| 3 | 
            +
                class << self
         | 
| 4 | 
            +
                  def instance
         | 
| 5 | 
            +
                    @instance ||= new
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
                  attr_writer :instance
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  protected
         | 
| 10 | 
            +
                  def method_missing(method_name, *args, &block)
         | 
| 11 | 
            +
                    instance.__send__(method_name, *args, &block)
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                attr_reader :loading_plugin, :plugins_in_registration
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def initialize
         | 
| 18 | 
            +
                  @plugins = []
         | 
| 19 | 
            +
                  @plugins_in_registration = []
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                def plugins
         | 
| 23 | 
            +
                  @plugins.dup
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def load_paths
         | 
| 27 | 
            +
                  paths = []
         | 
| 28 | 
            +
                  plugin_paths.each do |component_root|
         | 
| 29 | 
            +
                    paths << File.join(component_root, 'app')
         | 
| 30 | 
            +
                    paths << File.join(component_root, 'app','models')
         | 
| 31 | 
            +
                    paths << File.join(component_root, 'app','controllers')
         | 
| 32 | 
            +
                    paths << File.join(component_root, 'app','helpers')
         | 
| 33 | 
            +
                    paths << File.join(component_root, 'app','sweepers')
         | 
| 34 | 
            +
                    paths << File.join(component_root, 'lib')
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                  dependencies.load_paths.reverse_each do |path|
         | 
| 37 | 
            +
                    paths << File.expand_path(path)
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                  paths.uniq!
         | 
| 40 | 
            +
                  paths
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def register_plugin(plugin_path)
         | 
| 44 | 
            +
                  plugin = Plugin.new(plugin_path)
         | 
| 45 | 
            +
                  @plugins_in_registration << plugin
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  yield if block_given?
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  dependencies.load_paths << plugin.models_path
         | 
| 50 | 
            +
                  dependencies.load_paths << plugin.controllers_path
         | 
| 51 | 
            +
                  dependencies.load_paths << plugin.helpers_path
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  @plugins_in_registration.pop
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  if existing_plugin = find_plugin(plugin.name)
         | 
| 56 | 
            +
                    return existing_plugin
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                  @plugins << plugin
         | 
| 60 | 
            +
                  plugin
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                def find_plugin(name_or_directory)
         | 
| 64 | 
            +
                  name = File.basename(File.expand_path(name_or_directory))
         | 
| 65 | 
            +
                  plugins.find do |plugin|
         | 
| 66 | 
            +
                    plugin.name == name
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                def plugin_exists?(name_or_directory)
         | 
| 71 | 
            +
                  !find_plugin(name_or_directory).nil?
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                def plugin_path(name)
         | 
| 75 | 
            +
                  plugin = find_plugin(name)
         | 
| 76 | 
            +
                  return nil unless plugin
         | 
| 77 | 
            +
                  plugin.path
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                def files_on_load_path(file)
         | 
| 81 | 
            +
                  desert_file_exists = false
         | 
| 82 | 
            +
                  files = []
         | 
| 83 | 
            +
                  load_paths.each do |path|
         | 
| 84 | 
            +
                    full_path = File.join(path, file)
         | 
| 85 | 
            +
                    full_path << '.rb' unless File.extname(full_path) == '.rb'
         | 
| 86 | 
            +
                    files << full_path if File.exists?(full_path)
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
                  files
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                def directory_on_load_path?(dir_suffix)
         | 
| 92 | 
            +
                  Desert::Manager.load_paths.each do |path|
         | 
| 93 | 
            +
                    return true if File.directory?(File.join(path, dir_suffix))
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
                  return false
         | 
| 96 | 
            +
                end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                def layout_paths
         | 
| 99 | 
            +
                  layout_paths = plugins.reverse.collect do |plugin|
         | 
| 100 | 
            +
                    plugin.layouts_path
         | 
| 101 | 
            +
                  end
         | 
| 102 | 
            +
                  layout_paths
         | 
| 103 | 
            +
                end
         | 
| 104 | 
            +
                
         | 
| 105 | 
            +
                def require_all_files
         | 
| 106 | 
            +
                  all_files.each do |file|
         | 
| 107 | 
            +
                    require file
         | 
| 108 | 
            +
                  end
         | 
| 109 | 
            +
                end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                def all_files
         | 
| 112 | 
            +
                  Desert::Manager.load_paths.inject([]) do |all, load_path|
         | 
| 113 | 
            +
                    all |= Dir["#{load_path}/**/*.rb"]
         | 
| 114 | 
            +
                    all
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                protected
         | 
| 119 | 
            +
                def dependencies
         | 
| 120 | 
            +
                  @dependencies ||= ActiveSupport.const_defined?(:Dependencies) ? ActiveSupport::Dependencies : Dependencies
         | 
| 121 | 
            +
                end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                def plugin_paths
         | 
| 124 | 
            +
                  plugins_and_app.collect { |plugin| plugin.path }
         | 
| 125 | 
            +
                end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                def plugins_and_app
         | 
| 128 | 
            +
                  plugins + @plugins_in_registration + [Plugin.new(RAILS_ROOT)]
         | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
              end
         | 
| 131 | 
            +
            end
         | 
| @@ -0,0 +1,74 @@ | |
| 1 | 
            +
            module Desert
         | 
| 2 | 
            +
              class Plugin # nodoc
         | 
| 3 | 
            +
                attr_reader :name, :path
         | 
| 4 | 
            +
                def initialize(path)
         | 
| 5 | 
            +
                  @path = File.expand_path(path)
         | 
| 6 | 
            +
                  @name = File.basename(@path)
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def migration_path
         | 
| 10 | 
            +
                  "#{@path}/db/migrate"
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                # The path to the views for this plugin
         | 
| 14 | 
            +
                def templates_path
         | 
| 15 | 
            +
                  "#{@path}/app/views"
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def controllers_path
         | 
| 19 | 
            +
                  "#{@path}/app/controllers"
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                # TODO: Test me
         | 
| 23 | 
            +
                def models_path
         | 
| 24 | 
            +
                  "#{@path}/app/models"
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                # TODO: Test me
         | 
| 28 | 
            +
                def helpers_path
         | 
| 29 | 
            +
                  "#{@path}/app/helpers"
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                # The path to the layout for this plugin
         | 
| 33 | 
            +
                def layouts_path
         | 
| 34 | 
            +
                  "#{templates_path}/layouts"
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                # Finds a template with the specified path
         | 
| 38 | 
            +
                def find_template(template)
         | 
| 39 | 
            +
                  template_path = "#{templates_path}/#{template}"
         | 
| 40 | 
            +
                  File.exists?(template_path) ? template_path : nil
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def framework_paths
         | 
| 44 | 
            +
                  # TODO: Don't include dirs for frameworks that are not used
         | 
| 45 | 
            +
                  %w(
         | 
| 46 | 
            +
                    railties
         | 
| 47 | 
            +
                    railties/lib
         | 
| 48 | 
            +
                    actionpack/lib
         | 
| 49 | 
            +
                    activesupport/lib
         | 
| 50 | 
            +
                    activerecord/lib
         | 
| 51 | 
            +
                    actionmailer/lib
         | 
| 52 | 
            +
                    actionwebservice/lib
         | 
| 53 | 
            +
                  ).map { |dir| "#{framework_root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                def ==(other)
         | 
| 57 | 
            +
                  self.path == other.path
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                def migration
         | 
| 61 | 
            +
                  @migration ||= PluginMigrations::Migrator.new(:up, migration_path)
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                def with_current_plugin
         | 
| 65 | 
            +
                  old_plugin = PluginMigrations::Migrator.current_plugin
         | 
| 66 | 
            +
                  begin
         | 
| 67 | 
            +
                    PluginMigrations::Migrator.current_plugin = self
         | 
| 68 | 
            +
                    yield
         | 
| 69 | 
            +
                  ensure
         | 
| 70 | 
            +
                    PluginMigrations::Migrator.current_plugin = old_plugin
         | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
              end
         | 
| 74 | 
            +
            end
         | 
| @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            dir = File.dirname(__FILE__)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            dir = File.dirname(__FILE__)
         | 
| 4 | 
            +
            require "#{dir}/plugin_migrations/migrator"
         | 
| 5 | 
            +
            if ActiveRecord::ConnectionAdapters::SchemaStatements.instance_methods.include?('initialize_schema_information')
         | 
| 6 | 
            +
              require "#{dir}/plugin_migrations/1.2/migrator"
         | 
| 7 | 
            +
              require "#{dir}/plugin_migrations/1.2/extensions/schema_statements"
         | 
| 8 | 
            +
            else
         | 
| 9 | 
            +
              require "#{dir}/plugin_migrations/2.1/migrator"
         | 
| 10 | 
            +
              require "#{dir}/plugin_migrations/2.1/extensions/schema_statements"
         | 
| 11 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            ActiveRecord::ConnectionAdapters::SchemaStatements.module_eval do
         | 
| 2 | 
            +
              def initialize_schema_information_with_plugins
         | 
| 3 | 
            +
                initialize_schema_information_without_plugins
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                begin
         | 
| 6 | 
            +
                  execute "CREATE TABLE #{Desert::PluginMigrations::Migrator.schema_info_table_name} (plugin_name #{type_to_sql(:string)}, version #{type_to_sql(:integer)})"
         | 
| 7 | 
            +
                rescue ActiveRecord::StatementInvalid
         | 
| 8 | 
            +
                  # Schema has been initialized
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
              alias_method_chain :initialize_schema_information, :plugins
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              def dump_schema_information_with_plugins
         | 
| 14 | 
            +
                schema_information = []
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                dump = dump_schema_information_without_plugins
         | 
| 17 | 
            +
                schema_information << dump if dump
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                begin
         | 
| 20 | 
            +
                  plugins = ActiveRecord::Base.connection.select_all("SELECT * FROM #{Desert::PluginMigrations::Migrator.schema_info_table_name}")
         | 
| 21 | 
            +
                  plugins.each do |plugin|
         | 
| 22 | 
            +
                    if (version = plugin['version'].to_i) > 0
         | 
| 23 | 
            +
                      plugin_name = ActiveRecord::Base.quote_value(plugin['plugin_name'])
         | 
| 24 | 
            +
                      schema_information << "INSERT INTO #{Desert::PluginMigrations::Migrator.schema_info_table_name} (plugin_name, version) VALUES (#{plugin_name}, #{version})"
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                rescue ActiveRecord::StatementInvalid
         | 
| 28 | 
            +
                  # No Schema Info
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                schema_information.join(";\n")
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
              alias_method_chain :dump_schema_information, :plugins
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,33 @@ | |
| 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_info_table_name} WHERE plugin_name = '#{current_plugin.name}'")
         | 
| 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 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def set_schema_version(version)
         | 
| 17 | 
            +
                    version = down? ? version.to_i - 1 : version.to_i
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    if ActiveRecord::Base.connection.select_one("SELECT version FROM #{self.class.schema_info_table_name} WHERE plugin_name = '#{current_plugin.name}'").nil?
         | 
| 20 | 
            +
                      # We need to create the entry since it doesn't exist
         | 
| 21 | 
            +
                      ActiveRecord::Base.connection.execute("INSERT INTO #{self.class.schema_info_table_name} (version, plugin_name) VALUES (#{version},'#{current_plugin.name}')")
         | 
| 22 | 
            +
                    else
         | 
| 23 | 
            +
                      ActiveRecord::Base.connection.update("UPDATE #{self.class.schema_info_table_name} SET version = #{version} WHERE plugin_name = '#{current_plugin.name}'")
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  def migrated
         | 
| 28 | 
            +
                    current_plugin_version = self.class.current_version
         | 
| 29 | 
            +
                    (1..current_plugin_version).to_a
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            ActiveRecord::ConnectionAdapters::SchemaStatements.module_eval do
         | 
| 2 | 
            +
              def initialize_schema_migrations_table_with_plugins
         | 
| 3 | 
            +
                initialize_schema_migrations_table_without_plugins
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                begin
         | 
| 6 | 
            +
                  smt = Desert::PluginMigrations::Migrator.schema_migrations_table_name
         | 
| 7 | 
            +
                  unless ActiveRecord::Base.connection.tables.include?(smt)
         | 
| 8 | 
            +
                    execute "CREATE TABLE #{smt} (plugin_name #{type_to_sql(:string)}, version #{type_to_sql(:string)})"
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
                  old_smt = Desert::PluginMigrations::Migrator.schema_info_table_name
         | 
| 11 | 
            +
                  if ActiveRecord::Base.connection.tables.include?(old_smt)
         | 
| 12 | 
            +
                    plugins_and_versions = select_all("SELECT plugin_name, version from #{old_smt}")
         | 
| 13 | 
            +
                    plugins_and_versions.each do |plugin_data|
         | 
| 14 | 
            +
                      plugin_name, version = plugin_data["plugin_name"], plugin_data["version"]
         | 
| 15 | 
            +
                      plugin = Desert::Manager.find_plugin(plugin_name)
         | 
| 16 | 
            +
                      migration_versions = Dir["#{plugin.migration_path}/*.rb"].map do |path|
         | 
| 17 | 
            +
                        File.basename(path, ".rb")
         | 
| 18 | 
            +
                      end.select do |migration|
         | 
| 19 | 
            +
                        # Make sure versions don't start with zero, or Integer will interpret them as octal
         | 
| 20 | 
            +
                        version_from_table_stripped = version.sub(/^0*/, '')
         | 
| 21 | 
            +
                        migration_version_stripped = migration.split("_").first.sub(/^0*/, '')
         | 
| 22 | 
            +
                        Integer(migration_version_stripped) <= Integer(version_from_table_stripped)
         | 
| 23 | 
            +
                      end
         | 
| 24 | 
            +
                      migration_versions.each do |migration_version|
         | 
| 25 | 
            +
                        insert_sql = ActiveRecord::Base.send(:sanitize_sql, [
         | 
| 26 | 
            +
                          "INSERT INTO #{Desert::PluginMigrations::Migrator.schema_migrations_table_name}(plugin_name, version) VALUES(?, ?)",
         | 
| 27 | 
            +
                          plugin_name,
         | 
| 28 | 
            +
                          Integer(migration_version.split("_").first.sub(/^0*/, ''))
         | 
| 29 | 
            +
                        ])
         | 
| 30 | 
            +
                        execute insert_sql
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                rescue ActiveRecord::StatementInvalid
         | 
| 35 | 
            +
                  # Schema has been initialized
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
              alias_method_chain :initialize_schema_migrations_table, :plugins
         | 
| 39 | 
            +
            end
         |