Sha256: 943cc09ab89f2dbc9d7a4f3c5428877b8e6bf6992ca038fa58351143f08da5bb

Contents?: true

Size: 1.2 KB

Versions: 3

Compression:

Stored size: 1.2 KB

Contents

# Extension.
require_relative '../ext/swift'
require_relative 'swift/adapter'
require_relative 'swift/attribute'
require_relative 'swift/db'
require_relative 'swift/header'
require_relative 'swift/scheme'
require_relative 'swift/type'

module Swift
  class << self
    def setup name, type, options = {}
      unless type.kind_of?(Class) && type < Swift::Adapter
        raise TypeError, "Expected +type+ Swift::Adapter subclass but got #{type.inspect}"
      end
      (@repositories ||= {})[name] = type.new(options)
    end

    def db name = nil, &block
      # I pilfered the logic from DM but I don't really understand what is/isn't thread safe.
      scopes     = (Thread.current[:swift_db] ||= [])
      repository = if name || scopes.empty?
        @repositories[name || :default] or raise "Unknown db '#{name || :default}', did you forget to #setup?"
      else
        scopes.last
      end

      if block_given?
        begin
          scopes.push(repository)
          block.call(repository)
        ensure
          scopes.pop
        end
      end
      repository
    end

    def schema
      @schema ||= []
    end

    def migrate! name = nil
      db(name){ schema.each(&:migrate!)}
    end
  end
end # Swift

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
swift-0.4.3 lib/swift.rb
swift-0.4.2 lib/swift.rb
swift-0.4.1 lib/swift.rb