Sha256: 5c3ef7f0d37a28572d7d6d45c71c523d67c9f6101a54f020a8e490f23b66dba7

Contents?: true

Size: 1.59 KB

Versions: 3

Compression:

Stored size: 1.59 KB

Contents

require 'active_record/connection_adapters/abstract/quoting'

module Ambition
  class Processor < SexpProcessor 
    include ActiveRecord::ConnectionAdapters::Quoting

    attr_reader :key, :join_string, :prefix, :includes


    def initialize
      super()
      @strict          = false
      @expected        = String
      @auto_shift_type = true
      @warn_on_default = false
      @default_method  = :process_error
      @includes        = []
    end

    ##
    # Processing methods
    def process_error(exp)
      raise "Missing process method for sexp: #{exp.inspect}"
    end

    def process_proc(exp)
      receiver, body = process(exp.shift), exp.shift
      return process(body)
    end

    def process_dasgn_curr(exp)
      @receiver = exp.shift
      return @receiver.to_s
    end

    def process_array(exp)
      arrayed = exp.map { |m| process(m) }
      exp.clear
      return arrayed.join(', ')
    end

    ##
    # Helper methods
    def to_s
      process(@block.to_sexp).squeeze(' ')
    end

    def sanitize(value)
      case value.to_s
      when 'true'  then '1'
      when 'false' then '0'
      else ActiveRecord::Base.connection.quote(value) rescue quote(value)
      end
    end

    def extract_includes(receiver, method)
      return unless receiver.first == :call && receiver[1].last == @receiver

      if reflection = @owner.reflections[receiver.last]
        @includes << reflection.name unless @includes.include? reflection.name
        "#{reflection.table_name}.#{method}"
      else
        raise "No reflection `#{receiver.last}' found on #{@owner}"
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ambition-0.1.2 ./lib/ambition/processor.rb
ambition-0.1.3 ./lib/ambition/processor.rb
ambition-0.1.4 ./lib/ambition/processor.rb