rack 1.4.1 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rack might be problematic. Click here for more details.

Files changed (81) hide show
  1. data/COPYING +1 -1
  2. data/KNOWN-ISSUES +9 -0
  3. data/README.rdoc +72 -7
  4. data/Rakefile +18 -11
  5. data/SPEC +3 -1
  6. data/contrib/rack.png +0 -0
  7. data/contrib/rack.svg +150 -0
  8. data/contrib/rdoc.css +412 -0
  9. data/lib/rack/auth/basic.rb +1 -1
  10. data/lib/rack/auth/digest/nonce.rb +1 -1
  11. data/lib/rack/backports/uri/common_18.rb +14 -28
  12. data/lib/rack/backports/uri/common_192.rb +14 -17
  13. data/lib/rack/backports/uri/common_193.rb +29 -0
  14. data/lib/rack/body_proxy.rb +10 -0
  15. data/lib/rack/builder.rb +1 -1
  16. data/lib/rack/cascade.rb +11 -0
  17. data/lib/rack/commonlogger.rb +18 -5
  18. data/lib/rack/deflater.rb +5 -1
  19. data/lib/rack/directory.rb +1 -1
  20. data/lib/rack/etag.rb +6 -3
  21. data/lib/rack/file.rb +13 -4
  22. data/lib/rack/head.rb +1 -0
  23. data/lib/rack/lint.rb +3 -1
  24. data/lib/rack/lock.rb +3 -4
  25. data/lib/rack/mime.rb +1 -1
  26. data/lib/rack/mock.rb +3 -2
  27. data/lib/rack/multipart.rb +2 -2
  28. data/lib/rack/multipart/parser.rb +6 -4
  29. data/lib/rack/reloader.rb +1 -1
  30. data/lib/rack/request.rb +2 -4
  31. data/lib/rack/response.rb +2 -1
  32. data/lib/rack/server.rb +28 -2
  33. data/lib/rack/session/abstract/id.rb +5 -0
  34. data/lib/rack/session/cookie.rb +9 -0
  35. data/lib/rack/static.rb +90 -8
  36. data/lib/rack/utils.rb +17 -10
  37. data/rack.gemspec +3 -3
  38. data/test/builder/line.ru +1 -0
  39. data/test/cgi/assets/folder/test.js +1 -0
  40. data/test/cgi/assets/fonts/font.eot +1 -0
  41. data/test/cgi/assets/images/image.png +1 -0
  42. data/test/cgi/assets/index.html +1 -0
  43. data/test/cgi/assets/javascripts/app.js +1 -0
  44. data/test/cgi/assets/stylesheets/app.css +1 -0
  45. data/test/spec_auth_basic.rb +8 -0
  46. data/test/spec_auth_digest.rb +14 -0
  47. data/test/spec_body_proxy.rb +4 -0
  48. data/test/spec_builder.rb +7 -1
  49. data/test/spec_cascade.rb +8 -0
  50. data/test/spec_chunked.rb +6 -6
  51. data/test/spec_config.rb +0 -1
  52. data/test/spec_content_length.rb +26 -13
  53. data/test/spec_content_type.rb +15 -5
  54. data/test/spec_deflater.rb +35 -17
  55. data/test/spec_directory.rb +20 -1
  56. data/test/spec_etag.rb +29 -13
  57. data/test/spec_file.rb +42 -25
  58. data/test/spec_head.rb +25 -7
  59. data/test/spec_lobster.rb +20 -5
  60. data/test/spec_lock.rb +46 -21
  61. data/test/spec_logger.rb +2 -7
  62. data/test/spec_methodoverride.rb +21 -22
  63. data/test/spec_mock.rb +12 -7
  64. data/test/spec_multipart.rb +29 -0
  65. data/test/spec_nulllogger.rb +13 -2
  66. data/test/spec_recursive.rb +12 -9
  67. data/test/spec_request.rb +2 -2
  68. data/test/spec_response.rb +30 -0
  69. data/test/spec_runtime.rb +15 -5
  70. data/test/spec_sendfile.rb +11 -8
  71. data/test/spec_server.rb +47 -0
  72. data/test/spec_session_cookie.rb +68 -1
  73. data/test/spec_session_memcache.rb +10 -8
  74. data/test/spec_session_pool.rb +13 -10
  75. data/test/spec_showexceptions.rb +9 -4
  76. data/test/spec_showstatus.rb +10 -5
  77. data/test/spec_static.rb +85 -9
  78. data/test/spec_urlmap.rb +10 -10
  79. data/test/spec_utils.rb +14 -1
  80. data/test/static/another/index.html +1 -0
  81. metadata +21 -8
