tla-sbuilder 0.2.2 → 0.3.4

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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +150 -116
  3. data/VERSION +1 -1
  4. data/lib/cli/cli-customer.rb +23 -3
  5. data/lib/cli/cli-pet.rb +66 -12
  6. data/lib/cli/cli-text.rb +127 -8
  7. data/lib/cli/cli.rb +49 -6
  8. data/lib/sbuilder.rb +26 -3
  9. data/lib/sbuilder/constants.rb +165 -6
  10. data/lib/sbuilder/controller.rb +943 -169
  11. data/lib/sbuilder/controller_utils.rb +122 -0
  12. data/lib/sbuilder/default-sbuilder.yaml +38 -44
  13. data/lib/sbuilder/domain.rb +160 -36
  14. data/lib/sbuilder/domain_cardinality.rb +1 -1
  15. data/lib/sbuilder/domain_range.rb +102 -0
  16. data/lib/sbuilder/domain_type.rb +150 -0
  17. data/lib/sbuilder/domain_value.rb +21 -13
  18. data/lib/sbuilder/exception.rb +16 -0
  19. data/lib/sbuilder/extension_loader.rb +67 -686
  20. data/lib/sbuilder/extension_loader_deprecated_step_extensions.rb +711 -0
  21. data/lib/sbuilder/extension_loader_step_generator.rb +876 -0
  22. data/lib/sbuilder/facade/{api_loader.rb → api_loader_facade.rb} +176 -45
  23. data/lib/sbuilder/facade/api_loader_plugin.rb +6 -32
  24. data/lib/sbuilder/facade/api_loader_plugin_mixer.rb +35 -0
  25. data/lib/sbuilder/facade/facade_constants.rb +23 -0
  26. data/lib/sbuilder/facade/loader_plugin_root.rb +56 -0
  27. data/lib/sbuilder/facade/param_set_root.rb +55 -0
  28. data/lib/sbuilder/facade/snippet_loader_facade.rb +600 -0
  29. data/lib/sbuilder/facade/snippet_loader_plugin.rb +76 -0
  30. data/lib/sbuilder/facade/snippet_loader_plugin_mixer.rb +56 -0
  31. data/lib/sbuilder/factory.rb +224 -45
  32. data/lib/sbuilder/model.rb +125 -45
  33. data/lib/sbuilder/mustache/template.rb +107 -58
  34. data/lib/sbuilder/mustache/template_reader.rb +56 -46
  35. data/lib/sbuilder/mustache/template_reader_context.rb +64 -234
  36. data/lib/sbuilder/mustache/template_resolve.rb +103 -0
  37. data/lib/sbuilder/mustache/template_root.rb +71 -0
  38. data/lib/sbuilder/param_set.rb +30 -15
  39. data/lib/sbuilder/param_set_db.rb +1 -1
  40. data/lib/sbuilder/param_set_def.rb +6 -1
  41. data/lib/sbuilder/param_set_def_func.rb +39 -0
  42. data/lib/sbuilder/param_set_if.rb +45 -10
  43. data/lib/sbuilder/param_set_loader_swagger.rb +56 -26
  44. data/lib/sbuilder/param_set_step.rb +1 -1
  45. data/lib/sbuilder/param_sets.rb +2 -1
  46. data/lib/sbuilder/parameter.rb +9 -3
  47. data/lib/sbuilder/parameter_container.rb +1 -1
  48. data/lib/sbuilder/parameter_dom.rb +17 -5
  49. data/lib/sbuilder/parameter_ref.rb +39 -10
  50. data/lib/sbuilder/parser/parser_facade.rb +310 -0
  51. data/lib/sbuilder/resolver.rb +11 -6
  52. data/lib/sbuilder/resolver_loader.rb +1 -1
  53. data/lib/sbuilder/resolver_loader_yaml.rb +1 -1
  54. data/lib/sbuilder/resolver_rule.rb +1 -1
  55. data/lib/sbuilder/resolver_rule_match.rb +10 -4
  56. data/lib/sbuilder/resolver_rule_ref.rb +1 -1
  57. data/lib/sbuilder/setup_loader.rb +49 -0
  58. data/lib/sbuilder/setup_loader_env.rb +478 -0
  59. data/lib/sbuilder/setup_loader_pref.rb +56 -0
  60. data/lib/sbuilder/snippet_loader_simple.rb +125 -0
  61. data/lib/sbuilder/spec/api_loader.rb +34 -0
  62. data/lib/sbuilder/spec/api_loader_facade.rb +169 -32
  63. data/lib/sbuilder/spec/loader_plugin.rb +98 -0
  64. data/lib/sbuilder/spec/snippet_loader.rb +228 -0
  65. data/lib/sbuilder/symbol_table.rb +279 -0
  66. data/lib/utils/{cache_lines.rb → fileio.rb} +8 -1
  67. data/lib/utils/logger.rb +2 -1
  68. data/lib/utils/powerset.rb +13 -0
  69. data/lib/utils/validate.rb +38 -0
  70. data/mustache/cfg/const_def.mustache +2 -0
  71. data/mustache/cfg/macro_run.mustache +1 -4
  72. data/mustache/data-model-header.mustache +1 -0
  73. data/mustache/definition_types.mustache +34 -4
  74. data/mustache/domains.mustache +1 -1
  75. data/mustache/domains_assign.mustache +1 -1
  76. data/mustache/infrastructure-service-init.mustache +1 -1
  77. data/mustache/interface_processes.mustache +16 -10
  78. data/mustache/interface_types.mustache +37 -11
  79. data/mustache/operator-infrastructure-service.mustache +1 -1
  80. data/mustache/resources/schedule_operator_new_step.tla +8 -0
  81. data/mustache/resources/schedule_process_macro.tla +37 -0
  82. data/mustache/resources/schedule_process_procedure.tla +22 -0
  83. data/mustache/resources/schedule_throw.tla +16 -0
  84. data/mustache/setup/domains_run.mustache +8 -2
  85. data/mustache/setup/operator_run.mustache +0 -4
  86. data/mustache/setup/steps_run.mustache +4 -3
  87. data/mustache/setup/steps_run_parameterBind.mustache +14 -6
  88. data/mustache/setup/steps_run_parameterExact.mustache +7 -3
  89. data/mustache/state_type_invariant-infrastructure-service.mustache +9 -4
  90. data/mustache/tla/const_def.mustache +1 -1
  91. data/mustache/tla/macro_run.mustache +7 -1
  92. data/mustache/tla/module_header.mustache +1 -1
  93. data/mustache/tla/operator_run.mustache +8 -5
  94. data/mustache/tla/plc_define_run.mustache +45 -36
  95. data/mustache/tla/plc_run_state.mustache +12 -5
  96. data/src-extend/extend/extend_assumptions.mustache +3 -0
  97. data/src-extend/extend/extend_const.mustache +3 -0
  98. data/src-extend/extend/extend_implementation.mustache +3 -0
  99. data/src-extend/extend/extend_invariant.mustache +3 -0
  100. data/src-extend/extend/extend_macros.mustache +3 -0
  101. data/src-extend/extend/extend_operations.mustache +3 -0
  102. data/src-extend/extend/extend_state.mustache +3 -0
  103. data/src/pet/extend/extend_assumptions.mustache +4 -0
  104. data/src/pet/extend/extend_implementation.mustache +3 -0
  105. data/src/pet/extend/extend_invariant.mustache +3 -0
  106. data/src/pet/extend/extend_macros.mustache +3 -0
  107. data/src/pet/extend/extend_operations.mustache +4 -0
  108. data/src/pet/extend/extend_state.mustache +3 -0
  109. data/src/pet/interface +5 -5
  110. data/src/pet/interface_delete_pet.tla +1 -1
  111. data/src/pet/interface_get_pet.tla +1 -1
  112. data/src/pet/interface_post_pet.tla +4 -2
  113. data/src/pet/interface_post_tag.tla +1 -1
  114. data/src/pet/interface_put_tag.tla +1 -1
  115. data/tla-sbuilder.gemspec +3 -3
  116. metadata +44 -19
  117. data/mustache/name_definition_type.mustache +0 -5
  118. data/mustache/name_domain.mustache +0 -5
  119. data/mustache/name_domain_value.mustache +0 -5
  120. data/mustache/name_domain_value_prefix.mustache +0 -5
  121. data/mustache/name_interface_response_type.mustache +0 -6
  122. data/mustache/name_interface_type.mustache +0 -6
  123. data/mustache/name_parameter_type.mustache +0 -6
  124. data/mustache/name_process.mustache +0 -6
  125. data/mustache/state_type_invariant.mustache +0 -17
  126. data/mustache/state_variables.mustache +0 -20
  127. data/src-extend/extend/extend_invariant_cfg.mustache +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a2598df840dc392c2decb758b1dbc7f057cd6e6a
