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
@@ -11,7 +11,7 @@ module Sbuilder
11
11
  class TemplateReader
12
12
 
13
13
  include Sbuilder::Utils::MyLogger # mix logger
14
- PROGNAME = "treader" # progname for logger
14
+ PROGNAME = nil # progname for logger use default class name
15
15
 
16
16
 
17
17
  # ------------------------------------------------------------------
@@ -22,6 +22,10 @@ module Sbuilder
22
22
  attr_writer :partials # f: partial-name --> template string
23
23
  attr_writer :templates # f: template-name --> template string
24
24
 
25
+ # [Sbuilder::Controller] set in init
26
+ attr_reader :controller
27
+
28
+
25
29
  # ------------------------------------------------------------------
26
30
  # Constructor
27
31
 
@@ -29,42 +33,22 @@ module Sbuilder
29
33
  @logger = getLogger( PROGNAME, options )
30
34
  @logger.info( "#{__method__} created, options='#{options}" )
31
35
 
32
- # use default templates - prefix with user specified templates
33
- @template_paths = options[:default_templates]
34
- # for mustache templates
35
- if options[:templates] then
36
- @template_paths = options[:templates] + (options[:default_templates] || [] )
37
- end
38
-
39
- # # init partial cache
40
- # @partials = {}
36
+ @controller = controller
41
37
 
38
+ # use default templates - prefix with user specified templates
39
+ # @template_paths = options[:default_templates] || []
40
+ # # for mustache templates
41
+ # if options[:templates] then
42
+ # @template_paths = options[:templates] + (options[:default_templates] || [] )
43
+ # end
44
+ @template_paths = controller.templateRenderDirectories
42
45
  end
43
46
 
47
+
44
48
  # ------------------------------------------------------------------
45
- # Config - after contructor
46
49
 
47
- # Null operation: no configuration actions taken. Maybe subclasses
48
- # will implement something usefull
49
- #
50
- # @param steps [Hash] from 'model#templateData('steps')' with "steps"=>{'process', 'interface_name'}
51
- # @param interfaces [Hash] from 'model#templateData('interfaces')' with "interface"=>{'interface_name', 'implementation'}
50
+ # @!group Rules to identify template types
52
51
 
53
- # def configSetup( steps, interfaces )
54
- # @logger.info( "#{__method__} steps=#{steps["steps"].join('\n')}" )
55
- # interfaces = interfaces["interfaces"] ? interfaces["interfaces"] : []
56
- # @logger.info( "#{__method__} interfaces=#{interfaces.join('\n')}" )
57
- # end
58
-
59
-
60
- # ------------------------------------------------------------------
61
- # filter actions
62
-
63
- # default template when filtered
64
- # @return [String] emptpy string for filtered templtae
65
- def filtered_template
66
- ""
67
- end
68
52
 
69
53
  # To override in sub-classes
70
54
  #
@@ -72,12 +56,17 @@ module Sbuilder
72
56
  def show_template( name )
73
57
  true
74
58
  end
59
+
75
60
 
61
+ # @!endgroup
76
62
 
77
63
 
78
64
  # ------------------------------------------------------------------
79
65
  # Services
80
66
 
67
+ # @!group public services
68
+
69
+
81
70
  # Check whether template 'name' should be be shown, next resolve
82
71
  # location of a template file, and do 'File.read' on the file path
83
72
  #
@@ -96,23 +85,35 @@ module Sbuilder
96
85
 
97
86
  end # get_template( name )
98
87
 
99
- # @param path [String] path name to template
100
- # @return [String] for template content
101
- def template_read( path )
102
- File.read( path )
88
+
89
+ # @!endgroup
90
+
91
+ # ------------------------------------------------------------------
92
+ # @!group Special template content
93
+
94
+ # default template when filtered
95
+ # @return [String] emptpy string for filtered templtae
96
+ def filtered_template
97
+ ""
103
98
  end
104
-
105
-
106
99
 
107
100
 
108
- # return path to an existing template file name
101
+ # @!endgroup
102
+
103
+
104
+ # ------------------------------------------------------------------
105
+ # @!group Access template files
106
+
107
+
108
+ # @return path to an existing template file name
109
+ #
109
110
  # @exception if template not found
110
111
  def get_template_filepath( name )
111
112
 
112
113
  @template_paths.each do |directory_or_gemname|
