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.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +150 -116
  3. data/VERSION +1 -1
  4. data/lib/cli/cli-customer.rb +23 -3
  5. data/lib/cli/cli-pet.rb +66 -12
  6. data/lib/cli/cli-text.rb +127 -8
  7. data/lib/cli/cli.rb +49 -6
  8. data/lib/sbuilder.rb +26 -3
  9. data/lib/sbuilder/constants.rb +165 -6
  10. data/lib/sbuilder/controller.rb +943 -169
  11. data/lib/sbuilder/controller_utils.rb +122 -0
  12. data/lib/sbuilder/default-sbuilder.yaml +38 -44
  13. data/lib/sbuilder/domain.rb +160 -36
  14. data/lib/sbuilder/domain_cardinality.rb +1 -1
  15. data/lib/sbuilder/domain_range.rb +102 -0
  16. data/lib/sbuilder/domain_type.rb +150 -0
  17. data/lib/sbuilder/domain_value.rb +21 -13
  18. data/lib/sbuilder/exception.rb +16 -0
  19. data/lib/sbuilder/extension_loader.rb +67 -686
  20. data/lib/sbuilder/extension_loader_deprecated_step_extensions.rb +711 -0
  21. data/lib/sbuilder/extension_loader_step_generator.rb +876 -0
  22. data/lib/sbuilder/facade/{api_loader.rb → api_loader_facade.rb} +176 -45
  23. data/lib/sbuilder/facade/api_loader_plugin.rb +6 -32
  24. data/lib/sbuilder/facade/api_loader_plugin_mixer.rb +35 -0
  25. data/lib/sbuilder/facade/facade_constants.rb +23 -0
  26. data/lib/sbuilder/facade/loader_plugin_root.rb +56 -0
  27. data/lib/sbuilder/facade/param_set_root.rb +55 -0
  28. data/lib/sbuilder/facade/snippet_loader_facade.rb +600 -0
  29. data/lib/sbuilder/facade/snippet_loader_plugin.rb +76 -0
  30. data/lib/sbuilder/facade/snippet_loader_plugin_mixer.rb +56 -0
  31. data/lib/sbuilder/factory.rb +224 -45
  32. data/lib/sbuilder/model.rb +125 -45
  33. data/lib/sbuilder/mustache/template.rb +107 -58
  34. data/lib/sbuilder/mustache/template_reader.rb +56 -46
  35. data/lib/sbuilder/mustache/template_reader_context.rb +64 -234
  36. data/lib/sbuilder/mustache/template_resolve.rb +103 -0
  37. data/lib/sbuilder/mustache/template_root.rb +71 -0
  38. data/lib/sbuilder/param_set.rb +30 -15
  39. data/lib/sbuilder/param_set_db.rb +1 -1
  40. data/lib/sbuilder/param_set_def.rb +6 -1
  41. data/lib/sbuilder/param_set_def_func.rb +39 -0
  42. data/lib/sbuilder/param_set_if.rb +45 -10
  43. data/lib/sbuilder/param_set_loader_swagger.rb +56 -26
  44. data/lib/sbuilder/param_set_step.rb +1 -1
  45. data/lib/sbuilder/param_sets.rb +2 -1
  46. data/lib/sbuilder/parameter.rb +9 -3
  47. data/lib/sbuilder/parameter_container.rb +1 -1
  48. data/lib/sbuilder/parameter_dom.rb +17 -5
  49. data/lib/sbuilder/parameter_ref.rb +39 -10
  50. data/lib/sbuilder/parser/parser_facade.rb +310 -0
  51. data/lib/sbuilder/resolver.rb +11 -6
  52. data/lib/sbuilder/resolver_loader.rb +1 -1
  53. data/lib/sbuilder/resolver_loader_yaml.rb +1 -1
  54. data/lib/sbuilder/resolver_rule.rb +1 -1
  55. data/lib/sbuilder/resolver_rule_match.rb +10 -4
  56. data/lib/sbuilder/resolver_rule_ref.rb +1 -1
  57. data/lib/sbuilder/setup_loader.rb +49 -0
  58. data/lib/sbuilder/setup_loader_env.rb +478 -0
  59. data/lib/sbuilder/setup_loader_pref.rb +56 -0
  60. data/lib/sbuilder/snippet_loader_simple.rb +125 -0
  61. data/lib/sbuilder/spec/api_loader.rb +34 -0
  62. data/lib/sbuilder/spec/api_loader_facade.rb +169 -32
  63. data/lib/sbuilder/spec/loader_plugin.rb +98 -0
  64. data/lib/sbuilder/spec/snippet_loader.rb +228 -0
  65. data/lib/sbuilder/symbol_table.rb +279 -0
  66. data/lib/utils/{cache_lines.rb → fileio.rb} +8 -1
  67. data/lib/utils/logger.rb +2 -1
  68. data/lib/utils/powerset.rb +13 -0
  69. data/lib/utils/validate.rb +38 -0
  70. data/mustache/cfg/const_def.mustache +2 -0
  71. data/mustache/cfg/macro_run.mustache +1 -4
  72. data/mustache/data-model-header.mustache +1 -0
  73. data/mustache/definition_types.mustache +34 -4
  74. data/mustache/domains.mustache +1 -1
  75. data/mustache/domains_assign.mustache +1 -1
  76. data/mustache/infrastructure-service-init.mustache +1 -1
  77. data/mustache/interface_processes.mustache +16 -10
  78. data/mustache/interface_types.mustache +37 -11
  79. data/mustache/operator-infrastructure-service.mustache +1 -1
  80. data/mustache/resources/schedule_operator_new_step.tla +8 -0
  81. data/mustache/resources/schedule_process_macro.tla +37 -0
  82. data/mustache/resources/schedule_process_procedure.tla +22 -0
  83. data/mustache/resources/schedule_throw.tla +16 -0
  84. data/mustache/setup/domains_run.mustache +8 -2
  85. data/mustache/setup/operator_run.mustache +0 -4
  86. data/mustache/setup/steps_run.mustache +4 -3
  87. data/mustache/setup/steps_run_parameterBind.mustache +14 -6
  88. data/mustache/setup/steps_run_parameterExact.mustache +7 -3
  89. data/mustache/state_type_invariant-infrastructure-service.mustache +9 -4
  90. data/mustache/tla/const_def.mustache +1 -1
  91. data/mustache/tla/macro_run.mustache +7 -1
  92. data/mustache/tla/module_header.mustache +1 -1
  93. data/mustache/tla/operator_run.mustache +8 -5
  94. data/mustache/tla/plc_define_run.mustache +45 -36
  95. data/mustache/tla/plc_run_state.mustache +12 -5
  96. data/src-extend/extend/extend_assumptions.mustache +3 -0
  97. data/src-extend/extend/extend_const.mustache +3 -0
  98. data/src-extend/extend/extend_implementation.mustache +3 -0
  99. data/src-extend/extend/extend_invariant.mustache +3 -0
  100. data/src-extend/extend/extend_macros.mustache +3 -0
  101. data/src-extend/extend/extend_operations.mustache +3 -0
  102. data/src-extend/extend/extend_state.mustache +3 -0
  103. data/src/pet/extend/extend_assumptions.mustache +4 -0
  104. data/src/pet/extend/extend_implementation.mustache +3 -0
  105. data/src/pet/extend/extend_invariant.mustache +3 -0
  106. data/src/pet/extend/extend_macros.mustache +3 -0
  107. data/src/pet/extend/extend_operations.mustache +4 -0
  108. data/src/pet/extend/extend_state.mustache +3 -0
  109. data/src/pet/interface +5 -5
  110. data/src/pet/interface_delete_pet.tla +1 -1
  111. data/src/pet/interface_get_pet.tla +1 -1
  112. data/src/pet/interface_post_pet.tla +4 -2
  113. data/src/pet/interface_post_tag.tla +1 -1
  114. data/src/pet/interface_put_tag.tla +1 -1
  115. data/tla-sbuilder.gemspec +3 -3
  116. metadata +44 -19
  117. data/mustache/name_definition_type.mustache +0 -5
  118. data/mustache/name_domain.mustache +0 -5
  119. data/mustache/name_domain_value.mustache +0 -5
  120. data/mustache/name_domain_value_prefix.mustache +0 -5
  121. data/mustache/name_interface_response_type.mustache +0 -6
  122. data/mustache/name_interface_type.mustache +0 -6
  123. data/mustache/name_parameter_type.mustache +0 -6
  124. data/mustache/name_process.mustache +0 -6
  125. data/mustache/state_type_invariant.mustache +0 -17
  126. data/mustache/state_variables.mustache +0 -20
  127. data/src-extend/extend/extend_invariant_cfg.mustache +0 -7
@@ -9,7 +9,7 @@ module Sbuilder
9
9
 
10
10
  # ------------------------------------------------------------------
11
11
  # mixer
12
- PROGNAME = "Resolver" # progname for logger
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
- return true if parameter.isReference
65
- rules.each do |rule|
66
- if rule.applyRule( parameter, model ) then
67
- return true
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 = "ResolverLoader" # progname for logger
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 = "ResolverLoaderYAML" # progname for logger
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 = "ResolverRule" # progname for logger
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 = "ResolverRuleMatch" # progname for logger
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
- parameter.setDomain( domain )
46
- parameter.resolveDomain( model )
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 = "ResolverRuleRef" # progname for logger
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