4
- data.tar.gz: c58a5b8370bb4571dd7d4b33f6f5acb9c8049115
3
+ metadata.gz: 13bb5aca53c85d8ae5b3943c8c37c23f745adc00
4
+ data.tar.gz: 5f22e716073199acd62eef8f1477b2562727374c
5
5
  SHA512:
6
- metadata.gz: d64be8f51018a61900294b67cf884b19db0e752b98b935fde5c8c9565e9c93765afd1277896f57470153b587a44c0bb08fed3cbbf57e085dff7b68c78a58c114
7
- data.tar.gz: 16637b1375dc71c8a281b04f42373c0e89d13805529baff758ed8e9bddf92163e697f6f2c1a3bd5824b300f3737b9843213f5f40da55122888c573ec4cb82ae0
6
+ metadata.gz: 2686dae3b6360eeafa1d6f71639515f718c0f45bd43067010ea740391ab3338e5086d51f24d7d4929c7ed8499b94d3f2967ecd69b855d24f90dc935e121d3fd3
7
+ data.tar.gz: 9412ebeb149ca0357e0340cdadc00c7b1d55df6778764464a880274b13f1759f79c47a86c18b13162eab0a0fe4bf59ce6cd661ca63ba87048e742e1b11a5acd9
data/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  <link href="../site.css" rel="stylesheet"></link>
2
2
  [Readme](README.md) [Releases](RELEASES.md)