113
114
 
114
115
  template_path = get_template_filepath_resolve( directory_or_gemname, name )
115
- return template_path if template_path && File.exists?( template_path )
116
+ return template_path if template_path && File.exists?( template_path ) && File.file?( template_path )
116
117
 
117
118
  end # each
118
119
 
@@ -127,12 +128,9 @@ module Sbuilder
127
128
 
128
129
  end
129
130
 
130
- # ------------------------------------------------------------------
131
- # private
132
-
133
- private
131
+
134
132
  # return path to plain 'directory' or to gem directory
135
- def get_template_filepath_resolve( directory_or_gemname, template_file )
133
+ private def get_template_filepath_resolve( directory_or_gemname, template_file )
136
134
  @logger.info( "#{__method__} directory_or_gemname=#{directory_or_gemname}" )
137
135
  if directory_or_gemname[-1] == '/' then
138
136
  return get_template_filepath_in_directory( directory_or_gemname[0..-2], template_file )
@@ -143,7 +141,7 @@ module Sbuilder
143
141
  end
144
142
 
145
143
  # return directory to 'gemspec'
146
- def gemname_to_directory( gemname_and_spec )
144
+ private def gemname_to_directory( gemname_and_spec )
147
145
 
148
146
  # The version requirements are optional.
149
147
  # You can also specify multiple version requirements, just append more at the end
@@ -175,7 +173,7 @@ module Sbuilder
175
173
 
176
174
 
177
175
  # return path to 'template_file' in an existing 'directory'
178
- def get_template_filepath_in_directory( directory, template_file )
176
+ private def get_template_filepath_in_directory( directory, template_file )
179
177
  @logger.debug( "#{__method__} directory=#{directory}, template_file=#{template_file}" )
180
178
 
181
179
  if ! File.exists?( directory ) then
@@ -199,6 +197,18 @@ module Sbuilder
199
197
 
200
198
  end
201
199
 
200
+ # Read template from file
201
+ #
202
+ # @param path [String] path name to template
203
+ # @return [String] for template content
204
+ private def template_read( path )
205
+ File.read( path )
206
+ end
207
+
208
+
209
+
210
+ # @!endgroup
211
+
202
212
  end # class
203
213
 
204
214
  end # module
@@ -1,35 +1,27 @@
1
- require 'tla-parser-s' # TLA+ parser && resolver
2
-
3
1
  module Sbuilder
4
2
 
5
3
 
6
4
  # ------------------------------------------------------------------
7
- # Use setup configuration to filter out part of reander templates.
5
+ # Use setup configuration to render only templates, which are
6
+ # reachable for setup entry points (getEntryPoints +
7
+ # getSetupPossibilities + getModelInvariants + getSetupAssumes).
8
8
  #
9
9
  # Implementation overrides 'whitelist' method in 'TemplateReader'.
10
- # Uses 'TlaParserS::Resolver' to parse TLA+ snippets, and resolve
11
- # modules to put in whitelist'
12
- #
13
- # Overview:
14
- #
15
- # - configSetup -methods receives 'steps' ie. array of interface
16
- # names called in setup, and array of 'interfaces', which map
17
- # interfaces to interface implementations
10
+ # uses 'Sbuilder::ParserFacade' to parse TLA+ snippets, and resolve
11
+ # modules to put in whitelist'. `show_template` - method overrides
12
+ # default 'show-all' method in parent class, and says true only for
13
+ # templates, which are reachable for entry points.
18
14
  #
19
- # - TlaParserS::Resolver#initSnippets parses tla-sbuilder code
20
- # - repository
21
- #
22
- # - TlaParserS::Resolver#entryPoints resolves modules required to
23
- # satisfy interface implementations used in setup
24
15
 
25
16
  class TemplateContextReader < TemplateReader
26
17
 
27
18
  extend Forwardable # for easy delegation
28
19
 
29
20
  def_delegators :controller,
30
- :getEntryPoints, # [String:Array] of
21
+ :getEntryPoints, # [String:Array] of
22
+ # interface operation
31
23
  # implemenation names
32
- # extracted from 'configSetup'
24
+ # defined for current setup
33
25
  :getSetupPossibilities,
34
26
  # [String:Array] names of
35
27
  # possiblity operators defined
@@ -44,97 +36,62 @@ module Sbuilder
44
36
  :getModelNames # [String:Array] of names in model
