Sha256: f2367a9c587c03a22e7a718efbfe399b3e1797658732513de0fbb5a66bf63aaa

Contents?: true

Size: 1.57 KB

Versions: 5

Compression:

Stored size: 1.57 KB

Contents

module WhoAmI
  module Function
    class ResolveClassRelationships
      include ProcParty

      def call(extracted_classes)
        object_space =
          extracted_classes
            .map(&method(:self_and_outer_class))
            .flatten
            .compact
            .uniq
            .map { |x| [x.class_name, x] }
            .to_h

        object_space[""] ||= ExtractedClass.new(nil)

        object_space["::ActiveRecord::Base"] =
          ExtractedClass.new(
            "ActiveRecord::Base",
            outerclass: object_space[""],
            abstract_class: true
          )

        object_space.each do |class_name, extracted_class|
          possible_namespace_levels = class_name.split("::")[1..-2] || []

          if extracted_class.claimed_superclass == "" || extracted_class.claimed_superclass == nil
            next
          end

          (possible_namespace_levels.size + 1).times do
            class_uri_parts =
              possible_namespace_levels + [extracted_class.claimed_superclass]

            class_uri = "::#{class_uri_parts.join("::")}"

            if object_space[class_uri]
              extracted_class.resolved_superclass = object_space[class_uri]
              break
            end

            possible_namespace_levels.pop
          end
        end

        object_space
      end

      private

      def self_and_outer_class(extracted_class)
        if extracted_class.nil?
          return nil
        end

        [
          extracted_class,
          self_and_outer_class(extracted_class.outerclass)
        ]
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
who_am_i-0.0.6 lib/who_am_i/function/resolve_class_relationships.rb
who_am_i-0.0.5 lib/who_am_i/function/resolve_class_relationships.rb
who_am_i-0.0.4 lib/who_am_i/function/resolve_class_relationships.rb
who_am_i-0.0.3 lib/who_am_i/function/resolve_class_relationships.rb
who_am_i-0.0.2 lib/who_am_i/function/resolve_class_relationships.rb