Class: Migratrix::Migration

Inherits:
Object show all
Includes:
ActiveModel::AttributeMethods, Callbacks, Loggable, MigrationStrategy, ValidOptions
Defined in:
lib/migratrix/migration.rb

Overview

Superclass for all migrations. Migratrix COULD check to see that a loaded migration inherits from this class, but hey, duck typing.

Constant Summary

Constants included from Callbacks

Callbacks::CALLBACKS

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Callbacks

#extract, #load, #migrate, #transform

Methods included from MigrationStrategy

#extract, #load, #migrate, #transform

Constructor Details

#initialize(options = {}) ⇒ Migration

Returns a new instance of Migration.



16
17
18
19
# File 'lib/migratrix/migration.rb', line 16

def initialize(options={})
  @options = options.deep_copy.symbolize_keys
  Migratrix.log_to($stdout) if @options[:console]
end

Instance Attribute Details

#optionsObject

Returns the value of attribute options.



13
14
15
# File 'lib/migratrix/migration.rb', line 13

def options
  @options
end

Class Method Details

.extend_extraction(nickname, options = nil) ⇒ Object



66
67
68
69
70
71
72
# File 'lib/migratrix/migration.rb', line 66

def self.extend_extraction(nickname, options=nil)
  nickname, options = :default, nickname if options.nil?
  migration = ancestors.detect {|k| k.respond_to?(:extractions) && k.extractions[nickname]}
  raise ExtractionNotDefined.new("Could not extend extraction '%s'; no parent Migration defines it" % nickname) unless migration
  extraction = migration.extractions[nickname]
  extractions[nickname] = extraction.class.new(nickname, extraction.options.merge(options))
end

.extend_load(nickname, options = nil) ⇒ Object

def self.set_load(name, type, options={})

  loads[name] = Migratrix.load(name, type, options)
end

Raises:



158
159
160
161
162
163
164
# File 'lib/migratrix/migration.rb', line 158

def self.extend_load(nickname, options=nil)
  nickname, options = :default, nickname if options.nil?
  migration = ancestors.detect {|k| k.respond_to?(:loads) && k.loads[nickname]}
  raise LoadNotDefined.new("Could not extend load '%s'; no parent Migration defines it" % nickname) unless migration
  load = migration.loads[nickname]
  loads[nickname] = load.class.new(nickname, load.options.merge(options))
end

.extend_transform(nickname, options = nil) ⇒ Object



110
111
112
113
114
115
116
# File 'lib/migratrix/migration.rb', line 110

def self.extend_transform(nickname, options=nil)
  nickname, options = :default, nickname if options.nil?
  migration = ancestors.detect {|k| k.respond_to?(:transforms) && k.transforms[nickname]}
  raise TransformNotDefined.new("Could not extend transform '%s'; no parent Migration defines it" % nickname) unless migration
  transform = migration.transforms[nickname]
  transforms[nickname] = transform.class.new(nickname, transform.options.merge(options))
end

.extractionsObject



74
75
76
77
78
79
80
81
82
83
# File 'lib/migratrix/migration.rb', line 74

def self.extractions
  @extractions ||= {}
  ancestry = ancestors.select {|klass| klass != self && klass.respond_to?(:extractions) }.reverse
  # take oldest ancestor and merge extractions forward
  ext = {}
  ancestry.each do |ancestor|
    ext = ext.merge(ancestor.extractions || {})
  end
  @extractions = ext.merge(@extractions)
end

.loadsObject



166
167
168
169
170
171
172
173
174
175
# File 'lib/migratrix/migration.rb', line 166

def self.loads
  @loads ||= {}
  ancestry = ancestors.select {|klass| klass != self && klass.respond_to?(:loads) }.reverse
  # take oldest ancestor and merge loads forward
  ext = {}
  ancestry.each do |ancestor|
    ext = ext.merge(ancestor.loads || {})
  end
  @loads = ext.merge(@loads)
end

.set_extraction(nickname, registered_name = nil, options = nil) ⇒ Object