45
37
 
46
38
  # ------------------------------------------------------------------
47
- # constructore
48
-
39
+ # Add logger
49
40
 
50
41
  include Sbuilder::Utils::MyLogger # mix logger
51
- PROGNAME = "creader" # progname for logger
42
+ PROGNAME = nil
52
43
 
53
- # TLA+ standard library symbols
54
- GLOBALS = %w( TRUE FALSE Cardinality)
55
-
56
- # Sbuilder constant symbols
57
- SBUILDER = %w( Nil InfrastructureServiceReturn InfrastructureServiceGetStatus
58
- InfrastructureServiceGetResponse InTransaction)
59
-
60
- # these directories not unmustached
61
- DOC_DIRS= [ "docs", "doc" ]
62
-
63
44
  # ------------------------------------------------------------------
64
45
  # Attributes
65
- attr_reader :options # hash{:filter_list}
46
+ # @attr [Hash] options
47
+ attr_reader :options
66
48
 
67
- attr_reader :resolver # [TlaParserS::Resolver] to
68
- # resolve entry point modules
69
49
 
70
50
 
71
- attr_reader :controller # [Sbuilder::Controller]
51
+ attr_reader :setupName # setup being currently generated
72
52
 
73
-
74
- attr_reader :setupName # currently generating
53
+ # @attr parserFacade [Sbuilder::ParserFacade] object to access parser
54
+ attr_reader :parserFacade
75
55
 
76
56
  # ------------------------------------------------------------------
77
- # Constructor
57
+ # @!group Constructor && configure
58
+
59
+ # Constructor method
78
60
 
79
61
  def initialize( controller, options={} )
80
62
  super( controller, options )
81
63
  @logger = getLogger( PROGNAME, options )
82
64
  @logger.info( "#{__method__} created, options='#{options}" )
83
65
 
84
- @controller = controller
66
+ # Init object providing access to parser resolver
67
+ @parserFacade = controller.factory.createParserFacade
85
68
 
86
69
  @options = options
87
70
 
88
-
89
- # # create '@resolver' && parse snippet repository
90
- # if isOptFilterSrc then
91
- # end
92
-
93
- end
94
-
95
- # ------------------------------------------------------------------
96
- # Lazy intialize (so that configuration can take place)
97
- def resolver
98
- return @resolver if @resolver
99
-
100
- raise "No option :cache_dir" unless options[:cache_dir] && !options[:cache_dir].empty?
101
- unmustache_dir = "#{options[:cache_dir]}/unmustache"
102
-
103
- # copy unmustached version for templates
104
- unmustache( unmustache_dir )
105
-
106
- # init resovelver using 'unmustache_dir'
107
- @resolver = initResolver( unmustache_dir, options )
108
- return @resolver
109
71
  end
110
72
 
111
- # ------------------------------------------------------------------
112
- # Options
113
-
114
-
115
- # @return [string] file path for filter list
116
- def filter_list
117
- options[:filter_list]
118
- end
119
-
120
-
121
- # ------------------------------------------------------------------
122
- # config
73
+ # Controller uses this method to inform template reader of the
74
+ # setup currently being processed.
75
+ #
123
76
 
124
77
  def setSetupName( setupName )
125
78
  @logger.info( "#{__method__} setupName=#{setupName}" )
126
79
  @setupName = setupName
127
80
  end
81
+
82
+ # @!endgroup
128
83
 
84
+
129
85
  # ------------------------------------------------------------------
130
- #
86
+ # @!group Override default `show_template` in parent class
87
+
131
88
  # Try to find a reason to show template
132
89
  #
133
90
  # @param [String] name of template to check @return [boolean] true
134
91
  # when template should be shown normally, else false
135
92
  #
136
93
  # @return [Bool,String] show and text description
137
- def show_template_do( name )
94
+ private def show_template_do( name )
138
95
 
139
96
  @logger.debug( "#{__method__}: check name=#{name}" )
140
97
 
@@ -144,7 +101,6 @@ module Sbuilder
144
101
  # show template witout extesions
145
102
  return true, "no extension" if /^[^\/\.]*$/ =~ name
146
103
 
147
- # show template if name is in whitelist 'opts[:filter_list]'
148
104
  # puts "#{whitelist.join(',')}: '#{name}'--> #{whitelist.include?(name)}"