data/COPYING CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007, 2008, 2009, 2010 Christian Neukirchen <purl.org/net/chneukirchen>
1
+ Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012 Christian Neukirchen <purl.org/net/chneukirchen>
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to
@@ -1,3 +1,12 @@
1
+ = Known issues with Rack and ECMA-262
2
+
3
+ * Many users expect the escape() function defined in ECMA-262 to be compatible
4
+ with URI. Confusion is especially strong because the documentation for the
5
+ escape function includes a reference to the URI specifications. ECMA-262
6
+ escape is not however a URI escape function, it is a javascript escape
7
+ function, and is not fully compatible. Most notably, for characters outside of
8
+ the BMP. Users should use the more correct encodeURI functions.
9
+
1
10
  = Known issues with Rack and Web servers
2
11
 
3
12
  * Lighttpd sets wrong SCRIPT_NAME and PATH_INFO if you mount your
@@ -27,8 +27,11 @@ These web servers include Rack handlers in their distributions:
27
27
  * Fuzed
28
28
  * Glassfish v3
29
29
  * Phusion Passenger (which is mod_rack for Apache and for nginx)
30
+ * Puma
30
31
  * Rainbows!
31
32
  * Unicorn
33
+ * unixrack
34
+ * uWSGI
32
35
  * Zbatery
33
36
 
34
37
  Any valid Rack app will run the same on all these handlers, without
@@ -132,7 +135,11 @@ at my site:
132
135
 
133
136
  Testing Rack requires the bacon testing framework:
134
137
 
135
- gem install bacon
138
+ bundle install --without extra # to be able to run the fast tests
139
+
140
+ Or:
141
+
142
+ bundle install # this assumes that you have installed native extensions!
136
143
 
137
144
  There are two rake-based test tasks:
138
145
 
@@ -355,7 +362,7 @@ run on port 11211) and memcache-client installed.
355
362
  * July 16, 2011: Sixteenth public release 1.3.2
356
363
  * Fix for Rails and rack-test, Rack::Utils#escape calls to_s
357
364
 
358
- * Not Yet Released: Seventeenth public release 1.3.3
365
+ * September 16, 2011: Seventeenth public release 1.3.3
359
366
  * Fix bug with broken query parameters in Rack::ShowExceptions
360
367
  * Rack::Request#cookies no longer swallows exceptions on broken input
361
368
  * Prevents XSS attacks enabled by bug in Ruby 1.8's regexp engine
@@ -373,6 +380,10 @@ run on port 11211) and memcache-client installed.
373
380
  * October 17, 2011: Twentieth public release 1.3.5
374
381
  * Fix annoying warnings caused by the backport in 1.3.4
375
382
 
383
+ * December 28th, 2011: Twenty first public release: 1.1.3.
384
+ * Security fix. http://www.ocert.org/advisories/ocert-2011-003.html
385
+ Further information here: http://jruby.org/2011/12/27/jruby-1-6-5-1
386
+
376
387
  * December 28th, 2011: Twenty fourth public release 1.4.0
377
388
  * Ruby 1.8.6 support has officially been dropped. Not all tests pass.
378
389
  * Raise sane error messages for broken config.ru
@@ -394,20 +405,74 @@ run on port 11211) and memcache-client installed.
394
405
 
395
406
  * January 22nd, 2012: Twenty fifth public release 1.4.1
396
407
  * Alter the keyspace limit calculations to reduce issues with nested params
397
- * Add a workaround for multipart parsing where files contian unescaped "%"
408
+ * Add a workaround for multipart parsing where files contain unescaped "%"
398
409
  * Added Rack::Response::Helpers#method_not_allowed? (code 405)
399
- * Rack::File now returns 404's for illegal directory traversals
400
- * Rack::File now returns 405's for illegal methods (non HEAD/GET)
410
+ * Rack::File now returns 404 for illegal directory traversals
411
+ * Rack::File now returns 405 for illegal methods (non HEAD/GET)
401
412
  * Rack::Cascade now catches 405 by default, as well as 404
402
413
  * Cookies missing '--' no longer cause an exception to be raised
403
414
  * Various style changes and documentation spelling errors
404
- * Rack::BodyProxy always ensures to execute it's block
415
+ * Rack::BodyProxy always ensures to execute its block
405
416
  * Additional test coverage around cookies and secrets
406
417
  * Rack::Session::Cookie can now be supplied either secret or old_secret
407
418
  * Tests are no longer dependent on set order
408
419
  * Rack::Static no longer defaults to serving index files
