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.
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}}