Changeset 19115
- Timestamp:
- 09/10/08 11:31:41 (5 years ago)
- Location:
- lang/ruby/ymldot
- Files:
-
- 10 added
- 2 modified
-
README (added)
-
lib/ymldot.rb (modified) (5 diffs)
-
sample (added)
-
sample/sample.dot (added)
-
sample/sample.png (added)
-
sample/sample.yml (added)
-
sample/sample_jp.dot (added)
-
sample/sample_jp.png (added)
-
sample/sample_jp.yml (added)
-
spec/test_config_none.yml (added)
-
spec/test_many_relation.yml (added)
-
spec/ymldot_spec.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/ruby/ymldot/lib/ymldot.rb
r19101 r19115 14 14 end 15 15 16 def to_ s16 def to_dot 17 17 res = "" 18 18 res << %Q!"#{@name}" [#{@dependent? 'shape=Mrecord, ' : 'shape=record, '}label=\"{#{@name}|! … … 45 45 code += <<"EOS" 46 46 digraph #{@file_name} { 47 #{add_2_tab(config_to_ s)}48 #{add_2_tab(entities_to_ s)}49 #{add_2_tab(relations_to_ s)}47 #{add_2_tab(config_to_dot)} 48 #{add_2_tab(entities_to_dot)} 49 #{add_2_tab(relations_to_dot)} 50 50 } 51 51 EOS … … 59 59 end 60 60 61 def config_to_ s61 def config_to_dot 62 62 res = "" 63 63 res << "graph[overlap=false, splines=true]\n" 64 64 res << %Q!node [fontname="#{@config["font"]}"]! if @config["font"] 65 res 65 66 end 66 67 67 def entities_to_ s68 def entities_to_dot 68 69 res = "" 69 70 s = [] 70 71 @entities.each_value{|e| s << e } 71 s.sort{|a, b| a.name <=> b.name}.each{|e| res << e.to_ s<< "\n"}72 s.sort{|a, b| a.name <=> b.name}.each{|e| res << e.to_dot << "\n"} 72 73 res 73 74 end 74 75 75 def relations_to_ s76 def relations_to_dot 76 77 res = "" 77 78 @one_relations.sort{|a, b| a[:self].name <=> b[:self].name}.each do |r| … … 85 86 86 87 def eval 87 @config = @node["config"] 88 @config = @node["config"]? @node["config"] : {} 88 89 @node["tables"].each {|t| eval_entity(t) } 89 90 @node["tables"].each {|t| eval_relation(t) } … … 98 99 foreignkeys = table["foreignkeys"] 99 100 tname = table["name"] 100 case 101 when foreignkeys["belongs_to"] 102 foreignkeys["belongs_to"].each do |rel| 103 @entities[tname].foreignkeys << "#{rel}ID(FK)" 104 end 105 when foreignkeys["has_many"] 106 foreignkeys["has_many"].each do |rel| 107 @many_relations << {:self => @entities[tname], :have => @entities[rel]} 108 end 109 when foreignkeys["has_one"] 110 foreignkeys["has_one"].each do |rel| 111 @one_relations << {:self => @entities[tname], :have => @entities[rel]} 112 end 113 when foreignkeys["has_many_and_belongs_to"] 114 foreignkeys["has_many_and_belongs_to"].each do |rel| 115 join_tname = "#{rel}_#{tname}" 116 return if @entities.has_key? join_tname 117 join_tname = "#{tname}_#{rel}" 118 @entities[join_tname] ||= Entity.new(join_tname, true) 119 @entities[join_tname].foreignkeys << "#{tname}ID(FK)" 120 @entities[join_tname].foreignkeys << "#{rel}ID(FK)" 121 @many_relations << {:self => @entities[tname], :have => @entities[join_tname]} 122 @many_relations << {:self => @entities[rel], :have => @entities[join_tname]} 123 end 101 eval_relation_belongs_to(foreignkeys["belongs_to"], tname) if foreignkeys["belongs_to"] 102 eval_relation_has_many(foreignkeys["has_many"], tname) if foreignkeys["has_many"] 103 eval_relation_has_one(foreignkeys["has_one"], tname) if foreignkeys["has_one"] 104 eval_relation_hmabt(foreignkeys["has_many_and_belongs_to"], tname) if foreignkeys["has_many_and_belongs_to"] 105 end 106 107 def eval_relation_belongs_to(keys, tname) 108 keys.each do |rel| 109 @entities[tname].foreignkeys << "#{rel}ID(FK)" 110 end 111 end 112 113 def eval_relation_has_many(keys, tname) 114 keys.each do |rel| 115 @many_relations << {:self => @entities[tname], :have => @entities[rel]} 116 end 117 end 118 119 def eval_relation_has_one(keys, tname) 120 keys.each do |rel| 121 @one_relations << {:self => @entities[tname], :have => @entities[rel]} 122 end 123 end 124 125 def eval_relation_hmabt(keys, tname) 126 keys.each do |rel| 127 join_tname = "#{rel}_#{tname}" 128 return if @entities.has_key? join_tname 129 join_tname = "#{tname}_#{rel}" 130 @entities[join_tname] ||= Entity.new(join_tname, true) 131 @entities[join_tname].foreignkeys << "#{tname}ID(FK)" 132 @entities[join_tname].foreignkeys << "#{rel}ID(FK)" 133 @many_relations << {:self => @entities[tname], :have => @entities[join_tname]} 134 @many_relations << {:self => @entities[rel], :have => @entities[join_tname]} 124 135 end 125 136 end -
lang/ruby/ymldot/spec/ymldot_spec.rb
r19101 r19115 3 3 4 4 class Ymldot 5 attr_accessor :node, :entities, :one_relations, :many_relations, :file_name 5 attr_accessor :node, :entities, :one_relations, :many_relations, :file_name, :config 6 6 end 7 7 … … 137 137 end 138 138 end 139 140 describe Ymldot, "で読み込んだ.ymlにconfigがない場合" do 141 before do 142 @ymldot = Ymldot.new("test_config_none.yml") 143 end 144 145 it "#config は空のHashが格納されていること" do 146 @ymldot.config.should be_empty 147 end 148 end 149 150 describe Ymldot, "で読み込んだ.ymlにて一つのに複数の関係を持っている場合" do 151 before do 152 @ymldot = Ymldot.new("test_many_relation.yml") 153 end 154 155 it "#many_relations には'bar'から'baf'へのリレーションがあること" do 156 res = nil 157 @ymldot.many_relations.each{|e| res = e if e[:self].name == 'bar' and e[:have].name == 'baf' } 158 res.should_not be_nil 159 end 160 161 it "#entities の'baf'には'bar'へのforeginkeyがあること" do 162 @ymldot.entities["baf"].foreignkeys[0].should == "barID(FK)" 163 end 164 end
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)