409
420
  * Rack.release was fixed
410
421
 
422
+ * January 6th, 2013: Twenty sixth public release 1.1.4
423
+ * Add warnings when users do not provide a session secret
424
+
425
+ * January 6th, 2013: Twenty seventh public release 1.2.6
426
+ * Add warnings when users do not provide a session secret
427
+ * Fix parsing performance for unquoted filenames
428
+
429
+ * January 6th, 2013: Twenty eighth public release 1.3.7
430
+ * Add warnings when users do not provide a session secret
431
+ * Fix parsing performance for unquoted filenames
432
+ * Updated URI backports
433
+ * Fix URI backport version matching, and silence constant warnings
434
+ * Correct parameter parsing with empty values
435
+ * Correct rackup '-I' flag, to allow multiple uses
436
+ * Correct rackup pidfile handling
437
+ * Report rackup line numbers correctly
438
+ * Fix request loops caused by non-stale nonces with time limits
439
+ * Fix reloader on Windows
440
+ * Prevent infinite recursions from Response#to_ary
441
+ * Various middleware better conforms to the body close specification
442
+ * Updated language for the body close specification
443
+ * Additional notes regarding ECMA escape compatibility issues
444
+ * Fix the parsing of multiple ranges in range headers
445
+
446
+ * January 6th, 2013: Twenty ninth public release 1.4.2
447
+ * Add warnings when users do not provide a session secret
448
+ * Fix parsing performance for unquoted filenames
449
+ * Updated URI backports
450
+ * Fix URI backport version matching, and silence constant warnings
451
+ * Correct parameter parsing with empty values
452
+ * Correct rackup '-I' flag, to allow multiple uses
453
+ * Correct rackup pidfile handling
454
+ * Report rackup line numbers correctly
455
+ * Fix request loops caused by non-stale nonces with time limits
456
+ * Fix reloader on Windows
457
+ * Prevent infinite recursions from Response#to_ary
458
+ * Various middleware better conforms to the body close specification
459
+ * Updated language for the body close specification
460
+ * Additional notes regarding ECMA escape compatibility issues
461
+ * Fix the parsing of multiple ranges in range headers
462
+ * Prevent errors from empty parameter keys
463
+ * Added PATCH verb to Rack::Request
464
+ * Various documentation updates
465
+ * Fix session merge semantics (fixes rack-test)
466
+ * Rack::Static :index can now handle multiple directories
467
+ * All tests now utilize Rack::Lint (special thanks to Lars Gierth)
468
+ * Rack::File cache_control parameter is now deprecated, and removed by 1.5
469
+ * Correct Rack::Directory script name escaping
470
+ * Rack::Static supports header rules for sophisticated configurations
471
+ * Multipart parsing now works without a Content-Length header
472
+ * New logos courtesy of Zachary Scott!
473
+ * Rack::BodyProxy now explicitly defines #each, useful for C extensions
474
+ * Cookies that are not URI escaped no longer cause exceptions
475
+
411
476
  == Contact
412
477
 
413
478
  Please post bugs, suggestions and patches to
@@ -488,7 +553,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
488
553
 
489
554
  == Links
490
555
 
491
- Rack:: <http://rack.rubyforge.org/>
556
+ Rack:: <http://rack.github.com/>
492
557
  Official Rack repositories:: <http://github.com/rack>
493
558
  Rack Bug Tracking:: <http://github.com/rack/rack/issues>
494
559
  rack-devel mailing list:: <http://groups.google.com/group/rack-devel>
data/Rakefile CHANGED
@@ -11,12 +11,12 @@ task :deps do
11
11
  reqs = dep.requirements_list
12
12
  reqs = (["-v"] * reqs.size).zip(reqs).flatten
13
13
  # Use system over sh, because we want to ignore errors!
14
- system "gem", "install", '--conservative', dep.name, *reqs
14
+ system Gem.ruby, "-S", "gem", "install", '--conservative', dep.name, *reqs
15
15
  end
16
16
  end
17
17
 
18
18
  desc "Make an archive as .tar.gz"
19
- task :dist => [:chmod, :changelog, :rdoc, "SPEC"] do
19
+ task :dist => %w[chmod ChangeLog SPEC rdoc] do
20
20
  sh "git archive --format=tar --prefix=#{release}/ HEAD^{tree} >#{release}.tar"
21
21
  sh "pax -waf #{release}.tar -s ':^:#{release}/:' SPEC ChangeLog doc rack.gemspec"
22
22
  sh "gzip -f -9 #{release}.tar"
