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
@@ -11,7 +11,7 @@ module Sbuilder
|
|
11
11
|
class TemplateReader
|
12
12
|
|
13
13
|
include Sbuilder::Utils::MyLogger # mix logger
|
14
|
-
PROGNAME =
|
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
|
-
|
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
|
-
#
|
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
|
-
|
100
|
-
#
|
101
|
-
|
102
|
-
|
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
|
-
#
|
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
|
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
|
-
#
|
11
|
-
# modules to put in whitelist'
|
12
|
-
#
|
13
|
-
#
|
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
|
-
#
|
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
|
-
#
|
48
|
-
|
39
|
+
# Add logger
|
49
40
|
|
50
41
|
include Sbuilder::Utils::MyLogger # mix logger
|
51
|
-
PROGNAME =
|
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
|
-
|
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 :
|
51
|
+
attr_reader :setupName # setup being currently generated
|
72
52
|
|
73
|
-
|
74
|
-
attr_reader :
|
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
|
-
|
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
|
-
#
|
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
|
-
#
|
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
|
-
#
|
182
|
-
#
|
128
|
+
# Get access to parser resolver from parser facade.
|
183
129
|
#
|
184
|
-
|
185
|
-
|
186
|
-
|
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
|
-
# @
|
222
|
-
|
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
|
-
#
|
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
|
-
|
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
|
-
|
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 =
|
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
|
-
#
|
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
|
-
|
199
|
+
# @!endgroup
|
370
200
|
|
371
201
|
|
372
202
|
end
|