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
@@ -0,0 +1,122 @@
1
+ module Sbuilder
2
+
3
+ ##
4
+ # collect method, which all
5
+ module ControllerUtils
6
+
7
+
8
+ def dispatchExtendDomain( domainDef )
9
+ Utils::Validate.validateProperties( domainDef, Constants::VALIDATION[:domain_extension][:required], Constants::VALIDATION[:domain_extension][:allowed] )
10
+ Utils::Validate.oneOf( domainDef, Constants::VALIDATION[:domain_extension][:one_of] )
11
+
12
+ if !domainDef['cardinality'].nil? then
13
+ extendDomainWithCardinality( domainDef )
14
+ elsif !domainDef['values'].nil?
15
+ extendDomainWithValues( domainDef )
16
+ elsif !domainDef['range'].nil?
17
+ extendDomainRange( domainDef )
18
+ elsif !domainDef['type'].nil?
19
+ extendDomainWithType( domainDef )
20
+ else
21
+ raise ExtensionException, "Invalid domain definition #{domainDef}"
22
+ end
23
+ end
24
+
25
+ ##
26
+ # Extend domain with (integer) range
27
+ #
28
+ # @param [Hash]
29
+ # @option domainDef [String] range array lenght 2 start-stop
30
+ #
31
+ def extendDomainRange( domainDef )
32
+ # must be array with length of two, with first element less or equal
33
+ raise ExtensionException, "Invalid domain range defintion" unless domainDef['range'] &&
34
+ domainDef['range'].is_a?( Array ) &&
35
+ domainDef['range'].length == 2 &&
36
+ domainDef['range'][0] <= domainDef['range'][1]
37
+
38
+ domain = factory.createDomain( Sbuilder::Constants::TYPE_RANGE_DOMAIN )
39
+ domain.setName( domainDef['domain'] )
40
+ domain.setRange( domainDef['range'][0], domainDef['range'][1] )
41
+
42
+ # pass to model via controller
43
+ extendDomain( domain )
44
+
45
+ end
46
+
47
+
48
+
49
+ def extendDomainWithType( domainDef )
50
+ # @logger.info( "#{__method__}: domainDef=#{domainDef}" )
51
+ Utils::Validate.validateProperties(
52
+ domainDef,
53
+ Constants::VALIDATION[:domain_extension][:type_required], Constants::VALIDATION[:domain_extension][:type_allowed]
54
+ )
55
+
56
+ # create & configure
57
+ domain = factory.createDomain( Sbuilder::Constants::TYPE_DOMAIN_TYPE )
58
+ domain.setName( domainDef['domain'] )
59
+ domain.setType( domainDef['type'] )
60
+
61
+ # pass to model via controller
62
+ extendDomain( domain )
63
+ end
64
+
65
+
66
+
67
+ def extendDomainWithCardinality( domainDef )
68
+ # @logger.info( "#{__method__} domainDef=#{domainDef}" )
69
+ # validateProperties( domainDef, @@extensionDoaminProperties )
70
+ Utils::Validate.validateProperties(
71
+ domainDef,
72
+ Constants::VALIDATION[:domain_extension][:cardinality_required], Constants::VALIDATION[:domain_extension][:cardinality_allowed]
73
+ )
74
+
75
+ # create & configure
76
+ domain = factory.createDomain( Sbuilder::Constants::TYPE_CARDINALITY_DOMAIN )
77
+ domain.setName( domainDef['domain'] )
78
+ domain.setCardinality( domainDef['cardinality'] )
79
+
80
+ # pass to model via controller
81
+ extendDomain( domain )
82
+ end
83
+
84
+ #
85
+ # @param [String] domainName
86
+ # @param [String:Array] arrOfDomainValues
87
+ #
88
+ # Creates 'domainDef' and delegates to 'extendDomainWithValues'
89
+ #
90
+ def setApplicationDomainValues( domainName, arrOfDomainValues )
91
+ domainDef = {
92
+ 'domain' => domainName,
93
+ 'values' => arrOfDomainValues
94
+ }
95
+ # add to model
96
+ addApplicationDomainValue( domainDef )
97
+ end
98
+
99
+ def extendDomainWithValues( domainDef )
100
+ # @logger.info( "#{__method__} domainDef=#{domainDef}" )
101
+ # validateProperties( domainDef, @@extensionValuesProperties )
102
+ Utils::Validate.validateProperties(
103
+ domainDef,
104
+ Constants::VALIDATION[:domain_extension][:value_required], Constants::VALIDATION[:domain_extension][:value_allowed]
105
+ )
106
+
107
+ # create & configure
108
+ domain = factory.createDomain( Sbuilder::Constants::TYPE_VALUE_DOMAIN )
109
+ domain.setName( domainDef['domain'] )
110
+ domainDef['values'].each { |value| domain.addValue( value ) }
111
+
112
+ # pass to model via controller
113
+ extendDomain( domain )
114
+
115
+ end
116
+
117
+
118
+
119
+ end
120
+
121
+
122
+ end
@@ -7,6 +7,15 @@ generate:
7
7
  # ----------------------------------------
