module HairTrigger::MigrationReader
Public Class Methods
get_triggers(source, options)
click to toggle source
# File lib/hair_trigger/migration_reader.rb, line 7 def get_triggers(source, options) triggers = [] if source.is_a?(String) # schema.rb contents... because it's auto-generated and we know # exactly what it will look like, we can safely use a regex source.scan(/^ create_trigger\(.*?\n end\n\n/m).each do |match| trigger = instance_eval("generate_" + match.strip) triggers << trigger if options[:include_manual_triggers] || trigger.options[:generated] end else contents = File.read(source.filename) return [] unless contents =~ /(create|drop)_trigger/ sexps = RubyParser.for_current_ruby.parse(contents) # find the migration class sexps = [sexps] unless sexps[0] == :block sexps = sexps.detect{ |s| s.is_a?(Sexp) && s[0] == :class && s[1] == source.name.to_sym } # find the block of the up method sexps = sexps.last if sexps.last.is_a?(Sexp) && sexps.last[0] == :block sexps = sexps.detect{ |s| s.is_a?(Sexp) && (s[0] == :defs && s[1] && s[1][0] == :self && s[2] == :up || s[0] == :defn && s[1] == :up) } return [] unless sexps # no `up` method... unsupported `change` perhaps? sexps.each do |sexp| next unless (method = extract_method_call(sexp)) && [:create_trigger, :drop_trigger].include?(method) trigger = instance_eval("generate_" + generator.process(sexp)) triggers << trigger if options[:include_manual_triggers] || trigger.options[:generated] end end triggers rescue $stderr.puts "Error reading triggers in #{source.filename rescue "schema.rb"}: #{$!}" [] end
Private Class Methods
extract_method_call(exp)
click to toggle source
# File lib/hair_trigger/migration_reader.rb, line 40 def extract_method_call(exp) return nil unless exp.is_a?(Array) if exp[0] == :iter exp = exp[1] while exp[1].is_a?(Array) && exp[1][0] == :call end if exp[0] == :call exp[2] end end
generate_create_trigger(*arguments)
click to toggle source
# File lib/hair_trigger/migration_reader.rb, line 50 def generate_create_trigger(*arguments) arguments.unshift({}) if arguments.empty? arguments.unshift(nil) if arguments.first.is_a?(Hash) arguments.push({}) if arguments.size == 1 arguments[1][:compatibility] ||= HairTrigger::Builder.base_compatibility ::HairTrigger::Builder.new(*arguments) end
generate_drop_trigger(*arguments)
click to toggle source
# File lib/hair_trigger/migration_reader.rb, line 58 def generate_drop_trigger(*arguments) options = arguments[2] || {} ::HairTrigger::Builder.new(arguments[0], options.update({:table => arguments[1], :drop => true})) end
generator()
click to toggle source
# File lib/hair_trigger/migration_reader.rb, line 63 def generator @generator ||= Ruby2Ruby.new end