classx-pluggable 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 (42) hide show
  1. data/ChangeLog +221 -0
  2. data/README +88 -0
  3. data/Rakefile +52 -0
  4. data/doc/output/coverage/-Library-Ruby-Gems-gems-classx-0_0_5-lib-classx-attribute_rb.html +925 -0
  5. data/doc/output/coverage/-Library-Ruby-Gems-gems-classx-0_0_5-lib-classx-attributes_rb.html +772 -0
  6. data/doc/output/coverage/-Library-Ruby-Gems-gems-classx-0_0_5-lib-classx-bracketable_rb.html +671 -0
  7. data/doc/output/coverage/-Library-Ruby-Gems-gems-classx-0_0_5-lib-classx-role-logger_rb.html +716 -0
  8. data/doc/output/coverage/-Library-Ruby-Gems-gems-classx-0_0_5-lib-classx-validate_rb.html +663 -0
  9. data/doc/output/coverage/-Library-Ruby-Gems-gems-classx-0_0_5-lib-classx_rb.html +820 -0
  10. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-block_rb.html +661 -0
  11. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-callbacks_rb.html +932 -0
  12. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-change_rb.html +779 -0
  13. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-hunk_rb.html +867 -0
  14. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs_rb.html +1715 -0
  15. data/doc/output/coverage/-Library-Ruby-Gems-gems-rcov-0_8_1_2_0-lib-rcov_rb.html +1598 -0
  16. data/doc/output/coverage/examples-test_runner-bin-test_runner_rb.html +628 -0
  17. data/doc/output/coverage/examples-test_runner-lib-test_runner-plugin-setup_fixture_rb.html +641 -0
  18. data/doc/output/coverage/examples-test_runner-lib-test_runner-plugin-test_info_rb.html +638 -0
  19. data/doc/output/coverage/examples-test_runner-lib-test_runner-plugin-test_timer_rb.html +666 -0
  20. data/doc/output/coverage/examples-test_runner-lib-test_runner_rb.html +643 -0
  21. data/doc/output/coverage/index.html +711 -0
  22. data/doc/output/coverage/lib-classx-pluggable-plugin_rb.html +676 -0
  23. data/doc/output/coverage/lib-classx-pluggable_rb.html +841 -0
  24. data/examples/test_runner/bin/test_runner.rb +18 -0
  25. data/examples/test_runner/conf/config.yaml +19 -0
  26. data/examples/test_runner/lib/test_runner.rb +33 -0
  27. data/examples/test_runner/lib/test_runner/plugin/setup_fixture.rb +31 -0
  28. data/examples/test_runner/lib/test_runner/plugin/test_info.rb +28 -0
  29. data/examples/test_runner/lib/test_runner/plugin/test_timer.rb +56 -0
  30. data/lib/classx/pluggable.rb +231 -0
  31. data/lib/classx/pluggable/plugin.rb +66 -0
  32. data/spec/classx-pluggable-util/module2path_spec.rb +30 -0
  33. data/spec/classx-pluggable-util/nested_autoload_spec.rb +48 -0
  34. data/spec/classx-pluggable-util/nested_const_get_spec.rb +48 -0
  35. data/spec/classx-pluggable/component_class_get.rb +18 -0
  36. data/spec/classx-pluggable_spec.rb +5 -0
  37. data/spec/example_spec.rb +20 -0
  38. data/spec/spec.opts +1 -0
  39. data/spec/spec_helper.rb +6 -0
  40. data/tasks/basic_config.rake +22 -0
  41. data/tasks/basic_tasks.rake +139 -0
  42. metadata +127 -0