@@ -31,7 +31,7 @@ task :officialrelease do
31
31
  sh "mv stage/#{release}.tar.gz stage/#{release}.gem ."
32
32
  end
33
33
 
34
- task :officialrelease_really => ["SPEC", :dist, :gem] do
34
+ task :officialrelease_really => %w[SPEC dist gem] do
35
35
  sh "sha1sum #{release}.tar.gz #{release}.gem"
36
36
  end
37
37
 
@@ -46,7 +46,10 @@ task :chmod do
46
46
  end
47
47
 
48
48
  desc "Generate a ChangeLog"
49
- task :changelog do
49
+ task :changelog => %w[ChangeLog]
50
+
51
+ file '.git/index'
52
+ file "ChangeLog" => '.git/index' do
50
53
  File.open("ChangeLog", "w") { |out|
51
54
  `git log -z`.split("\0").map { |chunk|
52
55
  author = chunk[/Author: (.*)/, 1].strip
@@ -63,7 +66,6 @@ task :changelog do
63
66
  }
64
67
  end
65
68
 
66
-
67
69
  file 'lib/rack/lint.rb'
68
70
  desc "Generate Rack Specification"
69
71
  file "SPEC" => 'lib/rack/lint.rb' do
@@ -99,17 +101,22 @@ task :gem => ["SPEC"] do
99
101
  sh "gem build rack.gemspec"
100
102
  end
101
103
 
104
+ task :doc => :rdoc
102
105
  desc "Generate RDoc documentation"
103
- task :rdoc => ["SPEC"] do
106
+ task :rdoc => %w[ChangeLog SPEC] do
104
107
  sh(*%w{rdoc --line-numbers --main README.rdoc
105
108
  --title 'Rack\ Documentation' --charset utf-8 -U -o doc} +
106
- %w{README.rdoc KNOWN-ISSUES SPEC} +
107
- Dir["lib/**/*.rb"])
109
+ %w{README.rdoc KNOWN-ISSUES SPEC ChangeLog} +
110
+ `git ls-files lib/\*\*/\*.rb`.strip.split)
111
+ cp "contrib/rdoc.css", "doc/rdoc.css"
112
+ end
113
+
114
+ task :pushdoc => %w[rdoc] do
115
+ sh "rsync -avz doc/ rack.rubyforge.org:/var/www/gforge-projects/rack/doc/"
108
116
  end
109
117
 
110
- task :pushsite => [:rdoc] do
118
+ task :pushsite => %w[pushdoc] do
111
119
  sh "cd site && git gc"
112
- sh "rsync -avz doc/ chneukirchen@rack.rubyforge.org:/var/www/gforge-projects/rack/doc/"
113
- sh "rsync -avz site/ chneukirchen@rack.rubyforge.org:/var/www/gforge-projects/rack/"
120
+ sh "rsync -avz site/ rack.rubyforge.org:/var/www/gforge-projects/rack/"
114
121
  sh "cd site && git push"
115
122
  end
data/SPEC CHANGED
@@ -156,7 +156,9 @@ The Body must respond to +each+
156
156
  and must only yield String values.
157
157
  The Body itself should not be an instance of String, as this will
158
158
  break in Ruby 1.9.
159
- If the Body responds to +close+, it will be called after iteration.
159
+ If the Body responds to +close+, it will be called after iteration. If
160
+ the body is replaced by a middleware after action, the original body
161
+ must be closed first, if it repsonds to close.
160
162
  If the Body responds to +to_path+, it must return a String
161
163
  identifying the location of a file whose contents are identical
162
164
  to that produced by calling +each+; this may be used by the
