tla-sbuilder 0.2.2 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +150 -116
- data/VERSION +1 -1
- data/lib/cli/cli-customer.rb +23 -3
- data/lib/cli/cli-pet.rb +66 -12
- data/lib/cli/cli-text.rb +127 -8
- data/lib/cli/cli.rb +49 -6
- data/lib/sbuilder.rb +26 -3
- data/lib/sbuilder/constants.rb +165 -6
- data/lib/sbuilder/controller.rb +943 -169
- data/lib/sbuilder/controller_utils.rb +122 -0
- data/lib/sbuilder/default-sbuilder.yaml +38 -44
- data/lib/sbuilder/domain.rb +160 -36
- data/lib/sbuilder/domain_cardinality.rb +1 -1
- data/lib/sbuilder/domain_range.rb +102 -0
- data/lib/sbuilder/domain_type.rb +150 -0
- data/lib/sbuilder/domain_value.rb +21 -13
- data/lib/sbuilder/exception.rb +16 -0
- data/lib/sbuilder/extension_loader.rb +67 -686
- data/lib/sbuilder/extension_loader_deprecated_step_extensions.rb +711 -0
- data/lib/sbuilder/extension_loader_step_generator.rb +876 -0
- data/lib/sbuilder/facade/{api_loader.rb → api_loader_facade.rb} +176 -45
- data/lib/sbuilder/facade/api_loader_plugin.rb +6 -32
- data/lib/sbuilder/facade/api_loader_plugin_mixer.rb +35 -0
- data/lib/sbuilder/facade/facade_constants.rb +23 -0
- data/lib/sbuilder/facade/loader_plugin_root.rb +56 -0
- data/lib/sbuilder/facade/param_set_root.rb +55 -0
- data/lib/sbuilder/facade/snippet_loader_facade.rb +600 -0
- data/lib/sbuilder/facade/snippet_loader_plugin.rb +76 -0
- data/lib/sbuilder/facade/snippet_loader_plugin_mixer.rb +56 -0
- data/lib/sbuilder/factory.rb +224 -45
- data/lib/sbuilder/model.rb +125 -45
- data/lib/sbuilder/mustache/template.rb +107 -58
- data/lib/sbuilder/mustache/template_reader.rb +56 -46
- data/lib/sbuilder/mustache/template_reader_context.rb +64 -234
- data/lib/sbuilder/mustache/template_resolve.rb +103 -0
- data/lib/sbuilder/mustache/template_root.rb +71 -0
- data/lib/sbuilder/param_set.rb +30 -15
- data/lib/sbuilder/param_set_db.rb +1 -1
- data/lib/sbuilder/param_set_def.rb +6 -1
- data/lib/sbuilder/param_set_def_func.rb +39 -0
- data/lib/sbuilder/param_set_if.rb +45 -10
- data/lib/sbuilder/param_set_loader_swagger.rb +56 -26
- data/lib/sbuilder/param_set_step.rb +1 -1
- data/lib/sbuilder/param_sets.rb +2 -1
- data/lib/sbuilder/parameter.rb +9 -3
- data/lib/sbuilder/parameter_container.rb +1 -1
- data/lib/sbuilder/parameter_dom.rb +17 -5
- data/lib/sbuilder/parameter_ref.rb +39 -10
- data/lib/sbuilder/parser/parser_facade.rb +310 -0
- data/lib/sbuilder/resolver.rb +11 -6
- data/lib/sbuilder/resolver_loader.rb +1 -1
- data/lib/sbuilder/resolver_loader_yaml.rb +1 -1
- data/lib/sbuilder/resolver_rule.rb +1 -1
- data/lib/sbuilder/resolver_rule_match.rb +10 -4
- data/lib/sbuilder/resolver_rule_ref.rb +1 -1
- data/lib/sbuilder/setup_loader.rb +49 -0
- data/lib/sbuilder/setup_loader_env.rb +478 -0
- data/lib/sbuilder/setup_loader_pref.rb +56 -0
- data/lib/sbuilder/snippet_loader_simple.rb +125 -0
- data/lib/sbuilder/spec/api_loader.rb +34 -0
- data/lib/sbuilder/spec/api_loader_facade.rb +169 -32
- data/lib/sbuilder/spec/loader_plugin.rb +98 -0
- data/lib/sbuilder/spec/snippet_loader.rb +228 -0
- data/lib/sbuilder/symbol_table.rb +279 -0
- data/lib/utils/{cache_lines.rb → fileio.rb} +8 -1
- data/lib/utils/logger.rb +2 -1
- data/lib/utils/powerset.rb +13 -0
- data/lib/utils/validate.rb +38 -0
- data/mustache/cfg/const_def.mustache +2 -0
- data/mustache/cfg/macro_run.mustache +1 -4
- data/mustache/data-model-header.mustache +1 -0
- data/mustache/definition_types.mustache +34 -4
- data/mustache/domains.mustache +1 -1
- data/mustache/domains_assign.mustache +1 -1
- data/mustache/infrastructure-service-init.mustache +1 -1
- data/mustache/interface_processes.mustache +16 -10
- data/mustache/interface_types.mustache +37 -11
- data/mustache/operator-infrastructure-service.mustache +1 -1
- data/mustache/resources/schedule_operator_new_step.tla +8 -0
- data/mustache/resources/schedule_process_macro.tla +37 -0
- data/mustache/resources/schedule_process_procedure.tla +22 -0
- data/mustache/resources/schedule_throw.tla +16 -0
- data/mustache/setup/domains_run.mustache +8 -2
- data/mustache/setup/operator_run.mustache +0 -4
- data/mustache/setup/steps_run.mustache +4 -3
- data/mustache/setup/steps_run_parameterBind.mustache +14 -6
- data/mustache/setup/steps_run_parameterExact.mustache +7 -3
- data/mustache/state_type_invariant-infrastructure-service.mustache +9 -4
- data/mustache/tla/const_def.mustache +1 -1
- data/mustache/tla/macro_run.mustache +7 -1
- data/mustache/tla/module_header.mustache +1 -1
- data/mustache/tla/operator_run.mustache +8 -5
- data/mustache/tla/plc_define_run.mustache +45 -36
- data/mustache/tla/plc_run_state.mustache +12 -5
- data/src-extend/extend/extend_assumptions.mustache +3 -0
- data/src-extend/extend/extend_const.mustache +3 -0
- data/src-extend/extend/extend_implementation.mustache +3 -0
- data/src-extend/extend/extend_invariant.mustache +3 -0
- data/src-extend/extend/extend_macros.mustache +3 -0
- data/src-extend/extend/extend_operations.mustache +3 -0
- data/src-extend/extend/extend_state.mustache +3 -0
- data/src/pet/extend/extend_assumptions.mustache +4 -0
- data/src/pet/extend/extend_implementation.mustache +3 -0
- data/src/pet/extend/extend_invariant.mustache +3 -0
- data/src/pet/extend/extend_macros.mustache +3 -0
- data/src/pet/extend/extend_operations.mustache +4 -0
- data/src/pet/extend/extend_state.mustache +3 -0
- data/src/pet/interface +5 -5
- data/src/pet/interface_delete_pet.tla +1 -1
- data/src/pet/interface_get_pet.tla +1 -1
- data/src/pet/interface_post_pet.tla +4 -2
- data/src/pet/interface_post_tag.tla +1 -1
- data/src/pet/interface_put_tag.tla +1 -1
- data/tla-sbuilder.gemspec +3 -3
- metadata +44 -19
- data/mustache/name_definition_type.mustache +0 -5
- data/mustache/name_domain.mustache +0 -5
- data/mustache/name_domain_value.mustache +0 -5
- data/mustache/name_domain_value_prefix.mustache +0 -5
- data/mustache/name_interface_response_type.mustache +0 -6
- data/mustache/name_interface_type.mustache +0 -6
- data/mustache/name_parameter_type.mustache +0 -6
- data/mustache/name_process.mustache +0 -6
- data/mustache/state_type_invariant.mustache +0 -17
- data/mustache/state_variables.mustache +0 -20
- data/src-extend/extend/extend_invariant_cfg.mustache +0 -7
data/lib/sbuilder/resolver.rb
CHANGED
@@ -9,7 +9,7 @@ module Sbuilder
|
|
9
9
|
|
10
10
|
# ------------------------------------------------------------------
|
11
11
|
# mixer
|
12
|
-
PROGNAME =
|
12
|
+
PROGNAME = nil # progname for logger defaults class name
|
13
13
|
include Sbuilder::Utils::MyLogger # mix logger
|
14
14
|
|
15
15
|
# ------------------------------------------------------------------
|
@@ -61,13 +61,18 @@ module Sbuilder
|
|
61
61
|
# iterate rules and find a match, must find one that matches
|
62
62
|
def applyRule( parameter, model )
|
63
63
|
# No need resolve referenced paramters
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
if parameter.isReference
|
65
|
+
return parameter.resolveReference( model )
|
66
|
+
else
|
67
|
+
|
68
|
+
# paramter_dom
|
69
|
+
rules.each do |rule|
|
70
|
+
if rule.applyRule( parameter, model ) then
|
71
|
+
return true
|
72
|
+
end
|
68
73
|
end
|
74
|
+
return false
|
69
75
|
end
|
70
|
-
return false
|
71
76
|
|
72
77
|
end
|
73
78
|
|
@@ -8,7 +8,7 @@ module Sbuilder
|
|
8
8
|
|
9
9
|
# ------------------------------------------------------------------
|
10
10
|
# mixer
|
11
|
-
PROGNAME =
|
11
|
+
PROGNAME = nil # progname for logger default class name
|
12
12
|
include Sbuilder::Utils::MyLogger # mix logger
|
13
13
|
|
14
14
|
|
@@ -4,7 +4,7 @@ module Sbuilder
|
|
4
4
|
|
5
5
|
# ------------------------------------------------------------------
|
6
6
|
# mixer
|
7
|
-
PROGNAME =
|
7
|
+
PROGNAME = nil # progname for logger default class name
|
8
8
|
include Sbuilder::Utils::MyLogger # mix logger
|
9
9
|
|
10
10
|
# ------------------------------------------------------------------
|
@@ -6,7 +6,7 @@ module Sbuilder
|
|
6
6
|
|
7
7
|
# ------------------------------------------------------------------
|
8
8
|
# mixer
|
9
|
-
PROGNAME =
|
9
|
+
PROGNAME = nil # progname for logger default class name
|
10
10
|
include Sbuilder::Utils::MyLogger # mix logger
|
11
11
|
|
12
12
|
# ------------------------------------------------------------------
|
@@ -7,7 +7,7 @@ module Sbuilder
|
|
7
7
|
|
8
8
|
# ------------------------------------------------------------------
|
9
9
|
# mixer
|
10
|
-
PROGNAME =
|
10
|
+
PROGNAME = nil # progname for logger default class name
|
11
11
|
include Sbuilder::Utils::MyLogger # mix logger
|
12
12
|
|
13
13
|
# ------------------------------------------------------------------
|
@@ -41,14 +41,20 @@ module Sbuilder
|
|
41
41
|
return true if parameter.domain
|
42
42
|
if match( parameter ) then
|
43
43
|
@logger.info( "#{__method__} setDomain '#{domain}' on parameter '#{parameter.getName}' based on rule '#{matchRule}'" )
|
44
|
-
#
|
45
|
-
|
46
|
-
parameter.
|
44
|
+
#
|
45
|
+
self.class.setDomain( parameter, domain, model )
|
46
|
+
# parameter.setDomain( domain )
|
47
|
+
# parameter.resolveDomain( model )
|
47
48
|
return true
|
48
49
|
end
|
49
50
|
return false
|
50
51
|
end
|
51
52
|
|
53
|
+
def self.setDomain( parameter, domain, model )
|
54
|
+
parameter.setDomain( domain )
|
55
|
+
parameter.resolveDomain( model )
|
56
|
+
end
|
57
|
+
|
52
58
|
|
53
59
|
|
54
60
|
end
|
@@ -6,7 +6,7 @@ module Sbuilder
|
|
6
6
|
attr_reader :ref # reference to mapper
|
7
7
|
# ------------------------------------------------------------------
|
8
8
|
# mixer
|
9
|
-
PROGNAME =
|
9
|
+
PROGNAME = nil # progname for logger default class name
|
10
10
|
include Sbuilder::Utils::MyLogger # mix logger
|
11
11
|
|
12
12
|
# ------------------------------------------------------------------
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Sbuilder
|
2
|
+
|
3
|
+
|
4
|
+
# Abstaract base class
|
5
|
+
class SetupLoader
|
6
|
+
|
7
|
+
# ------------------------------------------------------------------
|
8
|
+
# mix logger
|
9
|
+
|
10
|
+
PROGNAME = nil # progname for logger default class name
|
11
|
+
include Sbuilder::Utils::MyLogger # mix logger
|
12
|
+
|
13
|
+
# @attr [Sbuilder:Controller] controller managing generation
|
14
|
+
attr_accessor :controller
|
15
|
+
|
16
|
+
# @attr [String] setupName setter & getter
|
17
|
+
attr_accessor :setupName
|
18
|
+
|
19
|
+
|
20
|
+
def initialize( options = {} )
|
21
|
+
@logger = getLogger( nil, options )
|
22
|
+
@logger.info( "#{__method__} initialized options=#{options}" )
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [Sbuilder::StepGenerator] generator to create input
|
27
|
+
def getStepGenerator
|
28
|
+
controller.factory.getStepGenerator
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
# Method called from extension-loder. Delegate actual load
|
33
|
+
# operation to sub-class.
|
34
|
+
#
|
35
|
+
# @param [Hash] extensionDef configuration defining loading
|
36
|
+
def load( extensionDef )
|
37
|
+
doLoad( extensionDef )
|
38
|
+
end
|
39
|
+
|
40
|
+
# Should override
|
41
|
+
#
|
42
|
+
# @param [Hash] extensionDef configuration defining loading
|
43
|
+
def doDoload( extensionDef )
|
44
|
+
raise "Missing implementation in sub-class"
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,478 @@
|
|
1
|
+
module Sbuilder
|
2
|
+
|
3
|
+
|
4
|
+
# Abstaract base class
|
5
|
+
class SetupLoaderEnv < SetupLoader
|
6
|
+
|
7
|
+
# ------------------------------------------------------------------
|
8
|
+
# Validation
|
9
|
+
|
10
|
+
@@validEnvExtension_required = %w( interface )
|
11
|
+
@@validEnvExtension_allowed = %w( validators input inputs bindExact )
|
12
|
+
|
13
|
+
|
14
|
+
# ------------------------------------------------------------------
|
15
|
+
# mix logger
|
16
|
+
|
17
|
+
PROGNAME = nil # progname for logger default class name
|
18
|
+
include Sbuilder::Utils::MyLogger # mix logger
|
19
|
+
|
20
|
+
@@extensionDomainProperties = ['domain', 'cardinality']
|
21
|
+
|
22
|
+
# ------------------------------------------------------------------
|
23
|
+
# @!group Construct & configure
|
24
|
+
|
25
|
+
|
26
|
+
def initialize( options = {} )
|
27
|
+
@logger = getLogger( nil, options )
|
28
|
+
@logger.info( "#{__method__} initialized options=#{options}" )
|
29
|
+
|
30
|
+
super( options )
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
# @!endgroup
|
35
|
+
|
36
|
+
# ------------------------------------------------------------------
|
37
|
+
# @!group Abstract methods from parent class
|
38
|
+
|
39
|
+
# @param [Hash:Array] extensionDef configuration defining loading
|
40
|
+
def doLoad( extensionDefs )
|
41
|
+
|
42
|
+
@logger.info "#{__method__}, extensionDefs=#{extensionDefs}"
|
43
|
+
|
44
|
+
extensionDefs && extensionDefs.each do |stepExtensionDef|
|
45
|
+
Sbuilder::Utils::Validate.validateProperties( stepExtensionDef, @@validEnvExtension_required, @@validEnvExtension_allowed )
|
46
|
+
begin
|
47
|
+
doLoadStep( stepExtensionDef )
|
48
|
+
rescue SbuilderException => e
|
49
|
+
msg = <<-EOS.unindent
|
50
|
+
|
51
|
+
#{e}
|
52
|
+
|
53
|
+
Error occurred, when applying step extension:
|
54
|
+
#{stepExtensionDef.to_yaml}
|
55
|
+
EOS
|
56
|
+
@logger.error "#{__method__} #{msg}"
|
57
|
+
raise Sbuilder::ExtensionException.new, msg, e.backtrace
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
# @!endgroup
|
64
|
+
|
65
|
+
# ------------------------------------------------------------------
|
66
|
+
# @!group Implement load
|
67
|
+
|
68
|
+
|
69
|
+
# @param [Hash] stepExtensionDef one step to take
|
70
|
+
# @option stepExtensionDef [String] interface
|
71
|
+
# @option stepExtensionDef [String] bindExact
|
72
|
+
# @option stepExtensionDef [String]
|
73
|
+
def doLoadStep ( stepExtensionDef )
|
74
|
+
|
75
|
+
# access interface (paramSet) to invoke in step
|
76
|
+
interface = controller.getInterface( stepExtensionDef['interface'] )
|
77
|
+
|
78
|
+
# create new param-set && configure it
|
79
|
+
stepParamSet = controller.createParamSet( Sbuilder::Constants::PARAM_SET_STEPS )
|
80
|
+
stepParamSet.setInterfaceReference( interface )
|
81
|
+
stepParamSet.setBindExact( stepExtensionDef["bindExact"] )
|
82
|
+
|
83
|
+
# set if 'stepExtensionDef' configuration defines
|
84
|
+
inputsValues = nil
|
85
|
+
if stepExtensionDef['validators']
|
86
|
+
inputsValues = doLoadGenerator( stepExtensionDef, interface )
|
87
|
+
|
88
|
+
elsif stepExtensionDef['input'] || stepExtensionDef['inputs']
|
89
|
+
inputsValues = doLoadInputs( stepExtensionDef, interface )
|
90
|
+
else
|
91
|
+
# msg =<<-EOS.unindent
|
92
|
+
# Extension must define 'validators' or 'input'/'inputs' properties.
|
93
|
+
|
94
|
+
# Erroneous extension definition #{stepExtensionDef}
|
95
|
+
# EOS
|
96
|
+
# @logger.error( "#{__method__} #{msg}" )
|
97
|
+
# raise ExtensionException.new, msg
|
98
|
+
end
|
99
|
+
|
100
|
+
if !inputsValues.nil?
|
101
|
+
|
102
|
+
# convert step inputs to mustache template data
|
103
|
+
mustacheTemplateDatas, mustacheTemplateDatasTypes = toTemplateData( inputsValues )
|
104
|
+
|
105
|
+
# add mustache data to param set to pass to model
|
106
|
+
mustacheTemplateDatas.each do |mustacheTemplateData|
|
107
|
+
stepParamSet.addInput( mustacheTemplateData )
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
# pass step extension to controller
|
114
|
+
controller.extendStep( stepParamSet )
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
# Generate input values
|
119
|
+
#
|
120
|
+
# @param [Hash] stepExtensionDef one step to take
|
121
|
+
#
|
122
|
+
# @param [Sbuilder::ParamSet] interface parameter for which
|
123
|
+
# generatio takes place
|
124
|
+
#
|
125
|
+
#
|
126
|
+
# @return [Hash:Array] array of input hashes to 'interface' operation
|
127
|
+
def doLoadGenerator( stepExtensionDef, interface )
|
128
|
+
# access rules used to generate step input
|
129
|
+
stepValidators = stepExtensionDef['validators']
|
130
|
+
@logger.info "#{__method__}, inputs=#{stepValidators.join(',')}"
|
131
|
+
|
132
|
+
# use generator to create inputs for the step
|
133
|
+
inputsValues = generateInputs( interface, stepValidators )
|
134
|
+
@logger.info "#{__method__}, inputsValues=#{inputsValues.join(',')}"
|
135
|
+
|
136
|
+
|
137
|
+
inputsValues
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
# Expand & maps 'input'/'inputs' in 'stepExtensionDef' to array of hashes
|
142
|
+
#
|
143
|
+
#
|
144
|
+
# @return [Hash:Array] array of input hashes to 'interface' operation
|
145
|
+
def doLoadInputs( stepExtensionDef, interface )
|
146
|
+
|
147
|
+
raise ExtensionException.new <<-EOS if stepExtensionDef['input'] && stepExtensionDef['inputs']
|
148
|
+
Property 'input' cannot be defined together with 'inputs' in #{stepExtensionDef.to_yaml}
|
149
|
+
|
150
|
+
Use
|
151
|
+
|
152
|
+
inputs:
|
153
|
+
- input:
|
154
|
+
...
|
155
|
+
- input:
|
156
|
+
...
|
157
|
+
|
158
|
+
or for a single input
|
159
|
+
|
160
|
+
input:
|
161
|
+
....
|
162
|
+
EOS
|
163
|
+
|
164
|
+
# use either 'input' or 'inputs/input'
|
165
|
+
inputs = stepExtensionDef['input'] ? [ stepExtensionDef['input'] ] : stepExtensionDef['inputs'].map { |i| i['input'] }
|
166
|
+
@logger.info "#{__method__}, inputs=#{inputs.join(',')}"
|
167
|
+
|
168
|
+
# use generator to create inputs for the step
|
169
|
+
inputsValues = expandInputs( inputs, interface )
|
170
|
+
@logger.info "#{__method__}, inputsValues=#{inputsValues.join(',')}"
|
171
|
+
|
172
|
+
inputsValues
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
# @!endgroup
|
177
|
+
|
178
|
+
# ------------------------------------------------------------------
|
179
|
+
# @!group Map inputs to domaina
|
180
|
+
|
181
|
+
# Expand domain reference in 'input' domain values in
|
182
|
+
# 'paramSet'. If '_default' parameter given in 'input', add
|
183
|
+
# missing all fields in 'input' with parameters in 'paramSet'
|
184
|
+
#
|
185
|
+
# @param [Sbuilder::ParamSet] paramSet used in expanion
|
186
|
+
#
|
187
|
+
# @param [Hash|Array] input to expand
|
188
|
+
def expandInputs( inputs, paramSet )
|
189
|
+
|
190
|
+
@logger.info "#{__method__} paramSet=#{paramSet}, isArray=#{paramSet.respond_to?(:isArray) ? paramSet.isArray : 'non-array' }"
|
191
|
+
|
192
|
+
inputs = inputs.kind_of?( Array ) ? inputs : [inputs]
|
193
|
+
|
194
|
+
ret = inputs.map { |input| expandHash( input, paramSet ) }
|
195
|
+
ret
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
|
200
|
+
#
|
201
|
+
#
|
202
|
+
# @param [Hash] memo which has been expanded so far
|
203
|
+
#
|
204
|
+
# @param [Array] default domain values for _default
|
205
|
+
|
206
|
+
def expandHash( input, paramSet, defaultValues=[], memo={} )
|
207
|
+
|
208
|
+
@logger.debug "#{__method__}: paramSet=#{paramSet}, isArray=#{paramSet.respond_to?(:isArray) ? paramSet.isArray : 'non-array' }, parameters=#{paramSet.parameters.join(',')}"
|
209
|
+
|
210
|
+
# Expect Hash as input
|
211
|
+
if !input.kind_of?( Hash )
|
212
|
+
msg = <<-EOS.unindent
|
213
|
+
Expect 'Hash' as an input, value '#{input}' is of type '#{input.class}'
|
214
|
+
|
215
|
+
Hash should define values for parameters: #{paramSet.parameters.map {|p| p.name}.join('n') }
|
216
|
+
EOS
|
217
|
+
@logger.error "#{__method__}: #{msg}"
|
218
|
+
raise ExtensionException.new, msg
|
219
|
+
end
|
220
|
+
|
221
|
+
# default is last non nil value on 'defaultValues' stack
|
222
|
+
defaultValues << input['_default']
|
223
|
+
defaultValue = defaultValues.reverse.find { |v| !v.nil? }
|
224
|
+
|
225
|
+
|
226
|
+
# iterate each hash key
|
227
|
+
input.each do |k,v|
|
228
|
+
next if k == '_default'
|
229
|
+
@logger.debug "#{__method__}: k=#{k}, v=#{v}"
|
230
|
+
parameter = paramSet.lookupParameter( k )
|
231
|
+
if parameter.nil?
|
232
|
+
msg = <<-EOS.unindent
|
233
|
+
Unknown parameter name '#{k}'
|
234
|
+
|
235
|
+
Valid names: #{paramSet.parameters.map {|p| p.name}.join(',')}
|
236
|
+
EOS
|
237
|
+
@logger.error "#{__method__} #{msg}"
|
238
|
+
raise ExtensionException.new, msg
|
239
|
+
end
|
240
|
+
|
241
|
+
# Error in array type
|
242
|
+
if parameterIsArray( parameter ) != v.kind_of?( Array )
|
243
|
+
msg = <<-EOS.unindent
|
244
|
+
Expect parameter '#{parameter.name}' #{ parameterIsArray(parameter) ? 'to be an array' : 'not to be an array' }.
|
245
|
+
|
246
|
+
However, input value '#{v}' is '#{ v.kind_of?( Array ) ? 'an array' : 'not an array' }'
|
247
|
+
|
248
|
+
EOS
|
249
|
+
@logger.error "#{__method__} #{msg}"
|
250
|
+
raise ExtensionException.new, msg
|
251
|
+
end
|
252
|
+
|
253
|
+
|
254
|
+
# Create value for key 'k'
|
255
|
+
case [parameter.class]
|
256
|
+
when [Sbuilder::Parameter_Dom]
|
257
|
+
# validateDomain( parameter, v )
|
258
|
+
memo[k] = v.kind_of?(Array) ?
|
259
|
+
v.map { |ve| parameterValue( parameter, ve ) } :
|
260
|
+
parameterValue( parameter, v )
|
261
|
+
when [Sbuilder::Parameter_Ref]
|
262
|
+
memo[k] = v.kind_of?(Array) ?
|
263
|
+
v.map { |ve| expandHash( ve, parameter.getResolvedReference, defaultValues ) } :
|
264
|
+
expandHash( v, parameter.getResolvedReference, defaultValues )
|
265
|
+
|
266
|
+
else
|
267
|
+
msg = "Unknown class #{parameter.class}"
|
268
|
+
raise msg
|
269
|
+
end # case
|
270
|
+
|
271
|
+
end # each k,v
|
272
|
+
|
273
|
+
# add defaults to memo - only if defult defined && key not set
|
274
|
+
|
275
|
+
if !defaultValue.nil?
|
276
|
+
paramSet.parameters.each do |parameter|
|
277
|
+
# add only if value not given
|
278
|
+
if !memo.key?( parameter.name )
|
279
|
+
# add default - unless given
|
280
|
+
case [parameter.class]
|
281
|
+
when [Sbuilder::Parameter_Dom]
|
282
|
+
# use domain value for domain parameters
|
283
|
+
memo[parameter.name] = parameterValue( parameter, defaultValue )
|
284
|
+
when [Sbuilder::Parameter_Ref]
|
285
|
+
# use empty hash as input
|
286
|
+
subHash = expandHash( {}, parameter.getResolvedReference, defaultValues )
|
287
|
+
memo[parameter.name] = subHash
|
288
|
+
else
|
289
|
+
msg = "Unknown class #{parameter.class}"
|
290
|
+
raise msg
|
291
|
+
end # case
|
292
|
+
|
293
|
+
end
|
294
|
+
end # parameters
|
295
|
+
end
|
296
|
+
|
297
|
+
memo
|
298
|
+
|
299
|
+
end
|
300
|
+
|
301
|
+
# @return [Boolean|String] domain values surrounded by quotoes ,
|
302
|
+
# false = nil value
|
303
|
+
private def parameterValue( parameter, domainId )
|
304
|
+
pv = retriveParameterValue( parameter, domainId )
|
305
|
+
# pv = '"' + pv + '"' if pv
|
306
|
+
pv
|
307
|
+
end
|
308
|
+
|
309
|
+
# @return [Boolean|String] domain values, false = nil
|
310
|
+
private def retriveParameterValue( parameter, domainId )
|
311
|
+
parameter.resolvedDomain.render_entry( domainId )
|
312
|
+
end
|
313
|
+
|
314
|
+
# @return [Boolean] true if parameter is array or parameter.refernce is array
|
315
|
+
private def parameterIsArray( parameter )
|
316
|
+
parameter.isArray || ( parameter.isReference && parameter.getResolvedReference.isArray )
|
317
|
+
end
|
318
|
+
|
319
|
+
|
320
|
+
# @!endgroup
|
321
|
+
|
322
|
+
|
323
|
+
# ------------------------------------------------------------------
|
324
|
+
# @!group Generator
|
325
|
+
|
326
|
+
|
327
|
+
# @return [Array] values respecting 'validators' as input to 'interfaceParamset'
|
328
|
+
def generateInputs( interfaceParamset, validators )
|
329
|
+
|
330
|
+
@logger.info "#{__method__}, interfaceParamset=#{interfaceParamset}, validators=#{validators}"
|
331
|
+
|
332
|
+
begin
|
333
|
+
step_generator = getStepGenerator
|
334
|
+
step_generator.initParamSet( interfaceParamset, validators )
|
335
|
+
step_values = step_generator.values
|
336
|
+
rescue StepGeneratorException => ee
|
337
|
+
|
338
|
+
msg =<<-EOS.unindent
|
339
|
+
#{ee}
|
340
|
+
|
341
|
+
Error occurred, when evaluating interface
|
342
|
+
|
343
|
+
#{interfaceParamset}
|
344
|
+
EOS
|
345
|
+
|
346
|
+
@logger.error( "#{__method__} #{msg}" )
|
347
|
+
raise ExtensionException.new, msg, ee.backtrace
|
348
|
+
end
|
349
|
+
|
350
|
+
@logger.debug "#{__method__}, step_values=#{step_values}" if @logger.debug?
|
351
|
+
|
352
|
+
return step_values
|
353
|
+
end
|
354
|
+
|
355
|
+
|
356
|
+
# @!endgroup
|
357
|
+
|
358
|
+
# ------------------------------------------------------------------
|
359
|
+
# @!group Convert ruby containers to template data
|
360
|
+
|
361
|
+
# param [Array] datas elements (Hashes or single values) to map to
|
362
|
+
# template data
|
363
|
+
#
|
364
|
+
# @return [Array, 'hashes'|'singletons'] templateEntry elements array
|
365
|
+
# for templateData elements, template data type 'hashes' or 'singletons'
|
366
|
+
|
367
|
+
def toTemplateData( datas )
|
368
|
+
|
369
|
+
@logger.info "#{__method__}, datas=#{datas} #{datas == [] }"
|
370
|
+
|
371
|
+
templateData = []
|
372
|
+
if datas
|
373
|
+
if datas.any? && datas.first.is_a?( Hash )
|
374
|
+
templateDataType = 'hashes'
|
375
|
+
templateData = datas.map { |data| { 'rows'=>false, 'columns' => toTemplateEntry( data ), "_comma" =>','} }
|
376
|
+
elsif datas == []
|
377
|
+
templateDataType = 'singletons'
|
378
|
+
templateData = [ singleValue( false ) ]
|
379
|
+
@logger.debug "#{__method__}, templateData empty array ret =#{templateData.to_yaml}"
|
380
|
+
else
|
381
|
+
templateDataType = 'singletons'
|
382
|
+
templateData = datas.map { |data| singleValue( data ) }
|
383
|
+
end
|
384
|
+
|
385
|
+
end
|
386
|
+
templateData.last['_comma'] = '' if templateData && templateData.any?
|
387
|
+
@logger.debug "#{__method__}, templateData ret =#{templateData.to_yaml}"
|
388
|
+
return templateData, templateDataType
|
389
|
+
|
390
|
+
end
|
391
|
+
|
392
|
+
# @param [Hash] hash to convert to template data
|
393
|
+
#
|
394
|
+
# @return [Hash] templateData mapped hash
|
395
|
+
# @option templateData [String] parameter_name key in data
|
396
|
+
# @option templateData [String] domain_element value in data (if singleton value element)
|
397
|
+
# @option templateData [Array] rows array of row elements (if array value )
|
398
|
+
# @option templateData [Array] columns aray (if hash value)
|
399
|
+
# @option templateData [String] _comma
|
400
|
+
# @option templateData [Interger] _index
|
401
|
+
#
|
402
|
+
# @return [Array] array with one element for each hash key
|
403
|
+
def toTemplateEntry( hash )
|
404
|
+
|
405
|
+
# should not occurr!
|
406
|
+
raise ExtensionException.new, "Error not a hash #{hash}" unless hash.is_a?( Hash )
|
407
|
+
|
408
|
+
recurseHash( hash ) do |memo, t,h,key,val,indx|
|
409
|
+
# common values, _comma will be overridden for the last entry
|
410
|
+
entry = { "parameter_name" => key, '_index'=> indx, "_comma" => ',' }
|
411
|
+
case t
|
412
|
+
when 'v'
|
413
|
+
entry["columns"] = false
|
414
|
+
entry["domain_element"] = false
|
415
|
+
entry["domain_value"] = val
|
416
|
+
entry["rows"] = false
|
417
|
+
when 'h' # hash valuees
|
418
|
+
entry["columns"] = val
|
419
|
+
entry["domain_element"] = false
|
420
|
+
entry["domain_value"] = false
|
421
|
+
entry["rows"] = false
|
422
|
+
when 'hashes', 'singletons' # array types
|
423
|
+
entry["columns"] = false
|
424
|
+
entry["domain_element"] = false
|
425
|
+
entry["domain_value"] = false
|
426
|
+
entry["row_types"] = t
|
427
|
+
entry["rows"] = val
|
428
|
+
end # case
|
429
|
+
memo << entry
|
430
|
+
end # recurse
|
431
|
+
end # toTemplateEntry
|
432
|
+
|
433
|
+
# Recurse hash
|
434
|
+
#
|
435
|
+
# @return []
|
436
|
+
private def recurseHash( hash, memo=[], &block )
|
437
|
+
|
438
|
+
hash && hash.each_with_index do |(k,v),index|
|
439
|
+
if v.is_a?( Hash ) then
|
440
|
+
hashVal = toTemplateEntry( v )
|
441
|
+
memo = yield memo, 'h', hash, k, hashVal, index
|
442
|
+
elsif v.is_a?( Array ) then
|
443
|
+
arrVals, dataTypes = toTemplateData( v )
|
444
|
+
memo = yield memo, dataTypes, hash, k, arrVals, index
|
445
|
+
else
|
446
|
+
if !v.nil?
|
447
|
+
# Nil values are omitted,
|
448
|
+
# NB: false is mapped to 'Nil' in spec.code
|
449
|
+
memo = yield memo, 'v', hash, k, v, index
|
450
|
+
end
|
451
|
+
end
|
452
|
+
end
|
453
|
+
# mustache template is logic less, last element in the array
|
454
|
+
# does not have '_comma'
|
455
|
+
memo.last['_comma'] = '' if memo && memo.any?
|
456
|
+
memo
|
457
|
+
end
|
458
|
+
|
459
|
+
private def singleValue( val, name=false )
|
460
|
+
|
461
|
+
entry = {}
|
462
|
+
entry = { "parameter_name" => name }
|
463
|
+
entry["columns"] = false
|
464
|
+
entry["domain_element"] = false
|
465
|
+
entry["domain_value"] = val
|
466
|
+
entry["_comma"] = ','
|
467
|
+
entry["rows"] = false
|
468
|
+
@logger.debug "#{__method_}: entry=#{entry}" if @logger.debug?
|
469
|
+
return entry
|
470
|
+
|
471
|
+
end
|
472
|
+
|
473
|
+
# @!endgroup
|
474
|
+
|
475
|
+
|
476
|
+
end # class
|
477
|
+
|
478
|
+
end # module
|