Skip to content

Commit

Permalink
Merge pull request #61 from Fryguy/class_hierarchy
Browse files Browse the repository at this point in the history
Add Class#hierarchy and Class#lineage
  • Loading branch information
bdunne authored Jul 27, 2018
2 parents 8aef00f + 8f5358f commit b2def1c
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 0 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ MoreCoreExtensions are a set of core extensions beyond those provided by ActiveS
* core_ext/array/tableize.rb
* `#tableize` - Create a string representation of receiver in a tabular format if receiver is an Array of Arrays or an Array of Hashes

#### Class

* core_ext/class/hierarchy.rb
* `#hierarchy` - Returns a tree-like Hash structure of all descendants.
* `#lineage` - Returns an Array of all superclasses.

#### Hash

* core_ext/hash/deletes.rb
Expand Down
1 change: 1 addition & 0 deletions lib/more_core_extensions/all.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
require 'more_core_extensions/version'

require 'more_core_extensions/core_ext/array'
require 'more_core_extensions/core_ext/class'
require 'more_core_extensions/core_ext/hash'
require 'more_core_extensions/core_ext/module'
require 'more_core_extensions/core_ext/numeric'
Expand Down
1 change: 1 addition & 0 deletions lib/more_core_extensions/core_ext/class.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
require 'more_core_extensions/core_ext/class/hierarchy'
30 changes: 30 additions & 0 deletions lib/more_core_extensions/core_ext/class/hierarchy.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
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
end
end

Class.send(:include, MoreCoreExtensions::ClassHierarchy)
18 changes: 18 additions & 0 deletions spec/core_ext/class/hierarchy_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
require 'socket' # for a more interesting hierarchy for specs

describe Class do
it "#hierarchy" do
expect(IO.hierarchy).to eq(
BasicSocket => {
Socket => {},
IPSocket => {TCPSocket => {TCPServer => {}}, UDPSocket => {}},
UNIXSocket => {UNIXServer => {}}
},
File => {}
)
end

it "#lineage" do
expect(TCPServer.lineage).to eq [TCPSocket, IPSocket, BasicSocket, IO, Object, BasicObject]
end
end

0 comments on commit b2def1c

Please # to comment.