rgen 0.8.2 → 0.8.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +10 -1
- data/Project.yaml +21 -0
- data/Rakefile +22 -25
- data/lib/rgen/ecore/ecore_to_json.rb +188 -0
- data/lib/rgen/ecore/ecore_to_ruby.rb +13 -0
- data/lib/rgen/fragment/fragmented_model.rb +2 -0
- data/lib/rgen/fragment/model_fragment.rb +3 -0
- data/lib/rgen/metamodel_builder/builder_extensions.rb +14 -6
- data/lib/rgen/metamodel_builder/builder_runtime.rb +12 -5
- 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 +2 -2
- data/test/environment_test.rb +2 -2
- data/test/json_test.rb +4 -4
- data/test/metamodel_builder_test.rb +77 -42
- 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 +1 -1
- data/test/template_language_test.rb +9 -11
- 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 +86 -25
- 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/template_language_test/line_endings_mixed.txt +0 -2
- data/test/template_language_test/line_endings_unix.txt +0 -2
- data/test/template_language_test/line_endings_windows.txt +0 -2
- data/test/testmodel/ea_testmodel_regenerated.xml +0 -813
- data/test/util/file_cache_map_test/testdir/fileA +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e58b57346e1f7e95fcaa15f29112706c911d20ed
|
4
|
+
data.tar.gz: 6551cb4e9579f7e76582018876973edd9a58d0e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e82e58dd4eaf95de47ef1714a778558a6bd3cb76f8229fb43e029a98f9e03c6234ee2fab831adde1d7de1b953665afab031f27f39b0ad7a060a91c4ed7c7328
|
7
|
+
data.tar.gz: 47b73a00783a82d630b0771fb55b01c4da6adffe73a459cd35828dd5040644b8b0f6cd00a565a4abf257d8c4d2e97ca17db2c072cbe05e8ae44fe9b2b3a2637e
|
data/CHANGELOG
CHANGED
@@ -212,4 +212,13 @@
|
|
212
212
|
|
213
213
|
=0.8.2
|
214
214
|
|
215
|
-
* Added helper methods
|
215
|
+
* Added helper methods
|
216
|
+
|
217
|
+
=0.8.3
|
218
|
+
|
219
|
+
* Performance improvement: getGeneric made a lot faster
|
220
|
+
|
221
|
+
=0.8.4
|
222
|
+
|
223
|
+
* Add early loading for types which have attributes conflicting with Ruby reserved words.
|
224
|
+
* Change type checking code to use ObjectSpace to find class objects. This is to find classes with an unbound name.
|
data/Project.yaml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
name: rgen
|
2
|
+
gemspec: rgen.gemspec
|
3
|
+
git: https://github.com/mthiede/rgen.git
|
4
|
+
version: 0.8.4
|
5
|
+
summary: Ruby Modelling and Generator Framework
|
6
|
+
email: martin dot thiede at gmx de
|
7
|
+
homepage: http://ruby-gen.org
|
8
|
+
rubyforge_project: rgen
|
9
|
+
description: RGen is a framework for Model Driven Software Development (MDSD) in Ruby. This means that it helps you build Metamodels, instantiate Models, modify and transform Models and finally generate arbitrary textual content from it.
|
10
|
+
authors: [Martin Thiede]
|
11
|
+
rdoc_options: [--main, README.rdoc, -x, test, -x, metamodels, -x, ea_support/uml13*]
|
12
|
+
extra_rdoc_files: [README.rdoc, CHANGELOG, MIT-LICENSE]
|
13
|
+
include_files: ['lib/**/*', 'test/**/*', README.rdoc, CHANGELOG, MIT-LICENSE, Rakefile]
|
14
|
+
exclude_files: ['**/*.bak']
|
15
|
+
encrypt_sources: false
|
16
|
+
dependencies:
|
17
|
+
https://rubygems.org:
|
18
|
+
- {name: nokogiri, version: ['~> 1.6.0', '>= 1.6.8.1'], development: true}
|
19
|
+
- {name: rake, version: '~> 12.0', development: true}
|
20
|
+
- {name: minitest, version: ['~> 5.0', '>= 5.10.1'], development: true}
|
21
|
+
- {name: minitest-fail-fast, version: '~> 0.1.0', development: true}
|
data/Rakefile
CHANGED
@@ -1,41 +1,38 @@
|
|
1
1
|
require 'rubygems/package_task'
|
2
2
|
require 'rdoc/task'
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'rake/testtask'
|
3
5
|
|
4
|
-
RGenGemSpec =
|
5
|
-
s.name = %q{rgen}
|
6
|
-
s.version = "0.8.2"
|
7
|
-
s.date = Time.now.strftime("%Y-%m-%d")
|
8
|
-
s.summary = %q{Ruby Modelling and Generator Framework}
|
9
|
-
s.email = %q{martin dot thiede at gmx de}
|
10
|
-
s.homepage = %q{http://ruby-gen.org}
|
11
|
-
s.rubyforge_project = %q{rgen}
|
12
|
-
s.description = %q{RGen is a framework for Model Driven Software Development (MDSD) in Ruby. This means that it helps you build Metamodels, instantiate Models, modify and transform Models and finally generate arbitrary textual content from it.}
|
13
|
-
s.authors = ["Martin Thiede"]
|
14
|
-
gemfiles = Rake::FileList.new
|
15
|
-
gemfiles.include("{lib,test}/**/*")
|
16
|
-
gemfiles.include("README.rdoc", "CHANGELOG", "MIT-LICENSE", "Rakefile")
|
17
|
-
gemfiles.exclude(/\b\.bak\b/)
|
18
|
-
s.files = gemfiles
|
19
|
-
s.rdoc_options = ["--main", "README.rdoc", "-x", "test", "-x", "metamodels", "-x", "ea_support/uml13*"]
|
20
|
-
s.extra_rdoc_files = ["README.rdoc", "CHANGELOG", "MIT-LICENSE"]
|
21
|
-
end
|
6
|
+
RGenGemSpec = eval(File.read('rgen.gemspec'))
|
22
7
|
|
23
8
|
RDoc::Task.new do |rd|
|
24
|
-
rd.main =
|
25
|
-
rd.rdoc_files.include(
|
26
|
-
rd.rdoc_files.exclude(
|
27
|
-
rd.rdoc_files.exclude(
|
28
|
-
rd.rdoc_dir =
|
9
|
+
rd.main = 'README.rdoc'
|
10
|
+
rd.rdoc_files.include('README.rdoc', 'CHANGELOG', 'MIT-LICENSE', 'lib/**/*.rb')
|
11
|
+
rd.rdoc_files.exclude('lib/metamodels/*')
|
12
|
+
rd.rdoc_files.exclude('lib/ea_support/uml13*')
|
13
|
+
rd.rdoc_dir = 'doc'
|
29
14
|
end
|
30
15
|
|
31
16
|
RGenPackageTask = Gem::PackageTask.new(RGenGemSpec) do |p|
|
32
17
|
p.need_zip = false
|
33
|
-
end
|
18
|
+
end
|
19
|
+
|
20
|
+
::Rake::TestTask.new(:test) do |t|
|
21
|
+
t.test_files = ['test/rgen_test.rb']
|
22
|
+
t.warning = false
|
23
|
+
end
|
34
24
|
|
35
25
|
task :prepare_package_rdoc => :rdoc do
|
36
|
-
RGenPackageTask.package_files.include(
|
26
|
+
RGenPackageTask.package_files.include('doc/**/*')
|
37
27
|
end
|
38
28
|
|
39
29
|
task :release => [:prepare_package_rdoc, :package]
|
40
30
|
|
41
31
|
task :clobber => [:clobber_rdoc, :clobber_package]
|
32
|
+
|
33
|
+
task :ecore_to_json do
|
34
|
+
require 'rgen/ecore/ecore_to_json'
|
35
|
+
|
36
|
+
exporter = RGen::ECore::ECoreToJson.new
|
37
|
+
File.write('ecore.json', exporter.epackage_to_json_string(RGen.ecore, exporter.ecore_datatypes))
|
38
|
+
end
|
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'rgen/ecore/ecore'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module RGen
|
5
|
+
|
6
|
+
module ECore
|
7
|
+
|
8
|
+
# ECoreToJson can turn ECore models into their JSON metamodel representations
|
9
|
+
class ECoreToJson
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
def root_elements_to_json_string(root_elements)
|
16
|
+
JSON.pretty_generate(root_elements.map do |el|
|
17
|
+
if el.is_a?(RGen::ECore::EPackage)
|
18
|
+
epackage(el)
|
19
|
+
elsif el.is_a?(RGen::ECore::EClass)
|
20
|
+
eclass(el)
|
21
|
+
else
|
22
|
+
raise "Not implemented for #{el}"
|
23
|
+
end
|
24
|
+
end)
|
25
|
+
end
|
26
|
+
|
27
|
+
def epackage_to_json(package)
|
28
|
+
epackage(package)
|
29
|
+
end
|
30
|
+
|
31
|
+
def ecore_datatypes
|
32
|
+
[RGen::ECore::EString, RGen::ECore::EInt, RGen::ECore::ELong, RGen::ECore::EBoolean, RGen::ECore::EFloat,
|
33
|
+
RGen::ECore::ERubyObject, RGen::ECore::EJavaObject, RGen::ECore::ERubyClass, RGen::ECore::EJavaClass]
|
34
|
+
.map {|dt| edatatype(dt)}
|
35
|
+
end
|
36
|
+
|
37
|
+
def epackage_to_json_pretty_string(package, append = [])
|
38
|
+
JSON.pretty_generate([epackage_to_json(package)] + append)
|
39
|
+
end
|
40
|
+
|
41
|
+
def epackage_to_json_string(package, append = [])
|
42
|
+
JSON.generate([epackage_to_json(package)] + append)
|
43
|
+
end
|
44
|
+
|
45
|
+
def emodelelement(me)
|
46
|
+
{
|
47
|
+
:eAnnotations => me.eAnnotations.map { |e| eannotation(e) }
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def enamedelement(ne)
|
53
|
+
merge(emodelelement(ne), {:name => ne.name})
|
54
|
+
end
|
55
|
+
|
56
|
+
def epackage(package)
|
57
|
+
merge(enamedelement(package), {
|
58
|
+
:_class_ref => 'RGen.ECore.EPackage',
|
59
|
+
:eClassifiers => package.eClassifiers.map do |classifier|
|
60
|
+
if classifier.is_a?(RGen::ECore::EClass)
|
61
|
+
eclass(classifier)
|
62
|
+
elsif classifier.is_a?(RGen::ECore::EEnum)
|
63
|
+
eenum(classifier)
|
64
|
+
else
|
65
|
+
edatatype(classifier)
|
66
|
+
end
|
67
|
+
end,
|
68
|
+
:eSubpackages => package.eSubpackages.map { |sp| epackage(sp) },
|
69
|
+
:nsURI => package.nsURI,
|
70
|
+
:nsPrefix => package.nsPrefix
|
71
|
+
})
|
72
|
+
end
|
73
|
+
|
74
|
+
def eclassifier(classifier)
|
75
|
+
enamedelement(classifier).merge({
|
76
|
+
# omit :instanceClassName => classifier.instanceClassName
|
77
|
+
})
|
78
|
+
end
|
79
|
+
|
80
|
+
def eclass(_class)
|
81
|
+
merge(eclassifier(_class), {
|
82
|
+
:_class_ref => 'RGen.ECore.EClass',
|
83
|
+
:abstract => _class.abstract,
|
84
|
+
:interface => _class.interface,
|
85
|
+
:eStructuralFeatures => _class.eStructuralFeatures.map do |sf|
|
86
|
+
if sf.is_a?(RGen::ECore::EReference)
|
87
|
+
ereference(sf)
|
88
|
+
else
|
89
|
+
eattribute(sf)
|
90
|
+
end
|
91
|
+
end,
|
92
|
+
:eSuperTypes => _class.eSuperTypes.map { |st| {:_ref => ref_id(st)} }
|
93
|
+
})
|
94
|
+
end
|
95
|
+
|
96
|
+
def edatatype(_datatype)
|
97
|
+
merge(eclassifier(_datatype), {
|
98
|
+
:_class_ref => 'RGen.ECore.EDataType',
|
99
|
+
:serializable => _datatype.serializable,
|
100
|
+
:instanceClassName => _datatype.instanceClassName
|
101
|
+
})
|
102
|
+
end
|
103
|
+
|
104
|
+
def eenum(enum)
|
105
|
+
merge(edatatype(enum), {
|
106
|
+
:_class_ref => 'RGen.ECore.EEnum',
|
107
|
+
:eLiterals => enum.eLiterals.map do |l|
|
108
|
+
merge({}, {
|
109
|
+
:_class_ref => 'RGen.ECore.EEnumLiteral',
|
110
|
+
:value => l.value,
|
111
|
+
:literal => l.literal
|
112
|
+
})
|
113
|
+
end
|
114
|
+
})
|
115
|
+
end
|
116
|
+
|
117
|
+
def eannotation(e)
|
118
|
+
merge(emodelelement(e), {
|
119
|
+
:source => e.source,
|
120
|
+
:details => e.details.map do |d|
|
121
|
+
merge({}, {
|
122
|
+
:_class_ref => 'RGen.ECore.EStringToStringMapEntry',
|
123
|
+
:key => d.key,
|
124
|
+
:value => d.value
|
125
|
+
})
|
126
|
+
end
|
127
|
+
})
|
128
|
+
end
|
129
|
+
|
130
|
+
def etypedelement(te)
|
131
|
+
merge(enamedelement(te), {
|
132
|
+
:ordered => te.ordered,
|
133
|
+
:unique => te.unique,
|
134
|
+
:lowerBound => te.lowerBound,
|
135
|
+
:upperBound => te.upperBound,
|
136
|
+
:many => te.many,
|
137
|
+
:required => te.required,
|
138
|
+
:eType => {:_ref => te.eType ? ref_id(te.eType) : nil}
|
139
|
+
})
|
140
|
+
end
|
141
|
+
|
142
|
+
def estructuralfeature(sf)
|
143
|
+
merge(etypedelement(sf), {
|
144
|
+
:changeable => sf.changeable,
|
145
|
+
:volatile => sf.volatile,
|
146
|
+
:transient => sf.transient,
|
147
|
+
:defaultValueLiteral => sf.defaultValueLiteral,
|
148
|
+
:unsettable => sf.unsettable,
|
149
|
+
:derived => sf.derived,
|
150
|
+
})
|
151
|
+
end
|
152
|
+
|
153
|
+
def eattribute(attr)
|
154
|
+
merge(estructuralfeature(attr), {
|
155
|
+
:_class_ref => 'RGen.ECore.EAttribute',
|
156
|
+
:iD => attr.iD
|
157
|
+
})
|
158
|
+
end
|
159
|
+
|
160
|
+
def ereference(ref)
|
161
|
+
merge(estructuralfeature(ref), {
|
162
|
+
:_class_ref => 'RGen.ECore.EReference',
|
163
|
+
:containment => ref.containment,
|
164
|
+
:resolveProxies => ref.resolveProxies,
|
165
|
+
:eOpposite => ref.eOpposite ? {:_ref => "#{ref_id(ref.eOpposite.eContainer)}.#{ref.eOpposite.name}"} : nil
|
166
|
+
})
|
167
|
+
end
|
168
|
+
|
169
|
+
def ref_id(obj)
|
170
|
+
res = ref_parts(obj)
|
171
|
+
res.join('.')
|
172
|
+
end
|
173
|
+
|
174
|
+
def ref_parts(obj)
|
175
|
+
return [obj.name] unless obj&.eContainer
|
176
|
+
ref_parts(obj.eContainer) << obj.name
|
177
|
+
end
|
178
|
+
|
179
|
+
def merge(hash, values)
|
180
|
+
values.each { |k, v| hash[k] = v unless v.nil? }
|
181
|
+
hash
|
182
|
+
end
|
183
|
+
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'set'
|
1
2
|
require 'rgen/ecore/ecore'
|
2
3
|
|
3
4
|
module RGen
|
@@ -11,6 +12,7 @@ class ECoreToRuby
|
|
11
12
|
@modules = {}
|
12
13
|
@classifiers = {}
|
13
14
|
@features_added = {}
|
15
|
+
@reserved = Set.new(Object.methods)
|
14
16
|
end
|
15
17
|
|
16
18
|
# Create a Ruby module representing +epackage+.
|
@@ -50,12 +52,23 @@ class ECoreToRuby
|
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
55
|
+
load_classes_with_reserved_keywords(epackage)
|
53
56
|
mod
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
57
60
|
private
|
58
61
|
|
62
|
+
def load_classes_with_reserved_keywords(epackage)
|
63
|
+
epackage.eAllClassifiers.each do |eclass|
|
64
|
+
# we early load classes which have ruby reserved keywords
|
65
|
+
if eclass.is_a?(RGen::ECore::EClass)
|
66
|
+
reserved_used = eclass.eStructuralFeatures.any? { |f| @reserved.include?(f.name.to_sym) }
|
67
|
+
add_features(eclass) if reserved_used
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
59
72
|
def create_module_internal(epackage, under, temp)
|
60
73
|
return @modules[epackage] if @modules[epackage]
|
61
74
|
|
@@ -111,6 +111,8 @@ class FragmentedModel
|
|
111
111
|
# This is a Hash mapping identifiers to model elements accessible via the identifier.
|
112
112
|
#
|
113
113
|
def index
|
114
|
+
# Invalidate the cache when any fragment's local index changes.
|
115
|
+
# Assumption: If the local index content changes, there is a new index object.
|
114
116
|
fragments.each do |f|
|
115
117
|
if !@fragment_index[f] || (@fragment_index[f].object_id != f.index.object_id)
|
116
118
|
@fragment_index[f] = f.index
|
@@ -117,6 +117,9 @@ class ModelFragment
|
|
117
117
|
end
|
118
118
|
|
119
119
|
# Returns the index of the element contained in this fragment.
|
120
|
+
#
|
121
|
+
# FragmentedModel's index caching depends on the fact that any change
|
122
|
+
# of a fragment's index contents implies a new index object.
|
120
123
|
#
|
121
124
|
def index
|
122
125
|
build_index unless @index
|
@@ -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,7 +402,7 @@ 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 %>
|
405
|
+
@<%= name %> = [] unless defined?(@<%= name %>)
|
398
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)
|
@@ -407,7 +415,7 @@ 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
420
|
if e.equal?(val)
|
413
421
|
@<%= name %>.delete_at(i)
|
@@ -428,7 +436,7 @@ module BuilderExtensions
|
|
428
436
|
get<%= firstToUpper(name) %>.each {|e|
|
429
437
|
remove<%= firstToUpper(name) %>(e)
|
430
438
|
}
|
431
|
-
@<%= name %> = [] unless @<%= name %>
|
439
|
+
@<%= name %> = [] unless defined?(@<%= name %>)
|
432
440
|
<% if props.reference? %>
|
433
441
|
val.uniq {|elem| elem.object_id }.each {|elem|
|
434
442
|
next if elem.nil?
|
@@ -451,7 +459,7 @@ module BuilderExtensions
|
|
451
459
|
alias <%= name %>= set<%= firstToUpper(name) %>
|
452
460
|
|
453
461
|
def _register<%= firstToUpper(name) %>(val)
|
454
|
-
@<%= name %> = [] unless @<%= name %>
|
462
|
+
@<%= name %> = [] unless defined?(@<%= name %>)
|
455
463
|
@<%= name %>.push val
|
456
464
|
<% if props.reference? && props.value(:containment) %>
|
457
465
|
val._set_container(self, :<%= name %>)
|
@@ -531,7 +539,7 @@ module BuilderExtensions
|
|
531
539
|
code << "\n"
|
532
540
|
expected = "Integer"
|
533
541
|
elsif props.impl_type.is_a?(Class)
|
534
|
-
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)"
|
535
543
|
code << " || #{varname}.is_a?(BigDecimal)" if props.impl_type == Float && defined?(BigDecimal)
|
536
544
|
code << "\n"
|
537
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
|
#
|
@@ -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
|
data/test/ecore_to_ruby_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 'rgen/ecore/ecore'
|
6
6
|
require 'rgen/ecore/ecore_ext'
|
7
7
|
require 'rgen/ecore/ecore_to_ruby'
|
8
8
|
|
9
|
-
class ECoreToRubyTest < Test
|
9
|
+
class ECoreToRubyTest < MiniTest::Test
|
10
10
|
|
11
11
|
module ContainerSimple
|
12
12
|
end
|
data/test/environment_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/environment'
|
5
5
|
require 'rgen/metamodel_builder'
|
6
6
|
|
7
|
-
class EnvironmentTest < Test
|
7
|
+
class EnvironmentTest < MiniTest::Test
|
8
8
|
|
9
9
|
class Model
|
10
10
|
attr_accessor :name
|
data/test/json_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 'rgen/metamodel_builder'
|
6
6
|
require 'rgen/serializer/json_serializer'
|
7
7
|
require 'rgen/instantiator/json_instantiator'
|
8
8
|
|
9
|
-
class JsonTest < Test
|
9
|
+
class JsonTest < MiniTest::Test
|
10
10
|
|
11
11
|
module TestMM
|
12
12
|
extend RGen::MetamodelBuilder::ModuleExtension
|
@@ -61,7 +61,7 @@ class JsonTest < Test::Unit::TestCase
|
|
61
61
|
inst.instantiate(%q({ "_class": "TestNode", "text": "some text", "childs": [
|
62
62
|
{ "_class": "TestNode", "text": "child" }] }))
|
63
63
|
root = env.find(:class => TestMM::TestNode, :text => "some text").first
|
64
|
-
|
64
|
+
assert root != nil
|
65
65
|
assert_equal 1, root.childs.size
|
66
66
|
assert_equal TestMM::TestNode, root.childs.first.class
|
67
67
|
assert_equal "child", root.childs.first.text
|
@@ -149,7 +149,7 @@ class JsonTest < Test::Unit::TestCase
|
|
149
149
|
def test_json_instantiator_subpackage_no_shortname_opt
|
150
150
|
env = RGen::Environment.new
|
151
151
|
inst = RGen::Instantiator::JsonInstantiator.new(env, TestMMSubpackage, :short_class_names => false)
|
152
|
-
|
152
|
+
assert_raises RuntimeError do
|
153
153
|
inst.instantiate(%q({ "_class": "Data2", "data2": "something" }))
|
154
154
|
end
|
155
155
|
end
|