EA のモデルを YAML に変換

EA のモデルを YAML として出力するスクリプトを書いてみたら78行だった。
やっぱり C# より Ruby が好きかな

# -*- coding: cp932; -*-
require 'win32ole'
require 'yaml'

def read_package(package)
   {
      "Name"       => package.Name,
      "PackageID"  => package.PackageID,
      "Packages"   => package.Packages.to_enum.collect {|sub_package| read_package(sub_package) },
      "Elements"   => package.Elements.to_enum.collect {|element| read_element(element) },
      "Connectors" => package.Connectors.to_enum.collect {|connector| read_connector(connector) },
      "Diagrams"   => package.Diagrams.to_enum.collect {|diagram| read_diagram(diagram) },
   }
end

def read_element(element)
   {
      "Name"        => element.Name,
      "ElementID"   => element.ElementID,
      "Stereotype"  => element.Stereotype,
      "Type"        => element.Type,
      "Elements"    => element.Elements.to_enum.collect {|sub_element| read_element(sub_element) },
      "Connectors"  => element.Connectors.to_enum.collect {|connector| read_connector(connector) },
      "Diagrams"    => element.Diagrams.to_enum.collect {|diagram| read_diagram(diagram) },
   }
end

def read_connector(connector)
   {
      "Name"         => connector.Name,
      "ConnectorID"  => connector.ConnectorID,
      "Direction"    => connector.Direction,
      "ClientID"     => connector.ClientID,
      "ClientEnd"    => read_connector_end(connector.ClientEnD),
      "SupplierID"   => connector.SupplierID,
      "SupplierEnd"  => read_connector_end(connector.SupplierEnD),
      "Stereotype"   => connector.Stereotype,
      "Type"         => connector.Type,
   }
end

def read_connector_end(connector_end)
   {
      "Role"   => connector_end.Role,
   }
end

def read_diagram(diagram)
   {
      "Name"            => diagram.Name,
      "DiagramID"       => diagram.DiagramID,
      "Stereotype"      => diagram.Stereotype,
      "Type"            => diagram.Type,
      "DiagramObjects"  => diagram.DiagramObjects.to_enum.collect {|obj| read_diagram_object(obj) },
      "DiagramLinks"    => diagram.DiagramLinks.to_enum.collect {|link| read_diagram_link(link) },
   }
end

def read_diagram_object(diagram_object)
   {
      "ElementID"   => diagram_object.ElementID,
      "Style"       => diagram_object.Style,
      "Position"    => { "Bottom" => diagram_object.bottom, "Left" => diagram_object.left, "Right" => diagram_object.right, "Top" => diagram_object.top },
   }
end

def read_diagram_link(diagram_link)
   {
      "ConnectorID"  => diagram_link.ConnectorID,
      "IsHidden"     => diagram_link.IsHidden,
      "Style"        => diagram_link.Style,
   }
end

app = WIN32OLE.connect "EA.App"
models = app.Repository.Models.to_enum.collect {|model| read_package(model) }

puts YAML.dump(models)