8
8
  # Default model.tla.
9
9
  #
10
+ # Define initial symbol table metatype entries & reserve
11
+ # following 'namaspace' prefixies:
12
+ #
13
+ # - domains --> d_
14
+ # - definitions -> t_ (types)
15
+ # - interface_types -> it_
16
+ # - processes -> p_
17
+ # - infra_services -> i_
18
+ #
10
19
  # Override template extension points
11
20
  # - extend_const.tla
12
21
  # - extend_state.tla
@@ -33,7 +42,6 @@ generate:
33
42
  template: tla/const_def.mustache
34
43
  modelData: none
35
44
 
36
- # --------------------
37
45
  # extension point: extend_const.tla
38
46
  - desc: Extension point for constants
39
47
  template: extend/extend_const.mustache
@@ -42,6 +50,7 @@ generate:
42
50
  - desc: Domain definitions
43
51
  template: domains.mustache
44
52
  modelData: domains
53
+ symbols: 'lambda{ |d| [ Sbuilder::Constants::META_MODEL_DOMAINS, d[:domain_name], "d_#{d[:domain_name]}" ] }'
45
54
 
46
55
  - desc: Environment operators
47
56
  template: tla/operator_run.mustache
@@ -54,10 +63,16 @@ generate:
54
63
  - desc: Data type definitions
55
64
  template: definition_types.mustache
56
65
  modelData: definitions
66
+ symbols: 'lambda{ |d| [ Sbuilder::Constants::META_MODEL_DEFINITIONS, d[:definition_name], "t_#{d[:definition_name]}", ] }'
57
67
 
58
68
  - desc: Interface types
59
69
  template: interface_types.mustache
60
- modelData: interface_types # = interfaces (not filtered)
70
+ modelData: interfaces # = all interfaces (not filtered)
71
+ # model data 'interfaces' is mapped to 'interface_types'
72
+ symbols:
73
+ - 'lambda{ |iface| [Constants::META_MODEL_INTERFACE_TYPES, iface[:interface_operation], "#{Constants::META_MODEL.select{ |e| e[:name] == Constants::META_MODEL_INTERFACE_TYPES}.first[:prefix]}#{iface[:interface_name]}", ] }'
74
+ - 'lambda{ |iface| [Constants::META_MODEL_INTERFACE_RESPONSE_TYPES,iface[:interface_operation], "#{Constants::META_MODEL.select{ |e| e[:name] == Constants::META_MODEL_INTERFACE_RESPONSE_TYPES}.first[:prefix]}#{iface[:interface_name]}", ] }'
75
+
61
76
 
62
77
  - desc: Start of plc block
63
78
  template: tla/plc_header.mustache
@@ -72,16 +87,15 @@ generate:
72
87
  modelData: none
73
88
 
74
89
 
75
- # --------------------
76
90
  # extension point: extend_state.tla
77
91
 
78
92
  - desc: Extension point for specification state
79
93
  template: extend/extend_state.mustache
80
94
  modelData: none
81
95
 
82
- - desc: Specification state
83
- template: state_variables.mustache
84
- modelData: variables
96
+ # - desc: Specification state
97
+ # template: state_variables.mustache
98
+ # modelData: variables
85
99
 
86
100
  - desc: Start of plc define block
87
101
  template: tla/plc_define_header.mustache
@@ -100,10 +114,8 @@ generate:
100
114
  template: tla/operators-infrastructure-service.mustache
101
115
  modelData: none
102
116
 
103
- # --------------------
104
117
  # extension point: extend_operations.tla
105
-
106
- - desc: Extension point for operations
118
+ - desc: Extension point for operations
107
119
  template: extend/extend_operations.mustache
108
120
  modelData: none
109
121
 
@@ -119,9 +131,7 @@ generate:
119
131
  template: tla/macro-infrastructure-service.mustache
120
132
  modelData: none
121
133
 
122
- # --------------------
123
134
  # extension point: extend_macros.tla
