redhillonrails_core 1.0.9.1 → 1.1.0
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/CHANGELOG +7 -0
- data/README.rdoc +31 -47
- data/lib/redhillonrails_core/active_record/base.rb +63 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/abstract_adapter.rb +75 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/column.rb +25 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/foreign_key_definition.rb +30 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/index_definition.rb +17 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/mysql_adapter.rb +78 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/mysql_column.rb +12 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/postgresql_adapter.rb +160 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/sqlite3_adapter.rb +111 -0
- data/lib/redhillonrails_core/active_record/connection_adapters/table_definition.rb +31 -0
- data/lib/redhillonrails_core/active_record/schema.rb +27 -0
- data/lib/redhillonrails_core/active_record/schema_dumper.rb +70 -0
- data/lib/redhillonrails_core.rb +20 -26
- data/redhillonrails_core.gemspec +34 -40
- data/spec/connections/mysql/connection.rb +18 -0
- data/spec/connections/mysql2/connection.rb +18 -0
- data/spec/connections/postgresql/connection.rb +15 -0
- data/spec/connections/sqlite3/connection.rb +14 -0
- data/spec/foreign_key_spec.rb +100 -0
- data/spec/index_definition_spec.rb +145 -0
- data/spec/index_spec.rb +67 -0
- data/spec/models/comment.rb +5 -0
- data/spec/models/post.rb +6 -0
- data/spec/models/user.rb +5 -0
- data/spec/schema/schema.rb +21 -0
- data/spec/schema_dumper_spec.rb +117 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/reference.rb +66 -0
- metadata +32 -57
- data/.document +0 -5
- data/.gitignore +0 -23
- data/.rvmrc +0 -1
- data/Gemfile +0 -20
- data/Gemfile.lock +0 -50
- data/Rakefile +0 -76
- data/VERSION +0 -1
- data/examples/example_helper.rb +0 -44
- data/examples/postgresql_index_parser_example.rb +0 -198
- data/lib/red_hill_consulting/core/active_record/base.rb +0 -61
- data/lib/red_hill_consulting/core/active_record/connection_adapters/abstract_adapter.rb +0 -71
- data/lib/red_hill_consulting/core/active_record/connection_adapters/column.rb +0 -21
- data/lib/red_hill_consulting/core/active_record/connection_adapters/foreign_key_definition.rb +0 -26
- data/lib/red_hill_consulting/core/active_record/connection_adapters/index_definition.rb +0 -13
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql4_adapter.rb +0 -37
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql5_adapter.rb +0 -40
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_adapter.rb +0 -103
- data/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_column.rb +0 -8
- data/lib/red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter.rb +0 -178
- data/lib/red_hill_consulting/core/active_record/connection_adapters/schema_statements.rb +0 -23
- data/lib/red_hill_consulting/core/active_record/connection_adapters/sqlite3_adapter.rb +0 -109
- data/lib/red_hill_consulting/core/active_record/connection_adapters/table_definition.rb +0 -27
- data/lib/red_hill_consulting/core/active_record/schema.rb +0 -25
- data/lib/red_hill_consulting/core/active_record/schema_dumper.rb +0 -66
- data/lib/red_hill_consulting/core/active_record.rb +0 -4
- data/lib/red_hill_consulting/core.rb +0 -4
- data/tasks/db/comments.rake +0 -9
| @@ -0,0 +1,111 @@ | |
| 1 | 
            +
            module RedhillonrailsCore
         | 
| 2 | 
            +
              module ActiveRecord
         | 
| 3 | 
            +
                module ConnectionAdapters
         | 
| 4 | 
            +
                  module Sqlite3Adapter
         | 
| 5 | 
            +
                    def self.included(base)
         | 
| 6 | 
            +
                      base.class_eval do
         | 
| 7 | 
            +
                        alias_method_chain :tables, :redhillonrails_core
         | 
| 8 | 
            +
                      end
         | 
| 9 | 
            +
                    end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    def move_table(from, to, options = {}, &block) #:nodoc:
         | 
| 12 | 
            +
                      copy_table(from, to, options, &block)
         | 
| 13 | 
            +
                      drop_table(from, options)
         | 
| 14 | 
            +
                    end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    def add_foreign_key(from_table_name, from_column_names, to_table_name, to_column_names, options = {})
         | 
| 17 | 
            +
                      initialize_sqlite3_foreign_key_table
         | 
| 18 | 
            +
                      from_column_names = Array(from_column_names)
         | 
