tla-sbuilder 0.1.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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}}
|