124
-
125
135
  - desc: Extension poin to add macros
126
136
  template: extend/extend_macros.mustache
127
137
  modelData: none
@@ -130,16 +140,19 @@ generate:
130
140
  template: interface_stubs_dummy.mustache
131
141
  modelData: none
132
142
 
133
- # --------------------
134
143
  # extension point: extend_implementation.tla
135
-
136
144
  - desc: Extension point for implementation
137
145
  template: extend/extend_implementation.mustache
138
146
  modelData: none
139
147
 
148
+ # create entries for two symbol table meta-types,
149
+ # META_MODEL_SERVICE_IMPLEMENTATION meta-types created only if it is defined
140
150
  - desc: Process interfaces
141
151
  template: interface_processes.mustache
142
152
  modelData: interfaces
153
+ symbols:
154
+ - 'lambda{ |iface| [ Sbuilder::Constants::META_MODEL_PROCESSES, iface[:interface_operation], "p_#{iface[:interface_name]}", ] }'
155
+ - 'lambda{ |iface| [ Sbuilder::Constants::META_MODEL_SERVICE_IMPLEMENTATION, iface[:interface_operation], iface[:implementation], ] if iface[:implementation] }'
143
156
 
144
157
  - desc: Environment model 'Tail' process
145
158
  template: tla/plc_tail.mustache
@@ -153,30 +166,20 @@ generate:
153
166
  template: tla/plc_translation.mustache
154
167
  modelData: none
155
168
 
156
- - desc: Type constraint in specification
157
- template: state_type_invariant.mustache
158
- modelData: variables
169
+ # - desc: Type constraint in specification
170
+ # template: state_type_invariant.mustache
171
+ # modelData: variables
159
172
 
160
- # --------------------
161
- # extension point: extend_type_invariant.tla
162
-
163
- # - desc: Extension point for type invariants
164
- # template: extend/extend_type_invariant.tla
165
- # modelData: none
166
-
167
173
  - desc: Validate types for infrastructure service return values
168
174
  template: state_type_invariant-infrastructure-service.mustache
169
175
  modelData: infrastructureServices
170
-
176
+ symbols: 'lambda{ |iface| [ Sbuilder::Constants::META_MODEL_INFRA_SERVICES, iface[:interface_operation], "i_#{iface[:interface_name]}", ] }'
171
177
 
172
- # --------------------
173
178
  # extension point: extend_invariant.tla
174
-
175
179
  - desc: Extension point for specification invariants
176
180
  template: extend/extend_invariant.mustache
177
181
  modelData: none
178
182
 
179
- # --------------------
180
183
  # extension point: extend_assumptions.tla
181
184
  - desc: Extension point for assumptions
182
185
  template: extend/extend_assumptions.mustache
@@ -231,19 +234,6 @@ generate:
231
234
  modelData: none
232
235
 
233
236
 
234
- # --------------------
235
- # extension point: extend_type_invariant.cfg
236
- # - desc: Extesion pointo to activate type constraints
237
- # template: extend/extend_type_invariant.cfg
238
- # modelData: none
239
-
240
- # --------------------
241
- # extension point: extend_invariant.cfg
242
-
243
- - desc: Extension point to activate specification invariants - DEPRECATED
244
- template: extend/extend_invariant_cfg.mustache
245
- modelData: none
246
-
247
237
  - desc: Activate invariants defined in sbuilder.yaml
248
238
  template: invariant_activate.mustache
249
239
  modelData: invariants
@@ -301,19 +291,23 @@ generate:
301
291
  # Dump data-models for template generation
302
292
 
303
293
  - output: doc/data-model.md
304
- inputs:
294
+ inputs:
305
295
 
306
296
  - desc: Model header
307
297
  template: data-model-header.mustache
308
298
  modelData: none
309
299
 
300
+ - desc: Metatypes
301
+ template: data-model-dump.mustache
302
+ modelData: metatypes
303
+
310
304
  - desc: Model interfaces
311
305
  template: data-model-dump.mustache
312
306
  modelData: interfaces
313
307
 
314
- - desc: Model interface_types (=request/reponse for all interfaces)
315
- template: data-model-dump.mustache
316
- modelData: interface_types
308
+ # - desc: Model interface_types (=request/reponse for all interfaces)
309
+ # template: data-model-dump.mustache
310
+ # modelData: interface_types
317
311
 
318
312
  - desc: Model infrastructureServices
319
313
  template: data-model-dump.mustache
@@ -3,15 +3,24 @@ module Sbuilder
3
3
 
