flexmock 1.3.3 → 2.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.autotest +3 -0
  3. data/.gitignore +14 -0
  4. data/.togglerc +7 -0
  5. data/.travis.yml +5 -0
  6. data/.yardopts +2 -0
  7. data/CHANGES +11 -0
  8. data/Gemfile +1 -4
  9. data/README.md +39 -11
  10. data/Rakefile +6 -217
  11. data/doc/examples/rspec_examples_spec.rb +244 -0
  12. data/doc/examples/test_unit_examples_test.rb +240 -0
  13. data/doc/jamis.rb +591 -0
  14. data/flexmock.gemspec +33 -0
  15. data/lib/flexmock.rb +0 -1
  16. data/lib/flexmock/composite_expectation.rb +1 -1
  17. data/lib/flexmock/core.rb +3 -7
  18. data/lib/flexmock/core_class_methods.rb +5 -1
  19. data/lib/flexmock/default_framework_adapter.rb +2 -2
  20. data/lib/flexmock/expectation.rb +29 -3
  21. data/lib/flexmock/expectation_director.rb +1 -1
  22. data/lib/flexmock/minitest.rb +13 -0
  23. data/lib/flexmock/minitest_extensions.rb +26 -0
  24. data/lib/flexmock/minitest_integration.rb +111 -0
  25. data/lib/flexmock/mock_container.rb +1 -2
  26. data/lib/flexmock/partial_mock.rb +61 -104
  27. data/lib/flexmock/recorder.rb +1 -2
  28. data/lib/flexmock/rspec.rb +6 -3
  29. data/lib/flexmock/test_unit_integration.rb +14 -0
  30. data/lib/flexmock/validators.rb +5 -4
  31. data/lib/flexmock/version.rb +1 -9
  32. data/rakelib/metrics.rake +40 -0
  33. data/rakelib/preview.rake +4 -0
  34. data/rakelib/tags.rake +18 -0
  35. data/todo.txt +20 -0
  36. metadata +61 -86
  37. data/Gemfile.lock +0 -20
  38. data/doc/examples/rspec_examples_spec.rdoc +0 -245
  39. data/doc/examples/test_unit_examples_test.rdoc +0 -241
  40. data/test/aliasing_test.rb +0 -66
  41. data/test/assert_spy_called_test.rb +0 -119
  42. data/test/base_class_test.rb +0 -71
  43. data/test/based_partials_test.rb +0 -51
  44. data/test/container_methods_test.rb +0 -118
  45. data/test/default_framework_adapter_test.rb +0 -38
  46. data/test/demeter_mocking_test.rb +0 -191
  47. data/test/deprecated_methods_test.rb +0 -225
  48. data/test/examples_from_readme_test.rb +0 -157
  49. data/test/expectation_description_test.rb +0 -80
  50. data/test/extended_should_receive_test.rb +0 -69
  51. data/test/flexmodel_test.rb +0 -54
  52. data/test/mock_builder_test.rb +0 -68
  53. data/test/naming_test.rb +0 -84
  54. data/test/new_instances_test.rb +0 -215
  55. data/test/object_extensions_test.rb +0 -25
  56. data/test/partial_mock_test.rb +0 -458
  57. data/test/record_mode_test.rb +0 -158
  58. data/test/redirect_error.rb +0 -16
  59. data/test/rspec_integration/integration_spec.rb +0 -56
  60. data/test/rspec_integration/spy_example_spec.rb +0 -207
  61. data/test/samples_test.rb +0 -283
  62. data/test/should_ignore_missing_test.rb +0 -84
  63. data/test/should_receive_test.rb +0 -1155
  64. data/test/spys_test.rb +0 -215
  65. data/test/symbol_extensions_test.rb +0 -8
  66. data/test/test_class_extensions.rb +0 -34
  67. data/test/test_setup.rb +0 -92
  68. data/test/test_unit_integration/auto_test_unit_test.rb +0 -42
  69. data/test/test_unit_integration/minitest_teardown_test.rb +0 -14
  70. data/test/tu_integration_test.rb +0 -99
  71. data/test/undefined_test.rb +0 -87