| 19 | 
            +
                      to_column_names = Array(to_column_names)
         | 
| 20 | 
            +
                      fk_name = options[:name] || ["fk", from_table_name, *to_column_names].join("_")
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      columns = %w(name from_table_name from_column_names to_table_name to_column_names)
         | 
| 23 | 
            +
                      values = [fk_name, from_table_name, from_column_names.join(","), to_table_name, to_column_names.join(",")]
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                      quoted_values = values.map { |x| quote(x.to_s) }.join(",")
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                      # TODO: support options
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                      insert <<-SQL
         | 
| 30 | 
            +
                    INSERT INTO #{sqlite3_foreign_key_table}(#{quoted_columns(columns)})
         | 
| 31 | 
            +
                    VALUES (#{quoted_values})
         | 
| 32 | 
            +
                      SQL
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    def remove_foreign_key(table_name, foreign_key_name, options = {})
         | 
| 36 | 
            +
                      return if options[:temporary] == true
         | 
| 37 | 
            +
                      initialize_sqlite3_foreign_key_table
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                      rows_deleted = delete <<-SQL
         | 
| 40 | 
            +
                    DELETE FROM #{sqlite3_foreign_key_table}
         | 
| 41 | 
            +
                     WHERE #{quote_column_name("name")} = #{quote(foreign_key_name.to_s)}
         | 
| 42 | 
            +
                       AND #{quote_column_name("from_table_name")} = #{quote(table_name.to_s)}
         | 
| 43 | 
            +
                       SQL
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                       if rows_deleted != 1
         | 
| 46 | 
            +
                         raise ActiveRecord::ActiveRecordError, "Foreign-key '#{foreign_key_name}' on table '#{table_name}' not found"
         | 
| 47 | 
            +
                       end
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    def tables_with_redhillonrails_core(name=nil)
         | 
| 51 | 
            +
                      tables_without_redhillonrails_core.reject{ |name| name == sqlite3_foreign_key_table }
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    def foreign_keys(table_name, name = nil)
         | 
| 55 | 
            +
                      load_foreign_keys("from_table_name", table_name, name)
         | 
| 56 | 
            +
                    end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    def reverse_foreign_keys(table_name, name = nil)
         | 
| 59 | 
            +
                      load_foreign_keys("to_table_name", table_name, name)
         | 
| 60 | 
            +
                    end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                    private
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                    def quoted_columns(columns)
         | 
| 65 | 
            +
                      columns.map { |x| quote_column_name(x) }.join(",")
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                    def sqlite3_foreign_key_table
         | 
| 69 | 
            +
                      "sqlite3_foreign_keys"
         | 
| 70 | 
            +
                    end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    def initialize_sqlite3_foreign_key_table
         | 
| 73 | 
            +
                      unless sqlite3_foreign_key_table_exists?
         | 
| 74 | 
            +
                        create_table(sqlite3_foreign_key_table, :id => false) do |t|
         | 
| 75 | 
            +
                          t.string "name",              :null => false
         | 
| 76 | 
            +
                          t.string "from_table_name",   :null => false
         | 
| 77 | 
            +
                          t.string "from_column_names", :null => false
         | 
| 78 | 
            +
                          t.string "to_table_name",     :null => false
         | 
| 79 | 
            +
                          t.string "to_column_names",   :null => false
         | 
| 80 | 
            +
                        end
         | 
| 81 | 
            +
                        add_index(sqlite3_foreign_key_table, "name",            :unique => true)
         | 
| 82 | 
            +
                        add_index(sqlite3_foreign_key_table, "from_table_name", :unique => false)
         | 
| 83 | 
            +
                        add_index(sqlite3_foreign_key_table, "to_table_name",   :unique => false)
         | 
| 84 | 
            +
                      end
         | 
| 85 | 
            +
                    end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                    def sqlite3_foreign_key_table_exists?
         | 
| 88 | 
            +
                      tables_without_redhillonrails_core.detect { |name| name == sqlite3_foreign_key_table }
         | 
| 89 | 
            +
                    end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                    def load_foreign_keys(discriminating_column, table_name, name = nil)
         | 
| 92 | 
            +
                      rows = select_all(<<-SQL, name)
         | 
| 93 | 
            +
                    SELECT *
         | 
| 94 | 
            +
                      FROM #{sqlite3_foreign_key_table}
         | 
| 95 | 
            +
                     WHERE #{quote_column_name(discriminating_column)} = #{quote(table_name.to_s)}
         | 
| 96 | 
            +
                     SQL
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                     rows.map do |row|
         | 
| 99 | 
            +
                       ForeignKeyDefinition.new(
         | 
| 100 | 
            +
                         row["name"],
         | 
| 101 | 
            +
                         row["from_table_name"], row["from_column_names"].split(","),
         | 
| 102 | 
            +
                         row["to_table_name"], row["to_column_names"].split(",")
         | 
| 103 | 
            +
                       )
         | 
| 104 | 
            +
                     end
         | 
| 105 | 
            +
                    end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                  end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                end
         | 
| 110 | 
            +
              end
         | 
| 111 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            module RedhillonrailsCore
         | 
| 2 | 
            +
              module ActiveRecord
         | 
| 3 | 
            +
                module ConnectionAdapters
         | 
| 4 | 
            +
                  module TableDefinition
         | 
| 5 | 
            +
                    def self.included(base)
         | 
| 6 | 
            +
                      base.class_eval do
         | 
| 7 | 
            +
                        attr_accessor :name
         | 
| 8 | 
            +
                        alias_method_chain :initialize, :redhillonrails_core
         | 
| 9 | 
            +
                        alias_method_chain :to_sql, :redhillonrails_core
         | 
| 10 | 
            +
                      end
         | 
| 11 | 
            +
                    end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    def initialize_with_redhillonrails_core(*args)
         | 
| 14 | 
            +
                      initialize_without_redhillonrails_core(*args)
         | 
| 15 | 
            +
                      @foreign_keys = []
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    def foreign_key(column_names, references_table_name, references_column_names, options = {})
         | 
| 19 | 
            +
                      @foreign_keys << ForeignKeyDefinition.new(options[:name], nil, column_names, ::ActiveRecord::Migrator.proper_table_name(references_table_name), references_column_names, options[:on_update], options[:on_delete], options[:deferrable])
         | 
| 20 | 
            +
                      self
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    def to_sql_with_redhillonrails_core
         | 
| 24 | 
            +
                      sql = to_sql_without_redhillonrails_core
         | 
| 25 | 
            +
                      sql << ', ' << @foreign_keys * ', ' unless @foreign_keys.empty? || ::ActiveRecord::Schema.defining?
         | 
| 26 | 
            +
                      sql
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            module RedhillonrailsCore
         | 
| 2 | 
            +
              module ActiveRecord
         | 
| 3 | 
            +
                module Schema
         | 
| 4 | 
            +
                  def self.included(base)
         | 
| 5 | 
            +
                    base.extend(ClassMethods)
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  module ClassMethods
         | 
| 9 | 
            +
                    def self.extended(base)
         | 
| 10 | 
            +
                      class << base
         | 
| 11 | 
            +
                        attr_accessor :defining
         | 
| 12 | 
            +
                        alias :defining? :defining
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                        alias_method_chain :define, :redhillonrails_core
         | 
| 15 | 
            +
                      end
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    def define_with_redhillonrails_core(info={}, &block)
         | 
| 19 | 
            +
                      self.defining = true
         | 
| 20 | 
            +
                      define_without_redhillonrails_core(info, &block)
         | 
| 21 | 
            +
                    ensure
         | 
| 22 | 
            +
                      self.defining = false
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,70 @@ | |
| 1 | 
            +
            module RedhillonrailsCore
         | 
| 2 | 
            +
              module ActiveRecord
         | 
| 3 | 
            +
                module SchemaDumper
         | 
| 4 | 
            +
                  def self.included(base)
         | 
| 5 | 
            +
                    base.class_eval do
         | 
| 6 | 
            +
                      private
         | 
| 7 | 
            +
                      alias_method_chain :tables, :redhillonrails_core
         | 
| 8 | 
            +
                      alias_method_chain :indexes, :redhillonrails_core
         | 
| 9 | 
            +
                    end
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  private
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def tables_with_redhillonrails_core(stream)
         | 
| 15 | 
            +
                    @foreign_keys = StringIO.new
         | 
| 16 | 
            +
                    begin
         | 
| 17 | 
            +
                      tables_without_redhillonrails_core(stream)
         | 
| 18 | 
            +
                      @foreign_keys.rewind
         | 
| 19 | 
            +
                      stream.print @foreign_keys.read
         | 
| 20 | 
            +
                      views(stream)
         | 
| 21 | 
            +
                    ensure
         | 
| 22 | 
            +
                      @foreign_keys = nil
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  def indexes_with_redhillonrails_core(table, stream)
         | 
| 27 | 
            +
                    indexes = @connection.indexes(table)
         | 
| 28 | 
            +
                    indexes.each do |index|
         | 
| 29 | 
            +
                      unless index.columns.blank? 
         | 
| 30 | 
            +
                        stream.print "  add_index #{index.table.inspect}, #{index.columns.inspect}, :name => #{index.name.inspect}"
         | 
| 31 | 
            +
                        stream.print ", :unique => true" if index.unique
         | 
| 32 | 
            +
                        stream.print ", :kind => \"#{index.kind}\"" unless index.kind.blank?
         | 
| 33 | 
            +
                        stream.print ", :case_sensitive => false" unless index.case_sensitive?
         | 
| 34 | 
            +
                        stream.print ", :conditions => #{index.conditions.inspect}" unless index.conditions.blank?
         | 
| 35 | 
            +
                      else
         | 
| 36 | 
            +
                        stream.print "  add_index #{index.table.inspect}"
         | 
| 37 | 
            +
                        stream.print ", :name => #{index.name.inspect}"
         | 
| 38 | 
            +
                        stream.print ", :kind => \"#{index.kind}\"" unless index.kind.blank?
         | 
| 39 | 
            +
                        stream.print ", :expression => #{index.expression.inspect}"
         | 
| 40 | 
            +
                      end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                      stream.puts
         | 
| 43 | 
            +
                    end
         | 
| 44 | 
            +
                    stream.puts unless indexes.empty?
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    foreign_keys(table, @foreign_keys)
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  def foreign_keys(table, stream)
         | 
| 50 | 
            +
                    foreign_keys = @connection.foreign_keys(table)
         | 
| 51 | 
            +
                    foreign_keys.each do |foreign_key|
         | 
| 52 | 
            +
                      stream.print "  "
         | 
| 53 | 
            +
                      stream.print foreign_key.to_dump
         | 
| 54 | 
            +
                      stream.puts
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
                    stream.puts unless foreign_keys.empty?
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                  def views(stream)
         | 
| 60 | 
            +
                    views = @connection.views
         | 
| 61 | 
            +
                    views.each do |view_name|
         | 
| 62 | 
            +
                      definition = @connection.view_definition(view_name)
         | 
| 63 | 
            +
                      stream.print "  create_view #{view_name.inspect}, #{definition.inspect}"
         | 
| 64 | 
            +
                      stream.puts
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
                    stream.puts unless views.empty?
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
              end
         | 
| 70 | 
            +
            end
         | 
    
        data/lib/redhillonrails_core.rb
    CHANGED
    
    | @@ -6,32 +6,26 @@ rescue | |
| 6 6 | 
             
            end
         | 
| 7 7 |  | 
| 8 8 | 
             
            # TODO: only needed adapters should be required here
         | 
| 9 | 
            -
            require ' | 
| 10 | 
            -
            require ' | 
| 11 | 
            -
            require ' | 
| 12 | 
            -
            require ' | 
| 13 | 
            -
            require ' | 
| 14 | 
            -
            require ' | 
| 15 | 
            -
            require ' | 
| 16 | 
            -
            require ' | 
| 17 | 
            -
            require ' | 
| 18 | 
            -
            require 'red_hill_consulting/core/active_record/connection_adapters/mysql_column'
         | 
| 19 | 
            -
            require 'red_hill_consulting/core/active_record/connection_adapters/schema_statements'
         | 
| 20 | 
            -
            require 'red_hill_consulting/core/active_record/connection_adapters/table_definition'
         | 
| 9 | 
            +
            require 'redhillonrails_core/active_record/base'
         | 
| 10 | 
            +
            require 'redhillonrails_core/active_record/schema'
         | 
| 11 | 
            +
            require 'redhillonrails_core/active_record/schema_dumper'
         | 
| 12 | 
            +
            require 'redhillonrails_core/active_record/connection_adapters/abstract_adapter'
         | 
| 13 | 
            +
            require 'redhillonrails_core/active_record/connection_adapters/foreign_key_definition'
         | 
| 14 | 
            +
            require 'redhillonrails_core/active_record/connection_adapters/column'
         | 
| 15 | 
            +
            require 'redhillonrails_core/active_record/connection_adapters/index_definition'
         | 
| 16 | 
            +
            require 'redhillonrails_core/active_record/connection_adapters/mysql_column'
         | 
| 17 | 
            +
            require 'redhillonrails_core/active_record/connection_adapters/table_definition'
         | 
| 21 18 |  | 
| 22 | 
            -
            module  | 
| 23 | 
            -
              autoload :MysqlAdapter, ' | 
| 24 | 
            -
              autoload : | 
| 25 | 
            -
              autoload : | 
| 26 | 
            -
              autoload :PostgresqlAdapter, 'red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter'
         | 
| 27 | 
            -
              autoload :Sqlite3Adapter, 'red_hill_consulting/core/active_record/connection_adapters/sqlite3_adapter'
         | 
| 19 | 
            +
            module RedhillonrailsCore::ActiveRecord::ConnectionAdapters
         | 
| 20 | 
            +
              autoload :MysqlAdapter, 'redhillonrails_core/active_record/connection_adapters/mysql_adapter'
         | 
| 21 | 
            +
              autoload :PostgresqlAdapter, 'redhillonrails_core/active_record/connection_adapters/postgresql_adapter'
         | 
| 22 | 
            +
              autoload :Sqlite3Adapter, 'redhillonrails_core/active_record/connection_adapters/sqlite3_adapter'
         | 
| 28 23 | 
             
            end
         | 
| 29 24 |  | 
| 30 | 
            -
            ActiveRecord::Base.send(:include,  | 
| 31 | 
            -
            ActiveRecord::Schema.send(:include,  | 
| 32 | 
            -
            ActiveRecord::SchemaDumper.send(:include,  | 
| 33 | 
            -
            ActiveRecord::ConnectionAdapters::IndexDefinition.send(:include,  | 
| 34 | 
            -
            ActiveRecord::ConnectionAdapters::TableDefinition.send(:include,  | 
| 35 | 
            -
            ActiveRecord::ConnectionAdapters::Column.send(:include,  | 
| 36 | 
            -
            ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:include,  | 
| 37 | 
            -
            ActiveRecord::ConnectionAdapters::SchemaStatements.send(:include, RedHillConsulting::Core::ActiveRecord::ConnectionAdapters::SchemaStatements)
         | 
| 25 | 
            +
            ActiveRecord::Base.send(:include, RedhillonrailsCore::ActiveRecord::Base)
         | 
| 26 | 
            +
            ActiveRecord::Schema.send(:include, RedhillonrailsCore::ActiveRecord::Schema)
         | 
| 27 | 
            +
            ActiveRecord::SchemaDumper.send(:include, RedhillonrailsCore::ActiveRecord::SchemaDumper)
         | 
| 28 | 
            +
            ActiveRecord::ConnectionAdapters::IndexDefinition.send(:include, RedhillonrailsCore::ActiveRecord::ConnectionAdapters::IndexDefinition)
         | 
| 29 | 
            +
            ActiveRecord::ConnectionAdapters::TableDefinition.send(:include, RedhillonrailsCore::ActiveRecord::ConnectionAdapters::TableDefinition)
         | 
| 30 | 
            +
            ActiveRecord::ConnectionAdapters::Column.send(:include, RedhillonrailsCore::ActiveRecord::ConnectionAdapters::Column)
         | 
| 31 | 
            +
            ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:include, RedhillonrailsCore::ActiveRecord::ConnectionAdapters::AbstractAdapter)
         | 
    
        data/redhillonrails_core.gemspec
    CHANGED
    
    | @@ -5,75 +5,69 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = %q{redhillonrails_core}
         | 
| 8 | 
            -
              s.version = "1.0 | 
| 8 | 
            +
              s.version = "1.1.0"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["Micha\305\202 \305\201omnicki"]
         | 
| 12 | 
            -
              s.date = %q{ | 
| 13 | 
            -
              s.description = %q{ | 
| 12 | 
            +
              s.date = %q{2011-01-09}
         | 
| 13 | 
            +
              s.description = %q{Adds support in ActiveRecord for foreign_keys, complex indexes and other database-related stuff. Easily create foreign_keys, complex indexes and views.}
         | 
| 14 14 | 
             
              s.email = %q{michal.lomnicki@gmail.com}
         | 
| 15 15 | 
             
              s.extra_rdoc_files = [
         | 
| 16 16 | 
             
                "README.rdoc"
         | 
| 17 17 | 
             
              ]
         | 
| 18 18 | 
             
              s.files = [
         | 
| 19 | 
            -
                " | 
| 20 | 
            -
                 ".gitignore",
         | 
| 21 | 
            -
                 ".rvmrc",
         | 
| 22 | 
            -
                 "CHANGELOG",
         | 
| 23 | 
            -
                 "Gemfile",
         | 
| 24 | 
            -
                 "Gemfile.lock",
         | 
| 19 | 
            +
                "CHANGELOG",
         | 
| 25 20 | 
             
                 "MIT-LICENSE",
         | 
| 26 21 | 
             
                 "README.rdoc",
         | 
| 27 | 
            -
                 "Rakefile",
         | 
| 28 | 
            -
                 "VERSION",
         | 
| 29 | 
            -
                 "examples/example_helper.rb",
         | 
| 30 | 
            -
                 "examples/postgresql_index_parser_example.rb",
         | 
| 31 22 | 
             
                 "init.rb",
         | 
| 32 | 
            -
                 "lib/red_hill_consulting/core.rb",
         | 
| 33 | 
            -
                 "lib/red_hill_consulting/core/active_record.rb",
         | 
| 34 | 
            -
                 "lib/red_hill_consulting/core/active_record/base.rb",
         | 
| 35 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/abstract_adapter.rb",
         | 
| 36 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/column.rb",
         | 
| 37 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/foreign_key_definition.rb",
         | 
| 38 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/index_definition.rb",
         | 
| 39 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/mysql4_adapter.rb",
         | 
| 40 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/mysql5_adapter.rb",
         | 
| 41 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/mysql_adapter.rb",
         | 
| 42 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/mysql_column.rb",
         | 
| 43 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter.rb",
         | 
| 44 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/schema_statements.rb",
         | 
| 45 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/sqlite3_adapter.rb",
         | 
| 46 | 
            -
                 "lib/red_hill_consulting/core/active_record/connection_adapters/table_definition.rb",
         | 
| 47 | 
            -
                 "lib/red_hill_consulting/core/active_record/schema.rb",
         | 
| 48 | 
            -
                 "lib/red_hill_consulting/core/active_record/schema_dumper.rb",
         | 
| 49 23 | 
             
                 "lib/redhillonrails_core.rb",
         | 
| 50 | 
            -
                 "redhillonrails_core. | 
| 51 | 
            -
                 " | 
| 24 | 
            +
                 "lib/redhillonrails_core/active_record/base.rb",
         | 
| 25 | 
            +
                 "lib/redhillonrails_core/active_record/connection_adapters/abstract_adapter.rb",
         | 
| 26 | 
            +
                 "lib/redhillonrails_core/active_record/connection_adapters/column.rb",
         | 
| 27 | 
            +
                 "lib/redhillonrails_core/active_record/connection_adapters/foreign_key_definition.rb",
         | 
| 28 | 
            +
                 "lib/redhillonrails_core/active_record/connection_adapters/index_definition.rb",
         | 
| 29 | 
            +
                 "lib/redhillonrails_core/active_record/connection_adapters/mysql_adapter.rb",
         | 
| 30 | 
            +
                 "lib/redhillonrails_core/active_record/connection_adapters/mysql_column.rb",
         | 
| 31 | 
            +
                 "lib/redhillonrails_core/active_record/connection_adapters/postgresql_adapter.rb",
         | 
| 32 | 
            +
                 "lib/redhillonrails_core/active_record/connection_adapters/sqlite3_adapter.rb",
         | 
| 33 | 
            +
                 "lib/redhillonrails_core/active_record/connection_adapters/table_definition.rb",
         | 
| 34 | 
            +
                 "lib/redhillonrails_core/active_record/schema.rb",
         | 
| 35 | 
            +
                 "lib/redhillonrails_core/active_record/schema_dumper.rb",
         | 
| 36 | 
            +
                 "redhillonrails_core.gemspec"
         | 
| 52 37 | 
             
              ]
         | 
| 53 38 | 
             
              s.homepage = %q{http://github.com/mlomnicki/redhillonrails_core}
         | 
| 54 39 | 
             
              s.rdoc_options = ["--charset=UTF-8"]
         | 
| 55 40 | 
             
              s.require_paths = ["lib"]
         | 
| 56 | 
            -
              s.rubygems_version = %q{1.3. | 
| 57 | 
            -
              s.summary = %q{ | 
| 41 | 
            +
              s.rubygems_version = %q{1.3.6}
         | 
| 42 | 
            +
              s.summary = %q{Adds support in ActiveRecord for foreign_keys, complex indexes and other database-related stuff}
         | 
| 58 43 | 
             
              s.test_files = [
         | 
| 59 | 
            -
                " | 
| 60 | 
            -
                 " | 
| 44 | 
            +
                "spec/schema/schema.rb",
         | 
| 45 | 
            +
                 "spec/foreign_key_spec.rb",
         | 
| 46 | 
            +
                 "spec/schema_dumper_spec.rb",
         | 
| 47 | 
            +
                 "spec/connections/mysql2/connection.rb",
         | 
| 48 | 
            +
                 "spec/connections/postgresql/connection.rb",
         | 
| 49 | 
            +
                 "spec/connections/sqlite3/connection.rb",
         | 
| 50 | 
            +
                 "spec/connections/mysql/connection.rb",
         | 
| 51 | 
            +
                 "spec/support/reference.rb",
         | 
| 52 | 
            +
                 "spec/index_definition_spec.rb",
         | 
| 53 | 
            +
                 "spec/spec_helper.rb",
         | 
| 54 | 
            +
                 "spec/index_spec.rb",
         | 
| 55 | 
            +
                 "spec/models/user.rb",
         | 
| 56 | 
            +
                 "spec/models/post.rb",
         | 
| 57 | 
            +
                 "spec/models/comment.rb"
         | 
| 61 58 | 
             
              ]
         | 
| 62 59 |  | 
| 63 60 | 
             
              if s.respond_to? :specification_version then
         | 
| 64 61 | 
             
                current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
         | 
| 65 62 | 
             
                s.specification_version = 3
         | 
| 66 63 |  | 
| 67 | 
            -
                if Gem::Version.new(Gem:: | 
| 64 | 
            +
                if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
         | 
| 68 65 | 
             
                  s.add_runtime_dependency(%q<activerecord>, [">= 0"])
         | 
| 69 | 
            -
                  s.add_development_dependency(%q<micronaut>, [">= 0"])
         | 
| 70 66 | 
             
                else
         | 
| 71 67 | 
             
                  s.add_dependency(%q<activerecord>, [">= 0"])
         | 
| 72 | 
            -
                  s.add_dependency(%q<micronaut>, [">= 0"])
         | 
| 73 68 | 
             
                end
         | 
| 74 69 | 
             
              else
         | 
| 75 70 | 
             
                s.add_dependency(%q<activerecord>, [">= 0"])
         | 
| 76 | 
            -
                s.add_dependency(%q<micronaut>, [">= 0"])
         | 
| 77 71 | 
             
              end
         | 
| 78 72 | 
             
            end
         | 
| 79 73 |  | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            print "Using MySQL\n"
         | 
| 2 | 
            +
            require 'logger'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            ActiveRecord::Base.logger = Logger.new("debug.log")
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            ActiveRecord::Base.configurations = {
         | 
| 7 | 
            +
              'redhillonrails' => {
         | 
| 8 | 
            +
                :adapter => 'mysql',
         | 
| 9 | 
            +
                :database => 'redhillonrails_core_test',
         | 
| 10 | 
            +
                :username => 'redhillonrails',
         | 
| 11 | 
            +
                :encoding => 'utf8',
         | 
| 12 | 
            +
                :socket => '/var/run/mysqld/mysqld.sock',
         | 
| 13 | 
            +
                :min_messages => 'warning'
         | 
| 14 | 
            +
              }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            }
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            ActiveRecord::Base.establish_connection 'redhillonrails'
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            print "Using MySQL2\n"
         | 
| 2 | 
            +
            require 'logger'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            ActiveRecord::Base.logger = Logger.new("debug.log")
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            ActiveRecord::Base.configurations = {
         | 
| 7 | 
            +
              'redhillonrails' => {
         | 
| 8 | 
            +
                :adapter => 'mysql2',
         | 
| 9 | 
            +
                :database => 'redhillonrails_core_test',
         | 
| 10 | 
            +
                :username => 'redhillonrails',
         | 
| 11 | 
            +
                :encoding => 'utf8',
         | 
| 12 | 
            +
                :socket => '/var/run/mysqld/mysqld.sock',
         | 
| 13 | 
            +
                :min_messages => 'warning'
         | 
| 14 | 
            +
              }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            }
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            ActiveRecord::Base.establish_connection 'redhillonrails'
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            print "Using PostgreSQL\n"
         | 
| 2 | 
            +
            require 'logger'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            ActiveRecord::Base.logger = Logger.new("debug.log")
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            ActiveRecord::Base.configurations = {
         | 
| 7 | 
            +
              'redhillonrails' => {
         | 
| 8 | 
            +
                :adapter => 'postgresql',
         | 
| 9 | 
            +
                :database => 'redhillonrails_core_test',
         | 
| 10 | 
            +
                :min_messages => 'warning'
         | 
| 11 | 
            +
              }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            ActiveRecord::Base.establish_connection 'redhillonrails'
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            print "Using SQLite3\n"
         | 
| 2 | 
            +
            require 'logger'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            ActiveRecord::Base.logger = Logger.new("debug.log")
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            ActiveRecord::Base.configurations = {
         | 
| 7 | 
            +
              'redhillonrails' => {
         | 
| 8 | 
            +
                :adapter => 'sqlite3',
         | 
| 9 | 
            +
                :database => File.expand_path(File.dirname(__FILE__) + 'redhillonrails_core.db')
         | 
| 10 | 
            +
              }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            }
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            ActiveRecord::Base.establish_connection 'redhillonrails'
         | 
| @@ -0,0 +1,100 @@ | |
| 1 | 
            +
            require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'models/user'
         | 
| 4 | 
            +
            require 'models/post'
         | 
| 5 | 
            +
            require 'models/comment'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            describe "Foreign Key" do
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              let(:migration) { ::ActiveRecord::Migration }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              context "when is added", "posts(author_id)" do
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                before(:each) do 
         | 
| 14 | 
            +
                  add_foreign_key(:posts, :author_id, :users, :id, :on_update => :cascade, :on_delete => :restrict)
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                after(:each) do
         | 
| 18 | 
            +
                  fk = Post.foreign_keys.detect { |fk| fk.column_names == %w[author_id] }
         | 
| 19 | 
            +
                  remove_foreign_key(:posts, fk.name)
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                it "references users(id)" do
         | 
| 23 | 
            +
                  Post.should reference(:users, :id).on(:author_id)
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                it "cascades on update" do
         | 
| 27 | 
            +
                  Post.should reference(:users).on_update(:cascade)
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                it "restricts on delete" do
         | 
| 31 | 
            +
                  Post.should reference(:users).on_delete(:restrict)
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                it "is available in Post.foreign_keys" do
         | 
| 35 | 
            +
                  Post.foreign_keys.collect(&:column_names).should include(%w[author_id])
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                it "is available in User.reverse_foreign_keys" do
         | 
| 39 | 
            +
                  User.reverse_foreign_keys.collect(&:column_names).should include(%w[author_id])
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              context "when is dropped", "comments(post_id)" do
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                let(:foreign_key_name) { Comment.foreign_keys.detect { |definition| definition.column_names == %w[post_id] }.name }
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                before(:each) do
         | 
| 49 | 
            +
                  remove_foreign_key(:comments, foreign_key_name)
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                after(:each) do
         | 
| 53 | 
            +
                  add_foreign_key(:comments, :post_id, :posts, :id)
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                it "doesn't reference posts(id)" do
         | 
| 57 | 
            +
                  Comment.should_not reference(:posts).on(:post_id)
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                it "is no longer available in Post.foreign_keys" do
         | 
| 61 | 
            +
                  Comment.foreign_keys.collect(&:column_names).should_not include(%w[post_id])
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
                
         | 
| 64 | 
            +
                it "is no longer available in User.reverse_foreign_keys" do
         | 
| 65 | 
            +
                  Post.reverse_foreign_keys.collect(&:column_names).should_not include(%w[post_id])
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
              context "when referencing column and column is removed" do
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                let(:foreign_key_name) { Comment.foreign_keys.detect { |definition| definition.column_names == %w[post_id] }.name }
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                it "should remove foreign keys" do
         | 
| 75 | 
            +
                  remove_foreign_key(:comments, foreign_key_name)
         | 
| 76 | 
            +
                  Post.reverse_foreign_keys.collect { |fk| fk.column_names == %w[post_id] && fk.table_name == "comments" }.should be_empty
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              protected
         | 
| 82 | 
            +
              def add_foreign_key(*args)
         | 
| 83 | 
            +
                migration.suppress_messages do
         | 
| 84 | 
            +
                  migration.add_foreign_key(*args)
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
                User.reset_column_information
         | 
| 87 | 
            +
                Post.reset_column_information
         | 
| 88 | 
            +
                Comment.reset_column_information
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
              def remove_foreign_key(*args)
         | 
| 92 | 
            +
                migration.suppress_messages do
         | 
| 93 | 
            +
                  migration.remove_foreign_key(*args)
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
                User.reset_column_information
         | 
| 96 | 
            +
                Post.reset_column_information
         | 
| 97 | 
            +
                Comment.reset_column_information
         | 
| 98 | 
            +
              end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
            end
         |