4
4
  class Domain
5
5
 
6
+ # @attr [Strin] name
6
7
  attr_reader :name
7
8
 
9
+ # alias for
10
+ alias domain_name :name
11
+
12
+ # @attr [Domain] extension defined in setup, overrinding defaults
8
13
  attr_reader :extension
9
14
 
10
15
  # ------------------------------------------------------------------
11
- # mixer
12
- PROGNAME = "domain" # progname for logger
16
+ # logger
17
+
18
+ PROGNAME = nil # progname for logger default class name
13
19
  include Sbuilder::Utils::MyLogger # mix logger
14
-
20
+
21
+ # ------------------------------------------------------------------
22
+ # @!group Constructor & configure
23
+
15
24
 
16
25
  def initialize( options = {} )
17
26
  @logger = getLogger( PROGNAME, options )
@@ -22,49 +31,95 @@ module Sbuilder
22
31
  "#{self.class}: name=#{name}"
23
32
  end
24
33
 
25
- # ------------------------------------------------------------------
26
- # config
27
34
 
28
35
  def setName( name )
29
36
  @name = name
30
37
  self
31
38
  end
32
39
 
33
- # def setCardinality( cardinality )
34
- # @cardinality = cardinality
35
- # raise "deprecated #{__method__} in #{self.class}"
36
- # self
37
- # end
38
-
39
- # ------------------------------------------------------------------
40
- # extendDomain
41
-
42
40
  def setExtension( extension )
43
41
  @extension = extension
44
42
  end
45
43
 
44
+ # @!endgroup
45
+
46
+
46
47
  # ------------------------------------------------------------------
47
- # use extension
48
+ # @!group Behaviour
49
+
50
+
51
+ ##
52
+ # Should we add Nil to domain set
53
+ #
54
+ # @return [Boolean] delegate to extenion, true default
55
+ def includeNil
56
+ return extension.includeNil if extension
57
+ true
58
+ end
48
59
 
60
+ ##
61
+ # It is safe to call +cardinality+, +domain_values+,
62
+ # +numberOfElements+, +render_values+, ...
63
+ #
64
+ # @return true, extension may override
65
+ #
66
+ def tlaBaseType
67
+ return extension.tlaBaseType if extension
68
+ false
69
+ end
70
+
71
+
72
+ # Notice: number of elements include also nil element, which should
73
+ # be calculated, when calculating elements in domain.
74
+ #
75
+ #
49
76
  # delegate to extension - return 1 if does not exist
50
77
  def cardinality
51
78
  return 1 unless extension
52
79
  extension.cardinality
53
80
  end
54
81
 
82
+ # @return [integer] number of elements including nil
83
+ def numberOfElements
84
+ cardinality + 1
85
+ end
86
+
87
+ ##
88
+ # @return [Integer..Integer] range to access 'domain_entry' of
89
+ # (maybe extentended) domain
90
+ def domain_range
91
+ return extension.domain_range if extension
92
+ endIndx = includeNil ? cardinality : cardinality-1
93
+ 0..endIndx
94
+ end
95
+
96
+
97
+ # @!endgroup
98
+
55
99
  # ------------------------------------------------------------------
56
- # generate
100
+ # @!group Implementation details
101
+
57
102
 
58
- # alias for
59
- alias domain_name :name
103
+ ##
104
+ # @return [Boolean] false which is internal nil repreentation
105
+ def nilValue
106
+ false
107
+ end
108
+
109
+ ##
110
+ # @return [Boolean] true if +includeNil+ && (Int(0) || Nil)
111
+ private def isNil( i )
112
+ includeNil && ( (i.is_a?(Integer) && i == 0) || (i.is_a?(String) && i == 'Nil' ))
113
+ end
114
+
115
+ # @!endgroup
116
+
117
+
118
+ # ------------------------------------------------------------------
119
+ # @!group Domain values
60
120
 
61
- # # used to generate default values - in extension loaded
62
- # def domain_prefix
63
- # domain_name + "_"
64
- # end
65
121
 
66
122
  # Return domain value for for element 'i'. Possibly delegate to sub-class.
67
- #
68
123
  #
69
124
  # @param i [Integer|String] element index (interger) or String value non integer
70
125
  #
@@ -72,7 +127,8 @@ module Sbuilder
72
127
  def domain_entry( i )
73
128
 
74
129
  # interpret 0 as Nil
75
- return false if i.is_a?(Integer) && i == 0
130
+ # return false if (i.is_a?(Integer) && i == 0) || (i.is_a?(String) && i == 'Nil' )
131
+ return nilValue if isNil( i )
76
132
 