149
105
  return true, "in whitelist" if whitelist.include?( name.to_s )
150
106
 
@@ -164,181 +120,55 @@ module Sbuilder
164
120
  ret[0]
165
121
  end
166
122
 
167
- # ------------------------------------------------------------------
168
- # whitelist
123
+ # @!endgroup
169
124
 
170
- # Return whitelisted template names.
171
- #
172
- # Implementation reads, and caches lines, in a file pointed by
173
- # options[:filter_list]
174
- #
175
- # @return [Array] of whitelistes template names
176
- def whitelist_file
177
- return [] unless filter_list
178
- File.readlines( filter_list ).each {|l| l.chomp! } || []
179
- end
125
+ # ------------------------------------------------------------------
126
+ # @!group Access resolver
180
127
 
181
- # Add Globals, Sbuilder and model symbols to resolver
182
- #
128
+ # Get access to parser resolver from parser facade.
183
129
  #
184
- def initResolverContext( resolver )
185
-
186
- output( 1, " Initialize resolver context symbols" )
187
-
188
-
189
- output( 2, " TLA+ symbols: #{GLOBALS.join( ',')}" )
190
- output( 1, " #{GLOBALS.length} TLA+ symbols" )
191
- resolver.initContext( GLOBALS )
192
-
193
- output( 2, " Sbuilder symbols: #{SBUILDER.join( ',')}" )
194
- output( 1, " #{SBUILDER.length} SBuilder symbols" )
195
- resolver.initContext( SBUILDER )
196
-
197
- model_names = getModelNames
198
- output( 2, " Model symbols: #{model_names.join( ',')}" )
199
- output( 1, " #{model_names.length} model symbols" )
200
- resolver.initContext( model_names )
201
-
202
- output( 1, " Initialize resolver context symbols - done" )
203
-
204
- end
205
-
206
- # Access controller to get information needed in un-mustache
207
- # operation
208
- def unmustache( unmustache_dir )
209
-
210
- if ! Dir.exists?( unmustache_dir )
211
- `mkdir #{unmustache_dir}`
212
- exit unless $?.success?
213
- end
214
-
215
- unmustacheDo( controller.getCodeRepository, unmustache_dir, controller.getPreferencesData(setupName) )
216
- end
217
-
218
- # Unmustache files in 'src_dir' to 'target_dir'. Pass preferences
219
- # json to mustache rendering
130
+ # At this point parser resolver is most likely already initialized
131
+ # (i.e. snippets parsed) becase snippets are sorted in correct
132
+ # order before a decission to prune out unreachable snippets is
133
+ # done in this class.
220
134
  #
221
- # @param src_dir [String] path source directory
222
- # @param dest_dir [String] path destination directory
223
-
224
- def unmustacheDo( src_dir, target_dir, preferences )
225
- @logger.info( "#{__method__}, src_dir=#{src_dir}, target_dir=#{target_dir}, preferences=#{preferences}" )
226
-
227
- output( 1, "Unmustache #{src_dir} --> #{target_dir} - start" )
228
-
229
- source_files = Dir::glob( "#{src_dir}/**/*" )
230
- source_files.each do |file|
231
-
232
- next if File.directory?( file )
233
-
234
- # extract relatve path in respect to src_dir
235
- source = Pathname.new( File.expand_path( file) )
236
- source_root = Pathname.new( File.expand_path( src_dir ) )
237
- src = source.relative_path_from( source_root )
238
-
239
- # do not unmustache anythins under docs, doc directory
240
- if DOC_DIRS.include?( File.dirname( src ).split(File::SEPARATOR).first )
241
- output( 1, " document file #{src} not unmustached" )
242
- next
243
- end
244
-
245
-
246
- target = "#{target_dir}/#{src}"
247
- # puts "#{source} --> #{target}"
248
-
249
- if !File.exists?( File.dirname(target) )
250
- cmd = "mkdir -p #{File.dirname(target)}"
251
- output( 1, cmd )
252
- `#{cmd}`
253
- exit unless $?.success?
254
- end # create dir
255
-
256
- if !File.exists?(target) or (File.mtime( source ) > File.mtime(target))
257
- cmd = "echo '#{preferences.to_json}' | mustache - #{source} > #{target}"
258
- output( 2, " " + cmd )
259
- `#{cmd}`
260
- exit unless $?.success?
261
- end # create file
262
- end
263
-
264
- output( 1, "Unmustache #{src_dir} --> #{target_dir} - done" )
135
+ # @return [TlaParserS::Resolver] parser resolver ready to use
136
+ private def getResolver
265
137
 
