cassandra_migrations 0.0.9 → 0.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.
- checksums.yaml +4 -4
- data/lib/cassandra_migrations/cassandra/keyspace_operations.rb +11 -9
- data/lib/cassandra_migrations/cassandra.rb +7 -1
- data/lib/cassandra_migrations/config.rb +17 -8
- data/lib/cassandra_migrations/migration/table_definition.rb +42 -1
- data/lib/cassandra_migrations/migration/table_operations.rb +10 -0
- data/lib/cassandra_migrations/migration.rb +1 -0
- data/lib/cassandra_migrations/railtie/tasks.rake +2 -2
- metadata +9 -9
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 937a04d1bf915cd899134c271aa645421259fb3b
         | 
| 4 | 
            +
              data.tar.gz: c0916a9b1fb7be0b142ad0515a3fca628953fe9c
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 557970e72c79f1b37035948c3f4990b99afd4a92c0e794d9251a252b9143a7f7a67be3767ef5fdbc4f204a990427d294d2eb351330561eae85935c445a8a571c
         | 
| 7 | 
            +
              data.tar.gz: 38be1b8793e029e2d912699421c572906f60ceca0939b69951b4553e4b2f34fa5a0f51d9d570cfe95bf333add26447cb798afd1bab58c1f27f7730a4c04557dd
         | 
| @@ -4,27 +4,29 @@ module CassandraMigrations | |
| 4 4 | 
             
              module Cassandra
         | 
| 5 5 | 
             
                module KeyspaceOperations
         | 
| 6 6 |  | 
| 7 | 
            -
                  def create_keyspace!
         | 
| 7 | 
            +
                  def create_keyspace!(env)
         | 
| 8 | 
            +
                    config = Config.configurations[env]
         | 
| 8 9 | 
             
                    begin
         | 
| 9 10 | 
             
                      execute(
         | 
| 10 | 
            -
                        "CREATE KEYSPACE #{ | 
| 11 | 
            +
                        "CREATE KEYSPACE #{config.keyspace} \
         | 
| 11 12 | 
             
                         WITH replication = { \ 
         | 
| 12 | 
            -
                           'class':'#{ | 
| 13 | 
            -
                           'replication_factor': #{ | 
| 13 | 
            +
                           'class':'#{config.replication['class']}', \
         | 
| 14 | 
            +
                           'replication_factor': #{config.replication['replication_factor']} \
         | 
| 14 15 | 
             
                         }"
         | 
| 15 16 | 
             
                      )
         | 
