Sha256: 4a66fac631bafb0921beac249c56733ce570f84c41abdc65616d6b19444aee85

Contents?: true

Size: 1.34 KB

Versions: 3

Compression:

Stored size: 1.34 KB

Contents

module ToFactory
  module Finders
    class Model
      def call(exclusions=[])
        instances = []

        each_klass(exclusions) do |klass|
          if instance = get_active_record_instance(klass)
            instances << instance
          end
        end

        instances
      end

      private

      def each_klass(exclusions)
        models.each do |file|
          matching_lines(file) do |match|
            klass = rescuing_require(file, match)

            break if exclusions.include?(klass) || yield(klass)
          end
        end
      end

      def models
        Dir.glob("#{ToFactory.models}/**/*.rb")
      end

      def matching_lines(file)
        File.readlines(file).each do |l|
          if match = l.match(/class (.*) ?</)
            yield match
          end
        end
      end

      def rescuing_require(file, match)
        require file
        klass = eval(match[1])
        klass

      rescue Exception => e
        warn "Failed to eval #{file}"
        warn e.message
      end

      def get_active_record_instance(klass)
        if klass && klass.ancestors.include?(ActiveRecord::Base)
          begin
            klass.first
          rescue
            klass.find(:first)
          end
        end
      rescue Exception => e
        warn "Failed to get record from #{klass} #{e.message}"
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
to_factory-2.0.0 lib/to_factory/finders/model.rb
to_factory-0.2.1 lib/to_factory/finders/model.rb
to_factory-0.2.0 lib/to_factory/finders/model.rb