cartodb-4.42/script/sequel-model-graph.rb

47 lines
1.3 KiB
Ruby
Raw Normal View History

2024-04-06 13:25:13 +08:00
# Script to generate a graph of Sequel models and associations
#
# Usage:
# bundle exec rails runner script/sequel-model-graph.rb
#
# The output is left in OUTPUT_FILE as a graphviz .dot
# Check constants for customizations.
#
# You can then convert the output file to an image using graphviz
# command line tools:
# dot -Tpng /tmp/sequel-graph.dot > /tmp/sequel-graph.png
require 'set'
OUTPUT_FILE = '/tmp/sequel-graph.dot'
INCLUDE_ASSOCIATION_TYPE = false
# Load all the model classes (autoloader might not have loaded all of
# them yet)
Dir.glob('./app/models/**/*.rb').each {|file| require file }
# A Set to store the resulting graph edges
graph = Set.new
# List Sequel through reflection
Sequel::Model.subclasses.each do |model|
# Get its associations
associations = model.association_reflections.values
associations.each do |assoc|
# Graphviz dot output format
association_type = INCLUDE_ASSOCIATION_TYPE ? %Q([ label=\"#{assoc[:type].to_s}\" ]) : ''
graph << "#{model.to_s.demodulize} -> #{assoc.associated_class.to_s} #{association_type};"
end
graph << "#{model.to_s.demodulize} -> {}" if associations.empty?
end
# Output to a file
File.open(OUTPUT_FILE, 'w') do |file|
file.puts "digraph D {"
graph.each do |edge|
file.puts edge
end
file.puts "}"
end
puts "Done!"