extraction crap set_extraction :nickname, :registered_name, options_hash set_extraction :nickname, :registered_name # options = {} set_extraction :registered_name, options_hash # nickname = :default set_extraction :registered_name # nickname = :default, options={}



52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/migratrix/migration.rb', line 52

def self.set_extraction(nickname, registered_name=nil, options=nil)
  # barf, seriously these args need some detangler.
  if registered_name.nil?
    nickname, registered_name, options = :default, nickname, {}
  elsif options.nil?
    if registered_name.is_a?(Hash)
      nickname, registered_name, options = :default, nickname, registered_name
    else
      nickname, registered_name, options = nickname, registered_name, {}
    end
  end
  extractions[nickname] = Migratrix.extraction(nickname, registered_name, options)
end

.set_load(nickname, registered_name = nil, options = nil) ⇒ Object

load crap set_load :nickname, :registered_name, options_hash set_load :nickname, :registered_name # options = {} set_load :registered_name, options_hash # nickname = :default set_load :registered_name # nickname = :default, options={}



140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/migratrix/migration.rb', line 140

def self.set_load(nickname, registered_name=nil, options=nil)
  # barf, seriously these args need some detangler.
  if registered_name.nil?
    nickname, registered_name, options = :default, nickname, {}
  elsif options.nil?
    if registered_name.is_a?(Hash)
      nickname, registered_name, options = :default, nickname, registered_name
    else
      nickname, registered_name, options = nickname, registered_name, {}
    end
  end
  loads[nickname] = Migratrix.load(nickname, registered_name, options)
end

.set_transform(nickname, registered_name = nil, options = nil) ⇒ Object

transform crap set_transform :nickname, :registered_name, options_hash set_transform :nickname, :registered_name # options = {} set_transform :registered_name, options_hash # nickname = :default set_transform :registered_name # nickname = :default, options={}



96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/migratrix/migration.rb', line 96

def self.set_transform(nickname, registered_name=nil, options=nil)
  # barf, seriously these args need some detangler.
  if registered_name.nil?
    nickname, registered_name, options = :default, nickname, {}
  elsif options.nil?
    if registered_name.is_a?(Hash)
      nickname, registered_name, options = :default, nickname, registered_name
    else
      nickname, registered_name, options = nickname, registered_name, {}
    end
  end
  transforms[nickname] = Migratrix.transform(nickname, registered_name, options)
end

.transformsObject



118
119
120
121
122
123
124
125
126
127
# File 'lib/migratrix/migration.rb', line 118

def self.transforms
  @transforms ||= {}
  ancestry = ancestors.select {|klass| klass != self && klass.respond_to?(:transforms) }.reverse
  # take oldest ancestor and merge transforms forward
  ext = {}
  ancestry.each do |ancestor|
    ext = ext.merge(ancestor.transforms || {})
  end
  @transforms = ext.merge(@transforms)
end

.valid_optionsObject

TODO: Technically, we need to ask our extractions, transformers and loaders for THEIR valid options as well. limit, offset, order and where are all extraction-only options, and fetchall is an ActiveRecord-specific option



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/migratrix/migration.rb', line 25

def self.valid_options
  opts = super # wacky, I know, but the extended ValidOptions module is in the super chain. (I <3 Ruby)
  if extractions
    extractions.each do |name, extraction|
      opts += extraction.valid_options
    end
  end
  if transforms
    transforms.each do |name, transform|
      opts += transform.valid_options
    end
  end
  if loads
    loads.each do |name, load|
      opts += load.valid_options
    end
  end
  opts.uniq.sort
end

Instance Method Details

#extractionsObject



85
86
87
# File 'lib/migratrix/migration.rb', line 85

def extractions
  self.class.extractions
end

#loadsObject



177
178
179
# File 'lib/migratrix/migration.rb', line 177

def loads
  self.class.loads
end

#transformsObject



129
130
131
# File 'lib/migratrix/migration.rb', line 129

def transforms
  self.class.transforms
end