Skip to content

Commit a67dbd4

Browse files
committed
Add catalog analyzer
1 parent 53a9d9f commit a67dbd4

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed

catalog-analyzer.rb

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
#!/usr/bin/env ruby
2+
3+
require 'json'
4+
require 'terminal-table'
5+
require 'colored'
6+
require 'set'
7+
8+
class Catalog
9+
10+
attr_reader :name, :environment, :version
11+
12+
def initialize(hash)
13+
@data = hash['data']
14+
@metadata = hash['metadata']
15+
16+
@name = @data['name']
17+
@version = @data['version']
18+
@environment = @data['environment']
19+
end
20+
21+
def resources
22+
@data['resources']
23+
end
24+
25+
def edges
26+
@data['edges']
27+
end
28+
29+
def classes
30+
@data['classes']
31+
end
32+
33+
def resource_type_count
34+
type_map = Hash.new { |h, k| h[k] = 0 }
35+
36+
@data['resources'].each do |resource|
37+
resource_type = resource['type']
38+
type_map[resource_type] += 1
39+
end
40+
41+
type_map
42+
end
43+
44+
def source_edge_count
45+
source_map = Hash.new { |h, k| h[k] = 0 }
46+
47+
@data['edges'].each do |edge|
48+
source_map[edge['source']] += 1
49+
end
50+
51+
source_map
52+
end
53+
54+
def target_edge_count
55+
target_map = Hash.new { |h, k| h[k] = 0 }
56+
57+
@data['edges'].each do |edge|
58+
target_map[edge['target']] += 1
59+
end
60+
61+
target_map
62+
end
63+
end
64+
65+
def tableflip(headings, hash, take = nil)
66+
rows = hash.to_a.sort { |a, b| b[1] <=> a[1] }
67+
68+
if take
69+
rows = rows.take(take)
70+
end
71+
72+
table = Terminal::Table.new(:headings => headings, :rows => rows)
73+
puts table
74+
end
75+
76+
hash = JSON.parse(File.read(ARGV[0]))
77+
catalog = Catalog.new(hash)
78+
79+
puts "--- Catalog ---"
80+
81+
name = catalog.name
82+
environment = catalog.environment
83+
version = catalog.version
84+
85+
puts "Name: #{name.inspect}"
86+
puts "Environment: #{environment.inspect}"
87+
puts "Catalog version: #{version.inspect}"
88+
89+
puts "--- Statistics ---"
90+
91+
puts "Edges: #{catalog.edges.count}"
92+
puts "Resources: #{catalog.resources.count}"
93+
puts "Classes: #{catalog.classes.count}"
94+
95+
puts "--- Resource types: ---"
96+
97+
tableflip(['Resource Type', 'Count'], catalog.resource_type_count)
98+
99+
puts "--- Edges ---"
100+
101+
source_map = catalog.source_edge_count
102+
target_map = catalog.target_edge_count
103+
104+
deleter = lambda { |k, v| v <= 1 }
105+
source_map.delete_if(&deleter)
106+
target_map.delete_if(&deleter)
107+
108+
tableflip(['Heavily depended resources', 'Count'], source_map, 20)
109+
tableflip(['Heavily dependent resources', 'Count'], target_map, 20)
110+
111+
file_map = Hash.new { |h, k| h[k] = [] }
112+
113+
catalog.resources.each do |resource|
114+
file_map[resource['file']] << "#{resource['type']}[#{resource['title']}]" if resource['file']
115+
end
116+
117+
puts "--- Files with the most defined resources ---"
118+
119+
file_rows = file_map.to_a.sort { |a, b| b[1].count <=> a[1].count }
120+
121+
tableflip(['File', 'Resource count'], file_rows.map { |(file, resources)| [file, resources.count] }, 20)
122+
123+
puts "--- Resources per file ---"
124+
125+
file_rows.take(20).map do |(file, resources)|
126+
puts "#{file} " + "(#{resources.count} resources)".yellow
127+
resources.sort.each do |resource|
128+
puts " -- #{resource}"
129+
end
130+
puts "-" * 20
131+
end

0 commit comments

Comments
 (0)