lib/swift/migrations.rb in swift-0.10.0 vs lib/swift/migrations.rb in swift-0.11.0
- old
+ new
@@ -1,15 +1,58 @@
module Swift
- class Scheme
- def self.migrations &migrations
- (class << self; self end).send :define_method, :migrate!, lambda{|db = Swift.db| migrations.call(db) }
- end
+ module Migrations
+ module ClassMethods
+ # @example
+ # class User < Swift::Scheme
+ # migrations do |db|
+ # db.execute %q{create table users(id serial, name text, age int)}
+ # end
+ # end
+ #
+ # @param [Proc] &migrations
+ #
+ # @see Swift::Scheme
+ def migrations &migrations
+ define_singleton_method(:migrate!, lambda{|db = Swift.db| migrations.call(db)})
+ end
- def self.migrate! db = Swift.db
- db.migrate! self
- end
- end # Scheme
+ # @example
+ # User.migrate!
+ #
+ # @param [Swift::Adapter] db
+ #
+ # @see Swift::Scheme
+ def migrate! db = Swift.db
+ db.migrate! self
+ end
+ end # ClassMethods
+ module InstanceMethods
+ # @example
+ # db.migrate! User
+ #
+ # @param [Swift::Scheme] scheme
+ #
+ # @see Swift::Adapter::Sql
+ def migrate! scheme
+ keys = scheme.header.keys
+ fields = scheme.header.map{|p| field_definition(p)}.join(', ')
+ fields += ", primary key (#{keys.join(', ')})" unless keys.empty?
+
+ execute("drop table if exists #{scheme.store} cascade")
+ execute("create table #{scheme.store} (#{fields})")
+ end
+ end # InstanceMethods
+ end # Migrations
+
def self.migrate! name = nil
schema.each{|scheme| scheme.migrate!(db(name)) }
+ end
+
+ class Scheme
+ extend Migrations::ClassMethods
+ end
+
+ class Adapter::Sql
+ include Migrations::InstanceMethods
end
end # Swift