Sha256: 943bd5e4a221eae5cbdce3737efab66360d8c006e9858946d872d9340d072950

Contents?: true

Size: 1.7 KB

Versions: 2

Compression:

Stored size: 1.7 KB

Contents

module Schofield

  module Generators

    class Levels

      class << self; attr_reader :all, :hierarchy, :sortables end

      @all       = []
      @names     = {}
      @sortables = {}



      def self.models= models
        @model_names = models.map{ |m| m.name.underscore }
        models.each do |model|
          if polymorphic_model?(model)
            superclass = add_level(model)
            subclasses(model).each do |subclass|
              add_level(subclass, superclass)
              superclass.subclasses << subclass
            end
          else
            add_level(model)
          end
        end
      end

      def self.sortables
        @sortables.keys
      end

      def self.sortable=sortable
        @sortables[sortable] = true
      end

      def self.find name
        @all[@names[name]]
      end

      def self.exists? name
        @model_names.include?(name.to_s)
      end



      private


      def self.polymorphic_model? model
        model.columns.find { |c| c.name == 'type' }.present?
      end

      def self.subclasses model
        begin
          answer = Responses.get "Which models extend #{model.name}?"
          subclasses = answer.split(/[^\w]+/).map{ |a| a.camelize.constantize }
          raise StandardError if subclasses.blank?
        rescue NameError => error
          Responses.say "Could not find models: #{error}"
          retry
        rescue StandardError
          Responses.say "You must answer!"
          retry
        end
        subclasses
      end

      def self.add_level model, superclass=nil
        level = Level.new(model, superclass)
        @all << level
        @names[model.name.underscore] = @all.length - 1
        level
      end

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
schofield-0.3.1 lib/generators/schofield/levels.rb
schofield-0.3.0 lib/generators/schofield/levels.rb