hutch-xamplr 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +14 -0
- data/README.rdoc +24 -4
- data/Rakefile +3 -3
- data/VERSION.yml +2 -2
- data/examples/employees/final/xampl-gen.rb +38 -0
- data/examples/employees/final/xml/ddd-final.xml +86 -0
- data/examples/employees/first/xampl-gen.rb +38 -0
- data/examples/employees/first/xml/ddd-first.xml +48 -0
- data/examples/employees/twist/twist.graphml +333 -0
- data/examples/employees/twist/xampl-gen.rb +38 -0
- data/examples/employees/twist/xml/twist.xml +90 -0
- data/examples/employees/xamplr-twist.xml +2 -0
- data/examples/employees/yuml-diagrams/ddd-final.png +0 -0
- data/examples/employees/yuml-diagrams/ddd-final.yuml +8 -0
- data/examples/employees/yuml-diagrams/ddd-first.png +0 -0
- data/examples/employees/yuml-diagrams/ddd-first.yuml +7 -0
- data/examples/employees/yuml-diagrams/final-yed.png +0 -0
- data/examples/employees/yuml-diagrams/first-yed.png +0 -0
- data/examples/employees/yuml-diagrams/twist.png +0 -0
- data/examples/employees/yuml-diagrams/twist.yuml +12 -0
- data/examples/employees/yuml-diagrams/xamplr-final-no-mixins.png +0 -0
- data/examples/employees/yuml-diagrams/xamplr-final-simplified.png +0 -0
- data/examples/employees/yuml-diagrams/xamplr-final-with-mixins.png +0 -0
- data/examples/employees/yuml-diagrams/yuml-simplified.txt +19 -0
- data/examples/employees/yuml-diagrams/yuml-with-mixins.txt +53 -0
- data/examples/employees/yuml-diagrams/yuml.txt +27 -0
- data/examples/random-people-shared-addresses/xampl-gen.rb +2 -0
- data/examples/random-people/xampl-gen.rb +2 -0
- data/examples/read-testing/xampl-gen.rb +2 -0
- data/examples/tokyo-cabinet-experimental/xampl-gen.rb +2 -0
- data/lib/xamplr-generator.rb +0 -1
- data/lib/xamplr.rb +1 -1
- data/lib/xamplr/graphml-out.rb +0 -12
- data/lib/xamplr/persisters/tokyo-cabinet.rb +12 -2
- data/lib/xamplr/xampl-generator.rb +4 -0
- data/lib/xamplr/yuml-out.rb +136 -0
- metadata +30 -4
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby -w -I..
|
2
|
+
|
3
|
+
if $0 == __FILE__ then
|
4
|
+
|
5
|
+
class File
|
6
|
+
def File.sjoin(*args)
|
7
|
+
File.join(args.select{ | o | o })
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
$LOAD_PATH.unshift('../../lib/')
|
12
|
+
|
13
|
+
require 'xamplr-generator'
|
14
|
+
|
15
|
+
include XamplGenerator
|
16
|
+
include Xampl
|
17
|
+
|
18
|
+
Xampl.transaction("setup", :in_memory) do
|
19
|
+
directory = File.sjoin(".", "xampl_generated_code")
|
20
|
+
|
21
|
+
options = Xampl.make(Options) do |options|
|
22
|
+
options.new_index_attribute("pid").persisted = true
|
23
|
+
options.new_index_attribute("id")
|
24
|
+
|
25
|
+
options.resolve("http://example.com/employees", "Employees", "emp")
|
26
|
+
end
|
27
|
+
|
28
|
+
filenames = Dir.glob("./xml/**/*.xml")
|
29
|
+
|
30
|
+
generator = Generator.new
|
31
|
+
generator.go(:options => options,
|
32
|
+
:filenames => filenames,
|
33
|
+
:directory => directory)
|
34
|
+
|
35
|
+
puts generator.print_elements("./generated-elements.xml")
|
36
|
+
exit!
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
<!--
|
2
|
+
[RetirementPlan] ^[DefinedContribution],
|
3
|
+
[RetirementPlan] ^[DefinedBenefit],
|
4
|
+
[Payroll]^[HourlyPayroll],
|
5
|
+
[Payroll]^[SalariedPayroll],
|
6
|
+
[EmployeeType]->*[RetirementPlan],
|
7
|
+
[EmployeeType]->*[Payroll],
|
8
|
+
[Employee]*->[EmployeeType],
|
9
|
+
[Department]-*[Employee]
|
10
|
+
-->
|
11
|
+
<company pid=''
|
12
|
+
xmlns="http://example.com/employees">
|
13
|
+
|
14
|
+
<hourly-payroll pid='singleton'>
|
15
|
+
<__payroll__/>
|
16
|
+
</hourly-payroll>
|
17
|
+
<salaried-payroll pid='singleton'>
|
18
|
+
<__payroll__/>
|
19
|
+
</salaried-payroll>
|
20
|
+
|
21
|
+
<defined-contribution pid="singleton">
|
22
|
+
<retirement-plan/>
|
23
|
+
</defined-contribution>
|
24
|
+
<defined-benefit pid="singleton">
|
25
|
+
<retirement-plan/>
|
26
|
+
</defined-benefit>
|
27
|
+
|
28
|
+
<employee-type pid="">
|
29
|
+
<__payroll__ />
|
30
|
+
</employee-type>
|
31
|
+
|
32
|
+
<employee-type pid=''
|
33
|
+
title='janitor'>
|
34
|
+
<hourly-payroll pid='singleton'/>
|
35
|
+
<defined-contribution pid="singleton"/>
|
36
|
+
</employee-type>
|
37
|
+
<employee-type pid=''
|
38
|
+
title='receptionist'>
|
39
|
+
<hourly-payroll pid='singleton'/>
|
40
|
+
<defined-contribution pid="singleton"/>
|
41
|
+
</employee-type>
|
42
|
+
<employee-type pid=''
|
43
|
+
title='office-admin'>
|
44
|
+
<hourly-payroll pid='singleton'/>
|
45
|
+
<defined-benefit pid="singleton"/>
|
46
|
+
</employee-type>
|
47
|
+
<employee-type pid=''
|
48
|
+
title='engineer'>
|
49
|
+
<salaried-payroll pid='singleton'/>
|
50
|
+
<defined-benefit pid="singleton"/>
|
51
|
+
</employee-type>
|
52
|
+
<employee-type pid=''
|
53
|
+
title='manager'>
|
54
|
+
<salaried-payroll pid='singleton'/>
|
55
|
+
<defined-benefit pid="singleton"/>
|
56
|
+
</employee-type>
|
57
|
+
|
58
|
+
|
59
|
+
<department pid=''
|
60
|
+
name='widget design'>
|
61
|
+
<employee pid=''
|
62
|
+
name='tom'>
|
63
|
+
<employee-type pid=''
|
64
|
+
title='janitor'/>
|
65
|
+
</employee>
|
66
|
+
<employee pid=''
|
67
|
+
name='mary'
|
68
|
+
title='receptionist'>
|
69
|
+
<employee-type pid=''
|
70
|
+
title='receptionist'/>
|
71
|
+
</employee>
|
72
|
+
<employee pid=''
|
73
|
+
name='bob'
|
74
|
+
title='office-admin'>
|
75
|
+
<employee-type pid=''
|
76
|
+
title='office-admin'/>
|
77
|
+
</employee>
|
78
|
+
|
79
|
+
<employee pid=''
|
80
|
+
name='jack'>
|
81
|
+
<employee-type pid=''
|
82
|
+
title='engineer'/>
|
83
|
+
</employee>
|
84
|
+
<employee pid=''
|
85
|
+
name='jill'>
|
86
|
+
<employee-type pid=''
|
87
|
+
title='manager'/>
|
88
|
+
</employee>
|
89
|
+
</department>
|
90
|
+
</company>
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,12 @@
|
|
1
|
+
[RetirementPlan::Mixin]^[DefinedContribution],
|
2
|
+
[RetirementPlan::Mixin]^[DefinedBenefit],
|
3
|
+
[Payroll::Mixin]^[HourlyPayroll],
|
4
|
+
[Payroll::Mixin]^[SalariedPayroll],
|
5
|
+
[EmployeeType]->*[RetirementPlan::Mixin],
|
6
|
+
[EmployeeType]->*[Payroll::Mixin],
|
7
|
+
[Employee]*->[EmployeeType],
|
8
|
+
[Department]<->*[Employee],
|
9
|
+
[SalariedPayroll]->[Payroll],
|
10
|
+
[HourlyPayroll]->[Payroll],
|
11
|
+
[DefinedBenefit]->[RetirementPlan],
|
12
|
+
[DefinedContribution]->[RetirementPlan]
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,19 @@
|
|
1
|
+
[Employees::HourlyPayroll{bg:red}],
|
2
|
+
[Employees::Payrole{bg:blue}],
|
3
|
+
[Employees::SalariedPayroll{bg:red}],
|
4
|
+
[Employees::DefinedContribution{bg:red}],
|
5
|
+
[Employees::RetirementPlan{bg:blue}],
|
6
|
+
[Employees::DefinedBenefit{bg:red}],
|
7
|
+
[Employees::EmployeeType{bg:red}],
|
8
|
+
[Employees::Department{bg:red}],
|
9
|
+
[Employees::Employee{bg:red}],
|
10
|
+
[Employees::HourlyPayroll]->[Employees::Payrole],
|
11
|
+
[Employees::SalariedPayroll]->[Employees::Payrole],
|
12
|
+
[Employees::DefinedContribution]->[Employees::RetirementPlan],
|
13
|
+
[Employees::DefinedBenefit]->[Employees::RetirementPlan],
|
14
|
+
[Employees::EmployeeType]->[Employees::DefinedContribution],
|
15
|
+
[Employees::EmployeeType]->[Employees::HourlyPayroll],
|
16
|
+
[Employees::EmployeeType]->[Employees::SalariedPayroll],
|
17
|
+
[Employees::EmployeeType]->[Employees::DefinedBenefit],
|
18
|
+
[Employees::Department]->[Employees::Employee],
|
19
|
+
[Employees::Employee]->[Employees::EmployeeType]
|
@@ -0,0 +1,53 @@
|
|
1
|
+
,
|
2
|
+
[Employees::Company{bg:red}],
|
3
|
+
[Employees::CompanyMixin],
|
4
|
+
[Employees::HourlyPayroll{bg:red}],
|
5
|
+
[Employees::HourlyPayrollMixin],
|
6
|
+
[Employees::Payrole{bg:blue}],
|
7
|
+
[Employees::PayroleMixin],
|
8
|
+
[Employees::SalariedPayroll{bg:red}],
|
9
|
+
[Employees::SalariedPayrollMixin],
|
10
|
+
[Employees::DefinedContribution{bg:red}],
|
11
|
+
[Employees::DefinedContributionMixin],
|
12
|
+
[Employees::RetirementPlan{bg:blue}],
|
13
|
+
[Employees::RetirementPlanMixin],
|
14
|
+
[Employees::DefinedBenefit{bg:red}],
|
15
|
+
[Employees::DefinedBenefitMixin],
|
16
|
+
[Employees::EmployeeType{bg:red}],
|
17
|
+
[Employees::EmployeeTypeMixin],
|
18
|
+
[Employees::Department{bg:red}],
|
19
|
+
[Employees::DepartmentMixin],
|
20
|
+
[Employees::Employee{bg:red}],
|
21
|
+
[Employees::EmployeeMixin],
|
22
|
+
[Employees::Company]->[Employees::HourlyPayroll],
|
23
|
+
[Employees::HourlyPayrollMixin]^[Employees::Company],
|
24
|
+
[Employees::Company]->[Employees::SalariedPayroll],
|
25
|
+
[Employees::SalariedPayrollMixin]^[Employees::Company],
|
26
|
+
[Employees::Company]->[Employees::DefinedContribution],
|
27
|
+
[Employees::DefinedContributionMixin]^[Employees::Company],
|
28
|
+
[Employees::Company]->[Employees::DefinedBenefit],
|
29
|
+
[Employees::DefinedBenefitMixin]^[Employees::Company],
|
30
|
+
[Employees::Company]->[Employees::EmployeeType],
|
31
|
+
[Employees::EmployeeTypeMixin]^[Employees::Company],
|
32
|
+
[Employees::Company]->[Employees::Department],
|
33
|
+
[Employees::DepartmentMixin]^[Employees::Company],
|
34
|
+
[Employees::HourlyPayroll]->[Employees::Payrole],
|
35
|
+
[Employees::PayroleMixin]^[Employees::HourlyPayroll],
|
36
|
+
[Employees::SalariedPayroll]->[Employees::Payrole],
|
37
|
+
[Employees::PayroleMixin]^[Employees::SalariedPayroll],
|
38
|
+
[Employees::DefinedContribution]->[Employees::RetirementPlan],
|
39
|
+
[Employees::RetirementPlanMixin]^[Employees::DefinedContribution],
|
40
|
+
[Employees::DefinedBenefit]->[Employees::RetirementPlan],
|
41
|
+
[Employees::RetirementPlanMixin]^[Employees::DefinedBenefit],
|
42
|
+
[Employees::EmployeeType]->[Employees::DefinedContribution],
|
43
|
+
[Employees::DefinedContributionMixin]^[Employees::EmployeeType],
|
44
|
+
[Employees::EmployeeType]->[Employees::HourlyPayroll],
|
45
|
+
[Employees::HourlyPayrollMixin]^[Employees::EmployeeType],
|
46
|
+
[Employees::EmployeeType]->[Employees::SalariedPayroll],
|
47
|
+
[Employees::SalariedPayrollMixin]^[Employees::EmployeeType],
|
48
|
+
[Employees::EmployeeType]->[Employees::DefinedBenefit],
|
49
|
+
[Employees::DefinedBenefitMixin]^[Employees::EmployeeType],
|
50
|
+
[Employees::Department]->[Employees::Employee],
|
51
|
+
[Employees::EmployeeMixin]^[Employees::Department],
|
52
|
+
[Employees::Employee]->[Employees::EmployeeType],
|
53
|
+
[Employees::EmployeeTypeMixin]^[Employees::Employee]
|
@@ -0,0 +1,27 @@
|
|
1
|
+
,
|
2
|
+
[Employees::Company{bg:red}],
|
3
|
+
[Employees::HourlyPayroll{bg:red}],
|
4
|
+
[Employees::Payrole{bg:blue}],
|
5
|
+
[Employees::SalariedPayroll{bg:red}],
|
6
|
+
[Employees::DefinedContribution{bg:red}],
|
7
|
+
[Employees::RetirementPlan{bg:blue}],
|
8
|
+
[Employees::DefinedBenefit{bg:red}],
|
9
|
+
[Employees::EmployeeType{bg:red}],
|
10
|
+
[Employees::Department{bg:red}],
|
11
|
+
[Employees::Employee{bg:red}],
|
12
|
+
[Employees::Company]->[Employees::HourlyPayroll],
|
13
|
+
[Employees::Company]->[Employees::SalariedPayroll],
|
14
|
+
[Employees::Company]->[Employees::DefinedContribution],
|
15
|
+
[Employees::Company]->[Employees::DefinedBenefit],
|
16
|
+
[Employees::Company]->[Employees::EmployeeType],
|
17
|
+
[Employees::Company]->[Employees::Department],
|
18
|
+
[Employees::HourlyPayroll]->[Employees::Payrole],
|
19
|
+
[Employees::SalariedPayroll]->[Employees::Payrole],
|
20
|
+
[Employees::DefinedContribution]->[Employees::RetirementPlan],
|
21
|
+
[Employees::DefinedBenefit]->[Employees::RetirementPlan],
|
22
|
+
[Employees::EmployeeType]->[Employees::DefinedContribution],
|
23
|
+
[Employees::EmployeeType]->[Employees::HourlyPayroll],
|
24
|
+
[Employees::EmployeeType]->[Employees::SalariedPayroll],
|
25
|
+
[Employees::EmployeeType]->[Employees::DefinedBenefit],
|
26
|
+
[Employees::Department]->[Employees::Employee],
|
27
|
+
[Employees::Employee]->[Employees::EmployeeType]
|
data/lib/xamplr-generator.rb
CHANGED
data/lib/xamplr.rb
CHANGED
data/lib/xamplr/graphml-out.rb
CHANGED
@@ -83,19 +83,7 @@ module XamplGenerator
|
|
83
83
|
return false
|
84
84
|
end
|
85
85
|
|
86
|
-
# def ignore_package(package)
|
87
|
-
# puts "#{File.basename(__FILE__)}:#{__LINE__} pkg: [#{ package }], exclude: #{ @excluded_packages.inspect }, include: #{ @included_packages.inspect }"
|
88
|
-
# r = ignore_package_work(package)
|
89
|
-
# puts "#{File.basename(__FILE__)}:#{__LINE__} ignore? #{ r }"
|
90
|
-
# r
|
91
|
-
# end
|
92
|
-
|
93
|
-
#def write_graph_ml(filename, excluded_packages=[ 'C2', 'NavRelationships', 'App' ], included_packages=nil, include_mixins=false)
|
94
86
|
def write_graph_ml(filename, excluded_packages=[ ], included_packages=nil, include_mixins=true)
|
95
|
-
|
96
|
-
#puts "#{File.basename(__FILE__)}:#{__LINE__} no graphml yet"
|
97
|
-
#return
|
98
|
-
|
99
87
|
filename = devise_filename(filename)
|
100
88
|
|
101
89
|
@excluded_packages = Set.new(excluded_packages)
|
@@ -264,7 +264,7 @@ module Xampl
|
|
264
264
|
next unless result
|
265
265
|
|
266
266
|
mentioner = result['xampl_from']
|
267
|
-
class_name = result['
|
267
|
+
class_name = result['mentioned_class']
|
268
268
|
result_class = class_cache[class_name]
|
269
269
|
unless result_class then
|
270
270
|
class_name.split("::").each do | chunk |
|
@@ -316,6 +316,10 @@ module Xampl
|
|
316
316
|
msg = note_errors("TC[[#{ @filename }]]:: trancommit error: %s\n") do
|
317
317
|
@tc_db.tranabort
|
318
318
|
end
|
319
|
+
puts "------------------------------------------------------------------------"
|
320
|
+
puts "TokyoCabinetPersister Error:: #{ msg }/#{ e }"
|
321
|
+
puts e.backtrace.join("\n")
|
322
|
+
puts "------------------------------------------------------------------------"
|
319
323
|
raise "TokyoCabinetPersister Error:: #{ msg }/#{ e }"
|
320
324
|
else
|
321
325
|
note_errors("TC[[#{ @filename }]]:: trancommit error: %s\n") do
|
@@ -327,6 +331,12 @@ module Xampl
|
|
327
331
|
# end
|
328
332
|
end
|
329
333
|
# puts " num records: #{ @tc_db.rnum() }"
|
334
|
+
# puts "#{ __FILE__ }:#{ __LINE__ } keys..."
|
335
|
+
# @tc_db.keys.each do | key |
|
336
|
+
# meta = @tc_db[key]
|
337
|
+
# meta['xampl'] = (meta['xampl'] || "no rep")[0..25]
|
338
|
+
# puts " key: [#{ key }] -- #{ meta.inspect }"
|
339
|
+
# end
|
330
340
|
end
|
331
341
|
|
332
342
|
def write(xampl)
|
@@ -349,7 +359,7 @@ module Xampl
|
|
349
359
|
pk = @tc_db.genuid
|
350
360
|
mention_hash = {
|
351
361
|
'xampl_from' => place,
|
352
|
-
'
|
362
|
+
'mentioned_class' => xampl.class.name,
|
353
363
|
'pid' => xampl.get_the_index,
|
354
364
|
'xampl_to' => mention_place
|
355
365
|
}
|
@@ -7,6 +7,7 @@ module XamplGenerator
|
|
7
7
|
require "xamplr/xampl-hand-generated"
|
8
8
|
require "xamplr/simpleTemplate/simple-template"
|
9
9
|
require "xamplr/graphml-out.rb"
|
10
|
+
require "xamplr/yuml-out.rb"
|
10
11
|
|
11
12
|
class Attribute
|
12
13
|
attr_accessor :tag_name
|
@@ -307,6 +308,9 @@ module XamplGenerator
|
|
307
308
|
graphml_out = GraphMLOut.new(@elements_map)
|
308
309
|
graphml_out.write_graph_ml(filename)
|
309
310
|
|
311
|
+
yuml_out = YUMLOut.new(@elements_map)
|
312
|
+
yuml_out.write_yuml(filename)
|
313
|
+
|
310
314
|
end
|
311
315
|
|
312
316
|
def go(args, &eval_context)
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
module XamplGenerator
|
5
|
+
|
6
|
+
class YUMLOut
|
7
|
+
|
8
|
+
def initialize(elements_map)
|
9
|
+
@elements_map = elements_map
|
10
|
+
end
|
11
|
+
|
12
|
+
def devise_filename(filename)
|
13
|
+
bn = File.basename(filename)
|
14
|
+
ext = File.extname(bn)
|
15
|
+
bn = bn[0..(bn.size - ext.size - 1)]
|
16
|
+
fn = "#{bn}.yuml"
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_class_nodes(element, include_mixins)
|
20
|
+
return if ignore_package(element.package)
|
21
|
+
|
22
|
+
class_name = "#{ element.package }::#{ element.class_name }"
|
23
|
+
mixin_name = "#{ element.package }::#{ element.class_name }"
|
24
|
+
|
25
|
+
@class_by_nstag[element.nstag] = element
|
26
|
+
@class_names_by_nstag[element.nstag] = class_name
|
27
|
+
|
28
|
+
if element.persisted then
|
29
|
+
write_entity_node(class_name, element.kind)
|
30
|
+
else
|
31
|
+
write_internal_node(class_name, element.kind)
|
32
|
+
end
|
33
|
+
|
34
|
+
if include_mixins then
|
35
|
+
write_mixin_node(class_name)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def generate_edges(element, include_mixins)
|
40
|
+
return if ignore_package(element.package)
|
41
|
+
|
42
|
+
element_name = @class_names_by_nstag[ element.nstag ]
|
43
|
+
|
44
|
+
element.child_element_child.each do | celement |
|
45
|
+
next if ignore_package(celement.package)
|
46
|
+
|
47
|
+
celement_name = @class_names_by_nstag[ celement.name ]
|
48
|
+
referenced_element = @class_by_nstag[ celement.name ]
|
49
|
+
|
50
|
+
if referenced_element.persisted then
|
51
|
+
write_entity_ref_edge(element_name, celement_name)
|
52
|
+
else
|
53
|
+
write_internal_ref_edge(element_name, celement_name)
|
54
|
+
end
|
55
|
+
if include_mixins then
|
56
|
+
write_mixin_ref_edge(element_name, celement_name)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def ignore_package(package)
|
62
|
+
return true if @excluded_packages.member?(package)
|
63
|
+
return false if @included_packages.nil?
|
64
|
+
return true unless @included_packages.member?(package)
|
65
|
+
return false
|
66
|
+
end
|
67
|
+
|
68
|
+
def write_yuml(base_filename, excluded_packages=[ ], included_packages=nil, include_mixins=false)
|
69
|
+
filename = devise_filename(base_filename)
|
70
|
+
|
71
|
+
@excluded_packages = Set.new(excluded_packages)
|
72
|
+
@included_packages = included_packages ? Set.new(included_packages) : nil
|
73
|
+
|
74
|
+
@class_names_by_nstag = {} # NOTE -- this is used by yuml!!
|
75
|
+
@class_by_nstag = {} # NOTE -- this is used by yuml!!
|
76
|
+
|
77
|
+
@initialise_output = true
|
78
|
+
|
79
|
+
File.open(filename, "w") do | out |
|
80
|
+
@out = out
|
81
|
+
|
82
|
+
@elements_map.each_value do |elements|
|
83
|
+
elements.element_child.each do |element|
|
84
|
+
generate_class_nodes(element, include_mixins)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
@elements_map.each_value do |elements|
|
89
|
+
elements.element_child.each do |element|
|
90
|
+
generate_edges(element, include_mixins)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
return nil
|
96
|
+
end
|
97
|
+
|
98
|
+
def new_statement
|
99
|
+
if @initialise_output then
|
100
|
+
@initialise_output = false
|
101
|
+
else
|
102
|
+
@out << ",\n"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def write_entity_node(class_name, kind)
|
107
|
+
new_statement
|
108
|
+
@out << "[#{ class_name }{bg:red}]"
|
109
|
+
end
|
110
|
+
|
111
|
+
def write_internal_node(class_name, kind)
|
112
|
+
new_statement
|
113
|
+
@out << "[#{ class_name }{bg:blue}]"
|
114
|
+
end
|
115
|
+
|
116
|
+
def write_mixin_node(class_name)
|
117
|
+
new_statement
|
118
|
+
@out << "[#{ class_name }Mixin]"
|
119
|
+
end
|
120
|
+
|
121
|
+
def write_entity_ref_edge(class_node, external_node)
|
122
|
+
new_statement
|
123
|
+
@out << "[#{ class_node }]->[#{ external_node }]"
|
124
|
+
end
|
125
|
+
|
126
|
+
def write_internal_ref_edge(class_node, internal_node)
|
127
|
+
new_statement
|
128
|
+
@out << "[#{ class_node }]->[#{ internal_node }]"
|
129
|
+
end
|
130
|
+
|
131
|
+
def write_mixin_ref_edge(class_node, mixin_node)
|
132
|
+
new_statement
|
133
|
+
@out << "[#{ mixin_node }Mixin]^[#{ class_node }]"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|