@@ -0,0 +1,841 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'><head><title>lib/classx/pluggable.rb - C0 code coverage information</title>
3
+ <style type='text/css'>body { background-color: rgb(240, 240, 245); }</style>
4
+ <style type='text/css'>span.cross-ref-title {
5
+ font-size: 140%;
6
+ }
7
+ span.cross-ref a {
8
+ text-decoration: none;
9
+ }
10
+ span.cross-ref {
11
+ background-color:#f3f7fa;
12
+ border: 1px dashed #333;
13
+ margin: 1em;
14
+ padding: 0.5em;
15
+ overflow: hidden;
16
+ }
17
+ a.crossref-toggle {
18
+ text-decoration: none;
19
+ }
20
+ span.marked0 {
21
+ background-color: rgb(185, 210, 200);
22
+ display: block;
23
+ }
24
+ span.marked1 {
25
+ background-color: rgb(190, 215, 205);
26
+ display: block;
27
+ }
28
+ span.inferred0 {
29
+ background-color: rgb(175, 200, 200);
30
+ display: block;
31
+ }
32
+ span.inferred1 {
33
+ background-color: rgb(180, 205, 205);
34
+ display: block;
35
+ }
36
+ span.uncovered0 {
37
+ background-color: rgb(225, 110, 110);
38
+ display: block;
39
+ }
40
+ span.uncovered1 {
41
+ background-color: rgb(235, 120, 120);
42
+ display: block;
43
+ }
44
+ span.overview {
45
+ border-bottom: 8px solid black;
46
+ }
47
+ div.overview {
48
+ border-bottom: 8px solid black;
49
+ }
50
+ body {
51
+ font-family: verdana, arial, helvetica;
52
+ }
53
+ div.footer {
54
+ font-size: 68%;
55
+ margin-top: 1.5em;
56
+ }
57
+ h1, h2, h3, h4, h5, h6 {
58
+ margin-bottom: 0.5em;
59
+ }
60
+ h5 {
61
+ margin-top: 0.5em;
62
+ }
63
+ .hidden {
64
+ display: none;
65
+ }
66
+ div.separator {
67
+ height: 10px;
68
+ }
69
+ /* Commented out for better readability, esp. on IE */
70
+ /*
71
+ table tr td, table tr th {
72
+ font-size: 68%;
73
+ }
74
+ td.value table tr td {
75
+ font-size: 11px;
76
+ }
77
+ */
78
+ table.percent_graph {
79
+ height: 12px;
80
+ border: #808080 1px solid;
81
+ empty-cells: show;
82
+ }
83
+ table.percent_graph td.covered {
84
+ height: 10px;
85
+ background: #00f000;
86
+ }
87
+ table.percent_graph td.uncovered {
88
+ height: 10px;
89
+ background: #e00000;
90
+ }
91
+ table.percent_graph td.NA {
92
+ height: 10px;
93
+ background: #eaeaea;
94
+ }
95
+ table.report {
96
+ border-collapse: collapse;
97
+ width: 100%;
98
+ }
99
+ table.report td.heading {
100
+ background: #dcecff;
101
+ border: #d0d0d0 1px solid;
102
+ font-weight: bold;
103
+ text-align: center;
104
+ }
105
+ table.report td.heading:hover {
106
+ background: #c0ffc0;
107
+ }
108
+ table.report td.text {
109
+ border: #d0d0d0 1px solid;
110
+ }
111
+ table.report td.value,
112
+ table.report td.lines_total,
113
+ table.report td.lines_code {
114
+ text-align: right;
115
+ border: #d0d0d0 1px solid;
116
+ }
117
+ table.report tr.light {
118
+ background-color: rgb(240, 240, 245);
119
+ }
120
+ table.report tr.dark {
121
+ background-color: rgb(230, 230, 235);
122
+ }
123
+ </style>
124
+ <script type='text/javascript'>
125
+ // <![CDATA[
126
+ function toggleCode( id ) {
127
+ if ( document.getElementById )
128
+ elem = document.getElementById( id );
129
+ else if ( document.all )
130
+ elem = eval( "document.all." + id );
131
+ else
132
+ return false;
133
+
134
+ elemStyle = elem.style;
135
+
136
+ if ( elemStyle.display != "block" ) {
137
+ elemStyle.display = "block"
138
+ } else {
139
+ elemStyle.display = "none"
140
+ }
141
+
142
+ return true;
143
+ }
144
+
145
+ // Make cross-references hidden by default
146
+ document.writeln( "<style type=\"text/css\">span.cross-ref { display: none }</style>" )
147
+ // ]]>
148
+ </script>
149
+ <style type='text/css'>span.run0 {
150
+ background-color: rgb(178, 204, 255);
151
+ display: block;
152
+ }
153
+ span.run1 {
154
+ background-color: rgb(178, 206, 255);
155
+ display: block;
156
+ }
157
+ span.run2 {
158
+ background-color: rgb(178, 209, 255);
159
+ display: block;
160
+ }
161
+ span.run3 {
162
+ background-color: rgb(178, 211, 255);
163
+ display: block;
164
+ }
165
+ span.run4 {
166
+ background-color: rgb(178, 214, 255);
167
+ display: block;
168
+ }
169
+ span.run5 {
170
+ background-color: rgb(178, 218, 255);
171
+ display: block;
172
+ }
173
+ span.run6 {
174
+ background-color: rgb(178, 220, 255);
175
+ display: block;
176
+ }
177
+ span.run7 {
178
+ background-color: rgb(178, 223, 255);
179
+ display: block;
180
+ }
181
+ span.run8 {
182
+ background-color: rgb(178, 225, 255);
183
+ display: block;
184
+ }
185
+ span.run9 {
186
+ background-color: rgb(178, 228, 255);
187
+ display: block;
188
+ }
189
+ span.run10 {
190
+ background-color: rgb(178, 232, 255);
191
+ display: block;
192
+ }
193
+ span.run11 {
194
+ background-color: rgb(178, 234, 255);
195
+ display: block;
196
+ }
197
+ span.run12 {
198
+ background-color: rgb(178, 237, 255);
199
+ display: block;
200
+ }
201
+ span.run13 {
202
+ background-color: rgb(178, 239, 255);
203
+ display: block;
204
+ }
205
+ span.run14 {
206
+ background-color: rgb(178, 242, 255);
207
+ display: block;
208
+ }
209
+ span.run15 {
210
+ background-color: rgb(178, 246, 255);
211
+ display: block;
212
+ }
213
+ span.run16 {
214
+ background-color: rgb(178, 248, 255);
215
+ display: block;
216
+ }
217
+ span.run17 {
218
+ background-color: rgb(178, 251, 255);
219
+ display: block;
220
+ }
221
+ span.run18 {
222
+ background-color: rgb(178, 253, 255);
223
+ display: block;
224
+ }
225
+ span.run19 {
226
+ background-color: rgb(178, 255, 253);
227
+ display: block;
228
+ }
229
+ span.run20 {
230
+ background-color: rgb(178, 255, 249);
231
+ display: block;
232
+ }
233
+ span.run21 {
234
+ background-color: rgb(178, 255, 247);
235
+ display: block;
236
+ }
237
+ span.run22 {
238
+ background-color: rgb(178, 255, 244);
239
+ display: block;
240
+ }
241
+ span.run23 {
242
+ background-color: rgb(178, 255, 242);
243
+ display: block;
244
+ }
245
+ span.run24 {
246
+ background-color: rgb(178, 255, 239);
247
+ display: block;
248
+ }
249
+ span.run25 {
250
+ background-color: rgb(178, 255, 235);
251
+ display: block;
252
+ }
253
+ span.run26 {
254
+ background-color: rgb(178, 255, 233);
255
+ display: block;
256
+ }
257
+ span.run27 {
258
+ background-color: rgb(178, 255, 230);
259
+ display: block;
260
+ }
261
+ span.run28 {
262
+ background-color: rgb(178, 255, 228);
263
+ display: block;
264
+ }
265
+ span.run29 {
266
+ background-color: rgb(178, 255, 225);
267
+ display: block;
268
+ }
269
+ span.run30 {
270
+ background-color: rgb(178, 255, 221);
271
+ display: block;
272
+ }
273
+ span.run31 {
274
+ background-color: rgb(178, 255, 219);
275
+ display: block;
276
+ }
277
+ span.run32 {
278
+ background-color: rgb(178, 255, 216);
279
+ display: block;
280
+ }
281
+ span.run33 {
282
+ background-color: rgb(178, 255, 214);
283
+ display: block;
284
+ }
285
+ span.run34 {
286
+ background-color: rgb(178, 255, 211);
287
+ display: block;
288
+ }
289
+ span.run35 {
290
+ background-color: rgb(178, 255, 207);
291
+ display: block;
292
+ }
293
+ span.run36 {
294
+ background-color: rgb(178, 255, 205);
295
+ display: block;
296
+ }
297
+ span.run37 {
298
+ background-color: rgb(178, 255, 202);
299
+ display: block;
300
+ }
301
+ span.run38 {
302
+ background-color: rgb(178, 255, 200);
303
+ display: block;
304
+ }
305
+ span.run39 {
306
+ background-color: rgb(178, 255, 197);
307
+ display: block;
308
+ }
309
+ span.run40 {
310
+ background-color: rgb(178, 255, 193);
311
+ display: block;
312
+ }
313
+ span.run41 {
314
+ background-color: rgb(178, 255, 191);
315
+ display: block;
316
+ }
317
+ span.run42 {
318
+ background-color: rgb(178, 255, 188);
319
+ display: block;
320
+ }
321
+ span.run43 {
322
+ background-color: rgb(178, 255, 186);
323
+ display: block;
324
+ }
325
+ span.run44 {
326
+ background-color: rgb(178, 255, 183);
327
+ display: block;
328
+ }
329
+ span.run45 {
330
+ background-color: rgb(178, 255, 179);
331
+ display: block;
332
+ }
333
+ span.run46 {
334
+ background-color: rgb(179, 255, 178);
335
+ display: block;
336
+ }
337
+ span.run47 {
338
+ background-color: rgb(182, 255, 178);
339
+ display: block;
340
+ }
341
+ span.run48 {
342
+ background-color: rgb(184, 255, 178);
343
+ display: block;
344
+ }
345
+ span.run49 {
346
+ background-color: rgb(187, 255, 178);
347
+ display: block;
348
+ }
349
+ span.run50 {
350
+ background-color: rgb(191, 255, 178);
351
+ display: block;
352
+ }
353
+ span.run51 {
354
+ background-color: rgb(193, 255, 178);
355
+ display: block;
356
+ }
357
+ span.run52 {
358
+ background-color: rgb(196, 255, 178);
359
+ display: block;
360
+ }
361
+ span.run53 {
362
+ background-color: rgb(198, 255, 178);
363
+ display: block;
364
+ }
365
+ span.run54 {
366
+ background-color: rgb(201, 255, 178);
367
+ display: block;
368
+ }
369
+ span.run55 {
370
+ background-color: rgb(205, 255, 178);
371
+ display: block;
372
+ }
373
+ span.run56 {
374
+ background-color: rgb(207, 255, 178);
375
+ display: block;
376
+ }
377
+ span.run57 {
378
+ background-color: rgb(210, 255, 178);
379
+ display: block;
380
+ }
381
+ span.run58 {
382
+ background-color: rgb(212, 255, 178);
383
+ display: block;
384
+ }
385
+ span.run59 {
386
+ background-color: rgb(215, 255, 178);
387
+ display: block;
388
+ }
389
+ span.run60 {
390
+ background-color: rgb(219, 255, 178);
391
+ display: block;
392
+ }
393
+ span.run61 {
394
+ background-color: rgb(221, 255, 178);
395
+ display: block;
396
+ }
397
+ span.run62 {
398
+ background-color: rgb(224, 255, 178);
399
+ display: block;
400
+ }
401
+ span.run63 {
402
+ background-color: rgb(226, 255, 178);
403
+ display: block;
404
+ }
405
+ span.run64 {
406
+ background-color: rgb(229, 255, 178);
407
+ display: block;
408
+ }
409
+ span.run65 {
410
+ background-color: rgb(233, 255, 178);
411
+ display: block;
412
+ }
413
+ span.run66 {
414
+ background-color: rgb(235, 255, 178);
415
+ display: block;
416
+ }
417
+ span.run67 {
418
+ background-color: rgb(238, 255, 178);
419
+ display: block;
420
+ }
421
+ span.run68 {
422
+ background-color: rgb(240, 255, 178);
423
+ display: block;
424
+ }
425
+ span.run69 {
426
+ background-color: rgb(243, 255, 178);
427
+ display: block;
428
+ }
429
+ span.run70 {
430
+ background-color: rgb(247, 255, 178);
431
+ display: block;
432
+ }
433
+ span.run71 {
434
+ background-color: rgb(249, 255, 178);
435
+ display: block;
436
+ }
437
+ span.run72 {
438
+ background-color: rgb(252, 255, 178);
439
+ display: block;
440
+ }
441
+ span.run73 {
442
+ background-color: rgb(255, 255, 178);
443
+ display: block;
444
+ }
445
+ span.run74 {
446
+ background-color: rgb(255, 252, 178);
447
+ display: block;
448
+ }
449
+ span.run75 {
450
+ background-color: rgb(255, 248, 178);
451
+ display: block;
452
+ }
453
+ span.run76 {
454
+ background-color: rgb(255, 246, 178);
455
+ display: block;
456
+ }
457
+ span.run77 {
458
+ background-color: rgb(255, 243, 178);
459
+ display: block;
460
+ }
461
+ span.run78 {
462
+ background-color: rgb(255, 240, 178);
463
+ display: block;
464
+ }
465
+ span.run79 {
466
+ background-color: rgb(255, 238, 178);
467
+ display: block;
468
+ }
469
+ span.run80 {
470
+ background-color: rgb(255, 234, 178);
471
+ display: block;
472
+ }
473
+ span.run81 {
474
+ background-color: rgb(255, 232, 178);
475
+ display: block;
476
+ }
477
+ span.run82 {
478
+ background-color: rgb(255, 229, 178);
479
+ display: block;
480
+ }
481
+ span.run83 {
482
+ background-color: rgb(255, 226, 178);
483
+ display: block;
484
+ }
485
+ span.run84 {
486
+ background-color: rgb(255, 224, 178);
487
+ display: block;
488
+ }
489
+ span.run85 {
490
+ background-color: rgb(255, 220, 178);
491
+ display: block;
492
+ }
493
+ span.run86 {
494
+ background-color: rgb(255, 218, 178);
495
+ display: block;
496
+ }
497
+ span.run87 {
498
+ background-color: rgb(255, 215, 178);
499
+ display: block;
500
+ }
501
+ span.run88 {
502
+ background-color: rgb(255, 212, 178);
503
+ display: block;
504
+ }
505
+ span.run89 {
506
+ background-color: rgb(255, 210, 178);
507
+ display: block;
508
+ }
509
+ span.run90 {
510
+ background-color: rgb(255, 206, 178);
511
+ display: block;
512
+ }
513
+ span.run91 {
514
+ background-color: rgb(255, 204, 178);
515
+ display: block;
516
+ }
517
+ span.run92 {
518
+ background-color: rgb(255, 201, 178);
519
+ display: block;
520
+ }
521
+ span.run93 {
522
+ background-color: rgb(255, 198, 178);
523
+ display: block;
524
+ }
525
+ span.run94 {
526
+ background-color: rgb(255, 196, 178);
527
+ display: block;
528
+ }
529
+ span.run95 {
530
+ background-color: rgb(255, 192, 178);
531
+ display: block;
532
+ }
533
+ span.run96 {
534
+ background-color: rgb(255, 189, 178);
535
+ display: block;
536
+ }
537
+ span.run97 {
538
+ background-color: rgb(255, 187, 178);
539
+ display: block;
540
+ }
541
+ span.run98 {
542
+ background-color: rgb(255, 184, 178);
543
+ display: block;
544
+ }
545
+ span.run99 {
546
+ background-color: rgb(255, 182, 178);
547
+ display: block;
548
+ }
549
+ span.run100 {
550
+ background-color: rgb(255, 178, 178);
551
+ display: block;
552
+ }
553
+ </style>
554
+ </head>
555
+ <body><h3>C0 code coverage information</h3>
556
+ <p>Generated on Sat Nov 08 17:43:44 +0900 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a>
557
+ </p>
558
+ <hr/>
559
+ <pre><span class='marked0'>Code reported as executed by Ruby looks like this...
560
+ </span><span class='marked1'>and this: this line is also marked as covered.
561
+ </span><span class='inferred0'>Lines considered as run by rcov, but not reported by Ruby, look like this,
562
+ </span><span class='inferred1'>and this: these lines were inferred by rcov (using simple heuristics).
563
+ </span><span class='uncovered0'>Finally, here&apos;s a line marked as not executed.
564
+ </span></pre>
565
+ <table class='report'><thead><tr><td class='heading'>Name</td>
566
+ <td class='heading'>Total lines</td>
567
+ <td class='heading'>Lines of code</td>
568
+ <td class='heading'>Total coverage</td>
569
+ <td class='heading'>Code coverage</td>
570
+ </tr>
571
+ </thead>
572
+ <tbody><tr class='light'><td><a href='lib-classx-pluggable_rb.html'>lib/classx/pluggable.rb</a>
573
+ </td>
574
+ <td class='lines_total'><tt>231</tt>
575
+ </td>
576
+ <td class='lines_code'><tt>152</tt>
577
+ </td>
578
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>91.3%</tt>
579
+ &nbsp;</td>
580
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='91'/>
581
+ <td class='uncovered' width='9'/>
582
+ </tr>
583
+ </table>
584
+ </td>
585
+ </tr>
586
+ </table>
587
+ </td>
588
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>86.8%</tt>
589
+ &nbsp;</td>
590
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='87'/>
591
+ <td class='uncovered' width='13'/>
592
+ </tr>
593
+ </table>
594
+ </td>
595
+ </tr>
596
+ </table>
597
+ </td>
598
+ </tr>
599
+ </tbody>
600
+ </table>
601
+ <pre><span class="marked0"><a name="line1"></a> 1 require 'classx'
602
+ </span><span class="marked1"><a name="line2"></a> 2 require 'ostruct'
603
+ </span><span class="inferred0"><a name="line3"></a> 3
604
+ </span><span class="marked1"><a name="line4"></a> 4 module ClassX
605
+ </span><span class="inferred0"><a name="line5"></a> 5 # in your context class.
606
+ </span><span class="inferred1"><a name="line6"></a> 6 #
607
+ </span><span class="inferred0"><a name="line7"></a> 7 # require 'classx'
608
+ </span><span class="inferred1"><a name="line8"></a> 8 # require 'classx/pluggable'
609
+ </span><span class="inferred0"><a name="line9"></a> 9 # class YourApp
610
+ </span><span class="inferred1"><a name="line10"></a> 10 # include ClassX
611
+ </span><span class="inferred0"><a name="line11"></a> 11 # include ClassX::Pluggable
612
+ </span><span class="inferred1"><a name="line12"></a> 12 #
613
+ </span><span class="inferred0"><a name="line13"></a> 13 # def run
614
+ </span><span class="inferred1"><a name="line14"></a> 14 # call_event(&quot;SETUP&quot;, {})
615
+ </span><span class="inferred0"><a name="line15"></a> 15 # # you app
616
+ </span><span class="inferred1"><a name="line16"></a> 16 # call_event(&quot;TEARDOWN&quot;, {})
617
+ </span><span class="inferred0"><a name="line17"></a> 17 # end
618
+ </span><span class="inferred1"><a name="line18"></a> 18 #
619
+ </span><span class="inferred0"><a name="line19"></a> 19 # end
620
+ </span><span class="inferred1"><a name="line20"></a> 20 #
621
+ </span><span class="inferred0"><a name="line21"></a> 21 # in your plugin class
622
+ </span><span class="inferred1"><a name="line22"></a> 22 #
623
+ </span><span class="inferred0"><a name="line23"></a> 23 # require 'classx'
624
+ </span><span class="inferred1"><a name="line24"></a> 24 # require 'classx/pluggable'
625
+ </span><span class="inferred0"><a name="line25"></a> 25 # class YourApp
626
+ </span><span class="inferred1"><a name="line26"></a> 26 # class Plugin
627
+ </span><span class="inferred0"><a name="line27"></a> 27 # include ClassX
628
+ </span><span class="inferred1"><a name="line28"></a> 28 # include ClassX::Pluggable::Plugin
629
+ </span><span class="inferred0"><a name="line29"></a> 29 #
630
+ </span><span class="inferred1"><a name="line30"></a> 30 # class SomePlugin &lt; Plugin
631
+ </span><span class="inferred0"><a name="line31"></a> 31 # def register
632
+ </span><span class="inferred1"><a name="line32"></a> 32 # add_event(&quot;SETUP&quot;, :on_setup)
633
+ </span><span class="inferred0"><a name="line33"></a> 33 # end
634
+ </span><span class="inferred1"><a name="line34"></a> 34 #
635
+ </span><span class="inferred0"><a name="line35"></a> 35 # def on_setup param
636
+ </span><span class="inferred1"><a name="line36"></a> 36 # # param is Hash
637
+ </span><span class="inferred0"><a name="line37"></a> 37 # # hooked setup
638
+ </span><span class="inferred1"><a name="line38"></a> 38 # end
639
+ </span><span class="inferred0"><a name="line39"></a> 39 # end
640
+ </span><span class="inferred1"><a name="line40"></a> 40 # end
641
+ </span><span class="inferred0"><a name="line41"></a> 41 # end
642
+ </span><span class="inferred1"><a name="line42"></a> 42 #
643
+ </span><span class="marked0"><a name="line43"></a> 43 module Pluggable
644
+ </span><span class="marked1"><a name="line44"></a> 44 extend ClassX::Attributes
645
+ </span><span class="marked0"><a name="line45"></a> 45 extend ClassX::Role::Logger
646
+ </span><span class="inferred1"><a name="line46"></a> 46
647
+ </span><span class="marked0"><a name="line47"></a> 47 class PluginLoadError &lt; ::Exception; end
648
+ </span><span class="inferred1"><a name="line48"></a> 48
649
+ </span><span class="marked0"><a name="line49"></a> 49 has :__classx_pluggable_events_of,
650
+ </span><span class="inferred1"><a name="line50"></a> 50 :lazy =&gt; true,
651
+ </span><span class="inferred0"><a name="line51"></a> 51 :no_cmd_option =&gt; true,
652
+ </span><span class="marked1"><a name="line52"></a> 52 :default =&gt; proc {|mine| mine.events.inject({}) {|h,event| h[event] = []; h } }
653
+ </span><span class="inferred0"><a name="line53"></a> 53
654
+ </span><span class="marked1"><a name="line54"></a> 54 has :plugin_dir,
655
+ </span><span class="inferred0"><a name="line55"></a> 55 :optional =&gt; true,
656
+ </span><span class="inferred1"><a name="line56"></a> 56 :kind_of =&gt; Array
657
+ </span><span class="inferred0"><a name="line57"></a> 57
658
+ </span><span class="marked1"><a name="line58"></a> 58 has :check_events,
659
+ </span><span class="inferred0"><a name="line59"></a> 59 :default =&gt; false,
660
+ </span><span class="inferred1"><a name="line60"></a> 60 :optional =&gt; true,
661
+ </span><span class="inferred0"><a name="line61"></a> 61 :desc =&gt; &quot;only add events that define before add_event.&quot;
662
+ </span><span class="inferred1"><a name="line62"></a> 62
663
+ </span><span class="marked0"><a name="line63"></a> 63 has :events,
664
+ </span><span class="inferred1"><a name="line64"></a> 64 :lazy =&gt; true,
665
+ </span><span class="inferred0"><a name="line65"></a> 65 :optional =&gt; true,
666
+ </span><span class="inferred1"><a name="line66"></a> 66 :kind_of =&gt; Array,
667
+ </span><span class="inferred0"><a name="line67"></a> 67 :desc =&gt; &quot;hook point for #{self}'s instance&quot;,
668
+ </span><span class="inferred1"><a name="line68"></a> 68 :default =&gt; proc { [] }
669
+ </span><span class="inferred0"><a name="line69"></a> 69
670
+ </span><span class="inferred1"><a name="line70"></a> 70 # register plugin and method to hook point.
671
+ </span><span class="inferred0"><a name="line71"></a> 71 #
672
+ </span><span class="marked1"><a name="line72"></a> 72 def add_event name, plugin, meth
673
+ </span><span class="marked0"><a name="line73"></a> 73 name = name.to_s
674
+ </span><span class="marked1"><a name="line74"></a> 74 if self.check_events &amp;&amp; !self.events.include?(name)
675
+ </span><span class="uncovered0"><a name="line75"></a> 75 raise &quot;#{name.inspect} should be declared before call add_event. not in #{self.events.inspect}&quot;
676
+ </span><span class="inferred1"><a name="line76"></a> 76 else
677
+ </span><span class="marked0"><a name="line77"></a> 77 self.__classx_pluggable_events_of[name] ||= []
678
+ </span><span class="inferred1"><a name="line78"></a> 78 end
679
+ </span><span class="marked0"><a name="line79"></a> 79 self.__classx_pluggable_events_of[name] &lt;&lt; { :plugin =&gt; plugin, :method =&gt; meth }
680
+ </span><span class="inferred1"><a name="line80"></a> 80 end
681
+ </span><span class="inferred0"><a name="line81"></a> 81
682
+ </span><span class="inferred1"><a name="line82"></a> 82 # load plugins.
683
+ </span><span class="inferred0"><a name="line83"></a> 83 #
684
+ </span><span class="inferred1"><a name="line84"></a> 84 # app.load_plugins([
685
+ </span><span class="inferred0"><a name="line85"></a> 85 # { :module =&gt; &quot;YourApp::Plugin::Foo&quot;, :confiig =&gt; { :some_config =&gt; &quot;foo&quot;} },
686
+ </span><span class="inferred1"><a name="line86"></a> 86 # { :module =&gt; &quot;+Bar&quot;, :confiig =&gt; { } }, # It's same meaning of YourApp::Plugin::Bar
687
+ </span><span class="inferred0"><a name="line87"></a> 87 # ])
688
+ </span><span class="inferred1"><a name="line88"></a> 88 #
689
+ </span><span class="marked0"><a name="line89"></a> 89 def load_plugins plugins
690
+ </span><span class="marked1"><a name="line90"></a> 90 load_components(&quot;plugin&quot;, plugins)
691
+ </span><span class="marked0"><a name="line91"></a> 91 end
692
+ </span><span class="inferred1"><a name="line92"></a> 92
693
+ </span><span class="inferred0"><a name="line93"></a> 93 # if you customize Plugin name space. you can use this instead of +load_plugins+.
694
+ </span><span class="inferred1"><a name="line94"></a> 94 #
695
+ </span><span class="inferred0"><a name="line95"></a> 95 # app.load_components('engine', [
696
+ </span><span class="inferred1"><a name="line96"></a> 96 # { :module =&gt; &quot;YourApp::Engine::Foo&quot;, :confiig =&gt; { :some_config =&gt; &quot;foo&quot;} },
697
+ </span><span class="inferred0"><a name="line97"></a> 97 # { :module =&gt; &quot;+Bar&quot;, :confiig =&gt; { } }, # It's same meaning of YourApp::Engine::Bar
698
+ </span><span class="inferred1"><a name="line98"></a> 98 # ])
699
+ </span><span class="inferred0"><a name="line99"></a> 99 #
700
+ </span><span class="marked1"><a name="line100"></a>100 def load_components type, components
701
+ </span><span class="marked0"><a name="line101"></a>101 components.each do |component|
702
+ </span><span class="marked1"><a name="line102"></a>102 load_component type, component
703
+ </span><span class="inferred0"><a name="line103"></a>103 end
704
+ </span><span class="marked1"><a name="line104"></a>104 end
705
+ </span><span class="inferred0"><a name="line105"></a>105
706
+ </span><span class="marked1"><a name="line106"></a>106 def load_component type, hash
707
+ </span><span class="marked0"><a name="line107"></a>107 component = OpenStruct.new(hash.dup)
708
+ </span><span class="marked1"><a name="line108"></a>108 mod = self.class.component_class_get(type, component.module, { :plugin_dir =&gt; self.plugin_dir })
709
+ </span><span class="marked0"><a name="line109"></a>109 component.config ||= {}
710
+ </span><span class="marked1"><a name="line110"></a>110 component.config[:context] = self
711
+ </span><span class="marked0"><a name="line111"></a>111 instance = mod.new(component.config)
712
+ </span><span class="marked1"><a name="line112"></a>112 instance.register
713
+ </span><span class="marked0"><a name="line113"></a>113 logger.debug(&quot;ClassX::Pluggable: loaded #{type} #{component.module}, config=#{instance.inspect}&quot;)
714
+ </span><span class="inferred1"><a name="line114"></a>114 end
715
+ </span><span class="inferred0"><a name="line115"></a>115
716
+ </span><span class="inferred1"><a name="line116"></a>116 # invoke registered event of +name+ with +args+. and return array of result each callback.
717
+ </span><span class="marked0"><a name="line117"></a>117 def call_event name, *args
718
+ </span><span class="marked1"><a name="line118"></a>118 name = name.to_s
719
+ </span><span class="marked0"><a name="line119"></a>119 if events = self.__classx_pluggable_events_of[name]
720
+ </span><span class="marked1"><a name="line120"></a>120 events.map do |event|
721
+ </span><span class="marked0"><a name="line121"></a>121 event[:plugin].__send__(event[:method], *args)
722
+ </span><span class="inferred1"><a name="line122"></a>122 end
723
+ </span><span class="inferred0"><a name="line123"></a>123 else
724
+ </span><span class="marked1"><a name="line124"></a>124 []
725
+ </span><span class="inferred0"><a name="line125"></a>125 end
726
+ </span><span class="inferred1"><a name="line126"></a>126 end
727
+ </span><span class="inferred0"><a name="line127"></a>127
728
+ </span><span class="inferred1"><a name="line128"></a>128 # invoke registered event of BEFORE_xxxx and yield block and invoke hook AFTER_xxxx.
729
+ </span><span class="marked0"><a name="line129"></a>129 def call_event_around name, *args, &amp;block
730
+ </span><span class="marked1"><a name="line130"></a>130 name = name.to_s
731
+ </span><span class="marked0"><a name="line131"></a>131 around_name = &quot;AROUND_#{name}&quot;
732
+ </span><span class="inferred1"><a name="line132"></a>132
733
+ </span><span class="marked0"><a name="line133"></a>133 call_event(&quot;BEFORE_#{name}&quot;, *args)
734
+ </span><span class="marked1"><a name="line134"></a>134 if events = self.__classx_pluggable_events_of[around_name]
735
+ </span><span class="marked0"><a name="line135"></a>135 procs = []
736
+ </span><span class="marked1"><a name="line136"></a>136 procs &lt;&lt; block
737
+ </span><span class="marked0"><a name="line137"></a>137 index = 0
738
+ </span><span class="marked1"><a name="line138"></a>138 nested_proc = events.inject(block) {|bl, event| proc { event[:plugin].__send__(event[:method], *args, &amp;bl ) } }
739
+ </span><span class="marked0"><a name="line139"></a>139 nested_proc.call
740
+ </span><span class="inferred1"><a name="line140"></a>140 end
741
+ </span><span class="marked0"><a name="line141"></a>141 call_event(&quot;AFTER_#{name}&quot;, *args)
742
+ </span><span class="inferred1"><a name="line142"></a>142 end
743
+ </span><span class="inferred0"><a name="line143"></a>143
744
+ </span><span class="marked1"><a name="line144"></a>144 private
745
+ </span><span class="inferred0"><a name="line145"></a>145
746
+ </span><span class="marked1"><a name="line146"></a>146 module Util
747
+ </span><span class="marked0"><a name="line147"></a>147 def module2path mod
748
+ </span><span class="marked1"><a name="line148"></a>148 mod.split(/::/).map { |s|
749
+ </span><span class="marked0"><a name="line149"></a>149 s.gsub(/([A-Z][a-z]+)(?=[A-Z][a-z]*?)/, '\1_').gsub(/([A-Z])(?=[A-Z][a-z]+)/, '\1_').downcase
750
+ </span><span class="inferred1"><a name="line150"></a>150 }.join(File::SEPARATOR)
751
+ </span><span class="marked0"><a name="line151"></a>151 end
752
+ </span><span class="inferred1"><a name="line152"></a>152
753
+ </span><span class="marked0"><a name="line153"></a>153 def nested_const_get mod
754
+ </span><span class="marked1"><a name="line154"></a>154 name_spaces = mod.split(/::/)
755
+ </span><span class="marked0"><a name="line155"></a>155 result = ::Object
756
+ </span><span class="marked1"><a name="line156"></a>156 name_spaces.each do |const|
757
+ </span><span class="marked0"><a name="line157"></a>157 result = result.const_get(const)
758
+ </span><span class="inferred1"><a name="line158"></a>158 end
759
+ </span><span class="marked0"><a name="line159"></a>159 return result
760
+ </span><span class="inferred1"><a name="line160"></a>160 end
761
+ </span><span class="inferred0"><a name="line161"></a>161
762
+ </span><span class="marked1"><a name="line162"></a>162 def nested_autoload mod, path
763
+ </span><span class="marked0"><a name="line163"></a>163 name_spaces = mod.split(/::/)
764
+ </span><span class="marked1"><a name="line164"></a>164 target = name_spaces.pop
765
+ </span><span class="marked0"><a name="line165"></a>165 tmp = ::Object
766
+ </span><span class="marked1"><a name="line166"></a>166 name_spaces.each do |const|
767
+ </span><span class="marked0"><a name="line167"></a>167 tmp = tmp.const_get(const)
768
+ </span><span class="inferred1"><a name="line168"></a>168 end
769
+ </span><span class="marked0"><a name="line169"></a>169 tmp.autoload(target, path)
770
+ </span><span class="inferred1"><a name="line170"></a>170 end
771
+ </span><span class="inferred0"><a name="line171"></a>171
772
+ </span><span class="marked1"><a name="line172"></a>172 module_function :module2path, :nested_const_get, :nested_autoload
773
+ </span><span class="inferred0"><a name="line173"></a>173 end
774
+ </span><span class="inferred1"><a name="line174"></a>174
775
+ </span><span class="marked0"><a name="line175"></a>175 module ClassMethods
776
+ </span><span class="marked1"><a name="line176"></a>176 include ClassX::Pluggable::Util
777
+ </span><span class="inferred0"><a name="line177"></a>177
778
+ </span><span class="marked1"><a name="line178"></a>178 def component_class_get type, name, options={}
779
+ </span><span class="marked0"><a name="line179"></a>179 case name
780
+ </span><span class="marked1"><a name="line180"></a>180 when ::Class
781
+ </span><span class="uncovered0"><a name="line181"></a>181 return name
782
+ </span><span class="inferred1"><a name="line182"></a>182 else
783
+ </span><span class="marked0"><a name="line183"></a>183 mod_name = nil
784
+ </span><span class="marked1"><a name="line184"></a>184 target_name = nil
785
+ </span><span class="marked0"><a name="line185"></a>185 if name =~ /\A\+([\w:]+)\z/
786
+ </span><span class="marked1"><a name="line186"></a>186 target_name = $1
787
+ </span><span class="marked0"><a name="line187"></a>187 mod_name = [ self, type.capitalize, target_name ].join(&quot;::&quot;)
788
+ </span><span class="inferred1"><a name="line188"></a>188 else
789
+ </span><span class="marked0"><a name="line189"></a>189 mod_name = name
790
+ </span><span class="inferred1"><a name="line190"></a>190 end
791
+ </span><span class="marked0"><a name="line191"></a>191 begin
792
+ </span><span class="marked1"><a name="line192"></a>192 return nested_const_get(mod_name)
793
+ </span><span class="inferred0"><a name="line193"></a>193 rescue NameError =&gt; e
794
+ </span><span class="marked1"><a name="line194"></a>194 begin
795
+ </span><span class="marked0"><a name="line195"></a>195 if options[:plugin_dir]
796
+ </span><span class="uncovered1"><a name="line196"></a>196 options[:plugin_dir].each do |path|
797
+ </span><span class="uncovered0"><a name="line197"></a>197 begin
798
+ </span><span class="uncovered1"><a name="line198"></a>198 begin
799
+ </span><span class="uncovered0"><a name="line199"></a>199 self.const_get(type.capitalize).autoload(name, File.expand_path(File.join(path, module2path(target_name))))
800
+ </span><span class="uncovered1"><a name="line200"></a>200 rescue LoadError =&gt; e
801
+ </span><span class="uncovered0"><a name="line201"></a>201 raise ::ClassX::Pluggable::PluginLoadError, &quot;class: #{mod_name} is not found&quot;
802
+ </span><span class="uncovered1"><a name="line202"></a>202 end
803
+ </span><span class="uncovered0"><a name="line203"></a>203 return nested_const_get(mod_name)
804
+ </span><span class="uncovered1"><a name="line204"></a>204 rescue NameError =&gt; e
805
+ </span><span class="uncovered0"><a name="line205"></a>205 next
806
+ </span><span class="uncovered1"><a name="line206"></a>206 end
807
+ </span><span class="uncovered0"><a name="line207"></a>207 raise NameError, &quot;must not happened unless your code is something wrong!!&quot;
808
+ </span><span class="uncovered1"><a name="line208"></a>208 end
809
+ </span><span class="inferred0"><a name="line209"></a>209 else
810
+ </span><span class="marked1"><a name="line210"></a>210 nested_autoload(mod_name, module2path(mod_name))
811
+ </span><span class="marked0"><a name="line211"></a>211 nested_const_get mod_name
812
+ </span><span class="inferred1"><a name="line212"></a>212 end
813
+ </span><span class="uncovered0"><a name="line213"></a>213 rescue LoadError =&gt; e
814
+ </span><span class="uncovered1"><a name="line214"></a>214 raise ::ClassX::Pluggable::PluginLoadError, &quot;class: #{mod_name} is not found.&quot;
815
+ </span><span class="uncovered0"><a name="line215"></a>215 end
816
+ </span><span class="uncovered1"><a name="line216"></a>216 end
817
+ </span><span class="uncovered0"><a name="line217"></a>217 end
818
+ </span><span class="marked1"><a name="line218"></a>218 end
819
+ </span><span class="inferred0"><a name="line219"></a>219 end
820
+ </span><span class="inferred1"><a name="line220"></a>220
821
+ </span><span class="marked0"><a name="line221"></a>221 def self.included klass
822
+ </span><span class="marked1"><a name="line222"></a>222 klass.extend ClassMethods
823
+ </span><span class="marked0"><a name="line223"></a>223 end
824
+ </span><span class="inferred1"><a name="line224"></a>224
825
+ </span><span class="inferred0"><a name="line225"></a>225 # It's useful for testing.
826
+ </span><span class="marked1"><a name="line226"></a>226 class MockContext
827
+ </span><span class="marked0"><a name="line227"></a>227 include ClassX
828
+ </span><span class="marked1"><a name="line228"></a>228 include ClassX::Pluggable
829
+ </span><span class="inferred0"><a name="line229"></a>229 end
830
+ </span><span class="inferred1"><a name="line230"></a>230 end
831
+ </span><span class="inferred0"><a name="line231"></a>231 end
832
+ </span></pre><hr/>
833
+ <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a>
834
+ version 0.8.1.2.</p>
835
+ <p><a href='http://validator.w3.org/check/referer'><img src='http://www.w3.org/Icons/valid-xhtml10' height='31' alt='Valid XHTML 1.0!' width='88'/>
836
+ </a>
837
+ <a href='http://jigsaw.w3.org/css-validator/check/referer'><img src='http://jigsaw.w3.org/css-validator/images/vcss' alt='Valid CSS!' style='border:0;width:88px;height:31px'/>
838
+ </a>
839
+ </p>
840
+ </body>
841
+ </html>