138
+ parserFacade.getResolver( controller )
266
139
 
267
140
  end
268
141
 
142
+ # @!endgroup
269
143
 
270
144
 
271
- # Create '@resolver' and initSnippets in 'snippet_repository'
272
- #
273
- # @param options [Hash] defining options for 'Resolver'
274
- def initResolver( snippet_repository, options={} )
275
-
276
-
277
- output( 1, "Parse snippet from repository #{snippet_repository} - start" )
278
-
279
- cnt = 0
280
- resolver = nil
281
- Dir.chdir( snippet_repository ) do
282
-
283
- @logger.info( "#{__method__}: init snippets in snippet_repository=#{snippet_repository}" )
284
- snippet_files = Dir.glob( "**/*").map { |fileName| File.new(fileName)}
285
- resolver = TlaParserS::Resolver.new( options )
286
-
287
- # Add Globals, Sbuilder and model symbols to resolver
288
- initResolverContext( resolver )
289
-
290
- # Parse 'snippet_files' -
291
- resolver.initSnippets( snippet_files ) do |stat,entry,e|
292
-
293
- if stat
294
- # success output dots no newline
295
- output( 1, ".", false )
296
- cnt += 1
297
- true
298
- else
299
-
300
- # parses error
301
- if filter_list
302
- msg = <<-EOS
303
-
304
- Parser error: option '--filter-list' set --> continue
305
- #{e.message}
306
- EOS
307
- @logger.error( msg )
308
- warn msg
309
- true
310
- else
311
- msg = <<-EOS
312
- Parser error: option '--filter-list' not set --> exiting
313
- #{e.message}
314
- EOS
315
- @logger.error( msg )
316
- warn msg
317
- false
318
- end # if filter_list
319
-
320
- end # else - false: error
321
- end # block
322
-
323
- end # chdir
324
-
325
- # start new line
326
- output( 1, "" )
327
- output( 1, "Parse snippet from repository #{snippet_repository} - done: parsed #{cnt} snippets" )
145
+ # ------------------------------------------------------------------
146
+ # @!group Whitelist
328
147
 
329
- resolver
148
+ # Return whitelisted template names. Implementation returns empty
149
+ # list.
150
+ #
151
+ # @return [Array] of whitelistes template names
152
+ private def whitelist_file
153
+ return []
330
154
  end
331
155
 
156
+
332
157
  # Call resolver#resolveModule to find out the whitelist modules.
333
158
  # Implementation uses 'entry_points' configured in 'configSetup'
334
159
  #
335
160
  # @return [String:Array] of white listed modules
336
- def whitelist_resolved
337
- rslv = resolver
161
+ private def whitelist_resolved
162
+
163
+ # initialize resolver when called for the first time
164
+ parserResolver = getResolver
338
165
  output( 1, "Resolving symbols - start" )
339
166
  entrypoints = getEntryPoints + getSetupPossibilities + getModelInvariants + getSetupAssumes
340
167
  @logger.debug("#{__method__}: entrypoints=#{entrypoints}")
341
- ret = rslv.resolveModules( entrypoints ) do |type,arr|
168
+ ret = parserResolver.resolveModules( entrypoints ) do |type,arr|
169
+
170
+ # output summary
171
+
342
172
  case type
343
173
  when "unresolved"
344
174
  # defult to output unresolved - if some unresolved symbols
@@ -353,20 +183,20 @@ module Sbuilder
353
183
  return ret
354
184
  end
355
185
 
356
-
357
- # Return whitelisted template names.
186
+ # Cache + return template names for resolved whitelisted modules,
187
+ # and for modules listed in separate file.
358
188
  #
359
189
  #
360
190
  # @return [Array] of whitelistes template names
361
191
 
362
- def whitelist
192
+ private def whitelist
363
193
  return @whitelist if @whitelist
364
194
  @whitelist = whitelist_file + whitelist_resolved
365
195
  @logger.info( "#{__method__}, whitelist=#{@whitelist}" )
366
196
  @whitelist
367
197
  end
368
198
 
369
- private
199
+ # @!endgroup
370
200
 
371
201
 
372
202
  end