rgen 0.7.0 → 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +27 -0
- data/Project.yaml +21 -0
- data/README.rdoc +1 -1
- data/Rakefile +22 -25
- data/lib/rgen/ecore/ecore.rb +1 -1
- data/lib/rgen/ecore/ecore_ext.rb +9 -1
- data/lib/rgen/ecore/ecore_to_json.rb +188 -0
- data/lib/rgen/ecore/ecore_to_ruby.rb +146 -47
- data/lib/rgen/fragment/fragmented_model.rb +2 -0
- data/lib/rgen/fragment/model_fragment.rb +3 -0
- data/lib/rgen/instantiator/default_xml_instantiator.rb +93 -88
- data/lib/rgen/metamodel_builder/builder_extensions.rb +33 -9
- data/lib/rgen/metamodel_builder/builder_runtime.rb +12 -5
- data/lib/rgen/template_language/output_handler.rb +52 -19
- data/lib/rgen/template_language/template_container.rb +17 -7
- data/lib/rgen/template_language.rb +2 -1
- data/test/array_extensions_test.rb +7 -7
- data/test/ea_instantiator_test.rb +2 -2
- data/test/ea_serializer_test.rb +2 -2
- data/test/ecore_self_test.rb +2 -2
- data/test/ecore_to_ruby_test.rb +73 -0
- data/test/environment_test.rb +2 -2
- data/test/json_test.rb +4 -4
- data/test/metamodel_builder_test.rb +79 -44
- data/test/metamodel_from_ecore_test.rb +1 -1
- data/test/metamodel_order_test.rb +2 -2
- data/test/metamodel_roundtrip_test.rb +2 -2
- data/test/method_delegation_test.rb +5 -5
- data/test/model_builder/builder_context_test.rb +3 -3
- data/test/model_builder/builder_test.rb +11 -11
- data/test/model_builder/reference_resolver_test.rb +3 -3
- data/test/model_builder/serializer_test.rb +2 -2
- data/test/model_fragment_test.rb +2 -2
- data/test/output_handler_test.rb +2 -2
- data/test/qualified_name_provider_test.rb +2 -2
- data/test/qualified_name_resolver_test.rb +4 -4
- data/test/reference_resolver_test.rb +4 -4
- data/test/rgen_test.rb +2 -1
- data/test/template_language_test/templates/indent_nonl_at_eof_test/test.tpl +14 -0
- data/test/template_language_test/templates/indent_same_line_sub/test.tpl +16 -0
- data/test/template_language_test/templates/line_endings/mixed.tpl +6 -0
- data/test/template_language_test/templates/line_endings/unix.tpl +6 -0
- data/test/template_language_test/templates/line_endings/windows.tpl +6 -0
- data/test/template_language_test/templates/ws_test.tpl +21 -0
- data/test/template_language_test.rb +60 -9
- data/test/testmodel/class_model_checker.rb +17 -17
- data/test/testmodel/ecore_model_checker.rb +13 -13
- data/test/testmodel/object_model_checker.rb +6 -6
- data/test/transformer_test.rb +3 -3
- data/test/util/file_cache_map_test.rb +2 -2
- data/test/util/pattern_matcher_test.rb +7 -7
- data/test/xml_instantiator_test/simple_ecore_model_checker.rb +12 -12
- data/test/xml_instantiator_test.rb +8 -8
- metadata +93 -22
- data/test/metamodel_roundtrip_test/TestModel_Regenerated.rb +0 -71
- data/test/metamodel_roundtrip_test/houseMetamodel_Regenerated.ecore +0 -162
- data/test/metamodel_roundtrip_test/using_builtin_types_serialized.ecore +0 -9
- data/test/model_builder/ecore_internal.rb +0 -113
- data/test/testmodel/ea_testmodel_regenerated.xml +0 -813
- data/test/util/file_cache_map_test/testdir/fileA +0 -1
@@ -8,107 +8,112 @@ module Instantiator
|
|
8
8
|
# Derive your own instantiator from this class or use it as is.
|
9
9
|
#
|
10
10
|
class DefaultXMLInstantiator < NodebasedXMLInstantiator
|
11
|
-
|
11
|
+
include Util::NameHelper
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
13
|
+
NamespaceDescriptor = Struct.new(:prefix, :target)
|
14
|
+
|
15
|
+
class << self
|
16
|
+
|
17
|
+
def map_tag_ns(from, to, prefix="")
|
18
|
+
tag_ns_map[from] = NamespaceDescriptor.new(prefix, to)
|
19
|
+
end
|
20
|
+
|
21
|
+
def tag_ns_map # :nodoc:
|
22
|
+
@tag_ns_map ||={}
|
23
|
+
@tag_ns_map
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(env, default_module, create_mm=false)
|
29
|
+
super(env)
|
30
|
+
@default_module = default_module
|
31
|
+
@create_mm = create_mm
|
32
|
+
end
|
33
|
+
|
34
|
+
def on_descent(node)
|
35
|
+
obj = new_object(node)
|
36
|
+
@env << obj unless obj.nil?
|
37
|
+
node.object = obj
|
38
|
+
node.attributes.each_pair { |k,v| set_attribute(node, k, v) }
|
39
|
+
end
|
40
40
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
41
|
+
def on_ascent(node)
|
42
|
+
node.children.each { |c| assoc_p2c(node, c) }
|
43
|
+
node.object.class.has_attr 'chardata', Object unless node.object.respond_to?(:chardata)
|
44
|
+
set_attribute(node, "chardata", node.chardata)
|
45
|
+
end
|
46
|
+
|
47
47
|
def class_name(str)
|
48
48
|
saneClassName(str)
|
49
49
|
end
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
51
|
+
def new_object(node)
|
52
|
+
ns_desc = self.class.tag_ns_map[node.namespace]
|
53
|
+
class_name = class_name(ns_desc.nil? ? node.qtag : ns_desc.prefix+node.tag)
|
54
|
+
mod = (ns_desc && ns_desc.target) || @default_module
|
55
|
+
build_on_error(NameError, :build_class, class_name, mod) do
|
56
|
+
begin
|
57
|
+
mod.const_get(class_name, false).new
|
58
|
+
rescue ArgumentError
|
59
|
+
# Ruby 1.8
|
60
|
+
mod.const_get(class_name).new
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
59
64
|
|
60
|
-
|
61
|
-
|
62
|
-
|
65
|
+
def build_class(name, mod)
|
66
|
+
mod.const_set(name, Class.new(RGen::MetamodelBuilder::MMBase))
|
67
|
+
end
|
63
68
|
|
64
69
|
def method_name(str)
|
65
70
|
saneMethodName(str)
|
66
71
|
end
|
67
72
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
73
|
+
def assoc_p2c(parent, child)
|
74
|
+
return unless parent.object && child.object
|
75
|
+
method_name = method_name(className(child.object))
|
76
|
+
build_on_error(NoMethodError, :build_p2c_assoc, parent, child, method_name) do
|
77
|
+
parent.object.addGeneric(method_name, child.object)
|
78
|
+
child.object.setGeneric("parent", parent.object)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def build_p2c_assoc(parent, child, method_name)
|
83
|
+
parent.object.class.has_many(method_name, child.object.class)
|
84
|
+
child.object.class.has_one("parent", RGen::MetamodelBuilder::MMBase)
|
85
|
+
end
|
86
|
+
|
87
|
+
def set_attribute(node, attr, value)
|
88
|
+
return unless node.object
|
89
|
+
build_on_error(NoMethodError, :build_attribute, node, attr, value) do
|
90
|
+
node.object.setGeneric(method_name(attr), value)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def build_attribute(node, attr, value)
|
95
|
+
node.object.class.has_attr(method_name(attr))
|
96
|
+
end
|
92
97
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
98
|
+
protected
|
99
|
+
|
100
|
+
# Helper method for implementing classes.
|
101
|
+
# This method yields the given block.
|
102
|
+
# If the metamodel should be create automatically (see constructor)
|
103
|
+
# rescues +error+ and calls +builder_method+ with +args+, then
|
104
|
+
# yields the block again.
|
105
|
+
def build_on_error(error, builder_method, *args)
|
106
|
+
begin
|
107
|
+
yield
|
108
|
+
rescue error
|
109
|
+
if @create_mm
|
110
|
+
send(builder_method, *args)
|
111
|
+
yield
|
112
|
+
else
|
113
|
+
raise
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
112
117
|
|
113
118
|
end
|
114
119
|
|
@@ -319,6 +319,10 @@ module BuilderExtensions
|
|
319
319
|
end
|
320
320
|
<% if name != "class" %>
|
321
321
|
alias <%= name %> get<%= firstToUpper(name) %>
|
322
|
+
<% else %>
|
323
|
+
def getGeneric(role)
|
324
|
+
send("get\#{firstToUpper(role.to_s)}")
|
325
|
+
end
|
322
326
|
<% end %>
|
323
327
|
|
324
328
|
CODE
|
@@ -380,10 +384,14 @@ module BuilderExtensions
|
|
380
384
|
@@many_read_builder ||= ERB.new <<-CODE
|
381
385
|
|
382
386
|
def get<%= firstToUpper(name) %>
|
383
|
-
( @<%= name %> ? @<%= name %>.dup : [] )
|
387
|
+
( defined?(@<%= name %>) ? @<%= name %>.dup : [] )
|
384
388
|
end
|
385
389
|
<% if name != "class" %>
|
386
390
|
alias <%= name %> get<%= firstToUpper(name) %>
|
391
|
+
<% else %>
|
392
|
+
def getGeneric(role)
|
393
|
+
send("get\#{firstToUpper(role.to_s)}")
|
394
|
+
end
|
387
395
|
<% end %>
|
388
396
|
|
389
397
|
CODE
|
@@ -394,8 +402,8 @@ module BuilderExtensions
|
|
394
402
|
@@many_write_builder ||= ERB.new <<-CODE
|
395
403
|
|
396
404
|
def add<%= firstToUpper(name) %>(val, index=-1)
|
397
|
-
@<%= name %> = [] unless @<%= name %>
|
398
|
-
return if val.nil? || (
|
405
|
+
@<%= name %> = [] unless defined?(@<%= name %>)
|
406
|
+
return if val.nil? || (val.is_a?(MMBase) || val.is_a?(MMGeneric)) && @<%= name %>.any? {|e| e.equal?(val)}
|
399
407
|
<%= type_check_code("val", props) %>
|
400
408
|
@<%= name %>.insert(index, val)
|
401
409
|
<% if other_role %>
|
@@ -407,9 +415,9 @@ module BuilderExtensions
|
|
407
415
|
end
|
408
416
|
|
409
417
|
def remove<%= firstToUpper(name) %>(val)
|
410
|
-
@<%= name %> = [] unless @<%= name %>
|
418
|
+
@<%= name %> = [] unless defined?(@<%= name %>)
|
411
419
|
@<%= name %>.each_with_index do |e,i|
|
412
|
-
if e.
|
420
|
+
if e.equal?(val)
|
413
421
|
@<%= name %>.delete_at(i)
|
414
422
|
<% if props.reference? && props.value(:containment) %>
|
415
423
|
val._set_container(nil, nil)
|
@@ -428,14 +436,30 @@ module BuilderExtensions
|
|
428
436
|
get<%= firstToUpper(name) %>.each {|e|
|
429
437
|
remove<%= firstToUpper(name) %>(e)
|
430
438
|
}
|
431
|
-
|
432
|
-
|
439
|
+
@<%= name %> = [] unless defined?(@<%= name %>)
|
440
|
+
<% if props.reference? %>
|
441
|
+
val.uniq {|elem| elem.object_id }.each {|elem|
|
442
|
+
next if elem.nil?
|
443
|
+
<%= type_check_code("elem", props) %>
|
444
|
+
@<%= name %> << elem
|
445
|
+
<% if other_role %>
|
446
|
+
elem._register<%= firstToUpper(other_role) %>(self) unless elem.is_a?(MMGeneric)
|
447
|
+
<% end %>
|
448
|
+
<% if props.value(:containment) %>
|
449
|
+
elem._set_container(self, :<%= name %>)
|
450
|
+
<% end %>
|
433
451
|
}
|
452
|
+
<% else %>
|
453
|
+
val.each {|elem|
|
454
|
+
<%= type_check_code("elem", props) %>
|
455
|
+
@<%= name %> << elem
|
456
|
+
}
|
457
|
+
<% end %>
|
434
458
|
end
|
435
459
|
alias <%= name %>= set<%= firstToUpper(name) %>
|
436
460
|
|
437
461
|
def _register<%= firstToUpper(name) %>(val)
|
438
|
-
@<%= name %> = [] unless @<%= name %>
|
462
|
+
@<%= name %> = [] unless defined?(@<%= name %>)
|
439
463
|
@<%= name %>.push val
|
440
464
|
<% if props.reference? && props.value(:containment) %>
|
441
465
|
val._set_container(self, :<%= name %>)
|
@@ -515,7 +539,7 @@ module BuilderExtensions
|
|
515
539
|
code << "\n"
|
516
540
|
expected = "Integer"
|
517
541
|
elsif props.impl_type.is_a?(Class)
|
518
|
-
code << "unless #{varname}.nil? || #{varname}.is_a?(#{props.impl_type}) || #{varname}.is_a?(MMGeneric)"
|
542
|
+
code << "unless #{varname}.nil? || #{varname}.is_a?(ObjectSpace._id2ref(#{props.impl_type.object_id})) || #{varname}.is_a?(MMGeneric)"
|
519
543
|
code << " || #{varname}.is_a?(BigDecimal)" if props.impl_type == Float && defined?(BigDecimal)
|
520
544
|
code << "\n"
|
521
545
|
expected = props.impl_type.to_s
|
@@ -58,14 +58,17 @@ module BuilderRuntime
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
|
62
|
-
send("get#{firstToUpper(role.to_s)}")
|
63
|
-
end
|
61
|
+
alias getGeneric send
|
64
62
|
|
65
63
|
def getGenericAsArray(role)
|
66
64
|
result = getGeneric(role)
|
67
|
-
|
68
|
-
|
65
|
+
if result.nil?
|
66
|
+
[]
|
67
|
+
elsif result.is_a?(Array)
|
68
|
+
result
|
69
|
+
else
|
70
|
+
[result]
|
71
|
+
end
|
69
72
|
end
|
70
73
|
|
71
74
|
def eIsSet(role)
|
@@ -100,6 +103,10 @@ module BuilderRuntime
|
|
100
103
|
|
101
104
|
# if a block is given, calls the block on every contained element in depth first order.
|
102
105
|
# if the block returns :prune, recursion will stop at this point.
|
106
|
+
#
|
107
|
+
# BEWARE of concurrent modification of contained elements while iterating!
|
108
|
+
# (adding/removing containers or contained elements)
|
109
|
+
# if you need to do such modifications, use the variant without a block instead.
|
103
110
|
#
|
104
111
|
# if no block is given builds and returns a list of all contained elements.
|
105
112
|
#
|
@@ -6,15 +6,28 @@ module RGen
|
|
6
6
|
module TemplateLanguage
|
7
7
|
|
8
8
|
class OutputHandler
|
9
|
-
attr_writer :indent
|
10
9
|
attr_accessor :noIndentNextLine
|
11
10
|
|
12
11
|
def initialize(indent=0, indentString=" ", mode=:explicit)
|
13
12
|
self.mode = mode
|
14
|
-
@indent = indent
|
15
13
|
@indentString = indentString
|
16
14
|
@state = :wait_for_nonws
|
17
15
|
@output = ""
|
16
|
+
@indent_string = @indentString*indent
|
17
|
+
end
|
18
|
+
|
19
|
+
def indent=(i)
|
20
|
+
@indent_string = @indentString*i
|
21
|
+
end
|
22
|
+
|
23
|
+
NL = "\n"
|
24
|
+
LFNL = "\r\n"
|
25
|
+
if RUBY_VERSION.start_with?("1.8")
|
26
|
+
NL_CHAR = 10
|
27
|
+
LF_CHAR = 13
|
28
|
+
else
|
29
|
+
NL_CHAR = "\n"
|
30
|
+
LF_CHAR = "\r"
|
18
31
|
end
|
19
32
|
|
20
33
|
# ERB will call this method for every string s which is part of the
|
@@ -22,36 +35,46 @@ module TemplateLanguage
|
|
22
35
|
# call this method for every part of s which is terminated by a \n
|
23
36
|
#
|
24
37
|
def concat(s)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
38
|
+
if @ignoreNextNL
|
39
|
+
idx = s.index(NL)
|
40
|
+
if idx && s[0..idx].strip.empty?
|
41
|
+
s = s[idx+1..-1]
|
42
|
+
end
|
43
|
+
@ignoreNextNL = false unless s.strip.empty?
|
44
|
+
end
|
45
|
+
if @ignoreNextWS
|
46
|
+
s = s.lstrip
|
47
|
+
@ignoreNextWS = false unless s.empty?
|
48
|
+
end
|
30
49
|
if @mode == :direct
|
31
50
|
@output.concat(s)
|
32
51
|
elsif @mode == :explicit
|
33
52
|
while s.size > 0
|
34
53
|
if @state == :wait_for_nl
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
54
|
+
idx = s.index(NL)
|
55
|
+
if idx
|
56
|
+
if s[idx-1] == LF_CHAR
|
57
|
+
@output.concat(s[0..idx].rstrip)
|
58
|
+
@output.concat(LFNL)
|
59
|
+
else
|
60
|
+
@output.concat(s[0..idx].rstrip)
|
61
|
+
@output.concat(NL)
|
62
|
+
end
|
63
|
+
s = s[idx+1..-1]
|
39
64
|
@state = :wait_for_nonws
|
40
65
|
else
|
41
66
|
@output.concat(s)
|
42
|
-
|
67
|
+
break
|
43
68
|
end
|
44
69
|
elsif @state == :wait_for_nonws
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
@output.concat(@
|
70
|
+
s = s.lstrip
|
71
|
+
if !s.empty?
|
72
|
+
unless @noIndentNextLine || (@output[-1] && @output[-1] != NL_CHAR)
|
73
|
+
@output.concat(@indent_string)
|
49
74
|
else
|
50
75
|
@noIndentNextLine = false
|
51
76
|
end
|
52
77
|
@state = :wait_for_nl
|
53
|
-
else
|
54
|
-
s = ""
|
55
78
|
end
|
56
79
|
end
|
57
80
|
end
|
@@ -68,6 +91,16 @@ module TemplateLanguage
|
|
68
91
|
@output.concat(s)
|
69
92
|
end
|
70
93
|
|
94
|
+
def direct_concat_allow_indent(s)
|
95
|
+
unless @noIndentNextLine || (@output[-1] && @output[-1] != NL_CHAR)
|
96
|
+
@output.concat(@indent_string)
|
97
|
+
else
|
98
|
+
@noIndentNextLine = false
|
99
|
+
end
|
100
|
+
@state = :wait_for_nl
|
101
|
+
@output.concat(s)
|
102
|
+
end
|
103
|
+
|
71
104
|
def ignoreNextNL
|
72
105
|
@ignoreNextNL = true
|
73
106
|
end
|
@@ -84,4 +117,4 @@ module TemplateLanguage
|
|
84
117
|
|
85
118
|
end
|
86
119
|
|
87
|
-
end
|
120
|
+
end
|
@@ -84,7 +84,7 @@ module RGen
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def ws
|
87
|
-
_direct_concat(" ")
|
87
|
+
_direct_concat(" ", true)
|
88
88
|
end
|
89
89
|
|
90
90
|
def iinc
|
@@ -134,7 +134,7 @@ module RGen
|
|
134
134
|
sep = params[:separator]
|
135
135
|
params[:foreach].each_with_index {|e,i|
|
136
136
|
_direct_concat(sep.to_s) if sep && i > 0
|
137
|
-
|
137
|
+
_expand(template, args, params.merge({:for => e}))
|
138
138
|
}
|
139
139
|
end
|
140
140
|
|
@@ -147,7 +147,12 @@ module RGen
|
|
147
147
|
@indent = params[:indent] || @indent
|
148
148
|
noIndentNextLine = params[:_noIndentNextLine] ||
|
149
149
|
(@output.is_a?(OutputHandler) && @output.noIndentNextLine) ||
|
150
|
-
|
150
|
+
# the following line actually defines the noIndentNextLine state:
|
151
|
+
# we don't indent the next line if the previous line was not finished,
|
152
|
+
# i.e. if output has been generated but is not terminated by a newline
|
153
|
+
# BEWARE: the initial evaluation of the ERB template during template loading
|
154
|
+
# also writes to @output (it creates a String); we must ignore this
|
155
|
+
(@output.is_a?(OutputHandler) && @output.to_s.size > 0 && @output.to_s[-1] != "\n"[0])
|
151
156
|
caller = params[:_caller] || self
|
152
157
|
old_context, @context = @context, context if context
|
153
158
|
local_output = nil
|
@@ -157,7 +162,7 @@ module RGen
|
|
157
162
|
old_output, @output = @output, OutputHandler.new(@indent, @parent.indentString)
|
158
163
|
@output.noIndentNextLine = noIndentNextLine
|
159
164
|
_call_template(tplname, @context, args, caller == self)
|
160
|
-
old_output.noIndentNextLine = false if old_output.is_a?(OutputHandler) &&
|
165
|
+
old_output.noIndentNextLine = false if old_output.is_a?(OutputHandler) && !@output.noIndentNextLine
|
161
166
|
local_output, @output = @output, old_output
|
162
167
|
else
|
163
168
|
local_output = @parent.expand(template, *(args.dup << {:for => @context, :indent => @indent, :_noIndentNextLine => noIndentNextLine, :_evalOnly => true, :_caller => caller}))
|
@@ -205,13 +210,18 @@ module RGen
|
|
205
210
|
raise StandardError.new("Template class not matching: #{tpl} for #{context.class.name}") unless found
|
206
211
|
end
|
207
212
|
|
208
|
-
def _direct_concat(s)
|
213
|
+
def _direct_concat(s, allow_indent=false)
|
209
214
|
if @output.is_a? OutputHandler
|
210
|
-
|
215
|
+
if allow_indent
|
216
|
+
@output.direct_concat_allow_indent(s)
|
217
|
+
else
|
218
|
+
@output.direct_concat(s)
|
219
|
+
end
|
211
220
|
else
|
212
221
|
@output << s
|
213
222
|
end
|
214
|
-
end
|
215
223
|
|
224
|
+
end
|
225
|
+
|
216
226
|
def _detectNewLinePattern(text)
|
217
227
|
tests = 0
|
218
228
|
rnOccurances = 0
|
@@ -129,6 +129,7 @@ module RGen
|
|
129
129
|
# Starting from this point one can add indentation and newlines as required by using
|
130
130
|
# explicit formatting commands:
|
131
131
|
# * <code><%nl%></code> (newline) starts a new line
|
132
|
+
# * <code><%ws%></code> (whitespace) adds an explicit space
|
132
133
|
# * <code><%iinc%></code> (indentation increment) increases the current indentation
|
133
134
|
# * <code><%idec%></code> (indentation decrement) decreases the current indentation
|
134
135
|
# * <code><%nonl%></code> (no newline) ignore next newline
|
@@ -294,4 +295,4 @@ module TemplateLanguage
|
|
294
295
|
|
295
296
|
end
|
296
297
|
|
297
|
-
end
|
298
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
$:.unshift File.join(File.dirname(__FILE__),"..","lib")
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'minitest/autorun'
|
4
4
|
require 'rgen/array_extensions'
|
5
5
|
|
6
|
-
class ArrayExtensionsTest < Test
|
6
|
+
class ArrayExtensionsTest < MiniTest::Test
|
7
7
|
|
8
8
|
def test_element_methods
|
9
9
|
c = Struct.new("SomeClass",:name,:age)
|
@@ -11,11 +11,11 @@ class ArrayExtensionsTest < Test::Unit::TestCase
|
|
11
11
|
a << c.new('MyName',33)
|
12
12
|
a << c.new('YourName',22)
|
13
13
|
assert_equal ["MyName", "YourName"], a >> :name
|
14
|
-
|
14
|
+
assert_raises NoMethodError do
|
15
15
|
a.name
|
16
16
|
end
|
17
17
|
assert_equal [33, 22], a>>:age
|
18
|
-
|
18
|
+
assert_raises NoMethodError do
|
19
19
|
a.age
|
20
20
|
end
|
21
21
|
# unfortunately, any method can be called on an empty array
|
@@ -42,11 +42,11 @@ class ArrayExtensionsTest < Test::Unit::TestCase
|
|
42
42
|
# put something into the array that is not an MMBase
|
43
43
|
a << "not a MMBase"
|
44
44
|
# the dot operator will tell that there is something not a MMBase
|
45
|
-
|
45
|
+
assert_raises StandardError do
|
46
46
|
a.age
|
47
47
|
end
|
48
48
|
# the >> operator will try to call the method anyway
|
49
|
-
|
49
|
+
assert_raises NoMethodError do
|
50
50
|
a >> :age
|
51
51
|
end
|
52
52
|
end
|
@@ -56,7 +56,7 @@ class ArrayExtensionsTest < Test::Unit::TestCase
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def test_to_str_on_empty_array
|
59
|
-
|
59
|
+
assert_raises NoMethodError do
|
60
60
|
[].to_str
|
61
61
|
end
|
62
62
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
$:.unshift File.join(File.dirname(__FILE__),"..","lib")
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'minitest/autorun'
|
4
4
|
require 'rgen/environment'
|
5
5
|
require 'metamodels/uml13_metamodel'
|
6
6
|
require 'ea_support/ea_support'
|
@@ -9,7 +9,7 @@ require 'testmodel/class_model_checker'
|
|
9
9
|
require 'testmodel/object_model_checker'
|
10
10
|
require 'testmodel/ecore_model_checker'
|
11
11
|
|
12
|
-
class EAInstantiatorTest < Test
|
12
|
+
class EAInstantiatorTest < MiniTest::Test
|
13
13
|
|
14
14
|
include Testmodel::ClassModelChecker
|
15
15
|
include Testmodel::ObjectModelChecker
|
data/test/ea_serializer_test.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
$:.unshift File.join(File.dirname(__FILE__),"..","lib")
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'minitest/autorun'
|
4
4
|
require 'rgen/environment'
|
5
5
|
require 'metamodels/uml13_metamodel'
|
6
6
|
require 'ea_support/ea_support'
|
7
7
|
require 'rgen/serializer/xmi11_serializer'
|
8
8
|
|
9
|
-
class EASerializerTest < Test
|
9
|
+
class EASerializerTest < MiniTest::Test
|
10
10
|
|
11
11
|
MODEL_DIR = File.join(File.dirname(__FILE__),"testmodel")
|
12
12
|
TEST_DIR = File.join(File.dirname(__FILE__),"ea_serializer_test")
|
data/test/ecore_self_test.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
$:.unshift File.join(File.dirname(__FILE__),"..","lib")
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'minitest/autorun'
|
4
4
|
require 'rgen/ecore/ecore'
|
5
5
|
require 'rgen/array_extensions'
|
6
6
|
|
7
|
-
class ECoreSelfTest < Test
|
7
|
+
class ECoreSelfTest < MiniTest::Test
|
8
8
|
include RGen::ECore
|
9
9
|
|
10
10
|
def test_simple
|