tla-sbuilder 0.1.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +116 -33
- data/VERSION +1 -1
- data/lib/cli/cli-customer.rb +41 -23
- data/lib/cli/cli-example.rb +1 -1
- data/lib/cli/cli-pet.rb +33 -30
- data/lib/cli/cli-text.rb +57 -17
- data/lib/cli/cli.rb +56 -10
- data/lib/sbuilder.rb +3 -1
- data/lib/sbuilder/constants.rb +5 -2
- data/lib/sbuilder/controller.rb +289 -59
- data/lib/sbuilder/default-sbuilder.yaml +25 -3
- data/lib/sbuilder/domain.rb +1 -1
- data/lib/sbuilder/domain_cardinality.rb +1 -1
- data/lib/sbuilder/domain_value.rb +1 -1
- data/lib/sbuilder/exception.rb +13 -7
- data/lib/sbuilder/extension_loader.rb +75 -18
- data/lib/sbuilder/facade/api_loader.rb +293 -0
- data/lib/sbuilder/factory.rb +66 -3
- data/lib/sbuilder/model.rb +59 -3
- data/lib/sbuilder/mustache/template.rb +13 -13
- data/lib/sbuilder/mustache/template_reader_context.rb +5 -3
- data/lib/sbuilder/param_set.rb +2 -1
- data/lib/sbuilder/param_set_db.rb +1 -1
- data/lib/sbuilder/param_set_def.rb +1 -1
- data/lib/sbuilder/param_set_if.rb +1 -1
- data/lib/sbuilder/param_set_loader_swagger.rb +122 -121
- data/lib/sbuilder/param_set_step.rb +1 -1
- data/lib/sbuilder/parameter.rb +1 -1
- data/lib/sbuilder/parameter_container.rb +1 -1
- data/lib/sbuilder/parameter_dom.rb +1 -1
- data/lib/sbuilder/parameter_ref.rb +2 -2
- data/lib/sbuilder/resolver_rule.rb +1 -1
- data/lib/sbuilder/resolver_rule_match.rb +1 -1
- data/lib/sbuilder/resolver_rule_ref.rb +1 -1
- data/lib/sbuilder/spec/README +5 -0
- data/lib/sbuilder/spec/api_loader_facade.rb +247 -0
- data/lib/utils/cache_lines.rb +21 -0
- data/lib/utils/netio.rb +5 -13
- data/mustache/cfg/macro_run.mustache +1 -0
- data/mustache/interface_processes.mustache +9 -2
- data/mustache/interface_stubs_dummy.mustache +7 -0
- data/mustache/interface_types.mustache +3 -3
- data/mustache/invariant_activate.mustache +16 -0
- data/mustache/setup/assumptions_activate.mustache +16 -0
- data/mustache/{domains_run.mustache → setup/domains_run.mustache} +2 -2
- data/mustache/setup/operator_run.mustache +2 -0
- data/mustache/setup/steps_run_bind_set.mustache +1 -1
- data/mustache/setup/steps_run_parameterBind.mustache +4 -2
- data/mustache/tla/macro_run.mustache +8 -0
- data/mustache/tla/operator_run.mustache +1 -0
- data/mustache/tla/plc_define_run.mustache +2 -4
- data/mustache/tla/plc_run_state.mustache +1 -1
- data/src-extend/extend/extend_invariant_cfg.mustache +1 -1
- data/src/pet/assumption_domains.tla +1 -1
- data/src/pet/correctness.cfg +4 -0
- data/tla-sbuilder.gemspec +3 -1
- metadata +14 -10
- data/lib/sbuilder/param_set_loader.rb +0 -77
- data/src-extend/extend_app/correctness.cfg +0 -9
data/lib/cli/cli-text.rb
CHANGED
@@ -2,43 +2,78 @@ module Sbuilder
|
|
2
2
|
|
3
3
|
class CliText
|
4
4
|
|
5
|
-
|
5
|
+
SBUILDER_EXTENSION = <<-EOS.unindent
|
6
|
+
|
7
|
+
# Load and configure sbuilder plugin extensions
|
8
|
+
#
|
9
|
+
# SCHEMA
|
10
|
+
#
|
11
|
+
# extend:
|
12
|
+
# loaders:
|
13
|
+
# - gem: <gem-name>
|
14
|
+
# className: <class name>
|
15
|
+
# configuration:
|
16
|
+
# <configuration-value>
|
17
|
+
#
|
18
|
+
# <gem-name>: gem name to require
|
19
|
+
# <class name>: name of interface loader in 'type' property in 'interfaces' array
|
20
|
+
# <configuration-value>: a (hash) value passed to 'className'::configure' -method
|
21
|
+
#
|
22
|
+
EOS
|
23
|
+
|
24
|
+
SBUILDER_INVARIANTS = <<-EOS.unindent
|
25
|
+
|
26
|
+
# Activate invariant operator defines in sBuilder code repository
|
27
|
+
#
|
28
|
+
# SCHEMA:
|
29
|
+
#
|
30
|
+
# invariants:
|
31
|
+
# - <invariant-name>: <invariant description>
|
32
|
+
#
|
33
|
+
#
|
34
|
+
# <invariant-name>: name of TlAplus operator defined in sBuilder code repository
|
35
|
+
# <invariant description>: documentantion text for the invariant
|
36
|
+
#
|
37
|
+
EOS
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
SBUILDER_RESOLVERS = <<-EOS.unindent
|
6
42
|
|
7
43
|
# Define how parameter names are mapped to domain
|
8
44
|
#
|
9
45
|
# SCHEMA:
|
10
46
|
#
|
11
47
|
# resolvers:
|
12
|
-
# -
|
13
|
-
# file: <file name in cnf-dir>
|
48
|
+
# - file: <file name in cnf-dir>
|
14
49
|
# url: <path or url>
|
15
50
|
#
|
16
|
-
#
|
51
|
+
# Give either 'file' or 'url'
|
17
52
|
# <file name in cnf-dir>: file name in cnf-directory
|
18
53
|
# <path or url>: path relative to cwd, or http url
|
19
54
|
#
|
20
55
|
#
|
21
|
-
# COMMENTS:
|
22
|
-
# - give 'file' xor 'url' property
|
23
56
|
#
|
24
57
|
|
25
58
|
EOS
|
26
59
|
|
27
|
-
SBUILBER_INTERFACES = <<-EOS
|
60
|
+
SBUILBER_INTERFACES = <<-EOS.unindent
|
28
61
|
|
29
62
|
# Define how to load interfaces configuration
|
30
63
|
#
|
31
64
|
# SCHEMA:
|
32
65
|
#
|
33
66
|
# interfaces:
|
34
|
-
# - type: <interface loader
|
67
|
+
# - type: <interface loader name>
|
35
68
|
#
|
36
69
|
# file: <file name in cnf-dir>
|
37
70
|
# infrastructureServices: <is infrastructureService>
|
38
71
|
# url: <path or url>
|
39
72
|
# cache: <cache file path>
|
40
73
|
#
|
41
|
-
# <interface loader
|
74
|
+
# <interface loader name>: name of interface loader,
|
75
|
+
# valid values: 'swagger' and className values
|
76
|
+
# given in 'extend.loaders' array
|
42
77
|
# <is infrastructureService>: true or false (default false)
|
43
78
|
# <file name in cnf-dir> : file name in cnf-directory
|
44
79
|
# <path or url> : path relative to cwd, or http url,
|
@@ -55,7 +90,7 @@ module Sbuilder
|
|
55
90
|
EOS
|
56
91
|
|
57
92
|
|
58
|
-
SBUILER_SETUPS = <<-EOS
|
93
|
+
SBUILER_SETUPS = <<-EOS.unindent
|
59
94
|
|
60
95
|
# Define environment setups
|
61
96
|
#
|
@@ -67,17 +102,21 @@ module Sbuilder
|
|
67
102
|
# url: <path or url>
|
68
103
|
# preferences:
|
69
104
|
# <hash-values>
|
105
|
+
# assumptions:
|
106
|
+
# <assume-op-names>
|
70
107
|
#
|
71
108
|
# <setupname> : name of setup = sub directory under <gen_dir>
|
72
109
|
# <file name in cnf-dir>: name extension configurion file in cnf-directory
|
73
110
|
# <path or url> : relative name or url of configurion file
|
74
111
|
# <hash-values> : optional properties overriding global generate preferences
|
112
|
+
# <assume-op-names> : array of operator names to put into ASSUME directives
|
75
113
|
#
|
76
114
|
# COMMENTS:
|
77
115
|
# - preferences property is optional
|
78
116
|
EOS
|
79
117
|
|
80
|
-
SBUILDER_GENERATE = <<-EOS
|
118
|
+
SBUILDER_GENERATE = <<-EOS.unindent
|
119
|
+
|
81
120
|
# Generate definitions
|
82
121
|
#
|
83
122
|
# SCHEMA:
|
@@ -106,13 +145,14 @@ module Sbuilder
|
|
106
145
|
#
|
107
146
|
EOS
|
108
147
|
|
109
|
-
SBUILDER_PREFERENCES = <<-EOS
|
148
|
+
SBUILDER_PREFERENCES = <<-EOS.unindent
|
149
|
+
|
110
150
|
# Generate preferences
|
111
151
|
#
|
112
152
|
# preferences:
|
113
153
|
# <hash-values>
|
114
154
|
#
|
115
|
-
# <hash-values>
|
155
|
+
# <hash-values> key-value pairs passed to mustache templates in 'PREFERENCES' -property
|
116
156
|
#
|
117
157
|
# Default templates use following propeties
|
118
158
|
# debug-output: <true/false>, output call message in interface processes, default 'true'
|
@@ -120,7 +160,7 @@ module Sbuilder
|
|
120
160
|
EOS
|
121
161
|
|
122
162
|
|
123
|
-
EXTENSION_HEADER_DOM = <<-EOS
|
163
|
+
EXTENSION_HEADER_DOM = <<-EOS.unindent
|
124
164
|
|
125
165
|
# Define extension for domains
|
126
166
|
#
|
@@ -142,7 +182,7 @@ module Sbuilder
|
|
142
182
|
|
143
183
|
EOS
|
144
184
|
|
145
|
-
EXTENSION_HEADER_IF = <<-EOS
|
185
|
+
EXTENSION_HEADER_IF = <<-EOS.unindent
|
146
186
|
|
147
187
|
# Define name of extension point for interface
|
148
188
|
#
|
@@ -158,7 +198,7 @@ module Sbuilder
|
|
158
198
|
|
159
199
|
EOS
|
160
200
|
|
161
|
-
EXTENSION_HEADER_SETUP = <<-EOS
|
201
|
+
EXTENSION_HEADER_SETUP = <<-EOS.unindent
|
162
202
|
|
163
203
|
# Define environment steps
|
164
204
|
#
|
@@ -194,7 +234,7 @@ module Sbuilder
|
|
194
234
|
EOS
|
195
235
|
|
196
236
|
|
197
|
-
RESOLVER_HEADER = <<-EOS
|
237
|
+
RESOLVER_HEADER = <<-EOS.unindent
|
198
238
|
# Example of an YAML resolver
|
199
239
|
#
|
200
240
|
# Contains array of hashes
|
data/lib/cli/cli.rb
CHANGED
@@ -184,16 +184,39 @@ module Sbuilder
|
|
184
184
|
shared_options :verbosity
|
185
185
|
shared_options :cnf_dir
|
186
186
|
def list( what )
|
187
|
-
|
188
|
-
|
189
|
-
|
187
|
+
validateWhats( what )
|
188
|
+
ctrl = getCtrl
|
189
|
+
# puts "#{ctrl.getSetups().map { |setup| setup['setupDirectory']}.join(' ')}"
|
190
|
+
puts "#{getSetupNames(ctrl).join(' ')}"
|
191
|
+
end
|
190
192
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
193
|
+
|
194
|
+
desc "document [setup]", "Document configuration for all setups or for the given setup"
|
195
|
+
shared_options :verbosity
|
196
|
+
shared_options :cnf_dir
|
197
|
+
def document( what=nil )
|
198
|
+
controller = getCtrl
|
199
|
+
controller.load
|
200
|
+
|
201
|
+
validateWhats( what, getSetupNames(controller) ) if what
|
202
|
+
|
203
|
+
invariants = controller.templateData('invariants')['invariants']
|
204
|
+
puts "INVARIANTS:"
|
205
|
+
invariants.each do |invariant|
|
206
|
+
puts <<-EOS.unindent
|
207
|
+
- #{invariant[:name]}: #{invariant[:desc]}
|
208
|
+
EOS
|
209
|
+
end
|
210
|
+
puts "SETUPS:"
|
211
|
+
controller.processSetups( what ) do |setupName, setupConf, possibilities|
|
212
|
+
assumptions = controller.getSetupAssumptionList( setupConf )
|
213
|
+
puts <<-EOS.unindent
|
214
|
+
- #{setupName}: #{setupConf['desc']}
|
215
|
+
- possibilities: #{(setupConf['possibilities'] || [] ).join( ' ' )}
|
216
|
+
- assumptions: #{assumptions.join( ' ' )}
|
217
|
+
- interfaces: #{controller.templateData('steps' )['steps'].map {|step| step[:interface_operation] }.uniq.join( ' ' )}
|
218
|
+
EOS
|
219
|
+
end
|
197
220
|
end
|
198
221
|
|
199
222
|
|
@@ -202,6 +225,22 @@ module Sbuilder
|
|
202
225
|
# common routines
|
203
226
|
no_commands do
|
204
227
|
|
228
|
+
# ensure that 'what' is correct
|
229
|
+
def validateWhats( what, whats = [ "setups", "setup" ] )
|
230
|
+
raise <<-EOS unless whats.include?( what )
|
231
|
+
Unknown target '#{what}'
|
232
|
+
|
233
|
+
Valid targets: #{whats.join(',')}
|
234
|
+
EOS
|
235
|
+
|
236
|
+
end
|
237
|
+
|
238
|
+
# @return [Sbuilder::Controller] contrller, which has loader configurations
|
239
|
+
def getCtrl
|
240
|
+
ctrl = getController( options )
|
241
|
+
return ctrl
|
242
|
+
end
|
243
|
+
|
205
244
|
# Copy 'extendFile' file to 'dirPath', append {{>benchmark/basename(extendFile}}
|
206
245
|
#
|
207
246
|
# @param dirPath [String] directory where extension file created
|
@@ -240,6 +279,12 @@ module Sbuilder
|
|
240
279
|
|
241
280
|
end
|
242
281
|
|
282
|
+
# @param controller [Sbuilder::Controller] controller to read the setups
|
283
|
+
# @return [String:Array] names of setups defined in 'ctrl'
|
284
|
+
def getSetupNames( ctrl )
|
285
|
+
ctrl.getSetups().map { |setup| setup['setupDirectory'] }
|
286
|
+
end
|
287
|
+
|
243
288
|
# ------------------------------------------------------------------
|
244
289
|
|
245
290
|
def init_files( options )
|
@@ -247,7 +292,8 @@ module Sbuilder
|
|
247
292
|
[
|
248
293
|
{ :file => "#{options[:cnf_dir]}/#{Sbuilder::Constants::CNF_FILE }.example", :content => [ Sbuilder::CliCustomer::SBUILDER_YAML_CUSTOMER] },
|
249
294
|
{ :file => "#{options[:cnf_dir]}/#{Sbuilder::CliCustomer::FILE_RESOLVER_CUSTOMER}.example", :content => [ Sbuilder::CliCustomer::RESOLVER_CUSTOMER] },
|
250
|
-
{ :file => "#{options[:cnf_dir]}/#{Sbuilder::CliCustomer::FILE_EXTENSIONS_CUSTOMER_COMMON}.
|
295
|
+
{ :file => "#{options[:cnf_dir]}/#{Sbuilder::CliCustomer::FILE_EXTENSIONS_CUSTOMER_COMMON}.example", :content => [Sbuilder::CliCustomer::EXTENSIONS_CUSTOMER_COMMON] },
|
296
|
+
{ :file => "#{options[:cnf_dir]}/#{Sbuilder::CliCustomer::FILE_EXTENSIONS_CUSTOMER_IF}.example", :content => [Sbuilder::CliCustomer::EXTENSIONS_CUSTOMER_IF] },
|
251
297
|
{ :file => "#{options[:cnf_dir]}/#{Sbuilder::CliCustomer::FILE_EXTENSIONS_CUSTOMER_RUN1}.example", :content => [Sbuilder::CliCustomer::EXTENSIONS_CUSTOMER_RUN1] },
|
252
298
|
{ :file => "#{options[:cnf_dir]}/#{Sbuilder::CliCustomer::FILE_EXTENSIONS_CUSTOMER_RUN2}.example", :content => [Sbuilder::CliCustomer::EXTENSIONS_CUSTOMER_RUN2] },
|
253
299
|
{ :file => "#{options[:cnf_dir]}/#{Sbuilder::CliCustomer::FILE_INTERFACE_CUSTOMER}.example", :content => [Sbuilder::CliCustomer::INTERFACE_CUSTOMER_SWAGGER] },
|
data/lib/sbuilder.rb
CHANGED
@@ -4,6 +4,7 @@ require_relative "utils/string_inject"
|
|
4
4
|
|
5
5
|
require_relative "utils/version"
|
6
6
|
require_relative "utils/logger"
|
7
|
+
require_relative "utils/cache_lines"
|
7
8
|
require_relative "utils/netio"
|
8
9
|
|
9
10
|
require_relative "sbuilder/constants.rb"
|
@@ -36,7 +37,7 @@ require_relative "sbuilder/resolver.rb"
|
|
36
37
|
require_relative "sbuilder/resolver_loader.rb"
|
37
38
|
require_relative "sbuilder/resolver_loader_yaml.rb"
|
38
39
|
|
39
|
-
|
40
|
+
|
40
41
|
require_relative "sbuilder/param_set_loader_swagger.rb"
|
41
42
|
|
42
43
|
require_relative "sbuilder/model.rb"
|
@@ -46,6 +47,7 @@ require_relative "sbuilder/extension_loader.rb"
|
|
46
47
|
require_relative "sbuilder/factory.rb"
|
47
48
|
require_relative "sbuilder/controller.rb"
|
48
49
|
|
50
|
+
require_relative "sbuilder/facade/api_loader.rb"
|
49
51
|
|
50
52
|
require_relative "sbuilder/mustache/template_reader"
|
51
53
|
require_relative "sbuilder/mustache/template_reader_context"
|
data/lib/sbuilder/constants.rb
CHANGED
@@ -11,10 +11,13 @@ module Sbuilder
|
|
11
11
|
EXTENSION_LOADER_YAML = "default-yaml"
|
12
12
|
|
13
13
|
# supported paramter set types
|
14
|
-
|
14
|
+
INTERFACE_OPERATION = "operation"
|
15
15
|
SWAGGER_DEFINITION="definition"
|
16
16
|
PARAM_SET_STEPS = "steps"
|
17
17
|
|
18
|
+
# supported interfa loader
|
19
|
+
LOADER_SWAGGER = "swagger"
|
20
|
+
|
18
21
|
# supported mapper types
|
19
22
|
MAPPER_YAML = "resolver_yaml"
|
20
23
|
|
@@ -47,7 +50,7 @@ module Sbuilder
|
|
47
50
|
CNF_FILE="sbuilder.yaml"
|
48
51
|
|
49
52
|
# directory to cache loaded files
|
50
|
-
CACHE_DIR = "
|
53
|
+
CACHE_DIR = "cache"
|
51
54
|
|
52
55
|
# direcotory where to output rendered templates
|
53
56
|
GEN_DIR = "gen"
|
data/lib/sbuilder/controller.rb
CHANGED
@@ -13,8 +13,8 @@ module Sbuilder
|
|
13
13
|
|
14
14
|
# model parts
|
15
15
|
attr_reader :model # which contain values loaded
|
16
|
-
def_delegators :model, :extendDomain, :extendInterface, :
|
17
|
-
:domainEncountered, :templateData, :getInterface, :extendStep
|
16
|
+
def_delegators :model, :extendDomain, :extendInterface, :modelInterface, :modelDefinition,
|
17
|
+
:domainEncountered, :templateData, :getInterface, :extendStep, :defineSetup
|
18
18
|
|
19
19
|
def_delegators :factory, :createParameter, :createParamSet
|
20
20
|
|
@@ -30,16 +30,35 @@ module Sbuilder
|
|
30
30
|
|
31
31
|
|
32
32
|
@@validSetups_required = [ "setupDirectory", ]
|
33
|
-
@@validSetups_allowed = @@validSetups_required + [ 'extensions', "desc", "preferences", "possibilities" ]
|
33
|
+
@@validSetups_allowed = @@validSetups_required + [ 'extensions', "desc", "preferences", "possibilities", 'assumptions', 'configuration']
|
34
|
+
@@validSetupConfiguration_required = []
|
35
|
+
@@validSetupConfiguration_allowed = ['allow_domain_nil_values']
|
34
36
|
|
35
|
-
|
36
|
-
@@
|
37
|
-
@@
|
37
|
+
|
38
|
+
@@extensionLoaderDef_required = [ ]
|
39
|
+
@@extensionLoaderDef_oneof = ["url", "file",]
|
40
|
+
@@extensionLoaderDef_defaults = {
|
41
|
+
'type' => Sbuilder::Constants::EXTENSION_LOADER_YAML
|
42
|
+
}
|
43
|
+
@@extensionLoaderDef_allowed = @@extensionLoaderDef_required + @@extensionLoaderDef_oneof + ['type']
|
38
44
|
|
39
|
-
|
40
|
-
@@
|
41
|
-
@@
|
45
|
+
|
46
|
+
@@resolverLoader_required = [ ]
|
47
|
+
@@resolverLoader_oneof = ["url", "file",]
|
48
|
+
@@resolverLoader_defaults = {
|
49
|
+
'type' => Sbuilder::Constants::MAPPER_YAML
|
50
|
+
}
|
51
|
+
@@resolverLoader_allowed = @@resolverLoader_required + @@resolverLoader_oneof + ['type']
|
42
52
|
|
53
|
+
@@interfaceLoaderDef_required = [ ]
|
54
|
+
@@interfaceLoaderDef_oneof = [ 'url', "file", ]
|
55
|
+
@@interfaceLoaderDef_oneof2 = [ 'type', "className", ]
|
56
|
+
@@interfaceLoaderDef_allowed = @@interfaceLoaderDef_required + ["cache", "infrastructureServices", "namespace" ] + @@interfaceLoaderDef_oneof + @@interfaceLoaderDef_oneof2
|
57
|
+
|
58
|
+
@@validExtendLoader = %w( gem className configuration )
|
59
|
+
|
60
|
+
@@validConfig = %w( generate )
|
61
|
+
@@allowConfig = @@validConfig + %w( extend extensions setups preferences resolvers interfaces invariants )
|
43
62
|
|
44
63
|
@@validGenerateConfigs = ["output", "inputs"]
|
45
64
|
@@allowedGenerateConfigs = @@validGenerateConfigs + ['category']
|
@@ -69,10 +88,17 @@ module Sbuilder
|
|
69
88
|
:filter_src => options[:filter_src] || false,
|
70
89
|
:templates => options[:templates],
|
71
90
|
} #.merge( options[PROGNAME] || {} )
|
72
|
-
|
91
|
+
setFactory( factory )
|
73
92
|
start
|
74
93
|
end
|
75
94
|
|
95
|
+
# @param factory [Sbuilder::Factory] to build objects
|
96
|
+
def setFactory( factory )
|
97
|
+
@factory = factory
|
98
|
+
# add loaders configured in 'sbuilder.yaml'
|
99
|
+
factory.addLoaders( getConfiguredLoaders )
|
100
|
+
end
|
101
|
+
|
76
102
|
# @param possibilities [String:Array] possibilities defined in setup
|
77
103
|
def start
|
78
104
|
# init state
|
@@ -81,11 +107,62 @@ module Sbuilder
|
|
81
107
|
|
82
108
|
end
|
83
109
|
|
110
|
+
# Iterate 'assumptions' and add to model assumption descritptions.
|
111
|
+
# Issue a warning if assumptions not defined
|
112
|
+
#
|
113
|
+
# @param assumption [String:Array] name of assumption to activate
|
114
|
+
|
115
|
+
|
116
|
+
def loadAssumptions( assumptions )
|
117
|
+
|
118
|
+
@logger.info "#{__method__}: assumptions=#{assumptions}"
|
119
|
+
assumptions.each do |assumption|
|
120
|
+
model.addAssumption( { :name => assumption, :desc => "Assume #{assumption}" } )
|
121
|
+
end # else - not nil
|
122
|
+
end
|
123
|
+
|
124
|
+
# Iterate 'invariants' and add to model invariant descritptions.
|
125
|
+
# Isse a warning if invarients not defined
|
126
|
+
#
|
127
|
+
# @param invariants [Hash:Array] with properties 'key'=>'description'
|
128
|
+
|
129
|
+
def loadInvariants( invariants )
|
130
|
+
|
131
|
+
if invariants.nil? then
|
132
|
+
msg = <<-EOS
|
133
|
+
No invariants section defined in #{getConfigFilePath}.
|
134
|
+
|
135
|
+
Suggestion add section 'invariants' defining invariants.
|
136
|
+
For example:
|
137
|
+
|
138
|
+
invariants:
|
139
|
+
- MustNotHappen: Invariant 'MustNotHappen' verified in the model
|
140
|
+
|
141
|
+
EOS
|
142
|
+
warn msg
|
143
|
+
else
|
144
|
+
@logger.info "#{__method__}: invariants=#{invariants}"
|
145
|
+
invariants = [invariants] if invariants.is_a?( Hash )
|
146
|
+
invariants.each do |invariant|
|
147
|
+
invariant.each do |k,v|
|
148
|
+
model.addInvariant( { :name => k, :desc => v } )
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end # else - not nil
|
152
|
+
end
|
153
|
+
|
84
154
|
# ------------------------------------------------------------------
|
85
155
|
# build controller: load (domain) resolvers
|
156
|
+
# @param arrOfmappersTypePath [Hash:Array] of :type,:url
|
86
157
|
|
87
158
|
def loadResolvers( arrOfmappersTypePath )
|
88
159
|
!arrOfmappersTypePath.nil? && arrOfmappersTypePath.each do |mapperDef|
|
160
|
+
# add defaults to 'mapperDef'
|
161
|
+
mapperDef = defaultProps( mapperDef, @@resolverLoader_defaults )
|
162
|
+
validateProperties( mapperDef, @@resolverLoader_required, @@resolverLoader_allowed )
|
163
|
+
validateOne( mapperDef, @@resolverLoader_oneof )
|
164
|
+
|
165
|
+
|
89
166
|
@logger.debug( "#{__method__} mapperDef=#{mapperDef} " )
|
90
167
|
|
91
168
|
# find correct loader based on type
|
@@ -112,12 +189,21 @@ module Sbuilder
|
|
112
189
|
# ------------------------------------------------------------------
|
113
190
|
# load extensions
|
114
191
|
|
115
|
-
#
|
116
|
-
|
192
|
+
# Load exntesion for setup
|
193
|
+
#
|
194
|
+
# @param setupName [String] name of setup, currently = extensionDirectory
|
195
|
+
# def loadExtensions( arrayOfExtensionDefs )
|
196
|
+
def loadExtensions( setupName )
|
197
|
+
|
198
|
+
# access sbuilder.yaml configuration
|
199
|
+
arrayOfExtensionDefs = getSetupExtensions( setupName )
|
117
200
|
|
201
|
+
# iteratio
|
118
202
|
arrayOfExtensionDefs && arrayOfExtensionDefs.each do |extensionLoaderDef|
|
119
203
|
validateProperties( extensionLoaderDef, @@extensionLoaderDef_required, @@extensionLoaderDef_allowed )
|
120
204
|
validateOne( extensionLoaderDef, @@extensionLoaderDef_oneof )
|
205
|
+
# ensure defaults in properties
|
206
|
+
extensionLoaderDef = defaultProps( extensionLoaderDef, @@extensionLoaderDef_defaults )
|
121
207
|
|
122
208
|
|
123
209
|
@logger.info( "#{__method__} extensionLoaderDef=#{extensionLoaderDef}" )
|
@@ -127,7 +213,7 @@ module Sbuilder
|
|
127
213
|
rescue Exception => ee
|
128
214
|
msg = "Error #{ee} caused by #{ee.backtrace.join("\n")} when loading '#{extensionLoaderDef['url']}'\n\n"
|
129
215
|
@logger.error( "#{__method__} #{msg}" )
|
130
|
-
raise ControllerException.new
|
216
|
+
raise ControllerException.new, msg, ee.backtrace
|
131
217
|
end
|
132
218
|
end
|
133
219
|
# domainLoader = factory.get
|
@@ -135,26 +221,73 @@ module Sbuilder
|
|
135
221
|
|
136
222
|
# ------------------------------------------------------------------
|
137
223
|
# load interfaces
|
224
|
+
|
225
|
+
# @param arrOfparamsetTypePath [Hash:Array] of :type,:file|:url,:cache properties
|
138
226
|
|
139
227
|
def loadInterfaces( arrOfparamsetTypePath )
|
140
228
|
!arrOfparamsetTypePath.nil? && arrOfparamsetTypePath.each do |interfaceParamsetDef|
|
141
229
|
|
142
|
-
|
143
|
-
|
144
|
-
|
230
|
+
begin
|
231
|
+
validateProperties( interfaceParamsetDef, @@interfaceLoaderDef_required, @@interfaceLoaderDef_allowed )
|
232
|
+
validateOne( interfaceParamsetDef, @@interfaceLoaderDef_oneof )
|
233
|
+
validateOne( interfaceParamsetDef, @@interfaceLoaderDef_oneof2 )
|
234
|
+
rescue ControllerException => e
|
235
|
+
msg = <<-EOS
|
236
|
+
Error:
|
237
|
+
|
238
|
+
#{e}
|
239
|
+
|
240
|
+
in
|
241
|
+
|
242
|
+
#{interfaceParamsetDef.to_yaml}
|
243
|
+
|
244
|
+
|
245
|
+
EOS
|
246
|
+
@logger.error( "#{__method__} #{msg}" )
|
247
|
+
raise ControllerException.new, msg, e.backtrace
|
248
|
+
end
|
249
|
+
warn <<-EOS if interfaceParamsetDef['type']
|
250
|
+
Interface loader configuration
|
251
|
+
|
252
|
+
#{interfaceParamsetDef.to_yaml}
|
253
|
+
|
254
|
+
uses property 'type', which is depracted.
|
255
|
+
|
256
|
+
|
257
|
+
|
258
|
+
Use property 'className' instead.
|
259
|
+
|
260
|
+
Particularly
|
261
|
+
|
262
|
+
type: #{Sbuilder::Constants::LOADER_SWAGGER}
|
263
|
+
|
264
|
+
should be replaced with
|
265
|
+
|
266
|
+
className: Sbuilder::ParamSetLoaderSwagger
|
267
|
+
|
268
|
+
EOS
|
145
269
|
|
146
270
|
# find correct loader based on type & configure it
|
147
271
|
loader = factory.getParamSetLoader( getParamsetType( interfaceParamsetDef ))
|
148
|
-
|
272
|
+
|
273
|
+
# configure facade && pass it to loader
|
274
|
+
facade = factory.getFacade(self)
|
275
|
+
# facada loading instrcture services
|
276
|
+
facade.configureInfrastructureService( interfaceParamsetDef['infrastructureServices'] == true )
|
277
|
+
# facade creates definitions in 'namespace' (default nil = no group)
|
278
|
+
facade.configureNamespace( interfaceParamsetDef['namespace'] )
|
279
|
+
facade.setInterfaceCacheFilePath(getParamsetCacheFilePath(interfaceParamsetDef))
|
280
|
+
loader.setFacade( facade )
|
281
|
+
|
149
282
|
# load an put array
|
150
|
-
loader.load(
|
283
|
+
loader.load( getFileUrlOrPath( interfaceParamsetDef ), )
|
151
284
|
# @paramSets = paramSets.concat( loaded ) if loaded && loaded.any?
|
152
285
|
end
|
153
286
|
end
|
154
287
|
|
155
288
|
# # accept parameters set to model
|
156
|
-
# def
|
157
|
-
# model.
|
289
|
+
# def modelInterface( paramSet )
|
290
|
+
# model.modelInterface( paramSet )
|
158
291
|
# end
|
159
292
|
|
160
293
|
# def paramSets
|
@@ -180,12 +313,13 @@ module Sbuilder
|
|
180
313
|
@logger.info( "#{__method__} load started" )
|
181
314
|
loadResolvers( getResolversConfig )
|
182
315
|
loadInterfaces( getInterfaceConfig )
|
316
|
+
loadInvariants( getInvariantConfig )
|
183
317
|
end
|
184
318
|
|
185
319
|
|
186
|
-
def extend
|
187
|
-
|
188
|
-
end
|
320
|
+
# def extend
|
321
|
+
# loadExtensions( getExtensionConfigs )
|
322
|
+
# end
|
189
323
|
|
190
324
|
# ------------------------------------------------------------------
|
191
325
|
# iterate setups
|
@@ -201,14 +335,15 @@ module Sbuilder
|
|
201
335
|
|
202
336
|
validateProperties( setupDef, @@validSetups_required, @@validSetups_allowed )
|
203
337
|
@logger.info( "#{__method__} -->next" ) if setupDirectory && (setupDef['setupDirectory'] != setupDirectory)
|
204
|
-
next if setupDirectory && setupDef['setupDirectory'] != setupDirectory
|
338
|
+
next if setupDirectory && setupDef['setupDirectory'] != setupDirectory
|
339
|
+
validateProperties( setupDef['configuration'], @@validSetupConfiguration_required, @@validSetupConfiguration_allowed ) if setupDef['configuration']
|
205
340
|
|
206
341
|
# process one setupDirectory
|
207
342
|
@logger.info( "#{__method__} start to generate setupDirectory=#{setupDirectory} for #{setupDef}" )
|
208
343
|
|
209
344
|
output( 1, "------------------------------------------------------------------" ) if isOptFilterSrc
|
210
345
|
output( 1, "generate setup: #{setupDef['setupDirectory']}" )
|
211
|
-
generate( setupDef['setupDirectory'], setupDef['setupDirectory']
|
346
|
+
generate( setupDef['setupDirectory'], setupDef['setupDirectory'] )
|
212
347
|
@logger.info( "#{__method__} done to generate setupDirectory=#{setupDirectory} for #{setupDef}" )
|
213
348
|
output( 2, "\n" )
|
214
349
|
|
@@ -253,6 +388,10 @@ module Sbuilder
|
|
253
388
|
# delegate action
|
254
389
|
begin
|
255
390
|
resolver.resolveDomains( paramSet, model )
|
391
|
+
|
392
|
+
# resolve also response
|
393
|
+
resolver.resolveDomains( paramSet.response, model ) if paramSet.respond_to?( :response )
|
394
|
+
|
256
395
|
rescue ResolverException => e
|
257
396
|
msg = "Error '#{e}' when mapping domains for parameter set '#{paramSet.getId}'"
|
258
397
|
puts msg
|
@@ -272,11 +411,48 @@ module Sbuilder
|
|
272
411
|
#
|
273
412
|
# @param setupName [String] name of setup, currently = extensionDirectory
|
274
413
|
# @param extensionDirectory [String] directory where setup generated
|
275
|
-
# @arrayOfExtensionDefs [Hash:Array] of extenstions to load
|
276
414
|
|
277
|
-
def generate( setupName="default", extensionDirectory="default"
|
415
|
+
def generate( setupName="default", extensionDirectory="default" )
|
278
416
|
@logger.info( "#{__method__} setupName=#{setupName}, extensionDirectory=#{extensionDirectory}" )
|
279
|
-
|
417
|
+
|
418
|
+
processSetup( setupName ) do |name, setupConf, possibilities|
|
419
|
+
|
420
|
+
# config && get renderes
|
421
|
+
mustache = prepareRender( setupName )
|
422
|
+
|
423
|
+
# path to directory where setup output is done
|
424
|
+
directoryPath = prepareSetupDir( extensionDirectory )
|
425
|
+
|
426
|
+
# output 'normal templates' - one generate def/one output
|
427
|
+
generateCase( setupName, directoryPath, nil, mustache )
|
428
|
+
|
429
|
+
# For 'possibities': map array of possibilities to array
|
430
|
+
# of filenames created using an output -property on
|
431
|
+
# 'generate' definition
|
432
|
+
possibilities && possibilities.any? && generateCase( setupName, directoryPath, 'possibility', mustache ) do |output|
|
433
|
+
# use output as template rendering
|
434
|
+
possibilities.map do |p|
|
435
|
+
{
|
436
|
+
:possibility => p,
|
437
|
+
:outputFile => mustache.render_str( output, { "possibility" => p } ),
|
438
|
+
}
|
439
|
+
end # map
|
440
|
+
end
|
441
|
+
|
442
|
+
end
|
443
|
+
|
444
|
+
end
|
445
|
+
|
446
|
+
# @param chosenSetup [String] optional string for the setup to process
|
447
|
+
def processSetups(chosenSetup=nil, &blk )
|
448
|
+
setups = Marshal.load( Marshal.dump( getSetups ) || [] ).select { |s| chosenSetup.nil? || s['setupDirectory'] == chosenSetup }
|
449
|
+
setups.each do |setup|
|
450
|
+
setupName = setup['setupDirectory']
|
451
|
+
processSetup( setupName, &blk )
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
def processSetup( setupName, &blk )
|
280
456
|
|
281
457
|
# init state
|
282
458
|
start
|
@@ -287,35 +463,24 @@ module Sbuilder
|
|
287
463
|
# resolve domain
|
288
464
|
resolve
|
289
465
|
|
466
|
+
# access config && put to model
|
467
|
+
setupConf = getSetup( setupName )
|
468
|
+
defineSetup( setupConf )
|
469
|
+
|
470
|
+
# add assumptions to model
|
471
|
+
loadAssumptions( getSetupAssumptionList( setupConf ) )
|
472
|
+
|
290
473
|
# extensions
|
291
|
-
loadExtensions(
|
474
|
+
loadExtensions( setupName )
|
292
475
|
|
293
476
|
# config model - before config rendering
|
477
|
+
possibilities= getSetupPossibilitiesList( setupName )
|
294
478
|
model.setPossibilities( possibilities )
|
295
|
-
|
296
|
-
# config && get renderes
|
297
|
-
mustache = prepareRender( setupName )
|
298
479
|
|
299
|
-
|
300
|
-
directoryPath = prepareSetupDir( extensionDirectory )
|
301
|
-
|
302
|
-
# output 'normal templates' - one generate def/one output
|
303
|
-
generateCase( setupName, directoryPath, nil, mustache )
|
304
|
-
|
305
|
-
# For 'possibities': map array of possibilities to array
|
306
|
-
# of filenames created using an output -property on
|
307
|
-
# 'generate' definition
|
308
|
-
possibilities && generateCase( setupName, directoryPath, 'possibility', mustache ) do |output|
|
309
|
-
# use output as template rendering
|
310
|
-
possibilities.map do |p|
|
311
|
-
{
|
312
|
-
:possibility => p,
|
313
|
-
:outputFile => mustache.render_str( output, { "possibility" => p } ),
|
314
|
-
}
|
315
|
-
end # map
|
316
|
-
end
|
480
|
+
yield setupName, setupConf, possibilities
|
317
481
|
|
318
482
|
end
|
483
|
+
|
319
484
|
|
320
485
|
|
321
486
|
# Ensure that directory 'extensionDirectory' exists under
|
@@ -505,7 +670,7 @@ module Sbuilder
|
|
505
670
|
#
|
506
671
|
# @param modelData [String] type of data (see model#templateData)
|
507
672
|
#
|
508
|
-
# @param
|
673
|
+
# @param renderData [Hash] data element to filter, content depends on 'modelData'
|
509
674
|
#
|
510
675
|
# @return [Boolean] true when show the elmement
|
511
676
|
def setupFilter( modelData, renderData )
|
@@ -582,10 +747,24 @@ module Sbuilder
|
|
582
747
|
return setupPossis
|
583
748
|
end
|
584
749
|
|
585
|
-
|
586
|
-
|
587
|
-
#
|
588
|
-
#
|
750
|
+
|
751
|
+
|
752
|
+
# Return model invariant defined in sbuilder
|
753
|
+
#
|
754
|
+
# @return [String:Array] of invariant names
|
755
|
+
def getModelInvariants
|
756
|
+
names = []
|
757
|
+
getInvariantConfig.each { |invariant| names += invariant.keys }
|
758
|
+
@logger.info "#{__method__} invariants=#{names.join(',')}"
|
759
|
+
return names
|
760
|
+
end
|
761
|
+
|
762
|
+
|
763
|
+
# @return [String:Array] names of setup assumes from
|
764
|
+
# 'setups.{supet}.assumptions' property
|
765
|
+
def getSetupAssumes
|
766
|
+
model.assumptions.map{|a| a[:name] }
|
767
|
+
end
|
589
768
|
|
590
769
|
# ------------------------------------------------------------------
|
591
770
|
# configuration
|
@@ -611,7 +790,8 @@ module Sbuilder
|
|
611
790
|
|
612
791
|
@logger.debug( "#{__method__} config in #{getInternalConfigFilePath} internal_config= #{internal_config.to_yaml}" )
|
613
792
|
@controller_config['generate'] = @controller_config['generate'] + internal_config['generate']
|
614
|
-
@logger.debug( "#{__method__} @controller_config=#{@controller_config.to_yaml}" )
|
793
|
+
@logger.debug( "#{__method__} @controller_config=#{@controller_config.to_yaml}" )
|
794
|
+
validateProperties( @controller_config, @@validConfig, @@allowConfig )
|
615
795
|
@controller_config
|
616
796
|
end
|
617
797
|
|
@@ -626,6 +806,25 @@ module Sbuilder
|
|
626
806
|
@logger.debug( "#{__method__} setupName=#{setupName}, setup=#{setup} " )
|
627
807
|
setup
|
628
808
|
end
|
809
|
+
|
810
|
+
# @return [Hash:Array] of 'type', 'url'|'file' properties
|
811
|
+
def getSetupExtensions( setupName )
|
812
|
+
@logger.debug( "#{__method__} setupName=#{setupName}" )
|
813
|
+
getSetup( setupName )['extensions'] || []
|
814
|
+
end
|
815
|
+
|
816
|
+
# @return [String:Array] of setup possibilities
|
817
|
+
def getSetupPossibilitiesList( setupName )
|
818
|
+
@logger.debug( "#{__method__} setupName=#{setupName}" )
|
819
|
+
getSetup( setupName )['possibilities'] || []
|
820
|
+
end
|
821
|
+
|
822
|
+
# @param setupDef [Hash] setup configuration
|
823
|
+
# @return [String:Array] name of assumption in setup, [] if none
|
824
|
+
def getSetupAssumptionList( setupDef )
|
825
|
+
return setupDef['assumptions'] || []
|
826
|
+
end
|
827
|
+
|
629
828
|
|
630
829
|
|
631
830
|
def getPreferencesData( setupName )
|
@@ -680,11 +879,34 @@ module Sbuilder
|
|
680
879
|
getConfig()['extensions']
|
681
880
|
end
|
682
881
|
|
882
|
+
# @return [Hash] of extension properties
|
883
|
+
def getExtensions
|
884
|
+
getConfig()['extend'] || {}
|
885
|
+
end
|
886
|
+
|
887
|
+
# Api loaders configured in sbuilder.yaml['extend']['loaders']
|
888
|
+
#
|
889
|
+
# @return [Hash:Array] with :name,:className,:configuration properties
|
890
|
+
def getConfiguredLoaders
|
891
|
+
loaders = getExtensions()['loaders'] || []
|
892
|
+
loaders.each do |loader|
|
893
|
+
validateProperties( loader, @@validExtendLoader )
|
894
|
+
end
|
895
|
+
loaders
|
896
|
+
end
|
683
897
|
|
684
898
|
def getResolversConfig
|
685
899
|
getConfig()['resolvers']
|
686
900
|
end
|
687
901
|
|
902
|
+
# @return [Hash:Array] of invariants defined
|
903
|
+
def getInvariantConfig
|
904
|
+
invariants = getConfig()['invariants']
|
905
|
+
invariants = [invariants] if invariants.is_a?( Hash )
|
906
|
+
return invariants || []
|
907
|
+
end
|
908
|
+
|
909
|
+
|
688
910
|
# @param generateCategory [Nil|String] choose templates in
|
689
911
|
# 'generateCategory', @return [Hash:Array] of {'output', 'inputs'}
|
690
912
|
# defining a file to render using templates in 'inputs'
|
@@ -717,15 +939,16 @@ module Sbuilder
|
|
717
939
|
|
718
940
|
end
|
719
941
|
|
720
|
-
# return
|
942
|
+
# @return [String] path to cacheFilePath, if no 'cache' -property
|
721
943
|
def getParamsetCacheFilePath( paramSetDef )
|
722
944
|
return "#{getOpt(:cache_dir)}/#{paramSetDef['cache']}" if paramSetDef['cache'] && getOpt(:cache_dir)
|
723
945
|
return paramSetDef['cache'] if paramSetDef['cache']
|
724
946
|
return nil
|
725
947
|
end
|
726
|
-
|
948
|
+
|
949
|
+
# @return [String] loader type (className/type)
|
727
950
|
def getParamsetType( paramSetDef )
|
728
|
-
paramSetDef['type']
|
951
|
+
paramSetDef['className'] ? paramSetDef['className'] : paramSetDef['type']
|
729
952
|
end
|
730
953
|
|
731
954
|
# def getResolverDefPath( mapperDef )
|
@@ -790,6 +1013,13 @@ module Sbuilder
|
|
790
1013
|
private def validateOne( defintionHash, propList )
|
791
1014
|
raise ControllerException.new "Must give one #{propList} in #{defintionHash}" unless propList.select {|prop| defintionHash.has_key?(prop) }.length == 1
|
792
1015
|
end
|
1016
|
+
|
1017
|
+
# add default properties in 'defaults' to 'defintionHash'
|
1018
|
+
private def defaultProps( defintionHash, defaults )
|
1019
|
+
defintionHash = defintionHash.merge( defaults ) do |k,orig,default|
|
1020
|
+
orig.nil? ? default : orig
|
1021
|
+
end
|
1022
|
+
end
|
793
1023
|
|
794
1024
|
|
795
1025
|
|