Sha256: 8b9bbb78be5006b12616fe147ce128af18d86c06edf7541d2af03f61d6c5dc9c

Contents?: true

Size: 1.91 KB

Versions: 43

Compression:

Stored size: 1.91 KB

Contents

module CassandraObject
  module Migrations
    extend ActiveSupport::Concern
    extend ActiveSupport::Autoload

    included do
      class_inheritable_array :migrations
      class_inheritable_accessor :current_schema_version
      self.current_schema_version = 0
    end

    autoload :Migration
    
    class MigrationNotFoundError < StandardError
      def initialize(record_version, migrations)
        super("Cannot migrate a record from #{record_version.inspect}.  Migrations exist for #{migrations.map(&:version)}")
      end
    end
    
    module InstanceMethods
      def schema_version
        Integer(@schema_version || self.class.current_schema_version)
      end
    end
    
    module ClassMethods
      def migrate(version, &blk)
        write_inheritable_array(:migrations, [Migration.new(version, blk)])
        
        if version > self.current_schema_version 
          self.current_schema_version = version
        end
      end
      
      def instantiate(key, attributes)
        version = attributes.delete('schema_version')
        original_attributes = attributes.dup
        if version == current_schema_version
          return super(key, attributes)
        end
        
        versions_to_migrate = ((version.to_i + 1)..current_schema_version)
        
        migrations_to_run = versions_to_migrate.map do |v|
          migrations.find {|m| m.version == v}
        end
        
        if migrations_to_run.any?(&:nil?)
          raise MigrationNotFoundError.new(version, migrations)
        end
        
        migrations_to_run.inject(attributes) do |attrs, migration|
          migration.run(attrs)
          @schema_version = migration.version.to_s
          attrs
        end
        
        super(key, attributes).tap do |record|
          original_attributes.diff(attributes).keys.each do |attribute|
            record.attribute_will_change! attribute
          end
        end
      end
    end
  end
end

Version data entries

43 entries across 43 versions & 2 rubygems

Version Path
sessionm-cassandra_object-2.2.47 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.46 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.45 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.44 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.43 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.42 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.41 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.40 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.39 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.38 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.37 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.36 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.35 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.34 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.33 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.32 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.31 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.30 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.29 lib/cassandra_object/migrations.rb
sessionm-cassandra_object-2.2.28 lib/cassandra_object/migrations.rb