Class: XamplGenerator::YUMLOut

Inherits:
Object
  • Object
show all
Defined in:
lib/xamplr/yuml-out.rb

Instance Method Summary collapse

Constructor Details

#initialize(elements_map) ⇒ YUMLOut

Returns a new instance of YUMLOut.



8
9
10
# File 'lib/xamplr/yuml-out.rb', line 8

def initialize(elements_map)
  @elements_map = elements_map
end

Instance Method Details

#devise_filename(filename) ⇒ Object



12
13
14
15
16
17
# File 'lib/xamplr/yuml-out.rb', line 12

def devise_filename(filename)
  bn = File.basename(filename)
  ext = File.extname(bn)
  bn = bn[0..(bn.size - ext.size - 1)]
  fn = "#{bn}.yuml"
end

#generate_class_nodes(element, include_mixins) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/xamplr/yuml-out.rb', line 19

def generate_class_nodes(element, include_mixins)
  return if ignore_package(element.package)

  class_name = "#{ element.package }::#{ element.class_name }"
  mixin_name = "#{ element.package }::#{ element.class_name }"

  @class_by_nstag[element.nstag] = element
  @class_names_by_nstag[element.nstag] = class_name

  if element.persisted then
    write_entity_node(class_name, element.kind)
  else
    write_internal_node(class_name, element.kind)
  end

  if include_mixins then
    write_mixin_node(class_name)
  end
end

#generate_edges(element, include_mixins) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/xamplr/yuml-out.rb', line 39

def generate_edges(element, include_mixins)
  return if ignore_package(element.package)

  element_name = @class_names_by_nstag[ element.nstag ]

  element.child_element_child.each do | celement |
    next if ignore_package(celement.package)

    celement_name = @class_names_by_nstag[ celement.name ]
    referenced_element = @class_by_nstag[ celement.name ]

    if referenced_element.persisted then
      write_entity_ref_edge(element_name, celement_name)
    else
      write_internal_ref_edge(element_name, celement_name)
    end
    if include_mixins then
      write_mixin_ref_edge(element_name, celement_name)
    end
  end
end

#ignore_package(package) ⇒ Object



61
62
63
64
65
66
# File 'lib/xamplr/yuml-out.rb', line 61

def ignore_package(package)
  return true if @excluded_packages.member?(package)
  return false if @included_packages.nil?
  return true unless @included_packages.member?(package)
  return false
end

#new_statementObject



98
99
100
101
102
103
104
# File 'lib/xamplr/yuml-out.rb', line 98

def new_statement
  if @initialise_output then
    @initialise_output = false
  else
    @out << ",\n"
  end
end

#write_entity_node(class_name, kind) ⇒ Object



106
107
108
109
# File 'lib/xamplr/yuml-out.rb', line 106

def write_entity_node(class_name, kind)
  new_statement
  @out << "[#{ class_name }{bg:red}]"
end

#write_entity_ref_edge(class_node, external_node) ⇒ Object



121
122
123
124
# File 'lib/xamplr/yuml-out.rb', line 121

def write_entity_ref_edge(class_node, external_node)
  new_statement
  @out << "[#{ class_node }]->[#{ external_node }]"
end

#write_internal_node(class_name, kind) ⇒ Object



111
112
113
114
# File 'lib/xamplr/yuml-out.rb', line 111

def write_internal_node(class_name, kind)
  new_statement
  @out << "[#{ class_name }{bg:blue}]"
end

#write_internal_ref_edge(class_node, internal_node) ⇒ Object



126
127
128
129
# File 'lib/xamplr/yuml-out.rb', line 126

def write_internal_ref_edge(class_node, internal_node)
  new_statement
  @out << "[#{ class_node }]->[#{ internal_node }]"
end

#write_mixin_node(class_name) ⇒ Object



116
117
118
119
# File 'lib/xamplr/yuml-out.rb', line 116

def write_mixin_node(class_name)
  new_statement
  @out << "[#{ class_name }Mixin]"
end

#write_mixin_ref_edge(class_node, mixin_node) ⇒ Object



131
132
133
134
# File 'lib/xamplr/yuml-out.rb', line 131

def write_mixin_ref_edge(class_node, mixin_node)
  new_statement
  @out << "[#{ mixin_node }Mixin]^[#{ class_node }]"
end

#write_yuml(base_filename, excluded_packages = [ ], included_packages = nil, include_mixins = false) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/xamplr/yuml-out.rb', line 68

def write_yuml(base_filename, excluded_packages=[ ], included_packages=nil, include_mixins=false)
  filename = devise_filename(base_filename)

  @excluded_packages = Set.new(excluded_packages)
  @included_packages = included_packages ? Set.new(included_packages) : nil

  @class_names_by_nstag = {} # NOTE -- this is used by yuml!!
  @class_by_nstag = {} # NOTE -- this is used by yuml!!

  @initialise_output = true

  File.open(filename, "w") do | out |
    @out = out

    @elements_map.each_value do |elements|
      elements.element_child.each do |element|
        generate_class_nodes(element, include_mixins)
      end
    end

    @elements_map.each_value do |elements|
      elements.element_child.each do |element|
        generate_edges(element, include_mixins)
      end
    end
  end

  return nil
end