| 16 | 
            -
                      use( | 
| 17 | 
            +
                      use(config.keyspace)
         | 
| 17 18 | 
             
                    rescue Exception => exception
         | 
| 18 | 
            -
                      drop_keyspace!
         | 
| 19 | 
            +
                      drop_keyspace!(env)
         | 
| 19 20 | 
             
                      raise exception
         | 
| 20 21 | 
             
                    end
         | 
| 21 22 | 
             
                  end
         | 
| 22 23 |  | 
| 23 | 
            -
                  def drop_keyspace!
         | 
| 24 | 
            +
                  def drop_keyspace!(env)
         | 
| 25 | 
            +
                    config = Config.configurations[env]
         | 
| 24 26 | 
             
                    begin
         | 
| 25 | 
            -
                      execute("DROP KEYSPACE #{ | 
| 27 | 
            +
                      execute("DROP KEYSPACE #{config.keyspace}")
         | 
| 26 28 | 
             
                    rescue Cql::QueryError
         | 
| 27 | 
            -
                      raise Errors::UnexistingKeyspaceError,  | 
| 29 | 
            +
                      raise Errors::UnexistingKeyspaceError, config.keyspace
         | 
| 28 30 | 
             
                    end
         | 
| 29 31 | 
             
                  end
         | 
| 30 32 |  | 
| @@ -38,7 +38,13 @@ module CassandraMigrations | |
| 38 38 | 
             
                  client.close if client.connected?
         | 
| 39 39 | 
             
                  self.client = nil
         | 
| 40 40 | 
             
                end
         | 
| 41 | 
            -
             | 
| 41 | 
            +
             | 
| 42 | 
            +
                def self.using_keyspace(keyspace, &block)
         | 
| 43 | 
            +
                  use(keyspace)
         | 
| 44 | 
            +
                  block.call
         | 
| 45 | 
            +
                  use(Config.keyspace)
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 42 48 | 
             
                def self.use(keyspace)
         | 
| 43 49 | 
             
                  connect_to_server unless client
         | 
| 44 50 |  | 
| @@ -2,23 +2,32 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module CassandraMigrations
         | 
| 4 4 | 
             
              module Config
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                 | 
| 7 | 
            -
             | 
| 5 | 
            +
             | 
| 6 | 
            +
                FIELDS = %w(host port keyspace replication)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                Configuration = Struct.new(*FIELDS.map(&:to_sym))
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                mattr_writer :configurations
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def self.configurations
         | 
| 13 | 
            +
                  @configurations || load_config
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 8 16 | 
             
                def self.method_missing(method_sym, *arguments, &block)
         | 
| 9 | 
            -
                  load_config unless  | 
| 10 | 
            -
                   | 
| 17 | 
            +
                  load_config unless configurations
         | 
| 18 | 
            +
                  self.configurations[Rails.env].send(method_sym)
         | 
| 11 19 | 
             
                end
         | 
| 12 20 |  | 
| 13 21 | 
             
              private
         | 
| 14 22 |  | 
| 15 23 | 
             
                def self.load_config
         | 
| 16 24 | 
             
                  begin
         | 
| 17 | 
            -
                     | 
| 18 | 
            -
             | 
| 19 | 
            -
                    if  | 
| 25 | 
            +
                    configs = YAML.load(ERB.new(File.new(Rails.root.join("config", "cassandra.yml")).read).result)
         | 
| 26 | 
            +
                    configurations = Hash[configs.map {|env, config| [env, Configuration.new(*(FIELDS.map {|k| config[k]}))]}]
         | 
| 27 | 
            +
                    if configurations[Rails.env].nil?
         | 
| 20 28 | 
             
                      raise Errors::MissingConfigurationError, "No configuration for #{Rails.env} environment! Complete your config/cassandra.yml."
         | 
| 21 29 | 
             
                    end
         | 
| 30 | 
            +
                    configurations
         | 
| 22 31 | 
             
                  rescue Errno::ENOENT
         | 
| 23 32 | 
             
                    raise Errors::MissingConfigurationError
         | 
| 24 33 | 
             
                  end
         | 
| @@ -76,6 +76,14 @@ module CassandraMigrations | |
| 76 76 | 
             
                      raise Errors::MigrationDefinitionError, 'No columns defined for table.'
         | 
| 77 77 | 
             
                    end
         | 
| 78 78 |  | 
| 79 | 
            +
                    if (@columns_name_type_hash.values.include? :counter)
         | 
| 80 | 
            +
                      non_key_columns = @columns_name_type_hash.keys - @primary_keys
         | 
| 81 | 
            +
                      counter_columns = [@columns_name_type_hash.select { |name, type| type == :counter }.first[0]]
         | 
| 82 | 
            +
                      if (non_key_columns - counter_columns).present?
         | 
| 83 | 
            +
                        raise Errors::MigrationDefinitionError, 'Non key fields not allowed in tables with counter'
         | 
| 84 | 
            +
                      end
         | 
| 85 | 
            +
                    end
         | 
| 86 | 
            +
             | 
| 79 87 | 
             
                    key_info = (@primary_keys - @partition_keys)
         | 
| 80 88 | 
             
                    key_info = ["(#{@partition_keys.join(', ')})", *key_info] if @partition_keys.any?
         | 
| 81 89 |  | 
| @@ -102,6 +110,10 @@ module CassandraMigrations | |
| 102 110 | 
             
                    cql
         | 
| 103 111 | 
             
                  end
         | 
| 104 112 |  | 
| 113 | 
            +
                  def options
         | 
| 114 | 
            +
                    @options ? " WITH %s" % (@options.map {|option| build_option(option)}.join(" AND ")) : ''
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
             | 
| 105 117 | 
             
                  def boolean(column_name, options={})
         | 
| 106 118 | 
             
                    @columns_name_type_hash[column_name.to_sym] = column_type_for(:boolean, options)
         | 
| 107 119 | 
             
                    define_primary_keys(column_name) if options[:primary_key]
         | 
| @@ -168,6 +180,13 @@ module CassandraMigrations | |
| 168 180 | 
             
                    define_primary_keys(column_name) if options[:primary_key]
         | 
| 169 181 | 
             
                  end
         | 
| 170 182 |  | 
| 183 | 
            +
                  def counter(column_name, options={})
         | 
| 184 | 
            +
                    @columns_name_type_hash[column_name.to_sym] = column_type_for(:counter, options)
         | 
| 185 | 
            +
                    if options[:primary_key]
         | 
| 186 | 
            +
                      raise Errors::MigrationDefinitionError, 'Counter columns cannot be primary keys'
         | 
| 187 | 
            +
                    end
         | 
| 188 | 
            +
                  end
         | 
| 189 | 
            +
             | 
| 171 190 | 
             
                  def list(column_name, options={})
         | 
| 172 191 | 
             
                    type = options[:type]
         | 
| 173 192 | 
             
                    if type.nil?
         | 
| @@ -226,11 +245,15 @@ module CassandraMigrations | |
| 226 245 | 
             
                    @partition_keys = keys.flatten
         | 
| 227 246 | 
             
                  end
         | 
| 228 247 |  | 
| 248 | 
            +
                  def define_options(hash)
         | 
| 249 | 
            +
                    @options = hash
         | 
| 250 | 
            +
                  end
         | 
| 251 | 
            +
             | 
| 229 252 | 
             
                  private
         | 
| 230 253 |  | 
| 231 254 | 
             
                  PASSTHROUGH_TYPES = [:text, :ascii, :decimal, :double, :boolean,
         | 
| 232 255 | 
             
                                       :uuid, :timeuuid, :inet, :timestamp, :list,
         | 
| 233 | 
            -
                                       :map, :set]
         | 
| 256 | 
            +
                                       :map, :set, :counter]
         | 
| 234 257 | 
             
                  TYPES_MAP = { string: :varchar,
         | 
| 235 258 | 
             
                                datetime: :timestamp,
         | 
| 236 259 | 
             
                                binary: :blob }
         | 
| @@ -240,6 +263,11 @@ module CassandraMigrations | |
| 240 263 | 
             
                                    float: { 4 => :float, 8 => :double, nil => :float }
         | 
| 241 264 | 
             
                                  }
         | 
