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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +116 -33
  3. data/VERSION +1 -1
  4. data/lib/cli/cli-customer.rb +41 -23
  5. data/lib/cli/cli-example.rb +1 -1
  6. data/lib/cli/cli-pet.rb +33 -30
  7. data/lib/cli/cli-text.rb +57 -17
  8. data/lib/cli/cli.rb +56 -10
  9. data/lib/sbuilder.rb +3 -1
  10. data/lib/sbuilder/constants.rb +5 -2
  11. data/lib/sbuilder/controller.rb +289 -59
  12. data/lib/sbuilder/default-sbuilder.yaml +25 -3
  13. data/lib/sbuilder/domain.rb +1 -1
  14. data/lib/sbuilder/domain_cardinality.rb +1 -1
  15. data/lib/sbuilder/domain_value.rb +1 -1
  16. data/lib/sbuilder/exception.rb +13 -7
  17. data/lib/sbuilder/extension_loader.rb +75 -18
  18. data/lib/sbuilder/facade/api_loader.rb +293 -0
  19. data/lib/sbuilder/factory.rb +66 -3
  20. data/lib/sbuilder/model.rb +59 -3
  21. data/lib/sbuilder/mustache/template.rb +13 -13
  22. data/lib/sbuilder/mustache/template_reader_context.rb +5 -3
  23. data/lib/sbuilder/param_set.rb +2 -1
  24. data/lib/sbuilder/param_set_db.rb +1 -1
  25. data/lib/sbuilder/param_set_def.rb +1 -1
  26. data/lib/sbuilder/param_set_if.rb +1 -1
  27. data/lib/sbuilder/param_set_loader_swagger.rb +122 -121
  28. data/lib/sbuilder/param_set_step.rb +1 -1
  29. data/lib/sbuilder/parameter.rb +1 -1
  30. data/lib/sbuilder/parameter_container.rb +1 -1
  31. data/lib/sbuilder/parameter_dom.rb +1 -1
  32. data/lib/sbuilder/parameter_ref.rb +2 -2
  33. data/lib/sbuilder/resolver_rule.rb +1 -1
  34. data/lib/sbuilder/resolver_rule_match.rb +1 -1
  35. data/lib/sbuilder/resolver_rule_ref.rb +1 -1
  36. data/lib/sbuilder/spec/README +5 -0
  37. data/lib/sbuilder/spec/api_loader_facade.rb +247 -0
  38. data/lib/utils/cache_lines.rb +21 -0
  39. data/lib/utils/netio.rb +5 -13
  40. data/mustache/cfg/macro_run.mustache +1 -0
  41. data/mustache/interface_processes.mustache +9 -2
  42. data/mustache/interface_stubs_dummy.mustache +7 -0
  43. data/mustache/interface_types.mustache +3 -3
  44. data/mustache/invariant_activate.mustache +16 -0
  45. data/mustache/setup/assumptions_activate.mustache +16 -0
  46. data/mustache/{domains_run.mustache → setup/domains_run.mustache} +2 -2
  47. data/mustache/setup/operator_run.mustache +2 -0
  48. data/mustache/setup/steps_run_bind_set.mustache +1 -1
  49. data/mustache/setup/steps_run_parameterBind.mustache +4 -2
  50. data/mustache/tla/macro_run.mustache +8 -0
  51. data/mustache/tla/operator_run.mustache +1 -0
  52. data/mustache/tla/plc_define_run.mustache +2 -4
  53. data/mustache/tla/plc_run_state.mustache +1 -1
  54. data/src-extend/extend/extend_invariant_cfg.mustache +1 -1
  55. data/src/pet/assumption_domains.tla +1 -1
  56. data/src/pet/correctness.cfg +4 -0
  57. data/tla-sbuilder.gemspec +3 -1
  58. metadata +14 -10
  59. data/lib/sbuilder/param_set_loader.rb +0 -77
  60. data/src-extend/extend_app/correctness.cfg +0 -9
@@ -16,7 +16,7 @@ module Sbuilder
16
16
  def initialize( options = {} )
17
17
  super( options )
18
18
  @logger = getLogger( PROGNAME, options )
19
- @logger.info( "#{__method__} initialized" )
19
+ @logger.debug( "#{__method__} initialized" )
20
20
 
21
21
  # default - use rule
22
22
  @bindExact = false
@@ -16,7 +16,7 @@ module Sbuilder
16
16
  # constrcutore
17
17
  def initialize( options = {} )
18
18
  @logger = getLogger( PROGNAME, options )
19
- @logger.info( "#{__method__} initialized" )
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.info( "#{__method__} initialized" )
22
+ @logger.debug( "#{__method__} initialized" )
23
23
  end
24
24
 
25
25
  # ------------------------------------------------------------------
@@ -17,7 +17,7 @@ module Sbuilder
17
17
  def initialize( options = {} )
18
18
  super( options )
19
19
  @logger = getLogger( PROGNAME, options )
20
- @logger.info( "#{__method__} initialized" )
20
+ @logger.debug( "#{__method__} initialized" )
21
21
  end
22
22
 
23
23
  def self.create( name, domain )
@@ -15,7 +15,7 @@ module Sbuilder
15
15
  def initialize( options = {} )
16
16
  super( options )
17
17
  @logger = getLogger( PROGNAME, options )
18
- @logger.info( "#{__method__} initialized" )
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.info( "#{__method__} initialized" )
16
+ @logger.debug( "#{__method__} initialized" )
17
17
  end
18
18
 
19
19
  # ------------------------------------------------------------------
@@ -14,7 +14,7 @@ module Sbuilder
14
14
  # constrcutore
15
15
  def initialize( options = {} )
16
16
  @logger = getLogger( PROGNAME, options )
17
- @logger.info( "#{__method__} initialized" )
17
+ @logger.debug( "#{__method__} initialized" )
18
18
  super( options )
19
19
  end
20
20
 
@@ -13,7 +13,7 @@ module Sbuilder
13
13
  # constrcutore
14
14
  def initialize( options = {} )
15
15
  @logger = getLogger( PROGNAME, options )
16
- @logger.info( "#{__method__} initialized" )
16
+ @logger.debug( "#{__method__} initialized" )
17
17
  super( options )
18
18
  end
19
19
 
@@ -0,0 +1,5 @@
1
+ Spec libraries distributed within Gem.
2
+
3
+ Allown extension points to verify their contract with sbuilder core
4
+
5
+
@@ -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
@@ -21,22 +21,18 @@ module Sbuilder
21
21
  end
22
22
  end
23
23
 
24
- # if 'cacheFile' return line in 'cacheFile else read from 'uri' && write to 'cacheFile'
25
- def read_lines_cached( uri, cacheFile = nil )
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 = read_lines( uri )
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 read_lines( uri )
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
@@ -4,3 +4,4 @@ CONSTANT ProcessRunning <- RunProcessRunning
4
4
  CONSTANT ProcessParameter <- RunProcessParameter
5
5
  CONSTANT ProcessesToRun <- RunProcessesToRun
6
6
  CONSTANT TickNext <- RunTickNext
7
+ CONSTANT InTransaction <- RunInTransaction
@@ -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
- (* Valid input type? *)
29
- assert( _input \in {{>name_interface_type.mustache}} );
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}}