simple-service 0.1.3 → 0.2.0

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -2
  3. data/.rubocop.yml +10 -2
  4. data/Gemfile +3 -1
  5. data/Makefile +7 -11
  6. data/README.md +67 -2
  7. data/TODO.txt +3 -0
  8. data/VERSION +1 -1
  9. data/doc/Simple/Service/Action/Comment/Extractor.html +347 -0
  10. data/doc/Simple/Service/Action/Comment.html +451 -0
  11. data/doc/Simple/Service/Action/MethodReflection.html +285 -0
  12. data/doc/Simple/Service/Action/Parameter.html +816 -0
  13. data/doc/Simple/Service/Action.html +923 -0
  14. data/doc/Simple/Service/ArgumentError.html +128 -0
  15. data/doc/Simple/Service/ClassMethods.html +187 -0
  16. data/doc/Simple/Service/Context.html +379 -0
  17. data/doc/Simple/Service/ContextMissingError.html +124 -0
  18. data/doc/Simple/Service/ContextReadOnlyError.html +206 -0
  19. data/doc/Simple/Service/ExtraArguments.html +428 -0
  20. data/doc/Simple/Service/GemHelper.html +190 -0
  21. data/doc/Simple/Service/MissingArguments.html +426 -0
  22. data/doc/Simple/Service/NoSuchAction.html +433 -0
  23. data/doc/Simple/Service.html +865 -0
  24. data/doc/Simple.html +117 -0
  25. data/doc/_index.html +274 -0
  26. data/doc/class_list.html +51 -0
  27. data/doc/css/common.css +1 -0
  28. data/doc/css/full_list.css +58 -0
  29. data/doc/css/style.css +496 -0
  30. data/doc/file.README.html +146 -0
  31. data/doc/file.TODO.html +70 -0
  32. data/doc/file_list.html +61 -0
  33. data/doc/frames.html +17 -0
  34. data/doc/index.html +146 -0
  35. data/doc/js/app.js +303 -0
  36. data/doc/js/full_list.js +216 -0
  37. data/doc/js/jquery.js +4 -0
  38. data/doc/method_list.html +483 -0
  39. data/doc/top-level-namespace.html +110 -0
  40. data/lib/simple/service/action/comment.rb +2 -2
  41. data/lib/simple/service/action/method_reflection.rb +1 -1
  42. data/lib/simple/service/action/parameter.rb +1 -1
  43. data/lib/simple/service/action.rb +34 -46
  44. data/lib/simple/service/errors.rb +4 -3
  45. data/lib/simple/service/version.rb +2 -2
  46. data/lib/simple/service.rb +109 -34
  47. data/lib/simple/workflow/context.rb +105 -0
  48. data/lib/simple/workflow/current_context.rb +33 -0
  49. data/lib/simple/workflow/reloader.rb +84 -0
  50. data/lib/simple/workflow/rspec_helper.rb +15 -0
  51. data/lib/simple/workflow.rb +96 -0
  52. data/lib/simple-workflow.rb +3 -0
  53. data/scripts/test +2 -0
  54. data/simple-service.gemspec +1 -0
  55. data/spec/simple/service/action_invoke3_spec.rb +258 -0
  56. data/spec/simple/service/action_invoke_spec.rb +49 -87
  57. data/spec/simple/service/service_spec.rb +40 -32
  58. data/spec/simple/workflow/context_spec.rb +90 -0
  59. data/spec/simple/workflow/current_context_spec.rb +41 -0
  60. data/spec/simple/workflow/reloader_spec/example1.rb +10 -0
  61. data/spec/simple/workflow/reloader_spec/example2.rb +7 -0
  62. data/spec/simple/workflow/reloader_spec.rb +48 -0
  63. data/spec/spec_helper.rb +2 -1
  64. data/spec/support/spec_services.rb +8 -2
  65. metadata +74 -9
  66. data/lib/simple/service/action/indie_hash.rb +0 -37
  67. data/lib/simple/service/context.rb +0 -94
  68. data/spec/simple/service/action_invoke2_spec.rb +0 -166
  69. data/spec/simple/service/context_spec.rb +0 -69