Binary file
@@ -0,0 +1,150 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
6
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
7
+ xmlns:cc="http://creativecommons.org/ns#"
8
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
9
+ xmlns:svg="http://www.w3.org/2000/svg"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
+ width="744.09448819"
14
+ height="1052.3622047"
15
+ id="svg2"
16
+ version="1.1"
17
+ inkscape:version="0.48.3.1 r9886"
18
+ sodipodi:docname="rack.svg">
19
+ <defs
20
+ id="defs4">
21
+ <linearGradient
22
+ id="linearGradient3837"
23
+ osb:paint="solid">
24
+ <stop
25
+ style="stop-color:#000000;stop-opacity:1;"
26
+ offset="0"
27
+ id="stop3839" />
28
+ </linearGradient>
29
+ </defs>
30
+ <sodipodi:namedview
31
+ id="base"
32
+ pagecolor="#ffffff"
33
+ bordercolor="#666666"
34
+ borderopacity="1.0"
35
+ inkscape:pageopacity="0.0"
36
+ inkscape:pageshadow="2"
37
+ inkscape:zoom="0.98994949"
38
+ inkscape:cx="230.49849"
39
+ inkscape:cy="656.46253"
40
+ inkscape:document-units="px"
41
+ inkscape:current-layer="layer1"
42
+ showgrid="false"
43
+ showguides="false"
44
+ inkscape:guide-bbox="true"
45
+ inkscape:window-width="1920"
46
+ inkscape:window-height="1056"
47
+ inkscape:window-x="1920"
48
+ inkscape:window-y="24"
49
+ inkscape:window-maximized="1">
50
+ <sodipodi:guide
51
+ orientation="1,0"
52
+ position="645.99255,757.10933"
53
+ id="guide2995" />
54
+ <sodipodi:guide
55
+ orientation="1,0"
56
+ position="488.40876,686.90373"
57
+ id="guide2997" />
58
+ <sodipodi:guide
59
+ orientation="1,0"
60
+ position="176.7767,748.52304"
61
+ id="guide2999" />
62
+ <sodipodi:guide
63
+ orientation="1,0"
64
+ position="355.71429,782.85714"
65
+ id="guide3005" />
66
+ <sodipodi:guide
67
+ orientation="0,1"
68
+ position="527.14286,642.85714"
69
+ id="guide3007" />
70
+ <sodipodi:guide
71
+ orientation="0,1"
72
+ position="431.42857,507.85714"
73
+ id="guide3009" />
74
+ <sodipodi:guide
75
+ orientation="0,1"
76
+ position="488.40876,783.57143"
77
+ id="guide3011" />
78
+ <sodipodi:guide
79
+ orientation="0,1"
80
+ position="505,372.85714"
81
+ id="guide3013" />
82
+ </sodipodi:namedview>
83
+ <metadata
84
+ id="metadata7">
85
+ <rdf:RDF>
86
+ <cc:Work
87
+ rdf:about="">
88
+ <dc:format>image/svg+xml</dc:format>
89
+ <dc:type
90
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
91
+ <dc:title></dc:title>
92
+ </cc:Work>
93
+ </rdf:RDF>
94
+ </metadata>
95
+ <g
96
+ inkscape:label="Layer 1"
97
+ inkscape:groupmode="layer"
98
+ id="layer1">
99
+ <path
100
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
101
+ d="m 176.28125,201.03125 0,0.625 0,395.125 0,0.375 0.34375,0.0937 312.34375,91.6875 0.625,0.1875 0,-0.65625 0.125,-419.09375 0,-0.40625 -0.40625,-0.0937 -312.4375,-67.71875 -0.59375,-0.125 z m 1,1.21875 311.4375,67.5 -0.125,418.0625 -311.3125,-91.375 0,-394.1875 z"
102
+ id="path2985"
103
+ inkscape:connector-curvature="0" />
104
+ <path
105
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
106
+ d="m 647.21875,206.59375 -0.6875,0.28125 -157.59375,62.21875 -0.3125,0.125 0,0.34375 0.1875,419.125 0,0.75 0.6875,-0.28125 156.0625,-63.1875 0.3125,-0.125 0,-0.34375 1.34375,-418.15625 0,-0.75 z m -1,1.4375 -1.34375,417.125 -155.0625,62.78125 -0.1875,-418.03125 156.59375,-61.875 z"
107
+ id="path2993"
108
+ inkscape:connector-curvature="0" />
109
+ <path
110
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
111
+ d="m 355.6875,137.40625 -0.15625,0.0625 L 176.96875,201.0625 177.3125,202 355.75,138.4375 646.78125,207.53125 647,206.5625 l -291.15625,-69.125 -0.15625,-0.0312 z"
112
+ id="path3003"
113
+ inkscape:connector-curvature="0" />
114
+ <path
115
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
116
+ d="m 355.71875,277.53125 -0.125,0.0312 -178.9375,47.96875 -1.8125,0.46875 1.8125,0.5 311.625,83.5 0.15625,0.0312 0.125,-0.0625 157.59375,-53.65625 1.5625,-0.53125 -1.59375,-0.4375 -290.28125,-77.78125 -0.125,-0.0312 z m 0,1.03125 L 644.3125,355.90625 488.375,409 178.71875,326 l 177,-47.4375 z"
117
+ id="path3015"
118
+ inkscape:connector-curvature="0" />
119
+ <path
120
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
121
+ d="m 355.21875,240.9375 0,37.125 1,0 0,-37.125 -1,0 z"
122
+ id="path3017"
123
+ inkscape:connector-curvature="0" />
124
+ <path
125
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
126
+ d="m 176.28125,202.65625 0,393.28125 1,0 0,-393.28125 -1,0 z"
127
+ id="path3019"
128
+ inkscape:connector-curvature="0" />
129
+ <path
130
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
131
+ d="m 355.71875,409 -0.125,0.0312 L 177,455.8125 l -1.78125,0.46875 1.78125,0.5 L 488.28125,545 l 0.15625,0.0312 0.125,-0.0625 156.71875,-56.25 1.46875,-0.53125 -1.53125,-0.40625 -289.375,-78.75 -0.125,-0.0312 z m 0,1.03125 287.6875,78.28125 L 488.375,544 179.03125,456.3125 355.71875,410.03125 z"
132
+ id="path3021"
133
+ inkscape:connector-curvature="0" />
134
+ <path
135
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
136
+ d="m 355.71875,544 -0.15625,0.0312 -178.5625,52.3125 0.28125,0.96875 178.4375,-52.28125 289.59375,80.25 0.28125,-0.96875 -289.75,-80.28125 -0.125,-0.0312 z"
137
+ id="path3023"
138
+ inkscape:connector-curvature="0" />
139
+ <path
140
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
141
+ d="m 355.21875,374.34375 0,35.15625 1,0 0,-35.15625 -1,0 z"
142
+ id="path3025"
143
+ inkscape:connector-curvature="0" />
144
+ <path
145
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
146
+ d="m 355.1875,507.03125 0,37.4375 1.03125,0 0,-37.4375 -1.03125,0 z"
147
+ id="path3027"
148
+ inkscape:connector-curvature="0" />
149
+ </g>
150
+ </svg>
@@ -0,0 +1,412 @@
1
+ /* Forked from the Darkfish templates rdoc.css file, much hacked, probably
2
+ * imperfect */
3
+
4
+ html { max-width: 960px; margin: 0 auto; }
5
+ body {
6
+ font: 14px "Helvetica Neue", Helvetica, Tahoma, sans-serif;
7
+ }
8
+ body.file-popup {
9
+ font-size: 90%;
10
+ margin-left: 0;
11
+ }
12
+
13
+ h1 {
14
+ color: #4183C4;
15
+ }
16
+
17
+ :link,
18
+ :visited {
19
+ color: #4183C4;
20
+ text-decoration: none;
21
+ }
22
+ :link:hover,
23
+ :visited:hover {
24
+ border-bottom: 1px dotted #4183C4;
25
+ }
26
+
27
+ pre, pre.description {
28
+ font: 12px Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;
29
+ padding: 1em;
30
+ overflow: auto;
31
+ line-height: 1.4;
32
+ }
33
+
34
+ /* @group Generic Classes */
35
+
36
+ .initially-hidden {
37
+ display: none;
38
+ }
39
+
40
+ #search-field {
41
+ width: 98%;
42
+ }
43
+
44
+ .missing-docs {
45
+ font-size: 120%;
46
+ background: white url(images/wrench_orange.png) no-repeat 4px center;
47
+ color: #ccc;
48
+ line-height: 2em;
49
+ border: 1px solid #d00;
50
+ opacity: 1;
51
+ text-indent: 24px;
52
+ letter-spacing: 3px;
53
+ font-weight: bold;
54
+ -webkit-border-radius: 5px;
55
+ -moz-border-radius: 5px;
56
+ }
57
+
58
+ .target-section {
59
+ border: 2px solid #dcce90;
60
+ border-left-width: 8px;
61
+ background: #fff3c2;
62
+ }
63
+
64
+ /* @end */
65
+
66
+ /* @group Index Page, Standalone file pages */
67
+ .indexpage ul {
68
+ line-height: 160%;
69
+ list-style: none;
70
+ }
71
+ .indexpage ul :link,
72
+ .indexpage ul :visited {
73
+ font-size: 16px;
74
+ }
75
+
76
+ .indexpage li {
77
+ padding-left: 20px;
78
+ }
79
+
80
+ .indexpage ul > li {
81
+ background: url(images/bullet_black.png) no-repeat left 4px;
82
+ }
83
+ .indexpage li.method {
84
+ background: url(images/plugin.png) no-repeat left 4px;
85
+ }
86
+ .indexpage li.module {
87
+ background: url(images/package.png) no-repeat left 4px;
88
+ }
89
+ .indexpage li.class {
90
+ background: url(images/ruby.png) no-repeat left 4px;
91
+ }
92
+ .indexpage li.file {
93
+ background: url(images/page_white_text.png) no-repeat left 4px;
94
+ }
95
+ .indexpage li li {
96
+ background: url(images/tag_blue.png) no-repeat left 4px;
97
+ }
98
+ .indexpage li .toc-toggle {
99
+ width: 16px;
100
+ height: 16px;
101
+ background: url(images/add.png) no-repeat;
102
+ }
103
+
104
+ .indexpage li .toc-toggle.open {
105
+ background: url(images/delete.png) no-repeat;
106
+ }
107
+
108
+ /* @end */
109
+
110
+ /* @group Top-Level Structure */
111
+
112
+ .project-section, #file-metadata, #class-metadata {
113
+ display: block;
114
+ background: #f5f5f5;
115
+ margin-bottom: 1em;
116
+ padding: 0.5em;
117
+ }
118
+ .project-section h3, #file-metadata h3, #class-metadata h3 {
119
+ margin: 0;
120
+ }
121
+
122
+ #metadata {
123
+ float: left;
124
+ width: 280px;
125
+ }
126
+
127
+ #documentation {
128
+ margin: 2em 1em 2em 300px;
129
+ }
130
+
131
+ #validator-badges {
132
+ clear: both;
133
+ margin: 1em 1em 2em;
134
+ font-size: smaller;
135
+ }
136
+
137
+ /* @end */
138
+
139
+ /* @group Metadata Section */
140
+
141
+ #metadata ul,
142
+ #metadata dl,
143
+ #metadata p {
144
+ padding: 0px;
145
+ list-style: none;
146
+ }
147
+
148
+ dl.svninfo {
149
+ color: #666;
150
+ margin: 0;
151
+ }
152
+ dl.svninfo dt {
153
+ font-weight: bold;
154
+ }
155
+
156
+ ul.link-list li {
157
+ white-space: nowrap;
158
+ }
159
+ ul.link-list .type {
160
+ font-size: 8px;
161
+ text-transform: uppercase;
162
+ color: white;
163
+ background: #969696;
164
+ }
165
+
166
+ /* @end */
167
+
168
+ /* @group Documentation Section */
169
+
170
+ .note-list {
171
+ margin: 8px 0;
172
+ }
173
+
174
+ .label-list {
175
+ margin: 8px 1.5em;
176
+ border: 1px solid #ccc;
177
+ }
178
+ .description .label-list {
179
+ font-size: 14px;
180
+ }
181
+
182
+ .note-list dt {
183
+ font-weight: bold;
184
+ }
185
+ .note-list dd {
186
+ }
187
+
188
+ .label-list dt {
189
+ font-weight: bold;
190
+ background: #ddd;
191
+ }
192
+ .label-list dd {
193
+ }
194
+ .label-list dd + dt,
195
+ .note-list dd + dt {
196
+ margin-top: 0.7em;
197
+ }
198
+
199
+ #documentation .section {
200
+ font-size: 90%;
201
+ }
202
+
203
+ #documentation h2.section-header {
204
+ color: #333;
205
+ font-size: 175%;
206
+ }
207
+
208
+ .documentation-section-title {
209
+ position: relative;
210
+ }
211
+ .documentation-section-title .section-click-top {
212
+ position: absolute;
213
+ top: 6px;
214
+ right: 12px;
215
+ font-size: 10px;
216
+ visibility: hidden;
217
+ }
218
+
219
+ .documentation-section-title:hover .section-click-top {
220
+ visibility: visible;
221
+ }
222
+
223
+ #documentation h3.section-header {
224
+ color: #333;
225
+ font-size: 150%;
226
+ }
227
+
228
+ #constants-list > dl,
229
+ #attributes-list > dl {
230
+ margin: 1em 0 2em;
231
+ border: 0;
232
+ }
233
+ #constants-list > dl dt,
234
+ #attributes-list > dl dt {
235
+ font-weight: bold;
236
+ font-family: Monaco, "Andale Mono";
237
+ background: inherit;
238
+ }
239
+ #constants-list > dl dt a,
240
+ #attributes-list > dl dt a {
241
+ color: inherit;
242
+ }
243
+ #constants-list > dl dd,
244
+ #attributes-list > dl dd {
245
+ margin: 0 0 1em 0;
246
+ color: #666;
247
+ }
248
+
249
+ .documentation-section h2 {
250
+ position: relative;
251
+ }
252
+
253
+ .documentation-section h2 a {
254
+ position: absolute;
255
+ top: 8px;
256
+ right: 10px;
257
+ font-size: 12px;
258
+ color: #9b9877;
259
+ visibility: hidden;
260
+ }
261
+
262
+ .documentation-section h2:hover a {
263
+ visibility: visible;
264
+ }
265
+
266
+ /* @group Method Details */
267
+
268
+ #documentation .method-source-code {
269
+ display: none;
270
+ }
271
+
272
+ #documentation .method-detail {
273
+ margin: 0.2em 0.2em;
274
+ padding: 0.5em;
275
+ }
276
+ #documentation .method-detail:hover {
277
+ background-color: #f5f5f5;
278
+ }
279
+ #documentation .method-heading {
280
+ cursor: pointer;
281
+ position: relative;
282
+ font-size: 125%;
283
+ line-height: 125%;
284
+ font-weight: bold;
285
+ color: #333;
286
+ background: url(images/brick.png) no-repeat left bottom;
287
+ padding-left: 20px;
288
+ }
289
+ #documentation .method-heading :link,
290
+ #documentation .method-heading :visited {
291
+ color: inherit;
292
+ }
293
+ #documentation .method-click-advice {
294
+ position: absolute;
295
+ right: 5px;
296
+ font-size: 10px;
297
+ color: #aaa;
298
+ visibility: hidden;
299
+ background: url(images/zoom.png) no-repeat right 5px;
300
+ padding-right: 20px;
301
+ overflow: show;
302
+ }
303
+ #documentation .method-heading:hover .method-click-advice {
304
+ visibility: visible;
305
+ }
306
+
307
+ #documentation .method-alias .method-heading {
308
+ color: #666;
309
+ background: url(images/brick_link.png) no-repeat left bottom;
310
+ }
311
+
312
+ #documentation .method-description,
313
+ #documentation .aliases {
314
+ margin: 0 20px;
315
+ color: #666;
316
+ }
317
+
318
+ #documentation .method-description p,
319
+ #documentation .aliases p {
320
+ line-height: 1.2em;
321
+ }
322
+
323
+ #documentation .aliases {
324
+ font-style: italic;
325
+ cursor: default;
326
+ }
327
+ #documentation .method-description p {
328
+ margin-bottom: 0.5em;
329
+ }
330
+ #documentation .method-description ul {
331
+ margin-left: 1.5em;
332
+ }
333
+
334
+ #documentation .attribute-method-heading {
335
+ background: url(images/tag_green.png) no-repeat left bottom;
336
+ }
337
+ #documentation #attribute-method-details .method-detail:hover {
338
+ background-color: transparent;
339
+ cursor: default;
340
+ }
341
+ #documentation .attribute-access-type {
342
+ font-size: 60%;
343
+ text-transform: uppercase;
344
+ vertical-align: super;
345
+ }
346
+
347
+ .method-section .method-source-code {
348
+ background: white;
349
+ }
350
+
351
+ /* @group Source Code */
352
+
353
+ .ruby-constant .ruby-keyword .ruby-ivar .ruby-operator .ruby-identifier
354
+ .ruby-node .ruby-comment .ruby-regexp .ruby-value {
355
+ background: transparent;
356
+ }
357
+
358
+ /* Thanks GitHub!!! */
359
+ .ruby-constant { color: #458; font-weight: bold; }
360
+ .ruby-keyword { color: black; font-weight: bold; }
361
+ .ruby-ivar { color: teal; }
362
+ .ruby-operator { color: #000; }
363
+ .ruby-identifier { color: black; }
364
+ .ruby-node { color: red; }
365
+ .ruby-comment { color: #998; font-weight: bold; }
366
+ .ruby-regexp { color: #009926; }
367
+ .ruby-value { color: #099; }
368
+ .ruby-string { color: red; }
369
+
370
+ /* @group search results */
371
+
372
+ #search-section .section-header {
373
+ margin: 0;
374
+ padding: 0;
375
+ }
376
+
377
+ #search-results {
378
+ width: 100%;
379
+ list-style: none;
380
+ margin: 0;
381
+ padding: 0;
382
+ }
383
+
384
+ #search-results h1 {
385
+ font-size: 1em;
386
+ font-weight: normal;
387
+ text-shadow: none;
388
+ }
389
+
390
+ #search-results .current {
391
+ background: #eee;
392
+ }
393
+
394
+ #search-results li {
395
+ list-style: none;
396
+ line-height: 1em;
397
+ padding: 0.5em;
398
+ border-bottom: 1px solid black;
399
+ }
400
+
401
+ #search-results .search-namespace {
402
+ font-weight: bold;
403
+ }
404
+
405
+ #search-results li em {
406
+ background: yellow;
407
+ font-style: normal;
408
+ }
409
+
410
+ #search-results pre {
411
+ margin: 0.5em;
412
+ }