Changeset 19163 for lang/ruby

Show
Ignore:
Timestamp:
09/11/08 11:10:49 (5 years ago)
Author:
authorNari
Message:

impl polymorphic pattern. add spec test.

Location:
lang/ruby/ymldot
Files:
1 added
8 modified

Legend:

Unmodified
Added
Removed
  • lang/ruby/ymldot/README

    r19133 r19163  
    99== Installation 
    1010(1) if not install graphviz, type following. 
    11   $ apt-get install graphviz 
     11    $ apt-get install graphviz 
    1212(2) get ymldot. 
    13   $ gem install ymldot 
     13    $ gem install ymldot 
    1414 
    1515== Option 
     
    3232      same meaning the relation of ActiveRecord. 
    3333      enumerate ref table name. 
     34    * polymorphic 
     35      * name 
     36      * type 
     37      * tables 
     38        target table name. 
     39 
    3440* category 
    3541   * label 
     
    3945 
    4046== Sample 
    41 please see "sample/sample.yml" 
     47* in file. "sample/sample.yml" 
     48 
     49  tables: 
     50    - name: customer 
     51      columns: 
     52        - name 
     53        - phone_number 
     54      foreignkeys: 
     55        has_many: 
     56           - order 
     57    - name:  order 
     58      columns: 
     59        - order_num 
     60    - name:  product 
     61      columns: 
     62        - name 
     63        - amount 
     64        - tax 
     65        - product_div 
     66      foreignkeys: 
     67        has_many: 
     68           - order 
     69    - name:  category 
     70      columns: 
     71        - name 
     72      foreignkeys: 
     73        has_many: 
     74           - product 
     75 
     76* output dot file. "sample/sample.dot" 
     77 
     78  digraph sample { 
     79    graph[overlap=false, splines=true] 
     80   
     81    "category" [shape=record, label="{category|name\l}"] 
     82    "customer" [shape=record, label="{customer|name\lphone_number\l}"] 
     83    "order" [shape=record, label="{order|customerID(FK)\lproductID(FK)\lorder_num\l}"] 
     84    "product" [shape=record, label="{product|categoryID(FK)\lname\lamount\ltax\lproduct_div\l}"] 
     85   
     86    "category" -> "product" [arrowtail=none arrowhead=dot headlabel="n" taillabel="1"] 
     87    "customer" -> "order" [arrowtail=none arrowhead=dot headlabel="n" taillabel="1"] 
     88    "product" -> "order" [arrowtail=none arrowhead=dot headlabel="n" taillabel="1"] 
     89   
     90  } 
     91 
     92* please type 
     93  $ dot -Tpng sample.dot -o sample.png 
    4294 
    4395== Copyright 
  • lang/ruby/ymldot/lib/ymldot.rb

    r19133 r19163  
    127127    @config = @node["config"]? @node["config"] : {} 
    128128    @category << Tables.new(@node["tables"]) if @node["tables"] and !@node["tables"].empty? 
    129     @node["category"].each{|c| @category << Tables.new(c["tables"], c["label"], true)} if @node["category"] 
     129    @node["category"].each{|c| @category << Tables.new(c["tables"], c["label"], true) } if @node["category"] 
    130130    @category.each{|c| c.entity_dict.each_pair{|k, v| @entity_dict[k] = v}} 
    131131    @category.each{|c| c.table_node.each{|e| eval_relation(e) } } 
     
    139139    eval_relation_has_one(foreignkeys["has_one"], tname) if foreignkeys["has_one"] 
    140140    eval_relation_hmabt(foreignkeys["has_many_and_belongs_to"], tname) if foreignkeys["has_many_and_belongs_to"] 
     141    eval_relation_polymorphic(foreignkeys["polymorphic"], tname) if foreignkeys["polymorphic"] 
    141142  end 
    142143 
     
    174175    end 
    175176  end 
     177 
     178  def eval_relation_polymorphic(keys, tname) 
     179    keys.each do |rel| 
     180      @entity_dict[tname].foreignkeys << "#{rel["name"]}ID(FK)" if key = rel["name"] 
     181      @entity_dict[tname].columns << "#{rel["type"]}(type)" if key = rel["type"] 
     182      rel["tables"].each do |t| 
     183        @one_relations << {:self => @entity_dict[t], :have => @entity_dict[tname] } 
     184      end 
     185    end 
     186  end 
    176187end 
  • lang/ruby/ymldot/sample/sample.dot

    r19115 r19163  
    33 
    44  "category" [shape=record, label="{category|name\l}"] 
    5   "customer" [shape=Mrecord, label="{customer|name\lphone_number\l}"] 
     5  "customer" [shape=record, label="{customer|name\lphone_number\l}"] 
    66  "order" [shape=record, label="{order|customerID(FK)\lproductID(FK)\lorder_num\l}"] 
    77  "product" [shape=record, label="{product|categoryID(FK)\lname\lamount\ltax\lproduct_div\l}"] 
  • lang/ruby/ymldot/sample/sample.yml

    r19115 r19163  
    1 # 
    21# reference http://codezine.jp/article/detail/154?p=1 
    32tables: 
     
    98      has_many: 
    109        - order 
    11     dependent: true 
    1210 
    1311  - name:  order 
    1412    columns: 
    1513      - order_num 
    16     foreignkeys: 
    17       belongs_to: 
    18          - customer 
    19          - product 
    20     dependent: false 
    2114 
    2215  - name:  product 
     
    2720      - product_div 
    2821    foreignkeys: 
    29       belongs_to: 
    30          - category 
    3122      has_many: 
    3223         - order 
    33     dependent: false 
    3424 
    3525  - name:  category 
     
    3929      has_many: 
    4030         - product 
    41     dependent: false 
  • lang/ruby/ymldot/sample/sample_jp.yml

    r19115 r19163  
    1 # 
    21# reference http://codezine.jp/article/detail/154?p=1 
    32config: 
     
    1211      has_many: 
    1312        - 注文 
    14     dependent: false 
    1513 
    1614  - name:  注文 
    1715    columns: 
    1816      - 注文数 
    19     foreignkeys: 
    20       belongs_to: 
    21          - 顧客 
    22          - 商品 
    23     dependent: false 
    2417 
    2518  - name:  商品 
     
    3023      - 商品区分 
    3124    foreignkeys: 
    32       belongs_to: 
    33          - 商品カテゴリ 
    3425      has_many: 
    3526         - 注文 
    36     dependent: false 
    3727 
    3828  - name:  商品カテゴリ 
     
    4232      has_many: 
    4333         - 商品 
    44     dependent: false 
    4534 
  • lang/ruby/ymldot/spec/ymldot_spec.rb

    r19133 r19163  
    227227  end 
    228228end 
     229 
     230describe Ymldot, "で読み込んだ.ymlにてpolymorphicを使用した場合" do 
     231  before do 
     232    @ymldot = Ymldot.new("test_polymorphic.yml") 
     233  end 
     234 
     235  it "#entity_dict のリレーションが正しいこと" do 
     236   
     237  end 
     238 
     239  it "#entity_dict['foo'] のforeginkeyは'entiityID(FK)'であること" do 
     240    @ymldot.entity_dict['foo'].foreignkeys.should be_include 'entityID(FK)' 
     241  end 
     242 
     243  it "#entity_dict['foo'] のcolumnsには'entity_tyep(type)'があること" do 
     244    @ymldot.entity_dict['foo'].columns.should be_include 'entity_type(type)' 
     245  end 
     246 
     247  it "出力されるdotが正しいこと" do 
     248    @ymldot.dot_generate.should == <<'EOS' 
     249digraph test_polymorphic { 
     250  graph[overlap=false, splines=true] 
     251 
     252  "baf" [shape=record, label="{baf|buge\l}"] 
     253  "bar" [shape=record, label="{bar|fuge\l}"] 
     254  "baz" [shape=record, label="{baz|gage\l}"] 
     255  "foo" [shape=record, label="{foo|entityID(FK)\lhoge\lentity_type(type)\l}"] 
     256 
     257  "baf" -> "foo" [arrowtail=none arrowhead=dot headlabel="1" taillabel="1"] 
     258  "bar" -> "foo" [arrowtail=none arrowhead=dot headlabel="1" taillabel="1"] 
     259  "baz" -> "foo" [arrowtail=none arrowhead=dot headlabel="1" taillabel="1"] 
     260 
     261} 
     262EOS 
     263  end 
     264end