77
133
  # delegage - if possible
78
134
  return extension.domain_entry( i ) if extension
@@ -87,34 +143,102 @@ module Sbuilder
87
143
  Requested cardinality #{i} exceeds cardinality #{cardinality} of domain #{name}
88
144
  EOS
89
145
 
90
-
146
+ # defaults strings
91
147
  "d_#{domain_name}_#{i}"
92
148
  end
93
-
94
149
 
95
- # return array of strings for entries in domain - overrid
96
- def domain_entries
97
- arr = *(1..cardinality).map { |i| domain_entry( i ) }
150
+ ##
151
+ # Default assumes that domain values are string elements, and they
152
+ # need to be wrapped with " -chars. Sub-classes may define
153
+ # integers, which should not be wrapped, and they override this
154
+ # method.
155
+ #
156
+ # @return [String] wrapped around "
157
+ def stringize( val )
158
+ return val if val.is_a?( FalseClass )
159
+ '"' + val + '"'
160
+ end
161
+
162
+
163
+ ##
164
+ # Index from 1.. if domain (extension defines Nil), index from
165
+ # 0 if no need to reserve space for nil (e.g. domain_range).
166
+ #
167
+ # Known override in domain range, where using index range does
168
+ # not necassarily start with 0.
169
+ #
170
+ # @see #render_entry
171
+ #
172
+ # @return [Array] renderValues set of elements, which can be
173
+ # outputted to TLA code (i.e. they wrapped with "-char, if
174
+ # necassary). Does not include Nil.
175
+ #
176
+
177
+ def render_values
178
+ startIndx = includeNil ? 1 : 0
179
+ endIndx = includeNil ? cardinality : cardinality-1
180
+ arr = *(startIndx..endIndx).map { |i| render_entry( i ) }
98
181
  return arr
99
182
  end
100
183
 
184
+ # @!endgroup
185
+
186
+
187
+ # ------------------------------------------------------------------
188
+ # @!group Model data
101
189
 
102
- # return and array of {:value,:_comma} hashes
190
+ ##
191
+ # Return entry which can be rendered (string values wrapped with
192
+ # "-marks, integers plain, constans, e.g. Nil not wrappedd. If
193
+ # domain +includeNil+ values i==0 and i=='Nil' are wrapped to
194
+ # 'nilValue' (=false). Actual value from +domain_entry+
195
+ #
196
+ def render_entry( i )
197
+ return nilValue if isNil( i )
198
+ return extension.render_entry( i ) if extension
199
+ stringize( domain_entry( i ))
200
+ end
201
+
202
+
203
+
204
+ ##
205
+ # Called from model#templateData, used in mustache templates to
206
+ # output elements in domain set. Nil NOT included in this set!
207
+ #
208
+ # Is not expected to be overridded by sub-classes.
209
+ #
210
+ # @see render_values returnin array of Hashes
211
+ #
212
+ # @see #includeNil whether Nil should be included
213
+ #
214
+ # @return [Hash:Array] array_of_hashes array of {:value,:_comma}
215
+ # @option array_of_hashes [:Symbol] :value
216
+ # @option array_of_hashes [:Symbol] :index
217
+ # @option array_of_hashes ['String'] _comma
218
+
103
219
  def domain_values
104
- # delegate - if extended
105
- return extension.domain_values if extension
106
- arra = domain_entries.map.with_index do |domain_entry, i|
220
+ vals = extension.nil? ? render_values : extension.render_values
221
+
222
+ # String is - name of a type, no need expand
223
+ return {
224
+ :value => vals,
225
+ '_comma' => '',
226
+ :index => 0,
227
+ } unless vals.is_a?( Array )
228
+ arra = vals.map.with_index do |domain_entry, i|
107
229
  {
108
- :namespace => Constants::TYPE_NAMESPACE_DOM,
109
230
  :value => domain_entry,
110
- :_comma => (i +1) == cardinality ? "" : ",",
231
+ '_comma' => ',',
111
232
  :index => i+1,
112
233
  }
113
234
  end
114
- @logger.debug( "#{__method__} #{name}: arra #{arra.to_yaml}" )
235
+ arra.last['_comma'] = '' if arra && arra.any?
236
+ @logger.debug( "#{__method__} #{name}: arra #{arra.to_yaml}, includeNil=#{includeNil}" )
115
237
  return arra
116
238
  end
117
239
 
240
+ # @!endgroup
241
+
118
242
  end
119
243
 
120
244