lib/dread/graph.rb in dread-0.0.2 vs lib/dread/graph.rb in dread-0.0.3
- old
+ new
@@ -1,44 +1,62 @@
+require 'dread/error'
+require 'dread/console_output'
module Dread
- class Error < StandardError;end
-
class Graph
- INDENT_INCREASE = 2
+ attr_reader :clazz, :dependable_collection
- attr_reader :clazz, :indent, :pluralized
-
- def initialize(clazz, indent=0, pluralized=false)
- set_and_verify_clazz(clazz)
- @indent = indent
+ def initialize(clazz_data, pluralized=false)
+ set_and_verify_clazz(clazz_data)
@pluralized = pluralized
end
- def draw
- puts " " * indent + clazz_name()
-
- @clazz.reflections.each do |assoc_name, assoc_data|
- if assoc_data.options[:dependent] == :delete
- puts " "*(indent+INDENT_INCREASE) + "#{assoc_name} [#{assoc_data.table_name.classify}]"
- elsif assoc_data.options[:dependent] == :destroy
- Graph.new(assoc_data.table_name, indent + INDENT_INCREASE, pluralized = true).draw
+ # { user: { tweets: { comments: {} }, comments: {}, account_setting: {} } }
+ def dependable_collection
+ @dependable_collection ||= Hash.new.tap do |relation_hash|
+ @clazz.reflections.each do |assoc_name, assoc_data|
+ if assoc_data.options[:dependent] == :delete
+ relation_hash[assoc_name] = {}
+ elsif assoc_data.options[:dependent] == :destroy
+ relation_hash[assoc_name] =
+ Graph.new(assoc_data, assoc_data.macro == :has_many).dependable_collection
+ end
end
end
end
+ def draw(output='console_output')
+ case output
+ when 'console_output'
+ ConsoleOutput.generate(dependable_collection)
+ end
+ end
private
- def set_and_verify_clazz(clazz)
- raise Error.new('Please pass a env var called class to proceed.') if clazz.nil?
+ def set_and_verify_clazz(clazz_data)
+ clazz_name = ClazzName(clazz_data)
begin
- @clazz = clazz.classify.constantize
+ @clazz = clazz_name.constantize
rescue NameError => e
- raise Error.new("Unable to find class called #{clazz.classify}")
+ raise Error.new("Unable to find class called #{clazz_name}")
end
end
- def clazz_name
+ def ClazzName(clazz_data)
+ case clazz_data
+ when ActiveRecord::Reflection::AssociationReflection
+ clazz_data.class_name || clazz_data.table_name
+ when String
+ clazz_data.classify
+ when NilClass
+ raise Error.new('Please pass a env var called class to proceed.')
+ else
+ raise Error.new("Unable to proceed with #{clazz_data.class}")
+ end
+ end
+
+ def relation_name
relation = @pluralized ? @clazz.to_s.pluralize : @clazz.to_s
relation.underscore
end
end
\ No newline at end of file