tla-sbuilder 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +116 -33
- data/VERSION +1 -1
- data/lib/cli/cli-customer.rb +41 -23
- data/lib/cli/cli-example.rb +1 -1
- data/lib/cli/cli-pet.rb +33 -30
- data/lib/cli/cli-text.rb +57 -17
- data/lib/cli/cli.rb +56 -10
- data/lib/sbuilder.rb +3 -1
- data/lib/sbuilder/constants.rb +5 -2
- data/lib/sbuilder/controller.rb +289 -59
- data/lib/sbuilder/default-sbuilder.yaml +25 -3
- data/lib/sbuilder/domain.rb +1 -1
- data/lib/sbuilder/domain_cardinality.rb +1 -1
- data/lib/sbuilder/domain_value.rb +1 -1
- data/lib/sbuilder/exception.rb +13 -7
- data/lib/sbuilder/extension_loader.rb +75 -18
- data/lib/sbuilder/facade/api_loader.rb +293 -0
- data/lib/sbuilder/factory.rb +66 -3
- data/lib/sbuilder/model.rb +59 -3
- data/lib/sbuilder/mustache/template.rb +13 -13
- data/lib/sbuilder/mustache/template_reader_context.rb +5 -3
- data/lib/sbuilder/param_set.rb +2 -1
- data/lib/sbuilder/param_set_db.rb +1 -1
- data/lib/sbuilder/param_set_def.rb +1 -1
- data/lib/sbuilder/param_set_if.rb +1 -1
- data/lib/sbuilder/param_set_loader_swagger.rb +122 -121
- data/lib/sbuilder/param_set_step.rb +1 -1
- data/lib/sbuilder/parameter.rb +1 -1
- data/lib/sbuilder/parameter_container.rb +1 -1
- data/lib/sbuilder/parameter_dom.rb +1 -1
- data/lib/sbuilder/parameter_ref.rb +2 -2
- data/lib/sbuilder/resolver_rule.rb +1 -1
- data/lib/sbuilder/resolver_rule_match.rb +1 -1
- data/lib/sbuilder/resolver_rule_ref.rb +1 -1
- data/lib/sbuilder/spec/README +5 -0
- data/lib/sbuilder/spec/api_loader_facade.rb +247 -0
- data/lib/utils/cache_lines.rb +21 -0
- data/lib/utils/netio.rb +5 -13
- data/mustache/cfg/macro_run.mustache +1 -0
- data/mustache/interface_processes.mustache +9 -2
- data/mustache/interface_stubs_dummy.mustache +7 -0
- data/mustache/interface_types.mustache +3 -3
- data/mustache/invariant_activate.mustache +16 -0
- data/mustache/setup/assumptions_activate.mustache +16 -0
- data/mustache/{domains_run.mustache → setup/domains_run.mustache} +2 -2
- data/mustache/setup/operator_run.mustache +2 -0
- data/mustache/setup/steps_run_bind_set.mustache +1 -1
- data/mustache/setup/steps_run_parameterBind.mustache +4 -2
- data/mustache/tla/macro_run.mustache +8 -0
- data/mustache/tla/operator_run.mustache +1 -0
- data/mustache/tla/plc_define_run.mustache +2 -4
- data/mustache/tla/plc_run_state.mustache +1 -1
- data/src-extend/extend/extend_invariant_cfg.mustache +1 -1
- data/src/pet/assumption_domains.tla +1 -1
- data/src/pet/correctness.cfg +4 -0
- data/tla-sbuilder.gemspec +3 -1
- metadata +14 -10
- data/lib/sbuilder/param_set_loader.rb +0 -77
- data/src-extend/extend_app/correctness.cfg +0 -9
data/lib/sbuilder/parameter.rb
CHANGED
@@ -16,7 +16,7 @@ module Sbuilder
|
|
16
16
|
# constrcutore
|
17
17
|
def initialize( options = {} )
|
18
18
|
@logger = getLogger( PROGNAME, options )
|
19
|
-
@logger.
|
19
|
+
@logger.debug( "#{__method__} initialized" )
|
20
20
|
# default is not an arrays
|
21
21
|
@isArray = false
|
22
22
|
end
|
@@ -19,7 +19,7 @@ module Sbuilder
|
|
19
19
|
def initialize( options = {} )
|
20
20
|
super( options )
|
21
21
|
@logger = getLogger( PROGNAME, options )
|
22
|
-
@logger.
|
22
|
+
@logger.debug( "#{__method__} initialized" )
|
23
23
|
end
|
24
24
|
|
25
25
|
# ------------------------------------------------------------------
|
@@ -15,7 +15,7 @@ module Sbuilder
|
|
15
15
|
def initialize( options = {} )
|
16
16
|
super( options )
|
17
17
|
@logger = getLogger( PROGNAME, options )
|
18
|
-
@logger.
|
18
|
+
@logger.debug( "#{__method__} initialized" )
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.create( name, paramSetName )
|
@@ -56,7 +56,7 @@ module Sbuilder
|
|
56
56
|
def do_parameter_definition( model )
|
57
57
|
{
|
58
58
|
# :name => name,
|
59
|
-
:type => reference,
|
59
|
+
:type => getResolvedReference(model).getName, # reference,
|
60
60
|
:namespace => Constants::TYPE_NAMESPACE_REF, # in TLA code prefix with 't_'
|
61
61
|
:composite_parameters => getResolvedReference(model).parameter_definitions( model ),
|
62
62
|
}
|
@@ -13,7 +13,7 @@ module Sbuilder
|
|
13
13
|
# constrcutore
|
14
14
|
def initialize( options = {} )
|
15
15
|
@logger = getLogger( PROGNAME, options )
|
16
|
-
@logger.
|
16
|
+
@logger.debug( "#{__method__} initialized" )
|
17
17
|
end
|
18
18
|
|
19
19
|
# ------------------------------------------------------------------
|
@@ -0,0 +1,247 @@
|
|
1
|
+
require 'sbuilder'
|
2
|
+
|
3
|
+
|
4
|
+
# ------------------------------------------------------------------
|
5
|
+
# "api_loader_facade: signatures": Facade implements methods
|
6
|
+
# :newDefinition, :newInterface, :newParameter,
|
7
|
+
# :newParameterReference, :modelDefinition, :modelInterface. Loader
|
8
|
+
# implements methods :load :setFacade
|
9
|
+
#
|
10
|
+
|
11
|
+
RSpec.shared_examples_for "api_loader_facade: signatures" do
|
12
|
+
|
13
|
+
let( :factory ) { Sbuilder::Factory.getFactory }
|
14
|
+
let( :facade ) { Sbuilder::ApiLoader.new( factory ) }
|
15
|
+
|
16
|
+
before :each do
|
17
|
+
loader.setFacade( facade )
|
18
|
+
end
|
19
|
+
# ------------------------------------------------------------------
|
20
|
+
# Interfaces
|
21
|
+
|
22
|
+
describe "interfaces" do
|
23
|
+
|
24
|
+
describe "loader" do
|
25
|
+
|
26
|
+
it ".configure static method " do
|
27
|
+
expect( loader.class ).to respond_to( :configure )
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
it "#load" do
|
32
|
+
expect( loader ).to respond_to( :load )
|
33
|
+
end
|
34
|
+
|
35
|
+
it "#setFacade" do
|
36
|
+
expect( loader ).to respond_to( :setFacade )
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
# ------------------------------------------------------------------
|
49
|
+
# uses ':read_cached' to access api definition: Loader calls
|
50
|
+
# 'read_cached' to receive one string containing api definition.
|
51
|
+
# Facade may cache the api definition, if ':cached' property is set
|
52
|
+
#
|
53
|
+
# Example:
|
54
|
+
#
|
55
|
+
# it_behaves_like "api_loader_facade: uses ':read_cached' to access api definition" do
|
56
|
+
# let( :loader ) { described_class.new }
|
57
|
+
# let( :load_data ) {
|
58
|
+
# one_definition
|
59
|
+
# }
|
60
|
+
# end
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
RSpec.shared_examples_for "api_loader_facade: uses ':read_cached' to access api definition" do
|
66
|
+
|
67
|
+
let( :factory ) { Sbuilder::Factory.getFactory }
|
68
|
+
let( :facade ) { Sbuilder::ApiLoader.new( factory ) }
|
69
|
+
|
70
|
+
before :each do
|
71
|
+
loader.setFacade( facade )
|
72
|
+
end
|
73
|
+
|
74
|
+
it "#read_cached called" do
|
75
|
+
uri = double( "uri" )
|
76
|
+
empty_yaml = ""
|
77
|
+
expect( facade ).to receive( :read_cached ).with( uri ).and_return( load_data )
|
78
|
+
# expect( Sbuilder::Utils::NetIo ).to receive( :cache_lines ).with( cacheFile, load_data )
|
79
|
+
|
80
|
+
# after using read_cached --> create model
|
81
|
+
allow( facade ).to receive( :newDefinition ).and_call_original
|
82
|
+
allow( facade ).to receive( :newParameter ).and_call_original
|
83
|
+
allow( facade ).to receive( :newParameterReference ).and_call_original
|
84
|
+
allow( facade ).to receive( :modelDefinition )
|
85
|
+
allow( facade ).to receive( :modelInterface )
|
86
|
+
|
87
|
+
loader.load( uri )
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
# ------------------------------------------------------------------
|
94
|
+
# contract to load one definition: loader calls facade methods
|
95
|
+
# 'newDefinition', 'newParameter', 'modelDefinition' in correct order,
|
96
|
+
# when loading one interface parameter definition.
|
97
|
+
#
|
98
|
+
# Example:
|
99
|
+
#
|
100
|
+
# it_behaves_like "api_loader_facade: contract to load one definition" do
|
101
|
+
#
|
102
|
+
# let( :loader ) { described_class.new }
|
103
|
+
#
|
104
|
+
# let( :load ) {
|
105
|
+
# expect( loader ).to receive( :readLines ).and_return( one_definition )
|
106
|
+
# loader.load( nil )
|
107
|
+
# }
|
108
|
+
# end
|
109
|
+
#
|
110
|
+
# Notice:
|
111
|
+
# - 'loader.load' calls 'loader.readLines', which is stubbed in example block
|
112
|
+
# - 'loader.readLine' returns 'one_definition' to create one definition with
|
113
|
+
# one parameter
|
114
|
+
#
|
115
|
+
|
116
|
+
RSpec.shared_examples_for "api_loader_facade: contract to load one definition" do
|
117
|
+
|
118
|
+
|
119
|
+
let( :factory ) { Sbuilder::Factory.getFactory }
|
120
|
+
let( :facade ) { Sbuilder::ApiLoader.new( factory ) }
|
121
|
+
|
122
|
+
before :each do
|
123
|
+
loader.setFacade( facade )
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
it "#newDefinition, #newParameter, #modelDefinition ordered" do
|
128
|
+
definition = instance_double( Sbuilder::ParamSetDef )
|
129
|
+
parameter = instance_double( Sbuilder::Parameter )
|
130
|
+
expect( facade ).to receive( :newDefinition ).ordered.and_return( definition )
|
131
|
+
expect( definition ).to receive( :addParameter ).with( parameter )
|
132
|
+
expect( facade ).to receive( :newParameter ).ordered.and_return( parameter )
|
133
|
+
expect( facade ).to receive( :modelDefinition ).ordered
|
134
|
+
load
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
# ------------------------------------------------------------------
|
141
|
+
# contract to load one interface: loader calls facade methods
|
142
|
+
# 'newInterface', 'newParameter', 'modelInterface' in correct order,
|
143
|
+
# when loading one interface definition.
|
144
|
+
#
|
145
|
+
# Example:
|
146
|
+
#
|
147
|
+
# it_behaves_like "api_loader_facade: contract to load one interface" do
|
148
|
+
# let( :loader ) { described_class.new }
|
149
|
+
# let( :load ) {
|
150
|
+
# expect( loader ).to receive( :readLines ).and_return( one_interface )
|
151
|
+
# loader.load( nil ) }
|
152
|
+
# end
|
153
|
+
#
|
154
|
+
# Notice:
|
155
|
+
# - 'loader.load' calls 'loader.readLines', which is stubbed in example block
|
156
|
+
# - 'loader.readLine' returns 'one_inteface', which defines one interface with
|
157
|
+
# one interface parameter
|
158
|
+
#
|
159
|
+
|
160
|
+
|
161
|
+
RSpec.shared_examples_for "api_loader_facade: contract to load one interface" do |parameters=1,references=0|
|
162
|
+
|
163
|
+
|
164
|
+
let( :factory ) { Sbuilder::Factory.getFactory }
|
165
|
+
let( :facade ) { Sbuilder::ApiLoader.new( factory ) }
|
166
|
+
|
167
|
+
before :each do
|
168
|
+
loader.setFacade( facade )
|
169
|
+
end
|
170
|
+
|
171
|
+
# ------------------------------------------------------------------
|
172
|
+
# builds interface correctly
|
173
|
+
|
174
|
+
describe "creates interface" do
|
175
|
+
|
176
|
+
it "#newInterface, #newParameter, #modelInterface ordered" do
|
177
|
+
expect( facade ).to receive( :newInterface ).ordered.and_call_original
|
178
|
+
expect( facade ).to receive( :newParameter ).exactly( parameters ).times.and_call_original
|
179
|
+
expect( facade ).to receive( :newParameterReference ).exactly( references ).times.and_call_original
|
180
|
+
expect( facade ).to receive( :modelInterface ).ordered
|
181
|
+
load
|
182
|
+
end
|
183
|
+
|
184
|
+
end
|
185
|
+
|
186
|
+
describe "facade#newInterface" do
|
187
|
+
|
188
|
+
let ( :newInterface ) { facade.newInterface( "path", "op" ) }
|
189
|
+
|
190
|
+
it "#returns Sbuilder::ParamSet" do
|
191
|
+
expect( newInterface ).to be_a( Sbuilder::ParamSet )
|
192
|
+
end
|
193
|
+
|
194
|
+
it "#returns Sbuilder::ParamSet_If" do
|
195
|
+
expect( newInterface ).to be_a( Sbuilder::ParamSet_If )
|
196
|
+
end
|
197
|
+
|
198
|
+
context "response" do
|
199
|
+
|
200
|
+
let ( :response ) { newInterface.respons }
|
201
|
+
|
202
|
+
it "#response returns Sbuilder::ParamSet" do
|
203
|
+
expect( newInterface ).to be_a( Sbuilder::ParamSet )
|
204
|
+
end
|
205
|
+
|
206
|
+
it "#response returns Sbuilder::ParamSet_If" do
|
207
|
+
expect( newInterface ).to be_a( Sbuilder::ParamSet_If )
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
end
|
213
|
+
|
214
|
+
end
|
215
|
+
|
216
|
+
# ------------------------------------------------------------------
|
217
|
+
# Loader method #setFacade calls facade#createLogger to get an Ruby
|
218
|
+
# logger objects
|
219
|
+
#
|
220
|
+
# Example:
|
221
|
+
#
|
222
|
+
# it_behaves_like "api_loader_facade: loader calls #createLogger on #setFacade" do
|
223
|
+
# let( :loader ) { described_class.new }
|
224
|
+
# end
|
225
|
+
#
|
226
|
+
#
|
227
|
+
|
228
|
+
RSpec.shared_examples_for "api_loader_facade: loader calls #createLogger on #setFacade" do
|
229
|
+
|
230
|
+
let( :factory ) { Sbuilder::Factory.getFactory }
|
231
|
+
let( :facade ) { Sbuilder::ApiLoader.new( factory ) }
|
232
|
+
|
233
|
+
|
234
|
+
it "#createLogger" do
|
235
|
+
expect( facade ).to receive( :createLogger ).and_call_original
|
236
|
+
loader.setFacade( facade )
|
237
|
+
end
|
238
|
+
|
239
|
+
describe "facade#createLogger" do
|
240
|
+
|
241
|
+
it "#returns Logger" do
|
242
|
+
expect( facade.createLogger( "name" )).to be_a( Logger )
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
end
|
247
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Sbuilder
|
2
|
+
|
3
|
+
module Utils
|
4
|
+
|
5
|
+
module CacheLines
|
6
|
+
|
7
|
+
# write lines in cache file
|
8
|
+
def self.cache_write( cacheFile, data )
|
9
|
+
File.open( cacheFile, "w" ) { |f| f.write( data ) }
|
10
|
+
end
|
11
|
+
|
12
|
+
# Return content of cache file
|
13
|
+
#
|
14
|
+
# @return [String] cached Strinng, nil if not cached
|
15
|
+
def self.cache_read( cacheFile )
|
16
|
+
return File.read( cacheFile ) if !cacheFile.nil? && File.exist?( cacheFile )
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/utils/netio.rb
CHANGED
@@ -21,22 +21,18 @@ module Sbuilder
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
#
|
25
|
-
|
24
|
+
# read line from uri
|
25
|
+
# @return [String] read from url
|
26
|
+
def read_lines( uri )
|
26
27
|
|
27
|
-
# cached
|
28
|
-
return File.read( cacheFile ) if !cacheFile.nil? && File.exist?( cacheFile )
|
29
|
-
|
30
28
|
# network access && create cache
|
31
|
-
lines =
|
32
|
-
cache_lines( cacheFile, lines ) unless cacheFile.nil?
|
29
|
+
lines = do_read_lines( uri )
|
33
30
|
|
34
|
-
#
|
35
31
|
return lines
|
36
32
|
|
37
33
|
end
|
38
34
|
|
39
|
-
def
|
35
|
+
def do_read_lines( uri )
|
40
36
|
begin
|
41
37
|
open( uri ).read
|
42
38
|
rescue => e
|
@@ -45,10 +41,6 @@ module Sbuilder
|
|
45
41
|
end
|
46
42
|
end
|
47
43
|
|
48
|
-
# write lines in cache file
|
49
|
-
def cache_lines( cacheFile, lines )
|
50
|
-
File.open( cacheFile, "w" ) { |f| f.write( lines ) }
|
51
|
-
end
|
52
44
|
|
53
45
|
|
54
46
|
end
|
@@ -25,8 +25,15 @@ fair process ({{>name_process.mustache}}="{{interface_operation}}") {
|
|
25
25
|
{{^PREFERENCES.debug-output}}\* {{/PREFERENCES.debug-output}}print <<" - input=>", _input >>;
|
26
26
|
(* print <<" - {{>name_interface_type.mustache}}=>", {{>name_interface_type.mustache}} >>; *)
|
27
27
|
{{/implementation}}
|
28
|
-
|
29
|
-
|
28
|
+
{{#parameter_definitions.length}}
|
29
|
+
(* Valid input type? - _input must match type of API request *)
|
30
|
+
assert( _input \in {{>name_interface_type.mustache}} );{{/parameter_definitions.length}}{{!
|
31
|
+
|
32
|
+
else : no parmaeter
|
33
|
+
|
34
|
+
}}{{^parameter_definitions.length}}
|
35
|
+
(* Valid input type? - API configuration did not define any parameters - must have Nil for _input.dummy: *)
|
36
|
+
assert( _input.dummy = Nil );{{/parameter_definitions.length}}
|
30
37
|
{{#implementation}}{{implementation}}( _input );{{/implementation}}
|
31
38
|
}; \* with _input
|
32
39
|
(* enable next process - after current process *)
|
@@ -4,6 +4,12 @@ Interfaces generated {{META.desc}}
|
|
4
4
|
- template {{META.template}}
|
5
5
|
******************************************************************)
|
6
6
|
|
7
|
+
(* Allow 'interface-extension.implementation' without specification code snippet *)
|
8
|
+
macro dummy( dummy_input ) {
|
9
|
+
print << "Dummy macro called should replace with actual macro" >>;
|
10
|
+
}
|
11
|
+
|
12
|
+
|
7
13
|
(* Create a dummy procedure with input variable so that pcal creates
|
8
14
|
constant defaultInitValue (which is assigned a value in setup.tla)
|
9
15
|
*)
|
@@ -11,3 +17,4 @@ Interfaces generated {{META.desc}}
|
|
11
17
|
procedure dummy( dummy_input ) {
|
12
18
|
dummy_start: skip;
|
13
19
|
}
|
20
|
+
|
@@ -19,9 +19,9 @@ Interface input types: {{META.desc}}
|
|
19
19
|
|
20
20
|
Empty parameter definition (passes swagger schema validation).
|
21
21
|
|
22
|
-
ouput 'dummy : Nil'
|
23
|
-
|
24
|
-
}}{{^parameter_definitions.length}}dummy: Nil{{/parameter_definitions.length}}
|
22
|
+
ouput 'dummy : {Nil}'
|
23
|
+
|
24
|
+
}}{{^parameter_definitions.length}}dummy: {Nil}{{/parameter_definitions.length}}
|
25
25
|
] \* operation '{{interface_operation}}' --> process '{{>name_process.mustache}}'
|
26
26
|
|
27
27
|
{{/interfaces}}
|