sdl-ng 0.0.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 (71) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.rspec +2 -0
  4. data/.yard_redcarpet_ext +1 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +13 -0
  7. data/README.md +454 -0
  8. data/Rakefile +16 -0
  9. data/bin/process_service_descriptions +102 -0
  10. data/examples/services/google_drive_for_business.service.rb +50 -0
  11. data/examples/services/salesforce_sales_cloud.service.rb +51 -0
  12. data/examples/translations/en.yml +184 -0
  13. data/examples/vocabulary/base/base.sdl.rb +8 -0
  14. data/examples/vocabulary/base/location.sdl.rb +5 -0
  15. data/examples/vocabulary/crf/characteristics.sdl.rb +25 -0
  16. data/examples/vocabulary/crf/charging.sdl.rb +8 -0
  17. data/examples/vocabulary/crf/compliance.sdl.rb +35 -0
  18. data/examples/vocabulary/crf/delivery.sdl.rb +22 -0
  19. data/examples/vocabulary/crf/dynamics.sdl.rb +6 -0
  20. data/examples/vocabulary/crf/interop.sdl.rb +54 -0
  21. data/examples/vocabulary/crf/optimizing.sdl.rb +15 -0
  22. data/examples/vocabulary/crf/portability.sdl.rb +25 -0
  23. data/examples/vocabulary/crf/protection.sdl.rb +8 -0
  24. data/examples/vocabulary/crf/reliability.sdl.rb +1 -0
  25. data/examples/vocabulary/crf/reputation.sdl.rb +3 -0
  26. data/lib/sdl.rb +17 -0
  27. data/lib/sdl/base.rb +20 -0
  28. data/lib/sdl/base/fact.rb +11 -0
  29. data/lib/sdl/base/property.rb +34 -0
  30. data/lib/sdl/base/service.rb +13 -0
  31. data/lib/sdl/base/service_compendium.rb +130 -0
  32. data/lib/sdl/base/type.rb +66 -0
  33. data/lib/sdl/exporters.rb +9 -0
  34. data/lib/sdl/exporters/exporter.rb +19 -0
  35. data/lib/sdl/exporters/markdown_service_exporter.rb +5 -0
  36. data/lib/sdl/exporters/rdf_exporter.rb +34 -0
  37. data/lib/sdl/exporters/rdf_mapping.rb +48 -0
  38. data/lib/sdl/exporters/schema_exporter.rb +9 -0
  39. data/lib/sdl/exporters/service_exporter.rb +9 -0
  40. data/lib/sdl/exporters/xml_mapping.rb +51 -0
  41. data/lib/sdl/exporters/xml_service_exporter.rb +37 -0
  42. data/lib/sdl/exporters/xsd_schema_exporter.rb +94 -0
  43. data/lib/sdl/receivers.rb +22 -0
  44. data/lib/sdl/receivers/fact_receiver.rb +15 -0
  45. data/lib/sdl/receivers/service_receiver.rb +63 -0
  46. data/lib/sdl/receivers/type_instance_receiver.rb +86 -0
  47. data/lib/sdl/receivers/type_receiver.rb +87 -0
  48. data/lib/sdl/translations/en.yml +9 -0
  49. data/lib/sdl/types.rb +19 -0
  50. data/lib/sdl/types/sdl_datetime.rb +10 -0
  51. data/lib/sdl/types/sdl_default_type.rb +13 -0
  52. data/lib/sdl/types/sdl_description.rb +10 -0
  53. data/lib/sdl/types/sdl_duration.rb +12 -0
  54. data/lib/sdl/types/sdl_number.rb +10 -0
  55. data/lib/sdl/types/sdl_string.rb +10 -0
  56. data/lib/sdl/types/sdl_type.rb +31 -0
  57. data/lib/sdl/types/sdl_url.rb +12 -0
  58. data/lib/sdl/util.rb +4 -0
  59. data/lib/sdl/util/documentation.rb +80 -0
  60. data/lib/sdl/util/nokogiri.rb +28 -0
  61. data/lib/sdl/util/verbs.rb +3 -0
  62. data/lib/sdl/version.rb +3 -0
  63. data/sdl-ng.gemspec +34 -0
  64. data/spec/documentation_spec.rb +64 -0
  65. data/spec/fact_type_instance_definition_spec.rb +188 -0
  66. data/spec/property_definitions_spec.rb +44 -0
  67. data/spec/service_compendium_spec.rb +90 -0
  68. data/spec/service_definition_spec.rb +81 -0
  69. data/spec/shared_test_compendium.rb +65 -0
  70. data/spec/spec_helper.rb +10 -0
  71. metadata +291 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 30daf06cf0f1fde000a8c2a8f3842b9be010a136