3
3
 
4
- # Sbuilder - A Specification Builder for TLA+ Tools - $Release:0.2.2$
4
+ # Sbuilder - A Specification Builder for TLA+ Tools - $Release:0.3.4$
5
5
 
6
- A tool to generate runnable specification models in
6
+ A tool to generate runnable formal models in
7
7
  [TLA+ language](http://research.microsoft.com/en-us/um/people/lamport/tla/book.html)
8
- for [target systems](#TARGET-SYSTEM). Specification model can be
9
- verified using
8
+ for [target systems](#TARGET-SYSTEM). Formal model can be verified
9
+ using
10
10
  [TLA+ Tools](http://research.microsoft.com/en-us/um/people/lamport/tla/tools.html),
11
11
  and parts of it can be presented as
12
12
  [implementation blueprints](#BLUEPRINT) to developers.
@@ -14,16 +14,16 @@ and parts of it can be presented as
14
14
  See
15
15
 
16
16
  * [documentation](https://jarjuk.wordpress.com/sbuilder/) for
17
- backgroun information, User's Guide and Developer's Guide
17
+ background information, User's Guide and Developer's Guide
18
18
 
19
- * [live documentation](http://jarjuk.github.io/tla-sbuilder/0.2.2/features.html)
20
- (Cucumber tests) for more details on configuring Sbuilder, and on
21
- features implemented by Sbuilder
19
+ * [on-line documentation](http://jarjuk.github.io/tla-sbuilder.html)
20
+ (including Cucumber tests) for more details on configuring Sbuilder,
21
+ and on features implemented by Sbuilder
22
22
 
23
23
 
24
24
  ## <a id="TARGET-SYSTEM">Target Systems</a>
25
25
 
26
- Sbuilder supports modeling typical business IT systems, where a system
26
+ Sbuilder supports modeling business IT systems, where system
27
27
  architecture identifies
28
28
 
29
29
  * **interfaces**: entry point providing access to services within the
@@ -40,60 +40,61 @@ architecture identifies
40
40
 
41
41
  ## <a id="ELEMENTS-OF">Runnable Specification Code</a>
42
42
 
43
- Sbuilder combines three main elements to create runnable TLA+
44
- Specification Code:
43
+ Sbuilder combines three main elements to create runnable TLA+ formal
44
+ model:
45
45
 
46
- 1. **Interface specification**: Natively Sbuilder accepts
46
+ 1. **API interfaces**: Natively Sbuilder accepts
47
47
  [RESTfull](https://en.wikipedia.org/wiki/Representational_state_transfer)
48
48
  interface api specification expressed in
49
49
  [Swagger](http://swagger.io/)
50
- [v2.0](http://swagger.io/specification/) format. Plugin system
51
- allows importing API confiugration also from external systems,
52
- e.g. from [salesforce](https://github.com/jarjuk/tla-sbuilder-salesforce)
50
+ [v2.0](http://swagger.io/specification/)
51
+ format. [API Loader Extension Point](#API_LOADER) allows importing
52
+ API confiugration also from external systems, e.g. from
53
+ [salesforce](https://github.com/jarjuk/tla-sbuilder-salesforce)
53
54
 
54
- 2. **Specification extension**: Sbuilder tangles manually crafted code
55
- snippets from Sbuilder *code repository* with the code generated
56
- using *inteterface specifications*. The manual code snippets use
57
- TLA+ language to model behavior and correctness criteria of the
58
- target system.
59
-
60
- 3. **Setups**: To complete runnable code Sbuilder uses setups. A setup
61
- is a sequence of interface operations, and their input parameters.
62
- In addition, a setup may define domain cardinalities, or domain
63
- values. The tools allows defining multiple setups, each setup
64
- resulting to a complete, runnable TLA+ code, allowing system model
65
- to be run in various environment context
55
+ 2. **TLA Snippets**: Sbuilder tangles either manually crafted TLA
56
+ snippets from Sbuilder *code repository*, or snippets loaded using
57
+ [Snippet Loader Extension Point](#SNIPPET_LOADER), with code
58
+ created for *API interfaces*. *TLA -snippets* are also used to
59
+ specify correctness criteria for the system. Examples of *TLA
60
+ Snippets* are:
61
+
62
+ * **state**: TLA+ variables modeling *database*
66
63
 
67
- Sbuilder uses following categories to organize *specification
68
- snippets* in its **code repository**:
64
+ * **operator**: TLA+ language constructs, which enable "to define all
65
+ the data structures and operations that occur in the specification"
69
66
 
70
- * **state**: TLA+ variables modeling *database*
67
+ * **transaction**: pseudo code implementation of common behavior in
68
+ modifying system state
71
69
 
72
- * **operator**: TLA+ language constructs, which enable "to define all
73
- the data structures and operations that occur in the specification"
70
+ * **service**: pseudo code implementation of target system
71
+ *application services* using PlusCal procedures in TLA+ language
74
72
 
75
- * **transaction**: pseudo code implementation of common behavior in
76
- modifying system state
73
+ * **infrastructure**: pseudo code implementation of target system
74
+ *infrastructure services* using PlusCal procedures in TLA+ language
77
75
 
78
- * **service**: pseudo code implementation of target system
79
- *application services* using PlusCal procedures in TLA+ language
76
+ * **interface**: implementation of *application interface* extension
77
+ points using PlusCal macros in TLA+ language
80
78
 
81
- * **infrastructure**: pseudo code implementation of target system
82
- *infrastructure services* using PlusCal procedures in TLA+ language
79
+ * **correctness**: operator definitions, and INVARIANT directives in
80
+ TLA+ language specifying properties, which must be not violated in
81
+ specification executions
83
82
 
84
- * **interface**: implementation of *application interface* extension
85
- points using PlusCal macros in TLA+ language
83
+ * **possibility**: optional operator definitions to increase
84
+ confidence in correctness invariants
86
85
 
87
- * **correctness**: operator definitions, and INVARIANT directives in
88
- TLA+ language specifying properties, which must be not violated in
89
- specification executions
86
+ * **assumption**: operator definitions, in TLA+ language specifying
87
+ properties on specification model constants, which must be not
88
+ violated.
90
89
 
91
- * **possibility**: optional operator definitions to increase
92
- confidence in correctness invariants
90
+
91
+ 3. **Setups**: To complete the runnable formal model Sbuilder uses
92
+ setups. A setup is a sequence of interface operations, and their
93
+ input parameters. Setup also define domain cardinalities, or
94
+ domain values. The tools allows defining multiple setups, each
95
+ setup resulting to a complete, runnable TLA+ code, allowing
96
+ application model to be run in various environment context
93
97
 
94
- * **assumption**: operator definitions, in TLA+ language specifying
95
- properties on specification model constants, which must be not
96
- violated.
97
98
 
98
99
  Sbuilder can generate <a id="BLUEPRINT">**implementation
99
100
  blueprints**</a> as depicted in section
@@ -102,84 +103,48 @@ blueprints* are html-pages including code snippets from Sbuilder *code
102
103
  repository*, or code generated based on *interface specifications*.
103
104
 
104
105
 
105
- ## <a id="MODELING-PIPELINE">Modeling Pipeline</a>
106
-
107
- The picture below gives an overview, how Sbuilder -tool can be
108
- deployed in an "mainstream" software development process.
109
-
110
- The objective for creating a specification model is to get better
111
- understanding, to get the design right, and to write better code for
112
- the system being built - and thereby to justify the extra effort
113
- needed in modeling.
114
-
115
-
116
- ![process](pics/process.jpg)
117
-
118
- We assume that services are currently implemented based on informal
119
- service specification documents written in English. We also assume
120
- that service interface is available in a machine readable format.
106
+ ## Two Operating Modes
121
107
 
122
- In the picture, process enhancements are highlighted in a box labeled
123
- "Pseudo code modeling". The output of the process enhancement are
124
- implementation blueprints, which are made available for developers at
125
- the side of current service implementation documentation. An
126
- implementation blueprint for a service contains pseudo code snippets
127
- extracted from specification model, relevant for implementing a
128
- particular service.
108
+ Sbuilder supports two operating modes:
129
109
 
130
- Pseudo code modeling includes following tasks:
110
+ * Modeling Pipeline
111
+ * Embedded Mode
131
112
 
132
- - **accept API specification input**: Machine readable interface
133
- specification is translated to TLA+ language.
134
113
 
135
- - **create domain model**: Interface parameters are mapped to
136
- domains. In this task, we define domain resolvers in Sbuilder -tool,
137
- and add TLA+ operators, and assumptions to verify that the resulting
138
- domain model conforms to service specification. In practice,
139
- creating a formal domain model results in "Gaining better
140
- understanding" of the informal specification.
114
+ ### <a id="MODELING-PIPELINE">Modeling Pipeline</a>
141
115
 
142
- - **specify correctness**: In the spirit of Test Driven Development,
143
- specifying correctness precedes specifying behavior. In this task,
144
- we interpret test cases, (hopefully) presented in the informal
145
- service specification, as TLA+ language operators and invariants.
116
+ Sbuilder can be embedded into "mainstream" software development
117
+ process to support specification and design up-front, before actually
118
+ starting the implementation.
146
119
 
147
- - **model behavior**: Modeling behavior includes creating pseudo code
148
- service implementation in TLA+ language. In this task, when we have
149
- formal correctness criteria expressed in TLA+, running model checker
150
- points out traces leading to violations any of the criteria, and
151
- helps us in "Getting design right".
120
+ In *Modeling Pipeline* mode, Sbuilder is used to create formal
121
+ specification model of the application with the objectives 1) to get
122
+ better understanding, 2) to get the design right, 3) and to write
123
+ better code for the system being
124
+ built. [more details](MODELING-PIPELINE.md)
152
125
 
153
- - **create implementation blueprint**: In the final task, modeler
154
- defines web pages for implementation blueprints. A blueprint
155
- collects relevant TLA+ snippets in Sbuilder code repository,
156
- together with any other useful documentation, to help in
157
- implementing a specific service. Web pages are made available for
158
- service implementation to help developers to "Write better
159
- code". Competent developers may understand TLA+ language, but, like
160
- in software engineering generally, good comments in pseudo code
161
- snippets will make blueprints more approachable.
162
126
 
163
127
 
164
- The picture above defines following roles:
128
+ ### <a id="EMBEDDED-MODE">Embedded Mode</a>
165
129
 
166
- * **architect**: expert role specifying services, and defining
167
- interfaces
130
+ Adding a separate task to create a formal specification model calls
131
+ for commitment, which may be
132
+ [hard to achieve](https://jarjuk.wordpress.com/2016/06/08/sbuilder-roadmap/)
133
+ in contemporary software development practices. In order to hide the
134
+ complexities in creating a formal model, Sbuilder can be embedded into
135
+ a framework, and to use implementation code in creating formal model
136
+ of the application.
168
137
 
169
- * **modeler**: expert role crafting specification extensions, and
170
- using Sbuilder, and TLA+ tools to generate specification code, and
171
- to verify its correctness
138
+ An example of embedded sbuilder is
139
+ [sbuilder-ethereum](https://github.com/jarjuk/sbuilder-ethereum).
172
140
 
173
- * **developer**: expert role implementing IT system interface and
174
- service according to the service specification, interface definition,
175
- and Sbuilder blueprint.
176
141
 
177
142
 
178
143
  ## <a id="USAGE">Usage</a>
179
144
 
180
145
  ### Pre-requisites
181
146
 
182
- `Sbuilder` -tool requires Ruby 2.
147
+ `Sbuilder` -tool requires Ruby 2.1
183
148
 
184
149
  To run the specification model created by Sbuilder -tool, you must
185
150
  have Java and
@@ -272,7 +237,8 @@ and observing **Error: Evaluating invariant** `possible_tag_with_invalid_address
272
237
 
273
238
  ### Create Own Model
274
239
 
275
- See [cucumber test](http://jarjuk.github.io/tla-sbuilder/0.2.2/features.html) for more details.
240
+ See [on-line documentation](http://jarjuk.github.io/tla-sbuilder.html)
241
+ for more details.
276
242
 
277
243
  Create default directories used by `sbuilder` in current working directory
278
244
 
@@ -325,7 +291,7 @@ controlling, how environment invokes interface operations, and in
325
291
  effect, by throttling number of states generated during model
326
292
  checking.
327
293
 
328
- To avoid enumering to0 large sets Sbuilder allows
294
+ In order to avoid enumerating too large sets Sbuilder allows
329
295
 
330
296
  * fixing input parameter bindings in an interface operation. In cases,
331
297
  where domain sizes are not a problem, SBuilder allows TLA+ tool to
@@ -349,15 +315,21 @@ from the specification code.
349
315
 
350
316
  ## Extending Sbuilder
351
317
 
352
- Sbuilder defines an extension point to add API loader plugins. An API
318
+ ### <a id="API_LOADER">API Loader Extension Point</a>
319
+
320
+ Sbuilder defines an *API Loader Extension Point* to load API
321
+ interfaces, and data type definitions into Sbuilder context. An API
353
322
  loader is a Ruby class
354
323
 
355
- * using [Sbuilder::ApiLoader](lib/sbuilder/facade/api_loader.rb)
324
+ * extending [Sbuilder::ApiLoaderPlugin](lib/sbuilder/facade/api_loader_plugin.rb)
325
+
326
+ * using [Sbuilder::ApiLoader](lib/sbuilder/facade/api_loader_facade.rb)
356
327
  facade to integrate with Sbuilder
357
328
 
358
329
  * satisfying [`api_loader_facade` contract](lib/sbuilder/spec/api_loader_facade.rb)
359
330
 
360
- * used as demonstated in [cucumber tests](features/100-plugin-extension/010-api-loader-plugin.feature)
331
+ * interacting with Sbuilder as demonstrated in
332
+ [cucumber tests](features/100-plugin-extension/010-api-loader-plugin.feature)
361
333
 
362
334
  For a plugin implementation example, see an Swagger API loader in
363
335
  Sbuilder:
@@ -368,9 +340,9 @@ Sbuilder:
368
340
 
369
341
  For example, to activate Sbuilder API loader plugin
370
342
  `Sbuilder::Interfaces::Salesforce::SalesforceLoader` implemented in
371
- `tla-sbuilder-salesforce` Gem using configuration hash shown below,
372
- add the following YAML snippet to `sbuilder.yaml` configuration file
373
- sub-section `extend.loaders`:
343
+ `tla-sbuilder-salesforce` GEM using configuration hash shown below,
344
+ add the following YAML snippet into `sbuilder.yaml` configuration file
345
+ `extend.loaders` -section:
374
346
 
375
347
  extend:
376
348
  loaders:
@@ -396,6 +368,68 @@ In the example, `file` -property points to a plugin configuration
396
368
  file, and `cache` property gives name prefix for files, which the
397
369
  plugin may use to cache API content to speed up generation phase.
398
370
 
371
+ ### <a id="SNIPPET_LOADER">Snippet Loader Extension Point</a>
372
+
373
+ Sbuilder defines an *Snippet Loader Extension Point* to load TLA
374
+ snippets into Sbuilder context. An Snippet loader is a Ruby class
375
+
376
+ * extending [Sbuilder::SnippetLoaderPlugin](lib/sbuilder/facade/snippet_loader_plugin.rb)
377
+
378
+ * using [Sbuilder::SnippetLoaderFacade](lib/sbuilder/facade/snippet_loader_facade.rb)
379
+ facade to integrate with Sbuilder
380
+
381
+ * satisfying interface specification
382
+ [`snippet_loader_plugin: signature`](lib/sbuilder/spec/snippet_loader.rb)
383
+
384
+ * interacting with Sbuilder as demonstrated in
385
+ [cucumber tests](features/100-plugin-extension/200-snippet-loader-plugin.feature)
386
+
387
+ For a plugin implementation, see an SnippetLoaderSimple example
388
+
389
+ * [implementation](lib/sbuilder/snippet_loader_simple.rb)
390
+
391
+ * [rpsec test](spec/sbuilder/snippet_loader_simple_spec.rb)
392
+
393
+
394
+ For example, to activate `Sbuilder::Ethereum::Plugin` in
395
+ [sbuilder-ethereum](https://github.com/jarjuk/sbuilder-ethereum) GEM,
396
+ and to create a object instance with the name `solcLoader` use YAML
397
+ configuration in `sbuilder.yaml` section `extend.loaders`:
398
+
399
+ extend:
400
+ loaders:
401
+ - className: Sbuilder::Ethereum::Plugin
402
+ gem: sbuilder-ethereum
403
+ configuration:
404
+ solc_command: "/home/jj/work/sbuilder-ethereum/bin/solc"
405
+ objects:
406
+ - objectName: solcLoader
407
+ configuration:
408
+ preferences:
409
+ tla-trace: false
410
+
411
+ In this example, class method `Sbuilder::Ethereum::Plugin.configure`
412
+ accepts a setting `solc_command`, object method
413
+ `Sbuilder::Ethereum::Plugin#configure` accepts `preferences` hash with
414
+ a property `tla-trace`. See documentation for
415
+ [sbuilder-ethereum](https://github.com/jarjuk/sbuilder-ethereum) GEM
416
+ for more details on these settings.
417
+
418
+ Plugin `Sbuilder::Ethereum::Plugin` hooks to *API Loader Extension
419
+ Point* and to *Snippet Loader Extension Point*. Loading over these
420
+ extensions points is activated using the following `sbuilder.yaml`
421
+ configuration in `interfaces` and `snippets` -sections:
422
+
423
+ interfaces:
424
+ - objectName: solcLoader
425
+ url:
426
+ - solidity/demo1.sol
427
+ snippets:
428
+ - objectName: solcLoader
429
+ snippets:
430
+
431
+ Notice, how this YAML snippet uses object instance name `objectName:
432
+ solcLoader` defined in `extend.loaders` -section above.
399
433
 
400
434
  ## License
401
435
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.4
@@ -27,6 +27,18 @@ module Sbuilder
27
27
  # ------------------------------------------------------------------
28
28
  #{Sbuilder::CliText::SBUILDER_EXTENSION}
29
29
 
30
+ # ------------------------------------------------------------------
31
+ #{Sbuilder::CliText::SBUILDER_SNIPPETS}
32
+
33
+ snippets:
34
+
35
+ - className: Sbuilder::SnippetLoaderSimple
36
+ snippets:
37
+
38
+ # make /customer(post) to map to name 'dummy'
39
+ - metatype: service_implementation
40
+ appName: /customers(post)
41
+ name: dummy
30
42
 
31
43
  # ------------------------------------------------------------------
32
44
  #{Sbuilder::CliText::SBUILBER_INTERFACES}
@@ -96,12 +108,20 @@ module Sbuilder
96
108
  EOS
97
109
 
98
110
  EXTENSIONS_CUSTOMER_IF = <<-EOS.unindent
111
+
112
+ #{Sbuilder::CliText::EXTENSION_HEADER_PREFS}
113
+
99
114
  #{Sbuilder::CliText::EXTENSION_HEADER_IF}
100
115
  #
116
+ #
101
117
  # Exampl uses dummy process, which should be replaced with real implementation
102
- - interface-extension:
103
- - matcher: /customers(post)
104
- implementation: dummy
118
+ #
119
+ # DEPRECATED: use snippets property in sbuilder.yaml
120
+ #
121
+ # - interface-extension:
122
+ # - matcher: /customers(post)
123
+ # implementation: dummy
124
+ #
105
125
  EOS
106
126
 
107
127
 
@@ -24,6 +24,18 @@ module Sbuilder
24
24
  # sbuilder
25
25
 
26
26
  SBUILDER_YAML_PET= <<-EOS
27
+ # sbuilder.ymal - for pet example
28
+ #
29
+ # ------------------------------------------------------------------
30
+ #{Sbuilder::CliText::SBUILDER_EXTENSION}
31
+ extend:
32
+ loaders:
33
+
34
+ - className: Sbuilder::SnippetLoaderSimple
35
+ configuration:
36
+ src_dir: src/pet
37
+
38
+ # ------------------------------------------------------------------
27
39
  #{Sbuilder::CliText::SBUILBER_INTERFACES}
28
40
 
29
41
  interfaces:
@@ -40,6 +52,34 @@ module Sbuilder
40
52
  file: #{FILE_INFRASTRUCTURE_PETSTORE}
41
53
 
42
54
 
55
+ # ------------------------------------------------------------------
56
+ #{Sbuilder::CliText::SBUILDER_SNIPPETS}
57
+ snippets:
58
+
59
+ - className: Sbuilder::SnippetLoaderSimple
60
+ snippets:
61
+
62
+ - metatype: service_implementation
63
+ appName: /pets(post)
64
+ file: interface_post_pet.tla
65
+
66
+ - metatype: service_implementation
67
+ appName: /pets/{id}(delete)
68
+ file: interface_delete_pet.tla
69
+
70
+ - metatype: service_implementation
71
+ appName: /pets/{id}(get)
72
+ file: interface_get_pet.tla
73
+
74
+ - metatype: service_implementation
75
+ appName: /tags(post)
76
+ file: interface_post_tag.tla
77
+
78
+ - metatype: service_implementation
79
+ appName: /tags(put)
80
+ file: interface_put_tag.tla
81
+
82
+
43
83
  # ------------------------------------------------------------------
44
84
  #{Sbuilder::CliText::SBUILDER_RESOLVERS}
45
85
  resolvers:
@@ -300,6 +340,9 @@ module Sbuilder
300
340
  EOS
301
341
 
302
342
  EXTENSIONS_PETSTORE_COMMON = <<-EOS
343
+
344
+ #{Sbuilder::CliText::EXTENSION_HEADER_PREFS}
345
+
303
346
  #{Sbuilder::CliText::EXTENSION_HEADER_DOM}
304
347
 
305
348
  #
@@ -320,25 +363,28 @@ module Sbuilder
320
363
 
321
364
  #{Sbuilder::CliText::EXTENSION_HEADER_SETUP}
322
365
 
323
- - interface-extension:
324
- - matcher: /pets(post)
325
- implementation: post_pet
366
+ # - interface-extension:
367
+ # - matcher: /pets(post)
368
+ # implementation: post_pet
326
369
 
327
- - matcher: /pets/{id}(delete)
328
- implementation: delete_pet
370
+ # - matcher: /pets/{id}(delete)
371
+ # implementation: delete_pet
329
372
 
330
- - matcher: /pets/{id}(get)
331
- implementation: get_pet
373
+ # - matcher: /pets/{id}(get)
374
+ # implementation: get_pet
332
375
 
333
- - matcher: /tags(post)
334
- implementation: post_tag
376
+ # - matcher: /tags(post)
377
+ # implementation: post_tag
335
378
 
336
- - matcher: /tags(put)
337
- implementation: put_tag
379
+ # - matcher: /tags(put)
380
+ # implementation: put_tag
338
381
 
339
382
  EOS
340
383
 
341
384
  EXTENSIONS_PETSTORE_RUN1 = <<-EOS
385
+
386
+ #{Sbuilder::CliText::EXTENSION_HEADER_PREFS}
387
+
342
388
  #{Sbuilder::CliText::EXTENSION_HEADER_SETUP}
343
389
  #
344
390
 
@@ -370,6 +416,9 @@ module Sbuilder
370
416
 
371
417
 
372
418
  EXTENSIONS_PETSTORE_RUN2 = <<-EOS
419
+
420
+ #{Sbuilder::CliText::EXTENSION_HEADER_PREFS}
421
+
373
422
  #
374
423
  #
375
424
 
@@ -384,8 +433,10 @@ module Sbuilder
384
433
  - interface: /pets/{id}(get)
385
434
 
386
435
  EOS
387
-
388
436
  EXTENSIONS_PETSTORE_RUN_SVG = <<-EOS
437
+
438
+ #{Sbuilder::CliText::EXTENSION_HEADER_PREFS}
439
+
389
440
  #
390
441
  # Just enough behaviour to create a decent graph
391
442
  #
@@ -447,6 +498,9 @@ module Sbuilder
447
498
 
448
499
 
449
500
  EXTENSIONS_PETSTORE_RUN3 = <<-EOS
501
+
502
+ #{Sbuilder::CliText::EXTENSION_HEADER_PREFS}
503
+
450
504
  #
451
505
  #
452
506