| 242 265 |  | 
| 266 | 
            +
                  SPECIAL_OPTIONS_MAP = {
         | 
| 267 | 
            +
                                  compact_storage: 'COMPACT STORAGE',
         | 
| 268 | 
            +
                                  clustering_order: 'CLUSTERING ORDER'
         | 
| 269 | 
            +
                                }
         | 
| 270 | 
            +
             | 
| 243 271 | 
             
                  def column_type_for(type, options={})
         | 
| 244 272 | 
             
                    cql_type = type if PASSTHROUGH_TYPES.include?(type)
         | 
| 245 273 | 
             
                    cql_type ||= TYPES_MAP[type]
         | 
| @@ -253,6 +281,19 @@ module CassandraMigrations | |
| 253 281 | 
             
                    cql_type
         | 
| 254 282 | 
             
                  end
         | 
| 255 283 |  | 
| 284 | 
            +
                  def build_option(option)
         | 
| 285 | 
            +
                    name, value = option
         | 
| 286 | 
            +
                    cql_name = SPECIAL_OPTIONS_MAP.fetch(name, name.to_s)
         | 
| 287 | 
            +
                    case name
         | 
| 288 | 
            +
                      when :clustering_order
         | 
| 289 | 
            +
                        "#{cql_name} BY (#{value})"
         | 