data/doc/css/style.css ADDED
@@ -0,0 +1,496 @@
1
+ html {
2
+ width: 100%;
3
+ height: 100%;
4
+ }
5
+ body {
6
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
7
+ font-size: 13px;
8
+ width: 100%;
9
+ margin: 0;
10
+ padding: 0;
11
+ display: flex;
12
+ display: -webkit-flex;
13
+ display: -ms-flexbox;
14
+ }
15
+
16
+ #nav {
17
+ position: relative;
18
+ width: 100%;
19
+ height: 100%;
20
+ border: 0;
21
+ border-right: 1px dotted #eee;
22
+ overflow: auto;
23
+ }
24
+ .nav_wrap {
25
+ margin: 0;
26
+ padding: 0;
27
+ width: 20%;
28
+ height: 100%;
29
+ position: relative;
30
+ display: flex;
31
+ display: -webkit-flex;
32
+ display: -ms-flexbox;
33
+ flex-shrink: 0;
34
+ -webkit-flex-shrink: 0;
35
+ -ms-flex: 1 0;
36
+ }
37
+ #resizer {
38
+ position: absolute;
39
+ right: -5px;
40
+ top: 0;
41
+ width: 10px;
42
+ height: 100%;
43
+ cursor: col-resize;
44
+ z-index: 9999;
45
+ }
46
+ #main {
47
+ flex: 5 1;
48
+ -webkit-flex: 5 1;
49
+ -ms-flex: 5 1;
50
+ outline: none;
51
+ position: relative;
52
+ background: #fff;
53
+ padding: 1.2em;
54
+ padding-top: 0.2em;
55
+ }
56
+
57
+ @media (max-width: 920px) {
58
+ .nav_wrap { width: 100%; top: 0; right: 0; overflow: visible; position: absolute; }
59
+ #resizer { display: none; }
60
+ #nav {
61
+ z-index: 9999;
62
+ background: #fff;
63
+ display: none;
64
+ position: absolute;
65
+ top: 40px;
66
+ right: 12px;
67
+ width: 500px;
68
+ max-width: 80%;
69
+ height: 80%;
70
+ overflow-y: scroll;
71
+ border: 1px solid #999;
72
+ border-collapse: collapse;
73
+ box-shadow: -7px 5px 25px #aaa;
74
+ border-radius: 2px;
75
+ }
76
+ }
77
+
78
+ @media (min-width: 920px) {
79
+ body { height: 100%; overflow: hidden; }
80
+ #main { height: 100%; overflow: auto; }
81
+ #search { display: none; }
82
+ }
83
+
84
+ #main img { max-width: 100%; }
85
+ h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; }
86
+ h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; }
87
+ h1.title { margin-bottom: 10px; }
88
+ h1.alphaindex { margin-top: 0; font-size: 22px; }
89
+ h2 {
90
+ padding: 0;
91
+ padding-bottom: 3px;
92
+ border-bottom: 1px #aaa solid;
93
+ font-size: 1.4em;
94
+ margin: 1.8em 0 0.5em;
95
+ position: relative;
96
+ }
97
+ h2 small { font-weight: normal; font-size: 0.7em; display: inline; position: absolute; right: 0; }
98
+ h2 small a {
99
+ display: block;
100
+ height: 20px;
101
+ border: 1px solid #aaa;
102
+ border-bottom: 0;
103
+ border-top-left-radius: 5px;
104
+ background: #f8f8f8;
105
+ position: relative;
106
+ padding: 2px 7px;
107
+ }
108
+ .clear { clear: both; }
109
+ .inline { display: inline; }
110
+ .inline p:first-child { display: inline; }
111
+ .docstring, .tags, #filecontents { font-size: 15px; line-height: 1.5145em; }
112
+ .docstring p > code, .docstring p > tt, .tags p > code, .tags p > tt {
113
+ color: #c7254e; background: #f9f2f4; padding: 2px 4px; font-size: 1em;
114
+ border-radius: 4px;
115
+ }
116
+ .docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; }
117
+ .docstring h1 { font-size: 1.2em; }
118
+ .docstring h2 { font-size: 1.1em; }
119
+ .docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; }
120
+ .summary_desc .object_link a, .docstring .object_link a {
121
+ font-family: monospace; font-size: 1.05em;
122
+ color: #05a; background: #EDF4FA; padding: 2px 4px; font-size: 1em;
123
+ border-radius: 4px;
124
+ }
125
+ .rdoc-term { padding-right: 25px; font-weight: bold; }
126
+ .rdoc-list p { margin: 0; padding: 0; margin-bottom: 4px; }
127
+ .summary_desc pre.code .object_link a, .docstring pre.code .object_link a {
128
+ padding: 0px; background: inherit; color: inherit; border-radius: inherit;
129
+ }
130
+
131
+ /* style for <table> */
132
+ #filecontents table, .docstring table { border-collapse: collapse; }
133
+ #filecontents table th, #filecontents table td,
134
+ .docstring table th, .docstring table td { border: 1px solid #ccc; padding: 8px; padding-right: 17px; }
135
+ #filecontents table tr:nth-child(odd),
136
+ .docstring table tr:nth-child(odd) { background: #eee; }
137
+ #filecontents table tr:nth-child(even),
138
+ .docstring table tr:nth-child(even) { background: #fff; }
139
+ #filecontents table th, .docstring table th { background: #fff; }
140
+
141
+ /* style for <ul> */
142
+ #filecontents li > p, .docstring li > p { margin: 0px; }
143
+ #filecontents ul, .docstring ul { padding-left: 20px; }
144
+ /* style for <dl> */
145
+ #filecontents dl, .docstring dl { border: 1px solid #ccc; }
146
+ #filecontents dt, .docstring dt { background: #ddd; font-weight: bold; padding: 3px 5px; }
147
+ #filecontents dd, .docstring dd { padding: 5px 0px; margin-left: 18px; }
148
+ #filecontents dd > p, .docstring dd > p { margin: 0px; }
149
+
150
+ .note {
151
+ color: #222;
152
+ margin: 20px 0;
153
+ padding: 10px;
154
+ border: 1px solid #eee;
155
+ border-radius: 3px;
156
+ display: block;
157
+ }
158
+ .docstring .note {
159
+ border-left-color: #ccc;
160
+ border-left-width: 5px;
161
+ }
162
+ .note.todo { background: #ffffc5; border-color: #ececaa; }
163
+ .note.returns_void { background: #efefef; }
164
+ .note.deprecated { background: #ffe5e5; border-color: #e9dada; }
165
+ .note.title.deprecated { background: #ffe5e5; border-color: #e9dada; }
166
+ .note.private { background: #ffffc5; border-color: #ececaa; }
167
+ .note.title { padding: 3px 6px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; display: inline; }
168
+ .summary_signature + .note.title { margin-left: 7px; }
169
+ h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; }
170
+ .note.title { background: #efefef; }
171
+ .note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; }
172
+ .note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; }
173
+ .note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; }
174
+ .note.title.private { background: #d5d5d5; border-color: #c5c5c5; }
175
+ .note.title.not_defined_here { background: transparent; border: none; font-style: italic; }
176
+ .discussion .note { margin-top: 6px; }
177
+ .discussion .note:first-child { margin-top: 0; }
178
+
179
+ h3.inherited {
180
+ font-style: italic;
181
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
182
+ font-weight: normal;
183
+ padding: 0;
184
+ margin: 0;
185
+ margin-top: 12px;
186
+ margin-bottom: 3px;
187
+ font-size: 13px;
188
+ }
189
+ p.inherited {
190
+ padding: 0;
191
+ margin: 0;
192
+ margin-left: 25px;
193
+ }
194
+
195
+ .box_info dl {
196
+ margin: 0;
197
+ border: 0;
198
+ width: 100%;
199
+ font-size: 1em;
200
+ display: flex;
201
+ display: -webkit-flex;
202
+ display: -ms-flexbox;
203
+ }
204
+ .box_info dl dt {
205
+ flex-shrink: 0;
206
+ -webkit-flex-shrink: 1;
207
+ -ms-flex-shrink: 1;
208
+ width: 100px;
209
+ text-align: right;
210
+ font-weight: bold;
211
+ border: 1px solid #aaa;
212
+ border-width: 1px 0px 0px 1px;
213
+ padding: 6px 0;
214
+ padding-right: 10px;
215
+ }
216
+ .box_info dl dd {
217
+ flex-grow: 1;
218
+ -webkit-flex-grow: 1;
219
+ -ms-flex: 1;
220
+ max-width: 420px;
221
+ padding: 6px 0;
222
+ padding-right: 20px;
223
+ border: 1px solid #aaa;
224
+ border-width: 1px 1px 0 0;
225
+ overflow: hidden;
226
+ position: relative;
227
+ }
228
+ .box_info dl:last-child > * {
229
+ border-bottom: 1px solid #aaa;
230
+ }
231
+ .box_info dl:nth-child(odd) > * { background: #eee; }
232
+ .box_info dl:nth-child(even) > * { background: #fff; }
233
+ .box_info dl > * { margin: 0; }
234
+
235
+ ul.toplevel { list-style: none; padding-left: 0; font-size: 1.1em; }
236
+ .index_inline_list { padding-left: 0; font-size: 1.1em; }
237
+
238
+ .index_inline_list li {
239
+ list-style: none;
240
+ display: inline-block;
241
+ padding: 0 12px;
242
+ line-height: 30px;
243
+ margin-bottom: 5px;
244
+ }
245
+
246
+ dl.constants { margin-left: 10px; }
247
+ dl.constants dt { font-weight: bold; font-size: 1.1em; margin-bottom: 5px; }
248
+ dl.constants.compact dt { display: inline-block; font-weight: normal }
249
+ dl.constants dd { width: 75%; white-space: pre; font-family: monospace; margin-bottom: 18px; }
250
+ dl.constants .docstring .note:first-child { margin-top: 5px; }
251
+
252
+ .summary_desc {
253
+ margin-left: 32px;
254
+ display: block;
255
+ font-family: sans-serif;
256
+ font-size: 1.1em;
257
+ margin-top: 8px;
258
+ line-height: 1.5145em;
259
+ margin-bottom: 0.8em;
260
+ }
261
+ .summary_desc tt { font-size: 0.9em; }
262
+ dl.constants .note { padding: 2px 6px; padding-right: 12px; margin-top: 6px; }
263
+ dl.constants .docstring { margin-left: 32px; font-size: 0.9em; font-weight: normal; }
264
+ dl.constants .tags { padding-left: 32px; font-size: 0.9em; line-height: 0.8em; }
265
+ dl.constants .discussion *:first-child { margin-top: 0; }
266
+ dl.constants .discussion *:last-child { margin-bottom: 0; }
267
+
268
+ .method_details { border-top: 1px dotted #ccc; margin-top: 25px; padding-top: 0; }
269
+ .method_details.first { border: 0; margin-top: 5px; }
270
+ .method_details.first h3.signature { margin-top: 1em; }
271
+ p.signature, h3.signature {
272
+ font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace;
273
+ padding: 6px 10px; margin-top: 1em;
274
+ background: #E8F4FF; border: 1px solid #d8d8e5; border-radius: 5px;
275
+ }
276
+ p.signature tt,
277
+ h3.signature tt { font-family: Monaco, Consolas, Courier, monospace; }
278
+ p.signature .overload,
279
+ h3.signature .overload { display: block; }
280
+ p.signature .extras,
281
+ h3.signature .extras { font-weight: normal; font-family: sans-serif; color: #444; font-size: 1em; }
282
+ p.signature .not_defined_here,
283
+ h3.signature .not_defined_here,
284
+ p.signature .aliases,
285
+ h3.signature .aliases { display: block; font-weight: normal; font-size: 0.9em; font-family: sans-serif; margin-top: 0px; color: #555; }
286
+ p.signature .aliases .names,
287
+ h3.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace; font-weight: bold; color: #000; font-size: 1.2em; }
288
+
289
+ .tags .tag_title { font-size: 1.05em; margin-bottom: 0; font-weight: bold; }
290
+ .tags .tag_title tt { color: initial; padding: initial; background: initial; }
291
+ .tags ul { margin-top: 5px; padding-left: 30px; list-style: square; }
292
+ .tags ul li { margin-bottom: 3px; }
293
+ .tags ul .name { font-family: monospace; font-weight: bold; }
294
+ .tags ul .note { padding: 3px 6px; }
295
+ .tags { margin-bottom: 12px; }
296
+
297
+ .tags .examples .tag_title { margin-bottom: 10px; font-weight: bold; }
298
+ .tags .examples .inline p { padding: 0; margin: 0; font-weight: bold; font-size: 1em; }
299
+ .tags .examples .inline p:before { content: "▸"; font-size: 1em; margin-right: 5px; }
300
+
301
+ .tags .overload .overload_item { list-style: none; margin-bottom: 25px; }
302
+ .tags .overload .overload_item .signature {
303
+ padding: 2px 8px;
304
+ background: #F1F8FF; border: 1px solid #d8d8e5; border-radius: 3px;
305
+ }
306
+ .tags .overload .signature { margin-left: -15px; font-family: monospace; display: block; font-size: 1.1em; }
307
+ .tags .overload .docstring { margin-top: 15px; }
308
+
309
+ .defines { display: none; }
310
+
311
+ #method_missing_details .notice.this { position: relative; top: -8px; color: #888; padding: 0; margin: 0; }
312
+
313
+ .showSource { font-size: 0.9em; }
314
+ .showSource a, .showSource a:visited { text-decoration: none; color: #666; }
315
+
316
+ #content a, #content a:visited { text-decoration: none; color: #05a; }
317
+ #content a:hover { background: #ffffa5; }
318
+
319
+ ul.summary {
320
+ list-style: none;
321
+ font-family: monospace;
322
+ font-size: 1em;
323
+ line-height: 1.5em;
324
+ padding-left: 0px;
325
+ }
326
+ ul.summary a, ul.summary a:visited {
327
+ text-decoration: none; font-size: 1.1em;
328
+ }
329
+ ul.summary li { margin-bottom: 5px; }
330
+ .summary_signature { padding: 4px 8px; background: #f8f8f8; border: 1px solid #f0f0f0; border-radius: 5px; }
331
+ .summary_signature:hover { background: #CFEBFF; border-color: #A4CCDA; cursor: pointer; }
332
+ .summary_signature.deprecated { background: #ffe5e5; border-color: #e9dada; }
333
+ ul.summary.compact li { display: inline-block; margin: 0px 5px 0px 0px; line-height: 2.6em;}
334
+ ul.summary.compact .summary_signature { padding: 5px 7px; padding-right: 4px; }
335
+ #content .summary_signature:hover a,
336
+ #content .summary_signature:hover a:visited {
337
+ background: transparent;
338
+ color: #049;
339
+ }
340
+
341
+ p.inherited a { font-family: monospace; font-size: 0.9em; }
342
+ p.inherited { word-spacing: 5px; font-size: 1.2em; }
343
+
344
+ p.children { font-size: 1.2em; }
345
+ p.children a { font-size: 0.9em; }
346
+ p.children strong { font-size: 0.8em; }
347
+ p.children strong.modules { padding-left: 5px; }
348
+
349
+ ul.fullTree { display: none; padding-left: 0; list-style: none; margin-left: 0; margin-bottom: 10px; }
350
+ ul.fullTree ul { margin-left: 0; padding-left: 0; list-style: none; }
351
+ ul.fullTree li { text-align: center; padding-top: 18px; padding-bottom: 12px; background: url(data:image/gif;base64,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) no-repeat top center; }
352
+ ul.fullTree li:first-child { padding-top: 0; background: transparent; }
353
+ ul.fullTree li:last-child { padding-bottom: 0; }
354
+ .showAll ul.fullTree { display: block; }
355
+ .showAll .inheritName { display: none; }
356
+
357
+ #search { position: absolute; right: 12px; top: 0px; z-index: 9000; }
358
+ #search a {
359
+ display: block; float: left;
360
+ padding: 4px 8px; text-decoration: none; color: #05a; fill: #05a;
361
+ border: 1px solid #d8d8e5;
362
+ border-bottom-left-radius: 3px; border-bottom-right-radius: 3px;
363
+ background: #F1F8FF;
364
+ box-shadow: -1px 1px 3px #ddd;
365
+ }
366
+ #search a:hover { background: #f5faff; color: #06b; fill: #06b; }
367
+ #search a.active {
368
+ background: #568; padding-bottom: 20px; color: #fff; fill: #fff;
369
+ border: 1px solid #457;
370
+ border-top-left-radius: 5px; border-top-right-radius: 5px;
371
+ }
372
+ #search a.inactive { color: #999; fill: #999; }
373
+ .inheritanceTree, .toggleDefines {
374
+ float: right;
375
+ border-left: 1px solid #aaa;
376
+ position: absolute; top: 0; right: 0;
377
+ height: 100%;
378
+ background: #f6f6f6;
379
+ padding: 5px;
380
+ min-width: 55px;
381
+ text-align: center;
382
+ }
383
+
384
+ #menu { font-size: 1.3em; color: #bbb; }
385
+ #menu .title, #menu a { font-size: 0.7em; }
386
+ #menu .title a { font-size: 1em; }
387
+ #menu .title { color: #555; }
388
+ #menu a, #menu a:visited { color: #333; text-decoration: none; border-bottom: 1px dotted #bbd; }
389
+ #menu a:hover { color: #05a; }
390
+
391
+ #footer { margin-top: 15px; border-top: 1px solid #ccc; text-align: center; padding: 7px 0; color: #999; }
392
+ #footer a, #footer a:visited { color: #444; text-decoration: none; border-bottom: 1px dotted #bbd; }
393
+ #footer a:hover { color: #05a; }
394
+
395
+ #listing ul.alpha { font-size: 1.1em; }
396
+ #listing ul.alpha { margin: 0; padding: 0; padding-bottom: 10px; list-style: none; }
397
+ #listing ul.alpha li.letter { font-size: 1.4em; padding-bottom: 10px; }
398
+ #listing ul.alpha ul { margin: 0; padding-left: 15px; }
399
+ #listing ul small { color: #666; font-size: 0.7em; }
400
+
401
+ li.r1 { background: #f0f0f0; }
402
+ li.r2 { background: #fafafa; }
403
+
404
+ #content ul.summary li.deprecated .summary_signature a,
405
+ #content ul.summary li.deprecated .summary_signature a:visited { text-decoration: line-through; font-style: italic; }
406
+
407
+ #toc {
408
+ position: relative;
409
+ float: right;
410
+ overflow-x: auto;
411
+ right: -3px;
412
+ margin-left: 20px;
413
+ margin-bottom: 20px;
414
+ padding: 20px; padding-right: 30px;
415
+ max-width: 300px;
416
+ z-index: 5000;
417
+ background: #fefefe;
418
+ border: 1px solid #ddd;
419
+ box-shadow: -2px 2px 6px #bbb;
420
+ }
421
+ #toc .title { margin: 0; }
422
+ #toc ol { padding-left: 1.8em; }
423
+ #toc li { font-size: 1.1em; line-height: 1.7em; }
424
+ #toc > ol > li { font-size: 1.1em; font-weight: bold; }
425
+ #toc ol > ol { font-size: 0.9em; }
426
+ #toc ol ol > ol { padding-left: 2.3em; }
427
+ #toc ol + li { margin-top: 0.3em; }
428
+ #toc.hidden { padding: 10px; background: #fefefe; box-shadow: none; }
429
+ #toc.hidden:hover { background: #fafafa; }
430
+ #filecontents h1 + #toc.nofloat { margin-top: 0; }
431
+ @media (max-width: 560px) {
432
+ #toc {
433
+ margin-left: 0;
434
+ margin-top: 16px;
435
+ float: none;
436
+ max-width: none;
437
+ }
438
+ }
439
+
440
+ /* syntax highlighting */
441
+ .source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; }
442
+ #filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; }
443
+ #filecontents pre.code, .docstring pre.code { display: block; }
444
+ .source_code .lines { padding-right: 12px; color: #555; text-align: right; }
445
+ #filecontents pre.code, .docstring pre.code,
446
+ .tags pre.example {
447
+ padding: 9px 14px;
448
+ margin-top: 4px;
449
+ border: 1px solid #e1e1e8;
450
+ background: #f7f7f9;
451
+ border-radius: 4px;
452
+ font-size: 1em;
453
+ overflow-x: auto;
454
+ line-height: 1.2em;
455
+ }
456
+ pre.code { color: #000; tab-size: 2; }
457
+ pre.code .info.file { color: #555; }
458
+ pre.code .val { color: #036A07; }
459
+ pre.code .tstring_content,
460
+ pre.code .heredoc_beg, pre.code .heredoc_end,
461
+ pre.code .qwords_beg, pre.code .qwords_end, pre.code .qwords_sep,
462
+ pre.code .words_beg, pre.code .words_end, pre.code .words_sep,
463
+ pre.code .qsymbols_beg, pre.code .qsymbols_end, pre.code .qsymbols_sep,
464
+ pre.code .symbols_beg, pre.code .symbols_end, pre.code .symbols_sep,
465
+ pre.code .tstring, pre.code .dstring { color: #036A07; }
466
+ pre.code .fid, pre.code .rubyid_new, pre.code .rubyid_to_s,
467
+ pre.code .rubyid_to_sym, pre.code .rubyid_to_f,
468
+ pre.code .dot + pre.code .id,
469
+ pre.code .rubyid_to_i pre.code .rubyid_each { color: #0085FF; }
470
+ pre.code .comment { color: #0066FF; }
471
+ pre.code .const, pre.code .constant { color: #585CF6; }
472
+ pre.code .label,
473
+ pre.code .symbol { color: #C5060B; }
474
+ pre.code .kw,
475
+ pre.code .rubyid_require,
476
+ pre.code .rubyid_extend,
477
+ pre.code .rubyid_include { color: #0000FF; }
478
+ pre.code .ivar { color: #318495; }
479
+ pre.code .gvar,
480
+ pre.code .rubyid_backref,
481
+ pre.code .rubyid_nth_ref { color: #6D79DE; }
482
+ pre.code .regexp, .dregexp { color: #036A07; }
483
+ pre.code a { border-bottom: 1px dotted #bbf; }
484
+ /* inline code */
485
+ *:not(pre) > code {
486
+ padding: 1px 3px 1px 3px;
487
+ border: 1px solid #E1E1E8;
488
+ background: #F7F7F9;
489
+ border-radius: 4px;
490
+ }
491
+
492
+ /* Color fix for links */
493
+ #content .summary_desc pre.code .id > .object_link a, /* identifier */
494
+ #content .docstring pre.code .id > .object_link a { color: #0085FF; }
495
+ #content .summary_desc pre.code .const > .object_link a, /* constant */
496
+ #content .docstring pre.code .const > .object_link a { color: #585CF6; }
@@ -0,0 +1,146 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.9.20
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ pathId = "README";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="file_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+ <span class="title">File: README</span>
41
+
42
+ </div>
43
+
44
+ <div id="search">
45
+
46
+ <a class="full_list_link" id="class_list_link"
47
+ href="class_list.html">
48
+
49
+ <svg width="24" height="24">
50
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
51
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
52
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
53
+ </svg>
54
+ </a>
55
+
56
+ </div>
57
+ <div class="clear"></div>
58
+ </div>
59
+
60
+ <div id="content"><div id='filecontents'><h1>simple-service – at your service!</h1>
61
+
62
+ <p>The <code>simple-service</code> ruby gem helps you turn your ruby source code into <em>&quot;services&quot;.</em> A service is a module which provides interfaces to one or more methods (<em>&quot;actions&quot;</em>) that implement business logic.</p>
63
+
64
+ <p>While one could, of course, call any such method any way one wants, this gem lets you</p>
65
+
66
+ <ul>
67
+ <li>discover available services (their names, their parameters (name, type, default values), comments - see <code>Simple::Service.actions</code>;</li>
68
+ <li>an interface to &quot;run&quot; (or &quot;execute&quot;) a service, with separation from any other parallel runs - see <code>Simple::Service.invoke</code> and <code>Simple::Service.invoke2</code>;</li>
69
+ <li>a semi-constant &quot;<em>environment</em>&quot; for the duration of an execution;</li>
70
+ <li><img src="https://badgen.net/badge/TODO/high?color=red" alt="TODO"> a normalized interface to check whether or not a specific service is allowed to run based on the current context.</li>
71
+ </ul>
72
+
73
+ <p>These features allow <em>simple-service</em> to serve as a building block for other tools. It is currently in used in:</p>
74
+
75
+ <ul>
76
+ <li><em>simple-httpd</em>: a simple web server</li>
77
+ <li><em>simple-cli</em>: the best way to build a ruby CLI.</li>
78
+ </ul>
79
+
80
+ <h2>Example</h2>
81
+
82
+ <h3>Defining a service</h3>
83
+
84
+ <p>A service module can define one or more services. The following example defines a single service:</p>
85
+
86
+ <pre class="code ruby"><code class="ruby"><span class='comment'># A service which constructs universes with different physics.
87
+ </span><span class='kw'>module</span> <span class='const'>GodMode</span>
88
+ <span class='id identifier rubyid_include'>include</span> <span class='const'><span class='object_link'><a href="Simple.html" title="Simple (module)">Simple</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Simple/Service.html" title="Simple::Service (module)">Service</a></span></span>
89
+
90
+ <span class='comment'># Build a universe.
91
+ </span> <span class='comment'>#
92
+ </span> <span class='comment'># This comment will become part of the full description of the
93
+ </span> <span class='comment'># &quot;build_universe&quot; service
94
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_build_universe'>build_universe</span><span class='lparen'>(</span><span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='label'>c:</span> <span class='comma'>,</span> <span class='label'>pi:</span> <span class='float'>3.14</span><span class='comma'>,</span> <span class='label'>e:</span> <span class='float'>2.781</span><span class='rparen'>)</span>
95
+ <span class='comment'># at this point I realize that *I* am not God.
96
+ </span>
97
+ <span class='int'>42</span> <span class='comment'># Best try approach
98
+ </span> <span class='kw'>end</span>
99
+ <span class='kw'>end</span>
100
+ </code></pre>
101
+
102
+ <h3>Running a service</h3>
103
+
104
+ <p>To run the service one uses one of two different methods. If you have an <strong>anonymous array</strong> of arguments - think command line interface - you would call it like this:</p>
105
+
106
+ <pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Simple.html" title="Simple (module)">Simple</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Simple/Service.html" title="Simple::Service (module)">Service</a></span></span><span class='period'>.</span><span class='id identifier rubyid_invoke'><span class='object_link'><a href="Simple/Service.html#invoke-class_method" title="Simple::Service.invoke (method)">invoke</a></span></span> <span class='const'>GodMode</span><span class='comma'>,</span> <span class='symbol'>:build_universe</span><span class='comma'>,</span>
107
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>My Universe</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
108
+ <span class='label'>c:</span> <span class='float'>3e8</span>
109
+ </code></pre>
110
+
111
+ <p>If the calling site, however, has <strong>named arguments</strong> (in a Hash), one would invoke a service using <code>invoke2</code>. This is used for HTTPD integration (with <code>simple-httpd</code>.)</p>
112
+
113
+ <pre class="code ruby"><code class="ruby"> <span class='id identifier rubyid_args'>args</span> <span class='op'>=</span> <span class='lbrace'>{</span> <span class='label'>name:</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>My Universe</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='label'>c:</span> <span class='int'>299792458</span><span class='rbrace'>}</span>
114
+ <span class='const'><span class='object_link'><a href="Simple.html" title="Simple (module)">Simple</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Simple/Service.html" title="Simple::Service (module)">Service</a></span></span><span class='period'>.</span><span class='id identifier rubyid_invoke2'>invoke2</span> <span class='const'>GodMode</span><span class='comma'>,</span>
115
+ <span class='symbol'>:build_universe</span><span class='comma'>,</span>
116
+ <span class='label'>args:</span> <span class='id identifier rubyid_args'>args</span>
117
+ </code></pre>
118
+
119
+ <p>Note that you must set a context during the execution; this is done by <code>with_context</code>. A <code>nil</code> context is a valid value which describes an empty context.</p>
120
+
121
+ <p>A full example could therefore look like:</p>
122
+
123
+ <pre class="code ruby"><code class="ruby"><span class='const'><span class='object_link'><a href="Simple.html" title="Simple (module)">Simple</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Simple/Service.html" title="Simple::Service (module)">Service</a></span></span><span class='period'>.</span><span class='id identifier rubyid_with_context'><span class='object_link'><a href="Simple/Service.html#with_context-class_method" title="Simple::Service.with_context (method)">with_context</a></span></span><span class='lparen'>(</span><span class='kw'>nil</span><span class='rparen'>)</span> <span class='kw'>do</span>
124
+ <span class='id identifier rubyid_args'>args</span> <span class='op'>=</span> <span class='lbrace'>{</span> <span class='label'>name:</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>My Universe</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='label'>c:</span> <span class='int'>299792458</span><span class='rbrace'>}</span>
125
+ <span class='const'><span class='object_link'><a href="Simple.html" title="Simple (module)">Simple</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Simple/Service.html" title="Simple::Service (module)">Service</a></span></span><span class='period'>.</span><span class='id identifier rubyid_invoke2'>invoke2</span> <span class='const'>GodMode</span><span class='comma'>,</span>
126
+ <span class='symbol'>:build_universe</span><span class='comma'>,</span>
127
+ <span class='label'>args:</span> <span class='id identifier rubyid_args'>args</span>
128
+ <span class='kw'>end</span>
129
+ </code></pre>
130
+
131
+ <h2>History</h2>
132
+
133
+ <p>Historically, the <code>simple-cli</code> gem implemented an easy way to build a CLI application, and therefore needed a way to reflect on existing code to determine which methods to call, which arguments they support etc. Also, the <code>postjob</code> job queue calls a specific method based on its name and an arguments Array or Hash, which is being read from a database. Finally, when I tried to extent <code>postjob</code> with a HTTP interface I discovered that a similar feature would again be extremely useful.</p>
134
+
135
+ <p>I therefore extracted these features into a standalone gem.</p>
136
+ </div></div>
137
+
138
+ <div id="footer">
139
+ Generated on Wed Dec 4 22:57:12 2019 by
140
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
141
+ 0.9.20 (ruby-2.5.1).
142
+ </div>
143
+
144
+ </div>
145
+ </body>
146
+ </html>