sdl-ng 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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