| 290 | 
            +
                      when :compact_storage
         | 
| 291 | 
            +
                        cql_name
         | 
| 292 | 
            +
                      else
         | 
| 293 | 
            +
                        "#{cql_name} = #{value}"
         | 
| 294 | 
            +
                    end
         | 
| 295 | 
            +
                  end
         | 
| 296 | 
            +
             | 
| 256 297 | 
             
                end
         | 
| 257 298 | 
             
              end
         | 
| 258 299 | 
             
            end
         | 
| @@ -20,6 +20,7 @@ module CassandraMigrations | |
| 20 20 | 
             
                    table_definition = TableDefinition.new
         | 
| 21 21 | 
             
                    table_definition.define_primary_keys(options[:primary_keys]) if options[:primary_keys]
         | 
| 22 22 | 
             
                    table_definition.define_partition_keys(options[:partition_keys]) if options[:partition_keys]
         | 
| 23 | 
            +
                    table_definition.define_options(options[:options]) if options[:options]
         | 
| 23 24 |  | 
| 24 25 | 
             
                    yield table_definition if block_given?
         | 
| 25 26 |  | 
| @@ -28,6 +29,7 @@ module CassandraMigrations | |
| 28 29 | 
             
                    create_cql =  "CREATE TABLE #{table_name} ("
         | 
| 29 30 | 
             
                    create_cql << table_definition.to_create_cql
         | 
| 30 31 | 
             
                    create_cql << ")"
         | 
| 32 | 
            +
                    create_cql << table_definition.options
         | 
| 31 33 |  | 
| 32 34 | 
             
                    announce_suboperation create_cql
         | 
| 33 35 |  | 
| @@ -63,6 +65,14 @@ module CassandraMigrations | |
| 63 65 | 
             
                    execute drop_index_cql        
         | 
| 64 66 | 
             
                  end
         | 
| 65 67 |  | 
| 68 | 
            +
                  def add_options(table_name, options)
         | 
| 69 | 
            +
                    announce_operation "add_options_#{table_name}"
         | 
| 70 | 
            +
                    add_options_cql = "ALTER TABLE #{properties_cql(options)}"
         | 
| 71 | 
            +
                    announce_suboperation drop_index_cql
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                    execute add_options_cql
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
             | 
| 66 76 | 
             
                end
         | 
| 67 77 | 
             
              end
         | 
| 68 78 | 
             
            end
         | 
| @@ -13,6 +13,7 @@ module CassandraMigrations | |
| 13 13 |  | 
| 14 14 | 
             
                # Makes +execute+ method directly available to migrations
         | 
| 15 15 | 
             
                delegate :execute, :to => Cassandra
         | 
| 16 | 
            +
                delegate :using_keyspace, :to => Cassandra
         | 
| 16 17 |  | 
| 17 18 | 
             
                # Makes +up+ work if the method in the migration is defined with self.up
         | 
| 18 19 | 
             
                def up
         | 
| @@ -12,7 +12,7 @@ namespace :cassandra do | |
| 12 12 | 
             
                  CassandraMigrations::Cassandra.start!
         | 
| 13 13 | 
             
                  puts "Keyspace #{CassandraMigrations::Config.keyspace} already exists!"
         | 
| 14 14 | 
             
                rescue CassandraMigrations::Errors::UnexistingKeyspaceError
         | 
| 15 | 
            -
                  CassandraMigrations::Cassandra.create_keyspace!
         | 
| 15 | 
            +
                  CassandraMigrations::Cassandra.create_keyspace!(Rails.env)
         | 
| 16 16 | 
             
                  puts "Created keyspace #{CassandraMigrations::Config.keyspace}"
         | 
| 17 17 | 
             
                end
         | 
| 18 18 | 
             
              end
         | 
| @@ -20,7 +20,7 @@ namespace :cassandra do | |
| 20 20 | 
             
              desc 'Drop keyspace in config/cassandra.yml for the current environment'
         | 
| 21 21 | 
             
              task :drop do
         | 
