class Metasploit::ERD::Cluster

A cluster of ‘Class<ActiveRecord::Base>` that are connected by `belongs_to` associations so that all foreign keys are paired with their appropriate primary keys.

Public Class Methods

new(*roots) click to toggle source

@param roots [Array<Class<ActiveRecord::Base>>] starting ‘ActiveRecord::Base` subclasses to seed {#class_set}.

# File lib/metasploit/erd/cluster.rb, line 9
def initialize(*roots)
  class_queue.concat(roots)
end

Public Instance Methods

class_set() click to toggle source

Clases that are reachable through ‘belongs_to` associations on classes passed as `roots` to {#initialize}.

@return [Set<Class<ActiveRecord::Base>>]

# File lib/metasploit/erd/cluster.rb, line 16
def class_set
  until class_queue.empty?
    klass = class_queue.pop
    # add immediately to visited set in case there are recursive associations
    visited_class_set.add klass

    class_entity = Metasploit::ERD::Entity::Class.new(klass)

    class_entity.class_set.each do |set_class|
      unless visited_class_set.include? set_class
        class_queue << set_class
      end
    end

    superclass = klass.superclass

    unless superclass == ActiveRecord::Base || visited_class_set.include?(superclass)
      class_queue << superclass
    end
  end

  visited_class_set
end

Private Instance Methods

class_queue() click to toggle source
# File lib/metasploit/erd/cluster.rb, line 42
def class_queue
  @class_queue ||= []
end
visited_class_set() click to toggle source
# File lib/metasploit/erd/cluster.rb, line 46
def visited_class_set
  @visited_class_set ||= Set.new
end