4
+ data.tar.gz: 19521cbe60a733612c245fc8d0f2d70520cc5b02
5
+ SHA512:
6
+ metadata.gz: baa76502bc340d3a0efe1687dd4488ffb3f2e8f702548e2699b02593dff6935aceaac914bba0ace704b60b1c99bf79239c72e6d4c18699fa4aa45cc85e4bfb83
7
+ data.tar.gz: 98a5a901aad83cca33921e5c7e6287514768b23eaac23936ab113542c46f28497a50511a693cae8c1824d16881dbd8acfff164b8cf612c8df2263f54f32b7924
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .idea
7
+ examples/output
8
+ examples/translations/en.out.yml
9
+ Gemfile.lock
10
+ InstalledFiles
11
+ _yardoc
12
+ coverage
13
+ doc/
14
+ lib/bundler/man
15
+ pkg
16
+ rdoc
17
+ spec/reports
18
+ test/tmp
19
+ test/version_tmp
20
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format Fuubar
2
+ --color
@@ -0,0 +1 @@
1
+ tables
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sdl-ng.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,13 @@
1
+ Copyright (c) 2013 Mathias Slawik
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,454 @@
1
+ Service Description Language Framework
2
+ ======================================
3
+
4
+ This is a framework for the easy description of business aspects of internet services using self defined vocabularies.
5
+
6
+ Its main features are:
7
+
8
+ * Comprehensive textual domain-specific language
9
+ * DSL implemented as Ruby code, allowing flexible use cases (e.g. extracting data from websites)
10
+ * Export of services and vocabulary to XML/XSD and RDF
11
+ * Internationalization of vocabulary descriptions
12
+
13
+ Upcoming features include:
14
+
15
+ * Definition of service property comparison
16
+ * Input alignment (e.g. matching country to jurisdiction)
17
+ * Property type enforcement / type conversion
18
+ * Feature model based service variant management
19
+ * Modelling of dynamic pricing
20
+
21
+ The main design constraints for the framework are:
22
+
23
+ * A text editor should suffice to create service descriptions and vocabulary
24
+ * Compared to other general SDLs, e.g. USDL, Linked-USDL, and OWL-S syntactic and semantic noise should be reduced
25
+ * Concrete serialization technologies should be abstracted, such as XML/XSD, RDF/OWL and EMF/Ecore
26
+ * There is no common answer to "What is a service?". Therefore the structure of service descriptions should be provided by concrete use cases, and not the framework itself
27
+ * The functionality of the framework should be demonstrated on existing services
28
+ * Using a programming language as textual format should allow both static and dynamic information to be available in the same file
29
+
30
+ The SDL Framework is the basis of the TRESOR Broker, and will be supporting the "Open Service Compendium", an envisioned crowdsourced repository for service descriptions, their comparison and brokering.
31
+
32
+ General Overview
33
+ ================
34
+
35
+ The SDL Framework allows the definition of *vocabulary* and *service descriptions*. The *vocabulary* defines "What can generally be known about any service" (a so called meta-model). *Service descriptions* refer to defined *vocabulary* and define "What is known about a specific service".
36
+
37
+ For example, a *vocabulary* defines that "services can be accessed using a browser" and that "there are different browsers in existence", while the *service description* of a concrete service, e.g. Salesforce Sales Cloud, defines that it can be accessed using Internet Explorer 7+, recent versions of Firefox and Chrome and Safari 5+ on mac. (see `examples/service_definitions/salesforce_sales_cloud.service.rb` for more examples)
38
+
39
+ The vocabulary
40
+ --------------
41
+
42
+ A *vocabulary* defines *fact classes*, *SDL types*, *properties*, and *SDL type instances*.
43
+
44
+ Any fact class, property value and type instance can be *annotated* with arbitrary data to capture "fine-print" of descriptions.
45
+
46
+ ### Fact classes
47
+
48
+ A *fact class* is a class of possible statements about a service. Some examples are:
49
+
50
+ | Class name | Statement |
51
+ | ----------------------- | ---------------------------------------------- |
52
+ | BrowserInterface | It can be accessed using a browser |
53
+ | CloudServiceModel | It can be categorized by a cloud service model |
54
+ | CommunicationProtection | It is protected by a communication protection |
55
+ | EstablishingYear | It has a defined year of establishment |
56
+
57
+ ### SDL Types and type instances
58
+
59
+ An *SDL type* is used for structuring fact information.
60
+
61
+ Within a vocabulary, SDL types can be instantiated. These *SDL type instances* can be easily referred to from fact instances by their name. This allows different service descriptions to refer to the same instances.
62
+
63
+ The following table shows some examples of types, their purpose, and predefined instances:
64
+
65
+ | Type name | Used with | Description | Instances |
66
+ | ----------------------- | ----------------------- | -------------------------------------- | --------------------- |
67
+ | Browser | BrowserInterface | A web browser | Firefox, Chome, Opera |
68
+ | CloudServiceModel | CloudServiceModel | A cloud service model | SaaS, PaaS, IaaS |
69
+ | CommunicationProtection | CommunicationProtection | A way to protect service communication | VPN, HTTPS |
70
+
71
+ ### Fact and Type Properties
72
+
73
+ *Properties* give more information about facts and types. Every property has a name, type, and can be multi valued (a list).
74
+
75
+ Some example properties are:
76
+
77
+ | Defined on | Name | Type | Multi-valued | Definition |
78
+ | ------------------------------ | ------------------------ | ----------------------- | ------------ | ------------------------------------------- |
79
+ | BrowserInterface (Fact) | compatible_browsers | CompatibleBrowser | Yes | A list of compatible browsers |
80
+ | CompatibleBrowser (Type) | browser | Browser | No | A browser |
81
+ | Browser (Type) | url | URL | No | The URL of a Browser |
82
+ | CloudServiceModel (Fact) | cloud_service_model | CloudServiceModel | No | The cloud service model |
83
+ | CommunicationProtection (Fact) | communication_protection | CommunicationProtection | No | The communication protection of the service |
84
+ | EstablishingYear (Fact) | year | Integer | No | The year a service was established |
85
+
86
+ Types can be either types wrapping Ruby classes, e.g. dates, durations, strings, numbers and URLs, and also other SDL types.
87
+
88
+ Service Descriptions
89
+ --------------------
90
+
91
+ A *service description* uses *fact classes*, *types*, and *type instances* to describe services.
92
+
93
+ Vocabulary Syntax
94
+ =================
95
+
96
+ This chapter defines the syntax of vocabularies.
97
+
98
+ Fact class and type definition
99
+ ------------------------------
100
+
101
+ The fact class and type definition are very similar.
102
+
103
+ This is how fact classes are defined:
104
+
105
+ `fact` *\<symbolic name>* `do`
106
+
107
+ > *\<Fact properties and subfacts>*
108
+
109
+ `end`
110
+
111
+ And this is how types are defined:
112
+
113
+ `type` *\<symbolic name>* `do`
114
+
115
+ > *\<Type properties and subtypes>*
116
+
117
+ `end`
118
+
119
+ Every fact class and type definition is identified by its *symbolic name*, for which the SDL framework creates a Ruby class:
120
+
121
+ | Symbolic name | Ruby class constant name |
122
+ | --------------------- | --------------------------- |
123
+ | `:name` | `Name` |
124
+ | `:payment_option` | `PaymentOption` |
125
+ | `:compatible_browser` | `CompatibleBrowser` |
126
+ | `:browser` | `Browser` |
127
+
128
+ The definition block includes *properties* and *subclasses* of fact classes and types respectively.
129
+
130
+ Property definition
131
+ -------------------
132
+
133
+ Fact and type properties are defined according to the following pattern:
134
+
135
+ *\<type>* *\<name>*
136
+
137
+ *\<type>* can refer either to a *wrapped type* or another SDL *type*.
138
+
139
+ *Wrapped types* wrap Ruby classes. The following are available (see `lib/sdl/types`):
140
+
141
+ | Wrapped Ruby Type | Referenced as |
142
+ | ----------------------- | -------------------------- |
143
+ | String | `string`, `str` |
144
+ | Integer | `number`, `integer`, `ìnt` |
145
+ | Time | `datetime` |
146
+ | ActiveSupport::Duration | `duration` |
147
+ | URI | `uri`, `url` |
148
+
149
+ *SDL types* are referred by their name, e.g. `payment_option` references `PaymentOption`.
150
+
151
+ Properties can be multi valued, denoted by a `list_of_` prefix, e.g. `list_of_strings` or `list_of_browsers`.
152
+
153
+ *\<name>* can be omitted, if it is the same as the name of the type. The following type definitions are equal
154
+
155
+ url
156
+
157
+ equals
158
+
159
+ url :url
160
+
161
+ Type instances definition
162
+ -------------------------
163
+
164
+ Predefined type instances are created using the following pattern:
165
+
166
+ *\<type reference>* *\<symbolic name>* `do`
167
+
168
+ > *\<property definition>*
169
+
170
+ `end`
171
+
172
+ If a browser type is defined as such:
173
+
174
+ type :browser do
175
+ url
176
+ end
177
+
178
+ Instantiating browsers can be done like this:
179
+
180
+ browser :firefox do
181
+ url 'http://www.mozilla.org/firefox/'
182
+ end
183
+
184
+ browser :chrome do
185
+ url 'https://www.google.com/chrome'
186
+ end
187
+
188
+ browser :internet_explorer do
189
+ url 'http://windows.microsoft.com/en-US/internet-explorer/download-ie'
190
+ end
191
+
192
+ Subtype and subfact definition
193
+ ------------------------------
194
+
195
+ As types and facts are Ruby classes, they can be inherited.
196
+
197
+ This is how subclasses of fact classes are defined:
198
+
199
+ `fact` *\<symbolic name>* `do`
200
+
201
+ > `subfact` *\<symbolic name>* `do`
202
+
203
+ > > *\<Subfact properties and further subfacts>*
204
+
205
+ > `end`
206
+
207
+ `end`
208
+
209
+ It is very similar to subclasses of type classes:
210
+
211
+ `type` *\<symbolic name>* `do`
212
+
213
+ > `subtype` *\<symbolic name>* `do`
214
+
215
+ > > *\<Subtype properties and further subtypes>*
216
+
217
+ > `end`
218
+
219
+ `end`
220
+
221
+ Service definition syntax
222
+ =========================
223
+
224
+ The service definition contains any number of lines following the pattern:
225
+
226
+ *\<fact class reference>* *\<property setting instructions>*
227
+
228
+ There are different ways how to reference facts and set property values, shown in the following subsections.
229
+
230
+ Fact class reference
231
+ --------------------
232
+
233
+ Fact classes can be referred by three different mechanisms: either *`has_`\<fact name>*, or *\<fact name>*, or *`is_`\<past perfective of fact name as verb>*. This allows choosing a term which has the highest readability for a certain fact class.
234
+
235
+ The following table contains some examples:
236
+
237
+ | Fact class | *`has_`\<fact name>* | *\<fact name>* | *`is_`\<past perfective of fact name as verb>* |
238
+ | ---------- | -------------------- | -------------- | ---------------------------------------------- |
239
+ | `Name` | `has_name` | `name` | `is_named` |
240
+ | `Bill` | `has_bill` | `bill` | `is_billed` |
241
+ | `Feature` | `has_feature` | `feature` | `is_featured` |
242
+
243
+ Property setting instructions
244
+ -----------------------------
245
+
246
+ Setting the values of fact and type properties can be done in two ways:
247
+
248
+ ### Short form
249
+
250
+ If a fact or type has only some properties, setting properties can be done by specifying their values in the order they appear in the vocabulary:
251
+
252
+ *\<fact or type reference>* *\<first value>*, *\<second value>*, *\<n-th value>*
253
+
254
+ The following example (taken from `examples/service_definitions/google_drive_for_business.service.rb`) illustrates this mechanism:
255
+
256
+ name 'Google Drive for Business'
257
+
258
+ has_add_on_repository 'https://www.google.com/enterprise/marketplace/home', 1000
259
+
260
+ If properties should be set in a different order, the property names can be specified as:
261
+
262
+ *\<fact or type reference>* *\<name>* `:` *\<value>*, *\<name>* `:` *\<value>*, ...
263
+
264
+ An example would be:
265
+
266
+ has_documentation url: 'http://www.salesforce.com/sales-cloud/overview/'
267
+
268
+ The default Ruby syntax applies for creating lists: `[` *\<item 1>* `, ` *\<item 2>* `, ` *\<item n>* `]`
269
+
270
+ It should be obvious that the order of values has to change if the order of properties changes.
271
+
272
+ ### Block form
273
+
274
+ If a fact or type has many properties, setting those can be done as a block:
275
+
276
+ *\<fact or type reference>* `do`
277
+
278
+ > *\<name>* *\<value>*
279
+
280
+ `end`
281
+
282
+ The following example (see `examples/service_definitions/salesforce_sales_cloud.service.rb`) illustrates this mechanism:
283
+
284
+ has_add_on_repository do
285
+ url 'https://appexchange.salesforce.com/'
286
+ number_of_add_ons 2000
287
+ end
288
+
289
+ Multi-valued properties are created by specifying the name more than once, for example:
290
+
291
+ has_browser_interface do
292
+ compatible_browser ...
293
+ compatible_browser ...
294
+ compatible_browser ...
295
+ compatible_browser ...
296
+ end
297
+
298
+ ### Combining both methods
299
+
300
+ Both methods can be combined:
301
+
302
+ *\<fact or type reference>* *\<property setting instructions>* `do`
303
+
304
+ > *\<name>* *\<value>*
305
+
306
+ `end`
307
+
308
+ So the example of the previous subsection can be rewritten as:
309
+
310
+ has_add_on_repository 'https://appexchange.salesforce.com/' do
311
+ number_of_add_ons 2000
312
+ end
313
+
314
+ Referencing type instances
315
+ --------------------------
316
+
317
+ Type instances can be referred to by using *name*, as for example:
318
+
319
+ has_cloud_service_model saas
320
+
321
+ Due to the inner workings of the framework, if there are different instances with the same *name*, then the name has to be prepended by a colon (`:`), for example:
322
+
323
+ has_cloud_service_model :saas
324
+
325
+ Annotating data
326
+ ---------------
327
+
328
+ Annotations can be used to capture the "fine-print" of service descriptions.
329
+
330
+ By adding `annotation: ` *annotation* any property value definition and fact instance can be annotated, for example:
331
+
332
+ has_cloud_service_model :saas, annotation: "Unless you are Deutsche Bank"
333
+
334
+ has_add_on_repository 'https://appexchange.salesforce.com/' do
335
+ number_of_add_ons 2000, annotation: "... and rising every minute"
336
+ end
337
+
338
+ Using Ruby code for crazy stuff
339
+ -------------------------------
340
+
341
+ As all service descriptions and vocabulary are Ruby code, any functionality can be integrated into the descriptions.
342
+
343
+ The following code example uses the helper function `fetch_from_url` which uses Nokogiri to fetch a url and filter it according to a CSS selector to retrieve feature descriptions:
344
+
345
+ features = fetch_from_url 'http://www.salesforce.com/sales-cloud/overview/', '.slide h3 + p'
346
+
347
+ has_feature 'Mobile', features[0]
348
+ has_feature 'Contact Management', features[1]
349
+ has_feature 'Opportunity Management', features[2]
350
+ has_feature 'Chatter', features[3]
351
+ has_feature 'Email Integration', features[4]
352
+
353
+ Interfacing with the framework
354
+ ==============================
355
+
356
+ As the framework is to be used within other applications, there is no mening to "running" it.
357
+
358
+ Nevertheless, there is a GEM binary, `process_service_descriptions` provided, which does the following:
359
+
360
+ * Load translations from the `translations` directory
361
+ * Load all vocabulary definitions from the `vocabulary` directory
362
+ * Use this vocabulary to process all service descriptions from a `services` directory
363
+ * Output XML/XSD, RDF and Markdown to the `output` directory
364
+
365
+ This binary can be used within the `examples` subdirectory of this GEM.
366
+
367
+ Examples
368
+ ========
369
+
370
+ To run all examples, execute the GEM binary `process_service_descriptions` within the `examples` subdirectory of this GEM.
371
+
372
+ Google Drive for Business
373
+ -------------------------
374
+
375
+ Included from `examples/service_definitions/google_drive_for_business.service.rb`
376
+
377
+ {include:file:examples/service_definitions/google_drive_for_business.service.rb}
378
+
379
+ Salesforce Sales cloud
380
+ ----------------------
381
+
382
+ Included from `examples/service_definitions/salesforce_sales_cloud.service.rb`
383
+
384
+ {include:file:examples/service_definitions/salesforce_sales_cloud.service.rb}
385
+
386
+ The most basic example
387
+ ----------------------
388
+
389
+ This vocabulary specifies that services can have an availability, expressed as an integer:
390
+
391
+ fact :availability do
392
+ integer :availability
393
+ end
394
+
395
+ This defines a Fact class `Availability`, with an integer property `availability` which can be instantiated within service descriptions as:
396
+
397
+ has_availability 100
398
+
399
+ or just
400
+
401
+ availability 100
402
+
403
+ If `service` would be a service description object, this would output `100`
404
+
405
+ puts service.availability
406
+
407
+ The definition of color
408
+ -----------------------
409
+
410
+ The following type class definition is used to specify that the type `:color` is defined by a hexadecimal value, stored in a string.
411
+
412
+ type :color do
413
+ string :hex_value
414
+ end
415
+
416
+ It is now possible to define instances of this type and assign them symbolic names, such as `red`, `green` or `blue`:
417
+
418
+ color :red do
419
+ hex_value '#F00'
420
+ end
421
+
422
+ color :green do
423
+ hex_value '#0F0'
424
+ end
425
+
426
+ color :blue do
427
+ hex_value '#00F'
428
+ end
429
+
430
+ After definition of types, a service fact class can be defined, referring to this type.
431
+
432
+ fact :color do
433
+ color :color
434
+ end
435
+
436
+ Now, differently colored services can be described, e.g.:
437
+
438
+ red_service.service.rb:
439
+ has_color :blue
440
+
441
+ green_service.service.rb:
442
+ has_color :green
443
+
444
+ blue_service.service.rb:
445
+ has_color :blue
446
+
447
+ Contributing
448
+ ============
449
+
450
+ 1. Fork it
451
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
452
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
453
+ 4. Push to the branch (`git push origin my-new-feature`)
454
+ 5. Create new Pull Request