| 22 22 | 
             
                begin
         | 
| 23 | 
            -
                  CassandraMigrations::Cassandra.drop_keyspace!
         | 
| 23 | 
            +
                  CassandraMigrations::Cassandra.drop_keyspace!(Rails.env)
         | 
| 24 24 | 
             
                  puts "Dropped keyspace #{CassandraMigrations::Config.keyspace}"
         | 
| 25 25 | 
             
                rescue CassandraMigrations::Errors::UnexistingKeyspaceError
         | 
| 26 26 | 
             
                  puts "Keyspace #{CassandraMigrations::Config.keyspace} does not exist... cannot be dropped"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: cassandra_migrations
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0 | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Henrique Gubert
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2014- | 
| 12 | 
            +
            date: 2014-06-18 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: cql-rb
         | 
| @@ -17,14 +17,14 @@ dependencies: | |
| 17 17 | 
             
                requirements:
         | 
| 18 18 | 
             
                - - '='
         | 
| 19 19 | 
             
                  - !ruby/object:Gem::Version
         | 
| 20 | 
            -
                    version: 2.0.0 | 
| 20 | 
            +
                    version: 2.0.0
         | 
| 21 21 | 
             
              type: :runtime
         | 
| 22 22 | 
             
              prerelease: false
         | 
| 23 23 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 24 24 | 
             
                requirements:
         | 
| 25 25 | 
             
                - - '='
         | 
| 26 26 | 
             
                  - !ruby/object:Gem::Version
         | 
| 27 | 
            -
                    version: 2.0.0 | 
| 27 | 
            +
                    version: 2.0.0
         | 
| 28 28 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 29 29 | 
             
              name: rake
         | 
| 30 30 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -59,28 +59,28 @@ dependencies: | |
| 59 59 | 
             
                requirements:
         | 
| 60 60 | 
             
                - - "~>"
         | 
| 61 61 | 
             
                  - !ruby/object:Gem::Version
         | 
| 62 | 
            -
                    version:  | 
| 62 | 
            +
                    version: 0.7.3
         | 
| 63 63 | 
             
              type: :runtime
         | 
| 64 64 | 
             
              prerelease: false
         | 
| 65 65 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 66 66 | 
             
                requirements:
         | 
| 67 67 | 
             
                - - "~>"
         | 
| 68 68 | 
             
                  - !ruby/object:Gem::Version
         | 
| 69 | 
            -
                    version:  | 
| 69 | 
            +
                    version: 0.7.3
         | 
| 70 70 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 71 71 | 
             
              name: rspec
         | 
| 72 72 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 73 73 | 
             
                requirements:
         | 
| 74 74 | 
             
                - - "~>"
         | 
| 75 75 | 
             
                  - !ruby/object:Gem::Version
         | 
| 76 | 
            -
                    version: '2. | 
| 76 | 
            +
                    version: '2.99'
         | 
| 77 77 | 
             
              type: :development
         | 
| 78 78 | 
             
              prerelease: false
         | 
| 79 79 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 80 80 | 
             
                requirements:
         | 
| 81 81 | 
             
                - - "~>"
         | 
| 82 82 | 
             
                  - !ruby/object:Gem::Version
         | 
| 83 | 
            -
                    version: '2. | 
| 83 | 
            +
                    version: '2.99'
         | 
| 84 84 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 85 85 | 
             
              name: debugger
         | 
| 86 86 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -138,7 +138,7 @@ dependencies: | |
| 138 138 | 
             
                  - !ruby/object:Gem::Version
         | 
| 139 139 | 
             
                    version: '0.7'
         | 
| 140 140 | 
             
            description: A gem to manage Cassandra database schema for Rails. This gem offers
         | 
| 141 | 
            -
              migrations and environment  | 
| 141 | 
            +
              migrations and environment specific databases out-of-the-box for Rails users.
         | 
| 142 142 | 
             
            email:
         | 
| 143 143 | 
             
            - guberthenrique@hotmail.com
         | 
| 144 144 | 
             
            - bsbodden@integrallis.com
         |