@@ -0,0 +1,240 @@
1
+ require 'flexmock/test_unit'
2
+
3
+ class TestSimple < Test::Unit::TestCase
4
+
5
+ # Simple stubbing of some methods
6
+
7
+ def test_simple_mock
8
+ m = flexmock(:pi => 3.1416, :e => 2.71)
9
+ assert_equal 3.1416, m.pi
10
+ assert_equal 2.71, m.e
11
+ end
12
+ end
13
+
14
+
15
+ class TestUndefined < Test::Unit::TestCase
16
+
17
+ # Create a mock object that returns an undefined object for method calls
18
+
19
+ def test_undefined_values
20
+ m = flexmock("mock")
21
+ m.should_receive(:divide_by).with(0).
22
+ and_return_undefined
23
+ assert_equal FlexMock.undefined, m.divide_by(0)
24
+ end
25
+ end
26
+
27
+ class TestDb < Test::Unit::TestCase
28
+
29
+ # Expect multiple queries and a single update
30
+
31
+ # Multiple calls to the query method will be allows, and calls may
32
+ # have any argument list. Each call to query will return the three
33
+ # element array [1, 2, 3]. The call to update must have a specific
34
+ # argument of 5.
35
+
36
+ def test_db
37
+ db = flexmock('db')
38
+ db.should_receive(:query).and_return([1,2,3])
39
+ db.should_receive(:update).with(5).and_return(nil).once
40
+
41
+ # Test Code
42
+
43
+ db.query
44
+ db.update(5)
45
+ end
46
+ end
47
+
48
+ class TestOrdered < Test::Unit::TestCase
49
+
50
+ # Expect all queries before any updates
51
+
52
+ # All the query message must occur before any of the update
53
+ # messages.
54
+
55
+ def test_query_and_update
56
+ db = flexmock('db')
57
+ db.should_receive(:query).and_return([1,2,3]).ordered
58
+ db.should_receive(:update).and_return(nil).ordered
59
+
60
+ # test code here
61
+
62
+ db.query
63
+ db.update
64
+ end
65
+ end
66
+
67
+ class MoreOrdered < Test::Unit::TestCase
68
+
69
+ # Expect several queries with different parameters
70
+
71
+ # The queries should happen after startup but before finish. The
72
+ # queries themselves may happen in any order (because they are in
73
+ # the same order group). The first two queries should happen exactly
74
+ # once, but the third query (which matches any query call with a
75
+ # four character parameter) may be called multiple times (but at
76
+ # least once). Startup and finish must also happen exactly once.
77
+
78
+ # Also note that we use the <code>with</code> method to match
79
+ # different argument values to figure out what value to return.
80
+
81
+ def test_ordered_queries
82
+ db = flexmock('db')
83
+ db.should_receive(:startup).once.ordered
84
+ db.should_receive(:query).with("CPWR").and_return(12.3).
85
+ once.ordered(:queries)
86
+ db.should_receive(:query).with("MSFT").and_return(10.0).
87
+ once.ordered(:queries)
88
+ db.should_receive(:query).with(/^....$/).and_return(3.3).
89
+ at_least.once.ordered(:queries)
90
+ db.should_receive(:finish).once.ordered
91
+
92
+ # Test Code
93
+
94
+ db.startup
95
+ db.query("MSFT")
96
+ db.query("XYZY")
97
+ db.query("CPWR")
98
+ db.finish
99
+ end
100
+ end
101
+
102
+ class EvenMoreOrderedTest < Test::Unit::TestCase
103
+
104
+ # Same as above, but using the Record Mode interface
105
+
106
+ # The record mode interface offers much the same features as the
107
+ # <code>should_receive</code> interface introduced so far, but it
108
+ # allows the messages to be sent directly to a recording object
109
+ # rather than be specified indirectly using a symbol.
110
+
111
+
112
+ def test_ordered_queries_in_record_mode
113
+ db = flexmock('db')
114
+ db.should_expect do |rec|
115
+ rec.startup.once.ordered
116
+ rec.query("CPWR") { 12.3 }.once.ordered(:queries)
117
+ rec.query("MSFT") { 10.0 }.once.ordered(:queries)
118
+ rec.query(/^....$/) { 3.3 }.at_least.once.ordered(:queries)
119
+ rec.finish.once.ordered
120
+ end
121
+
122
+ # Test Code
123
+
124
+ db.startup
125
+ db.query("MSFT")
126
+ db.query("XYZY")
127
+ db.query("CPWR")
128
+ db.finish
129
+ end
130
+ end
131
+
132
+ class RecordedTest < Test::Unit::TestCase
133
+
134
+ # Using Record Mode to record a known, good algorithm for testing
135
+
136
+ # Record mode is nice when you have a known, good algorithm that can
137
+ # use a recording mock object to record the steps. Then you compare
138
+ # the execution of a new algorithm to behavior of the old using the
139
+ # recorded expectations in the mock. For this you probably want to
140
+ # put the recorder in _strict_ mode so that the recorded
141
+ # expectations use exact matching on argument lists, and strict
142
+ # ordering of the method calls.
143
+
144
+ # <b>Note:</b> This is most useful when there are no queries on the
145
+ # mock objects, because the query responses cannot be programmed
146
+ # into the recorder object.
147
+
148
+ def test_build_xml
149
+ builder = flexmock('builder')
150
+ builder.should_expect do |rec|
151
+ rec.should_be_strict
152
+ known_good_way_to_build_xml(rec) # record the messages
153
+ end
154
+ new_way_to_build_xml(builder) # compare to new way
155
+ end
156
+
157
+ def known_good_way_to_build_xml(builder)
158
+ builder.person
159
+ end
160
+
161
+ def new_way_to_build_xml(builder)
162
+ builder.person
163
+ end
164
+
165
+ end
166
+
167
+ class MultipleReturnValueTest < Test::Unit::TestCase
168
+
169
+ # Expect multiple calls, returning a different value each time
170
+
171
+ # Sometimes you need to return different values for each call to a
172
+ # mocked method. This example shifts values out of a list for this
173
+ # effect.
174
+
175
+ def test_multiple_gets
176
+ file = flexmock('file')
177
+ file.should_receive(:gets).with_no_args.
178
+ and_return("line 1\n", "line 2\n")
179
+
180
+ # test code here
181
+
182
+ file.gets # returns "line 1"
183
+ file.gets # returns "line 2"
184
+ end
185
+ end
186
+
187
+ class IgnoreUnimportantMessages < Test::Unit::TestCase
188
+
189
+ # Ignore uninteresting messages
190
+
191
+ # Generally you need to mock only those methods that return an
192
+ # interesting value or wish to assert were sent in a particular
193
+ # manner. Use the <code>should_ignore_missing</code> method to turn
194
+ # on missing method ignoring.
195
+
196
+ def test_an_important_message
197
+ m = flexmock('m')
198
+ m.should_receive(:an_important_message).and_return(1).once
199
+ m.should_ignore_missing
200
+
201
+ # Test Code
202
+
203
+ m.an_important_message
204
+ m.an_unimportant_message
205
+ end
206
+
207
+ # When <code>should_ignore_missing</code> is enabled, ignored
208
+ # missing methods will return an undefined object. Any operation on
209
+ # the undefined object will return the undefined object.
210
+
211
+ end
212
+
213
+ class PartialMockTest < Test::Unit::TestCase
214
+
215
+ # Mock just one method on an existing object
216
+
217
+ # The Portfolio class calculate the value of a set of stocks by
218
+ # talking to a quote service via a web service. Since we don't want
219
+ # to use a real web service in our unit tests, we will mock the
220
+ # quote service.
221
+
222
+ def test_portfolio_value
223
+ flexmock(QuoteService).new_instances do |m|
224
+ m.should_receive(:quote).and_return(100)
225
+ end
226
+ port = Portfolio.new
227
+ value = port.value # Portfolio calls QuoteService.quote
228
+ assert_equal 100, value
229
+ end
230
+
231
+ class QuoteService
232
+ end
233
+
234
+ class Portfolio
235
+ def value
236
+ qs = QuoteService.new
237
+ qs.quote
238
+ end
239
+ end
240
+ end
data/doc/jamis.rb ADDED
@@ -0,0 +1,591 @@
1
+ module RDoc
2
+ module Page
3
+
4
+ FONTS = "\"Bitstream Vera Sans\", Verdana, Arial, Helvetica, sans-serif"
5
+
6
+ STYLE = <<CSS
7
+ a {
8
+ color: #00F;
9
+ text-decoration: none;
10
+ }
11
+
12
+ a:hover {
13
+ color: #77F;
14
+ text-decoration: underline;
15
+ }
16
+
17
+ body, td, p {
18
+ font-family: %fonts%;
19
+ background: #FFF;
20
+ color: #000;
21
+ margin: 0px;
22
+ font-size: small;
23
+ }
24
+
25
+ #content {
26
+ margin: 2em;
27
+ }
28
+
29
+ #description p {
30
+ margin-bottom: 0.5em;
31
+ }
32
+
33
+ .sectiontitle {
34
+ margin-top: 1em;
35
+ margin-bottom: 1em;
36
+ padding: 0.5em;
37
+ padding-left: 2em;
38
+ background: #005;
39
+ color: #FFF;
40
+ font-weight: bold;
41
+ border: 1px dotted black;
42
+ }
43
+
44
+ .attr-rw {
45
+ padding-left: 1em;
46
+ padding-right: 1em;
47
+ text-align: center;
48
+ color: #055;
49
+ }
50
+
51
+ .attr-name {
52
+ font-weight: bold;
53
+ }
54
+
55
+ .attr-desc {
56
+ }
57
+
58
+ .attr-value {
59
+ font-family: monospace;
60
+ }
61
+
62
+ .file-title-prefix {
63
+ font-size: large;
64
+ }
65
+
66
+ .file-title {
67
+ font-size: large;
68
+ font-weight: bold;
69
+ background: #005;
70
+ color: #FFF;
71
+ }
72
+
73
+ .banner {
74
+ background: #005;
75
+ color: #FFF;
76
+ border: 1px solid black;
77
+ padding: 1em;
78
+ }
79
+
80
+ .banner td {
81
+ background: transparent;
82
+ color: #FFF;
83
+ }
84
+
85
+ h1 a, h2 a, .sectiontitle a, .banner a {
86
+ color: #FF0;
87
+ }
88
+
89
+ h1 a:hover, h2 a:hover, .sectiontitle a:hover, .banner a:hover {
90
+ color: #FF7;
91
+ }
92
+
93
+ .dyn-source {
94
+ display: none;
95
+ background: #FFE;
96
+ color: #000;
97
+ border: 1px dotted black;
98
+ margin: 0.5em 2em 0.5em 2em;
99
+ padding: 0.5em;
100
+ }
101
+
102
+ .dyn-source .cmt {
103
+ color: #00F;
104
+ font-style: italic;
105
+ }
106
+
107
+ .dyn-source .kw {
108
+ color: #070;
109
+ font-weight: bold;
110
+ }
111
+
112
+ .method {
113
+ margin-left: 1em;
114
+ margin-right: 1em;
115
+ margin-bottom: 1em;
116
+ }
117
+
118
+ .description pre {
119
+ padding: 0.5em;
120
+ border: 1px dotted black;
121
+ background: #FFE;
122
+ }
123
+
124
+ .method .title {
125
+ font-family: monospace;
126
+ font-size: large;
127
+ border-bottom: 1px dashed black;
128
+ margin-bottom: 0.3em;
129
+ padding-bottom: 0.1em;
130
+ }
131
+
132
+ .method .description, .method .sourcecode {
133
+ margin-left: 1em;
134
+ }
135
+
136
+ .description p, .sourcecode p {
137
+ margin-bottom: 0.5em;
138
+ }
139
+
140
+ .method .sourcecode p.source-link {
141
+ text-indent: 0em;
142
+ margin-top: 0.5em;
143
+ }
144
+
145
+ .method .aka {
146
+ margin-top: 0.3em;
147
+ margin-left: 1em;
148
+ font-style: italic;
149
+ text-indent: 2em;
150
+ }
151
+
152
+ h1 {
153
+ padding: 1em;
154
+ border: 1px solid black;
155
+ font-size: x-large;
156
+ font-weight: bold;
157
+ color: #FFF;
158
+ background: #007;
159
+ }
160
+
161
+ h2 {
162
+ padding: 0.5em 1em 0.5em 1em;
163
+ border: 1px solid black;
164
+ font-size: large;
165
+ font-weight: bold;
166
+ color: #FFF;
167
+ background: #009;
168
+ }
169
+
170
+ h3, h4, h5, h6 {
171
+ padding: 0.2em 1em 0.2em 1em;
172
+ border: 1px dashed black;
173
+ color: #000;
174
+ background: #AAF;
175
+ }
176
+
177
+ .sourcecode > pre {
178
+ padding: 0.5em;
179
+ border: 1px dotted black;
180
+ background: #FFE;
181
+ }
182
+
183
+ CSS
184
+
185
+ XHTML_PREAMBLE = %{<?xml version="1.0" encoding="%charset%"?>
186
+ <!DOCTYPE html
187
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
188
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
189
+ }
190
+
191
+ HEADER = XHTML_PREAMBLE + <<ENDHEADER
192
+ <html>
193
+ <head>
194
+ <title>%title%</title>
195
+ <meta http-equiv="Content-Type" content="text/html; charset=%charset%" />
196
+ <link rel="stylesheet" href="%style_url%" type="text/css" media="screen" />
197
+
198
+ <script language="JavaScript" type="text/javascript">
199
+ // <![CDATA[
200
+
201
+ function toggleSource( id )
202
+ {
203
+ var elem
204
+ var link
205
+
206
+ if( document.getElementById )
207
+ {
208
+ elem = document.getElementById( id )
209
+ link = document.getElementById( "l_" + id )
210
+ }
211
+ else if ( document.all )
212
+ {
213
+ elem = eval( "document.all." + id )
214
+ link = eval( "document.all.l_" + id )
215
+ }
216
+ else
217
+ return false;
218
+
219
+ if( elem.style.display == "block" )
220
+ {
221
+ elem.style.display = "none"
222
+ link.innerHTML = "show source"
223
+ }
224
+ else
225
+ {
226
+ elem.style.display = "block"
227
+ link.innerHTML = "hide source"
228
+ }
229
+ }
230
+
231
+ function openCode( url )
232
+ {
233
+ window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
234
+ }
235
+ // ]]>
236
+ </script>
237
+ </head>
238
+
239
+ <body>
240
+ ENDHEADER
241
+
242
+ FILE_PAGE = <<HTML
243
+ <table border='0' cellpadding='0' cellspacing='0' width="100%" class='banner'>
244
+ <tr><td>
245
+ <table width="100%" border='0' cellpadding='0' cellspacing='0'><tr>
246
+ <td class="file-title" colspan="2"><span class="file-title-prefix">File</span><br />%short_name%</td>
247
+ <td align="right">
248
+ <table border='0' cellspacing="0" cellpadding="2">
249
+ <tr>
250
+ <td>Path:</td>
251
+ <td>%full_path%
252
+ IF:cvsurl
253
+ &nbsp;(<a href="%cvsurl%">CVS</a>)
254
+ ENDIF:cvsurl
255
+ </td>
256
+ </tr>
257
+ <tr>
258
+ <td>Modified:</td>
259
+ <td>%dtm_modified%</td>
260
+ </tr>
261
+ </table>
262
+ </td></tr>
263
+ </table>
264
+ </td></tr>
265
+ </table><br>
266
+ HTML
267
+
268
+ ###################################################################
269
+
270
+ CLASS_PAGE = <<HTML
271
+ <table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
272
+ <td class="file-title"><span class="file-title-prefix">%classmod%</span><br />%full_name%</td>
273
+ <td align="right">
274
+ <table cellspacing=0 cellpadding=2>
275
+ <tr valign="top">
276
+ <td>In:</td>
277
+ <td>
278
+ START:infiles
279
+ HREF:full_path_url:full_path:
280
+ IF:cvsurl
281
+ &nbsp;(<a href="%cvsurl%">CVS</a>)
282
+ ENDIF:cvsurl
283
+ END:infiles
284
+ </td>
285
+ </tr>
286
+ IF:parent
287
+ <tr>
288
+ <td>Parent:</td>
289
+ <td>
290
+ IF:par_url
291
+ <a href="%par_url%">
292
+ ENDIF:par_url
293
+ %parent%
294
+ IF:par_url
295
+ </a>
296
+ ENDIF:par_url
297
+ </td>
298
+ </tr>
299
+ ENDIF:parent
300
+ </table>
301
+ </td>
302
+ </tr>
303
+ </table>
304
+ HTML
305
+
306
+ ###################################################################
307
+
308
+ METHOD_LIST = <<HTML
309
+ <div id="content">
310
+ IF:diagram
311
+ <table cellpadding='0' cellspacing='0' border='0' width="100%"><tr><td align="center">
312
+ %diagram%
313
+ </td></tr></table>
314
+ ENDIF:diagram
315
+
316
+ IF:description
317
+ <div class="description">%description%</div>
318
+ ENDIF:description
319
+
320
+ IF:requires
321
+ <div class="sectiontitle">Required Files</div>
322
+ <ul>
323
+ START:requires
324
+ <li>HREF:aref:name:</li>
325
+ END:requires
326
+ </ul>
327
+ ENDIF:requires
328
+
329
+ IF:toc
330
+ <div class="sectiontitle">Contents</div>
331
+ <ul>
332
+ START:toc
333
+ <li><a href="#%href%">%secname%</a></li>
334
+ END:toc
335
+ </ul>
336
+ ENDIF:toc
337
+
338
+ IF:methods
339
+ <div class="sectiontitle">Methods</div>
340
+ <ul>
341
+ START:methods
342
+ <li>HREF:aref:name:</li>
343
+ END:methods
344
+ </ul>
345
+ ENDIF:methods
346
+
347
+ IF:includes
348
+ <div class="sectiontitle">Included Modules</div>
349
+ <ul>
350
+ START:includes
351
+ <li>HREF:aref:name:</li>
352
+ END:includes
353
+ </ul>
354
+ ENDIF:includes
355
+
356
+ START:sections
357
+ IF:sectitle
358
+ <div class="sectiontitle"><a nem="%secsequence%">%sectitle%</a></div>
359
+ IF:seccomment
360
+ <div class="description">
361
+ %seccomment%
362
+ </div>
363
+ ENDIF:seccomment
364
+ ENDIF:sectitle
365
+
366
+ IF:classlist
367
+ <div class="sectiontitle">Classes and Modules</div>
368
+ %classlist%
369
+ ENDIF:classlist
370
+
371
+ IF:constants
372
+ <div class="sectiontitle">Constants</div>
373
+ <table border='0' cellpadding='5'>
374
+ START:constants
375
+ <tr valign='top'>
376
+ <td class="attr-name">%name%</td>
377
+ <td>=</td>
378
+ <td class="attr-value">%value%</td>
379
+ </tr>
380
+ IF:desc
381
+ <tr valign='top'>
382
+ <td>&nbsp;</td>
383
+ <td colspan="2" class="attr-desc">%desc%</td>
384
+ </tr>
385
+ ENDIF:desc
386
+ END:constants
387
+ </table>
388
+ ENDIF:constants
389
+
390
+ IF:attributes
391
+ <div class="sectiontitle">Attributes</div>
392
+ <table border='0' cellpadding='5'>
393
+ START:attributes
394
+ <tr valign='top'>
395
+ <td class='attr-rw'>
396
+ IF:rw
397
+ [%rw%]
398
+ ENDIF:rw
399
+ </td>
400
+ <td class='attr-name'>%name%</td>
401
+ <td class='attr-desc'>%a_desc%</td>
402
+ </tr>
403
+ END:attributes
404
+ </table>
405
+ ENDIF:attributes
406
+
407
+ IF:method_list
408
+ START:method_list
409
+ IF:methods
410
+ <div class="sectiontitle">%type% %category% methods</div>
411
+ START:methods
412
+ <div class="method">
413
+ <div class="title">
414
+ IF:callseq
415
+ <a name="%aref%"></a><b>%callseq%</b>
416
+ ENDIF:callseq
417
+ IFNOT:callseq
418
+ <a name="%aref%"></a><b>%name%</b>%params%
419
+ ENDIF:callseq
420
+ IF:codeurl
421
+ [ <a href="javascript:openCode('%codeurl%')">source</a> ]
422
+ ENDIF:codeurl
423
+ </div>
424
+ IF:m_desc
425
+ <div class="description">
426
+ %m_desc%
427
+ </div>
428
+ ENDIF:m_desc
429
+ IF:aka
430
+ <div class="aka">
431
+ This method is also aliased as
432
+ START:aka
433
+ <a href="%aref%">%name%</a>
434
+ END:aka
435
+ </div>
436
+ ENDIF:aka
437
+ IF:sourcecode
438
+ <div class="sourcecode">
439
+ <p class="source-link">[ <a href="javascript:toggleSource('%aref%_source')" id="l_%aref%_source">show source</a> ]</p>
440
+ <div id="%aref%_source" class="dyn-source">
441
+ <pre>
442
+ %sourcecode%
443
+ </pre>
444
+ </div>
445
+ </div>
446
+ ENDIF:sourcecode
447
+ </div>
448
+ END:methods
449
+ ENDIF:methods
450
+ END:method_list
451
+ ENDIF:method_list
452
+ END:sections
453
+ </div>
454
+ HTML
455
+
456
+ FOOTER = <<ENDFOOTER
457
+ </body>
458
+ </html>
459
+ ENDFOOTER
460
+
461
+ BODY = HEADER + <<ENDBODY
462
+ !INCLUDE! <!-- banner header -->
463
+
464
+ <div id="bodyContent">
465
+ #{METHOD_LIST}
466
+ </div>
467
+
468
+ #{FOOTER}
469
+ ENDBODY
470
+
471
+ ########################## Source code ##########################
472
+
473
+ SRC_PAGE = XHTML_PREAMBLE + <<HTML
474
+ <html>
475
+ <head><title>%title%</title>
476
+ <meta http-equiv="Content-Type" content="text/html; charset=%charset%">
477
+ <style>
478
+ .ruby-comment { color: green; font-style: italic }
479
+ .ruby-constant { color: #4433aa; font-weight: bold; }
480
+ .ruby-identifier { color: #222222; }
481
+ .ruby-ivar { color: #2233dd; }
482
+ .ruby-keyword { color: #3333FF; font-weight: bold }
483
+ .ruby-node { color: #777777; }
484
+ .ruby-operator { color: #111111; }
485
+ .ruby-regexp { color: #662222; }
486
+ .ruby-value { color: #662222; font-style: italic }
487
+ .kw { color: #3333FF; font-weight: bold }
488
+ .cmt { color: green; font-style: italic }
489
+ .str { color: #662222; font-style: italic }
490
+ .re { color: #662222; }
491
+ </style>
492
+ </head>
493
+ <body bgcolor="white">
494
+ <pre>%code%</pre>
495
+ </body>
496
+ </html>
497
+ HTML
498
+
499
+ ########################## Index ################################
500
+
501
+ FR_INDEX_BODY = <<HTML
502
+ !INCLUDE!
503
+ HTML
504
+
505
+ FILE_INDEX = XHTML_PREAMBLE + <<HTML
506
+ <html>
507
+ <head>
508
+ <meta http-equiv="Content-Type" content="text/html; charset=%charset%">
509
+ <style>
510
+ <!--
511
+ body {
512
+ background-color: #EEE;
513
+ font-family: #{FONTS};
514
+ color: #000;
515
+ margin: 0px;
516
+ }
517
+ .banner {
518
+ background: #005;
519
+ color: #FFF;
520
+ padding: 0.2em;
521
+ font-size: small;
522
+ font-weight: bold;
523
+ text-align: center;
524
+ }
525
+ .entries {
526
+ margin: 0.25em 1em 0 1em;
527
+ font-size: x-small;
528
+ }
529
+ a {
530
+ color: #00F;
531
+ text-decoration: none;
532
+ white-space: nowrap;
533
+ }
534
+ a:hover {
535
+ color: #77F;
536
+ text-decoration: underline;
537
+ }
538
+ -->
539
+ </style>
540
+ <base target="docwin">
541
+ </head>
542
+ <body>
543
+ <div class="banner">%list_title%</div>
544
+ <div class="entries">
545
+ START:entries
546
+ <a href="%href%">%name%</a><br>
547
+ END:entries
548
+ </div>
549
+ </body></html>
550
+ HTML
551
+
552
+ CLASS_INDEX = FILE_INDEX
553
+ METHOD_INDEX = FILE_INDEX
554
+
555
+ INDEX = XHTML_PREAMBLE + <<HTML
556
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
557
+ <head>
558
+ <title>%title%</title>
559
+ <meta http-equiv="Content-Type" content="text/html; charset=%charset%">
560
+ </head>
561
+
562
+ <frameset cols="20%,*">
563
+ <frameset rows="15%,35%,50%">
564
+ <frame src="fr_file_index.html" title="Files" name="Files" />
565
+ <frame src="fr_class_index.html" name="Classes" />
566
+ <frame src="fr_method_index.html" name="Methods" />
567
+ </frameset>
568
+ IF:inline_source
569
+ <frame src="%initial_page%" name="docwin">
570
+ ENDIF:inline_source
571
+ IFNOT:inline_source
572
+ <frameset rows="80%,20%">
573
+ <frame src="%initial_page%" name="docwin">
574
+ <frame src="blank.html" name="source">
575
+ </frameset>
576
+ ENDIF:inline_source
577
+ <noframes>
578
+ <body bgcolor="white">
579
+ Click <a href="html/index.html">here</a> for a non-frames
580
+ version of this page.
581
+ </body>
582
+ </noframes>
583
+ </frameset>
584
+
585
+ </html>
586
+ HTML
587
+
588
+ end
589
+ end
590
+
591
+