Sha256: b4c02b40e7c9e5634676d742d63e01dea081dc29de45481667f8b0d0d50b20e2

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

module Makers
  module Dsl
    class Maker

      def initialize(name, options={}, &block)
        @name = name
        @options = options.reverse_merge(class_name: name.to_s.classify)
        @class = @options[:class_name].constantize
        @assignments = {}
        if block_given?
          instance_eval &block
        end
        Makers.definitions.add(
          [@name] + Array(@options[:aliases]),
          @options,
          @assignments
        )
      end

      def maker(name, overrides={}, &block)
        options = @options.dup
        options.delete :aliases
        options.merge! overrides
        options.merge! parent: @name
        Dsl::Maker.new name, options, &block
      end

      def sequence(name, &block)
        index = 0
        if block_given?
          @assignments[name] = -> {
            index += 1
            instance_exec index, &block
          }
        else
          @assignments[name] = -> {
            index += 1
          }
        end
      end

      def association(name, *args)
        options = args.extract_options!
        name = (options[:maker] || name)
        strategy = (options[:strategy] || :build)
        case @class.reflections[name.to_s].macro
        when :belongs_to,:has_one
          @assignments[name] = -> {
            maker = Makers.definitions.find(name)
            maker.send strategy
          }
        when :has_many
          @assignments[name] = -> {
            maker = Makers.definitions.find(name.to_s.singularize.to_sym)
            (args.first || 1).times.map do
              maker.send strategy
            end
          }
        end
      end

      def method_missing(name, *args, &block)
        if @class.reflections.has_key?(name.to_s)
          association name, *args
        elsif block_given?
          @assignments[name] = block
        elsif args.size > 0
          @assignments[name] = -> { args.first }
        end
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
makers-4.0.0.0 lib/makers/dsl/maker.rb