Sha256: b7e599254034fedb8687a1f42bf4b7fdb03e1e2e0b1f3f664363bf778620b53e

Contents?: true

Size: 1.14 KB

Versions: 1

Compression:

Stored size: 1.14 KB

Contents

require 'active_support/core_ext/class/subclasses'
require 'active_support/core_ext/object/try'

module MoreCoreExtensions
  module ClassHierarchy
    # Returns a tree-like Hash structure of all descendants.
    #
    #   require 'socket'
    #   IO.hierarchy
    #   # => {BasicSocket=>
    #   #      {Socket=>{},
    #   #       IPSocket=>{TCPSocket=>{TCPServer=>{}}, UDPSocket=>{}},
    #   #       UNIXSocket=>{UNIXServer=>{}}},
    #   #     File=>{}}
    def hierarchy
      subclasses.each_with_object({}) { |k, h| h[k] = k.hierarchy }
    end

    # Returns an Array of all superclasses.
    #
    #   require 'socket'
    #   TCPServer.lineage
    #   # => [TCPSocket, IPSocket, BasicSocket, IO, Object, BasicObject]
    def lineage
      superclass.nil? ? [] : superclass.lineage.unshift(superclass)
    end

    # Returns an Array of all descendants which have no subclasses
    #
    #   require 'socket'
    #   BasicSocket.leaf_subclasses
    #   # => [Socket, TCPServer, UDPSocket, UNIXServer]
    def leaf_subclasses
      descendants.select { |d| d.subclasses.empty? }
    end
  end
end

Class.send(:include, MoreCoreExtensions::ClassHierarchy)

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
more_core_extensions-3.8.0 lib/more_core_extensions/core_ext/class/hierarchy.rb