ruby-web 1.1.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 (190) hide show
  1. data/ChangeLog +474 -0
  2. data/INSTALL.txt +9 -0
  3. data/InstalledFiles +180 -0
  4. data/LICENSE.txt +74 -0
  5. data/Rakefile +529 -0
  6. data/TODO +65 -0
  7. data/doc/additional.xml +149 -0
  8. data/doc/core.xml +652 -0
  9. data/doc/credits/index.xml +52 -0
  10. data/doc/credits/php.contributors.xml +118 -0
  11. data/doc/credits/php.language-snippets.ent +622 -0
  12. data/doc/install/index.xml +136 -0
  13. data/doc/install/mac/index.xml +21 -0
  14. data/doc/install/ruby-web.install.rb.instructions.xml +7 -0
  15. data/doc/install/unix/index.xml +46 -0
  16. data/doc/install/win/apache1.xml +166 -0
  17. data/doc/install/win/apache2.xml +141 -0
  18. data/doc/install/win/iis.xml +162 -0
  19. data/doc/install/win/index.xml +24 -0
  20. data/doc/install/win/installer.xml +31 -0
  21. data/doc/install/win/manual.xml +43 -0
  22. data/doc/manual.xml +69 -0
  23. data/doc/old/apache_cgi.txt +23 -0
  24. data/doc/old/fastcgi.txt +23 -0
  25. data/doc/old/mod_ruby.txt +21 -0
  26. data/doc/old/snippets.rdoc +183 -0
  27. data/doc/old/webrick.txt +23 -0
  28. data/doc/old/windows_cgi.txt +9 -0
  29. data/doc/tutorial.xml +14 -0
  30. data/doc/xsl/manual-multi.xsl +10 -0
  31. data/doc/xsl/manual-pdf.xsl +6 -0
  32. data/doc/xsl/manual-single.xsl +6 -0
  33. data/doc/xsl/manual.css +22 -0
  34. data/install.rb +1022 -0
  35. data/lib/formatter.rb +314 -0
  36. data/lib/html-parser.rb +429 -0
  37. data/lib/htmlrepair.rb +113 -0
  38. data/lib/htmlsplit.rb +842 -0
  39. data/lib/sgml-parser.rb +332 -0
  40. data/lib/web.rb +68 -0
  41. data/lib/web/assertinclude.rb +129 -0
  42. data/lib/web/config.rb +50 -0
  43. data/lib/web/connection.rb +1070 -0
  44. data/lib/web/convenience.rb +154 -0
  45. data/lib/web/formreader.rb +318 -0
  46. data/lib/web/htmlparser/html-parser.rb +429 -0
  47. data/lib/web/htmlparser/sgml-parser.rb +332 -0
  48. data/lib/web/htmltools/element.rb +296 -0
  49. data/lib/web/htmltools/stparser.rb +276 -0
  50. data/lib/web/htmltools/tags.rb +286 -0
  51. data/lib/web/htmltools/tree.rb +139 -0
  52. data/lib/web/htmltools/xmltree.rb +160 -0
  53. data/lib/web/htmltools/xpath.rb +71 -0
  54. data/lib/web/info.rb +63 -0
  55. data/lib/web/load.rb +210 -0
  56. data/lib/web/mime.rb +87 -0
  57. data/lib/web/phprb.rb +340 -0
  58. data/lib/web/resources/test/cookie.rb +33 -0
  59. data/lib/web/resources/test/counter.rb +20 -0
  60. data/lib/web/resources/test/multipart.rb +14 -0
  61. data/lib/web/resources/test/redirect.rb +8 -0
  62. data/lib/web/resources/test/stock.rb +33 -0
  63. data/lib/web/sapi/apache.rb +129 -0
  64. data/lib/web/sapi/fastcgi.rb +22 -0
  65. data/lib/web/sapi/install/apache.rb +180 -0
  66. data/lib/web/sapi/install/iis.rb +93 -0
  67. data/lib/web/sapi/install/macosx.rb +90 -0
  68. data/lib/web/sapi/webrick.rb +86 -0
  69. data/lib/web/session.rb +83 -0
  70. data/lib/web/shim/cgi.rb +129 -0
  71. data/lib/web/shim/rails.rb +175 -0
  72. data/lib/web/stringio.rb +78 -0
  73. data/lib/web/strscanparser.rb +24 -0
  74. data/lib/web/tagparser.rb +96 -0
  75. data/lib/web/testing.rb +666 -0
  76. data/lib/web/traceoutput.rb +75 -0
  77. data/lib/web/unit.rb +56 -0
  78. data/lib/web/upload.rb +59 -0
  79. data/lib/web/validate.rb +52 -0
  80. data/lib/web/wiki.rb +557 -0
  81. data/lib/web/wiki/linker.rb +72 -0
  82. data/lib/web/wiki/page.rb +201 -0
  83. data/lib/webunit.rb +27 -0
  84. data/lib/webunit/assert.rb +152 -0
  85. data/lib/webunit/converter.rb +154 -0
  86. data/lib/webunit/cookie.rb +118 -0
  87. data/lib/webunit/domwalker.rb +185 -0
  88. data/lib/webunit/exception.rb +14 -0
  89. data/lib/webunit/form.rb +116 -0
  90. data/lib/webunit/frame.rb +37 -0
  91. data/lib/webunit/htmlelem.rb +122 -0
  92. data/lib/webunit/image.rb +26 -0
  93. data/lib/webunit/jscript.rb +31 -0
  94. data/lib/webunit/link.rb +33 -0
  95. data/lib/webunit/params.rb +321 -0
  96. data/lib/webunit/parser.rb +229 -0
  97. data/lib/webunit/response.rb +464 -0
  98. data/lib/webunit/runtest.rb +41 -0
  99. data/lib/webunit/table.rb +148 -0
  100. data/lib/webunit/testcase.rb +45 -0
  101. data/lib/webunit/ui/cui/testrunner.rb +50 -0
  102. data/lib/webunit/utils.rb +68 -0
  103. data/lib/webunit/webunit.rb +28 -0
  104. data/test/dev/action.rb +83 -0
  105. data/test/dev/forms.rb +104 -0
  106. data/test/dev/forms2.rb +104 -0
  107. data/test/dev/parser.rb +17 -0
  108. data/test/dev/scripts/dump.rb +24 -0
  109. data/test/dev/scripts/makedist.rb +62 -0
  110. data/test/dev/scripts/uri.rb +41 -0
  111. data/test/dev/scripts/uri/common.rb +432 -0
  112. data/test/dev/scripts/uri/ftp.rb +149 -0
  113. data/test/dev/scripts/uri/generic.rb +1106 -0
  114. data/test/dev/scripts/uri/http.rb +76 -0
  115. data/test/dev/scripts/uri/https.rb +26 -0
  116. data/test/dev/scripts/uri/ldap.rb +238 -0
  117. data/test/dev/scripts/uri/mailto.rb +260 -0
  118. data/test/dev/scripts/urireg.rb +174 -0
  119. data/test/dev/simpledispatcher.rb +156 -0
  120. data/test/dev/test.action.rb +146 -0
  121. data/test/dev/test.formreader.rb +463 -0
  122. data/test/dev/test.simpledispatcher.rb +186 -0
  123. data/test/dev/webunit/conv/digit-0.rb +21 -0
  124. data/test/dev/webunit/conv/digit-1.rb +17 -0
  125. data/test/dev/webunit/conv/digit.rb +23 -0
  126. data/test/dev/webunit/conv/test_digit-0.rb +16 -0
  127. data/test/dev/webunit/conv/test_digit-1.rb +19 -0
  128. data/test/dev/webunit/conv/test_digit.rb +26 -0
  129. data/test/dev/webunit/conv/test_digit_view-0.rb +76 -0
  130. data/test/dev/webunit/conv/test_digit_view-1.rb +102 -0
  131. data/test/dev/webunit/conv/test_digit_view.rb +134 -0
  132. data/test/installation/htdocs/cgi_test.rb +296 -0
  133. data/test/installation/htdocs/test_install.rb +4 -0
  134. data/test/installation/runwebtest.rb +5 -0
  135. data/test/installation/test_cookie.rb +128 -0
  136. data/test/installation/test_form.rb +47 -0
  137. data/test/installation/test_multipart.rb +51 -0
  138. data/test/installation/test_request.rb +24 -0
  139. data/test/installation/test_response.rb +35 -0
  140. data/test/unit/htdocs/cookie.rb +32 -0
  141. data/test/unit/htdocs/multipart.rb +28 -0
  142. data/test/unit/htdocs/redirect.rb +12 -0
  143. data/test/unit/htdocs/simple.rb +13 -0
  144. data/test/unit/htdocs/stock.rb +33 -0
  145. data/test/unit/test_assert.rb +162 -0
  146. data/test/unit/test_cookie.rb +114 -0
  147. data/test/unit/test_domwalker.rb +77 -0
  148. data/test/unit/test_form.rb +42 -0
  149. data/test/unit/test_frame.rb +40 -0
  150. data/test/unit/test_htmlelem.rb +74 -0
  151. data/test/unit/test_image.rb +45 -0
  152. data/test/unit/test_jscript.rb +57 -0
  153. data/test/unit/test_link.rb +85 -0
  154. data/test/unit/test_multipart.rb +51 -0
  155. data/test/unit/test_params.rb +210 -0
  156. data/test/unit/test_parser.rb +53 -0
  157. data/test/unit/test_response.rb +150 -0
  158. data/test/unit/test_table.rb +70 -0
  159. data/test/unit/test_utils.rb +106 -0
  160. data/test/unit/test_webunit.rb +28 -0
  161. data/test/web/mod_ruby_stub.rb +39 -0
  162. data/test/web/test.assertinclude.rb +109 -0
  163. data/test/web/test.buffer.rb +182 -0
  164. data/test/web/test.code.loader.rb +78 -0
  165. data/test/web/test.config.rb +31 -0
  166. data/test/web/test.error.handling.rb +91 -0
  167. data/test/web/test.formreader-2.0.rb +352 -0
  168. data/test/web/test.load.rb +125 -0
  169. data/test/web/test.mime-type.rb +23 -0
  170. data/test/web/test.narf.cgi.rb +106 -0
  171. data/test/web/test.phprb.rb +239 -0
  172. data/test/web/test.request.rb +368 -0
  173. data/test/web/test.response.rb +637 -0
  174. data/test/web/test.ruby-web.rb +10 -0
  175. data/test/web/test.session.rb +50 -0
  176. data/test/web/test.shim.cgi.rb +96 -0
  177. data/test/web/test.tagparser.rb +65 -0
  178. data/test/web/test.template2.rb +297 -0
  179. data/test/web/test.testing2.rb +318 -0
  180. data/test/web/test.upload.rb +45 -0
  181. data/test/web/test.validate.rb +46 -0
  182. data/test/web/test.web.test.rb +495 -0
  183. data/test/wiki/test.history.rb +297 -0
  184. data/test/wiki/test.illustration_page.rb +287 -0
  185. data/test/wiki/test.linker.rb +197 -0
  186. data/test/wiki/test.tarpit.rb +56 -0
  187. data/test/wiki/test.wiki.rb +300 -0
  188. data/test/wikitestroot/admin.rb +7 -0
  189. data/test/wikitestroot/wiki.rb +6 -0
  190. metadata +234 -0
@@ -0,0 +1,23 @@
1
+ == Webrick
2
+
3
+ I have writen a Web::NarfHandler, based on the CGIHandler, to run narf
4
+ scripts. You will need to add the Web::NarfHandler to webrick with a
5
+ startup script like this, replacing :DocumentRoot with the appropriate
6
+ value:
7
+
8
+ #!/usr/local/bin/ruby
9
+ $: << File.dirname($0)
10
+ require 'webrick'
11
+ require 'web/sapi/webrick'
12
+
13
+ include WEBrick
14
+
15
+ dir = Dir::pwd
16
+
17
+ HTTPServlet::FileHandler.add_handler("rb", Web::NarfHandler)
18
+ HTTPServlet::FileHandler.add_handler("narf", Web::NarfHandler)
19
+
20
+ s = HTTPServer.new(:Port => 4476,
21
+ :DocumentRoot => "/.../htdocs/" )
22
+ trap("INT"){ s.shutdown }
23
+ s.start
@@ -0,0 +1,9 @@
1
+ The narf executable will print syntax errors to the screen. A pre-compiled version is located in:
2
+
3
+ narf/sapi/win/narf.exe
4
+
5
+ This file is linked against msvcrt-ruby18.lib, provided with the Windows One-Click Installer:
6
+
7
+ http://rubyinstaller.rubyforge.org/wiki/wiki.pl
8
+
9
+ After installing ruby, place narf.exe ruby/bin, alongside ruby.exe. In IIS, map .narf and .rb to bin/narf.exe to use the narf runner.
@@ -0,0 +1,14 @@
1
+ <para>hello.world.rb</para>
2
+ <programlisting>
3
+ #!/usr/bin/ruby-web
4
+
5
+ Web::write "Hello World"
6
+ </programlisting>
7
+
8
+ <para>hello.world.rhtml</para>
9
+ <programlisting>
10
+ #!/usr/bin/ruby-web
11
+
12
+ &lt;?= "Hello World" ?&gt;
13
+ </programlisting>
14
+
@@ -0,0 +1,10 @@
1
+ <?xml version='1.0'?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
3
+ <xsl:import href="/sw/share/xml/xsl/docbook-xsl/html/chunk.xsl"/>
4
+
5
+ <xsl:template match="sect1[@role = 'NotInToc']" mode="toc" />
6
+ <xsl:template match="sect2[@role = 'NotInToc']" mode="toc" />
7
+ <xsl:param name="html.stylesheet" select="'manual.css'"/>
8
+ <!--xsl:param name="html.ext" select="'.php'"/-->
9
+ <xsl:param name="use.id.as.filename" select="1" />
10
+ </xsl:stylesheet>
@@ -0,0 +1,6 @@
1
+ <?xml version='1.0'?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
3
+ <xsl:import href="/sw/share/xml/xsl/docbook-xsl/fo/docbook.xsl"/>
4
+ <xsl:template match="sect1[@role = 'NotInToc']" mode="toc" />
5
+ <xsl:template match="sect2[@role = 'NotInToc']" mode="toc" />
6
+ </xsl:stylesheet>
@@ -0,0 +1,6 @@
1
+ <?xml version='1.0'?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
3
+ <xsl:import href="/sw/share/xml/xsl/docbook-xsl/html/docbook.xsl"/>
4
+ <xsl:template match="sect1[@role = 'NotInToc']" mode="toc" />
5
+ <xsl:template match="sect2[@role = 'NotInToc']" mode="toc" />
6
+ </xsl:stylesheet>
@@ -0,0 +1,22 @@
1
+ BODY {
2
+ font-family:Arial,Helvetica,San-Serif;
3
+ }
4
+
5
+ .programlisting {
6
+ background:#dfdfdf;
7
+ border: dashed 1px #fffffff;
8
+ }
9
+
10
+ .term {
11
+ font-style:italic;
12
+ }
13
+
14
+ div.variablelist {
15
+
16
+ }
17
+
18
+ div.variablelist dd {
19
+ margin-top: 2px;
20
+ margin-bottom:15px;
21
+ }
22
+
@@ -0,0 +1,1022 @@
1
+ #
2
+ # This file is automatically generated. DO NOT MODIFY!
3
+ #
4
+ # install.rb
5
+ #
6
+ # Copyright (c) 2000-2002 Minero Aoki <aamine@loveruby.net>
7
+ #
8
+ # This program is free software.
9
+ # You can distribute/modify this program under the terms of
10
+ # the GNU Lesser General Public License version 2.
11
+ #
12
+
13
+ ### begin compat.rb
14
+
15
+ unless Enumerable.instance_methods.include? 'inject' then
16
+ module Enumerable
17
+ def inject( result )
18
+ each do |i|
19
+ result = yield(result, i)
20
+ end
21
+ result
22
+ end
23
+ end
24
+ end
25
+
26
+ def File.read_all( fname )
27
+ File.open(fname, 'rb') {|f| return f.read }
28
+ end
29
+
30
+ def File.write( fname, str )
31
+ File.open(fname, 'wb') {|f| f.write str }
32
+ end
33
+
34
+ ### end compat.rb
35
+ ### begin config.rb
36
+
37
+ if i = ARGV.index(/\A--rbconfig=/) then
38
+ file = $'
39
+ ARGV.delete_at(i)
40
+ require file
41
+ else
42
+ require 'rbconfig'
43
+ end
44
+
45
+
46
+ class ConfigTable
47
+
48
+ c = ::Config::CONFIG
49
+
50
+ rubypath = c['bindir'] + '/' + c['ruby_install_name']
51
+
52
+ major = c['MAJOR'].to_i
53
+ minor = c['MINOR'].to_i
54
+ teeny = c['TEENY'].to_i
55
+ version = "#{major}.#{minor}"
56
+
57
+ # ruby ver. >= 1.4.4?
58
+ newpath_p = ((major >= 2) or
59
+ ((major == 1) and
60
+ ((minor >= 5) or
61
+ ((minor == 4) and (teeny >= 4)))))
62
+
63
+ re = Regexp.new('\A' + Regexp.quote(c['prefix']))
64
+ subprefix = lambda {|path|
65
+ re === path and path.sub(re, '$prefix')
66
+ }
67
+
68
+ if c['rubylibdir'] then
69
+ # 1.6.3 < V
70
+ stdruby = subprefix.call(c['rubylibdir'])
71
+ siteruby = subprefix.call(c['sitedir'])
72
+ versite = subprefix.call(c['sitelibdir'])
73
+ sodir = subprefix.call(c['sitearchdir'])
74
+ elsif newpath_p then
75
+ # 1.4.4 <= V <= 1.6.3
76
+ stdruby = "$prefix/lib/ruby/#{version}"
77
+ siteruby = subprefix.call(c['sitedir'])
78
+ versite = siteruby + '/' + version
79
+ sodir = "$site-ruby/#{c['arch']}"
80
+ else
81
+ # V < 1.4.4
82
+ stdruby = "$prefix/lib/ruby/#{version}"
83
+ siteruby = "$prefix/lib/ruby/#{version}/site_ruby"
84
+ versite = siteruby
85
+ sodir = "$site-ruby/#{c['arch']}"
86
+ end
87
+
88
+ DESCRIPTER = [
89
+ [ 'prefix', [ c['prefix'],
90
+ 'path',
91
+ 'path prefix of target environment' ] ],
92
+ [ 'std-ruby', [ stdruby,
93
+ 'path',
94
+ 'the directory for standard ruby libraries' ] ],
95
+ [ 'site-ruby-common', [ siteruby,
96
+ 'path',
97
+ 'the directory for version-independent non-standard ruby libraries' ] ],
98
+ [ 'site-ruby', [ versite,
99
+ 'path',
100
+ 'the directory for non-standard ruby libraries' ] ],
101
+ [ 'bin-dir', [ '$prefix/bin',
102
+ 'path',
103
+ 'the directory for commands' ] ],
104
+ [ 'rb-dir', [ '$site-ruby',
105
+ 'path',
106
+ 'the directory for ruby scripts' ] ],
107
+ [ 'so-dir', [ sodir,
108
+ 'path',
109
+ 'the directory for ruby extentions' ] ],
110
+ [ 'data-dir', [ '$prefix/share',
111
+ 'path',
112
+ 'the directory for shared data' ] ],
113
+ [ 'ruby-path', [ rubypath,
114
+ 'path',
115
+ 'path to set to #! line' ] ],
116
+ [ 'ruby-prog', [ rubypath,
117
+ 'name',
118
+ 'the ruby program using for installation' ] ],
119
+ [ 'make-prog', [ 'make',
120
+ 'name',
121
+ 'the make program to compile ruby extentions' ] ],
122
+ [ 'without-ext', [ 'no',
123
+ 'yes/no',
124
+ 'does not compile/install ruby extentions' ] ]
125
+ ]
126
+
127
+ SAVE_FILE = 'config.save'
128
+
129
+ def ConfigTable.each_name( &block )
130
+ keys().each( &block )
131
+ end
132
+
133
+ def ConfigTable.keys
134
+ DESCRIPTER.collect {|k,*dummy| k }
135
+ end
136
+
137
+ def ConfigTable.each_definition( &block )
138
+ DESCRIPTER.each( &block )
139
+ end
140
+
141
+ def ConfigTable.get_entry( name )
142
+ name, ent = DESCRIPTER.assoc(name)
143
+ ent
144
+ end
145
+
146
+ def ConfigTable.get_entry!( name )
147
+ get_entry(name) or raise ArgumentError, "no such config: #{name}"
148
+ end
149
+
150
+ def ConfigTable.add_entry( name, vals )
151
+ ConfigTable::DESCRIPTER.push [name,vals]
152
+ end
153
+
154
+ def ConfigTable.remove_entry( name )
155
+ get_entry name or raise ArgumentError, "no such config: #{name}"
156
+ DESCRIPTER.delete_if {|n,arr| n == name }
157
+ end
158
+
159
+ def ConfigTable.config_key?( name )
160
+ get_entry(name) ? true : false
161
+ end
162
+
163
+ def ConfigTable.bool_config?( name )
164
+ ent = get_entry(name) or return false
165
+ ent[1] == 'yes/no'
166
+ end
167
+
168
+ def ConfigTable.value_config?( name )
169
+ ent = get_entry(name) or return false
170
+ ent[1] != 'yes/no'
171
+ end
172
+
173
+ def ConfigTable.path_config?( name )
174
+ ent = get_entry(name) or return false
175
+ ent[1] == 'path'
176
+ end
177
+
178
+
179
+ class << self
180
+
181
+ alias newobj new
182
+
183
+ def new
184
+ c = newobj()
185
+ c.__send__ :init
186
+ c
187
+ end
188
+
189
+ def load
190
+ c = newobj()
191
+ File.file? SAVE_FILE or
192
+ raise InstallError, "#{File.basename $0} config first"
193
+ File.foreach( SAVE_FILE ) do |line|
194
+ k, v = line.split( '=', 2 )
195
+ c.instance_eval {
196
+ @table[k] = v.strip
197
+ }
198
+ end
199
+ c
200
+ end
201
+
202
+ end
203
+
204
+ def initialize
205
+ @table = {}
206
+ end
207
+
208
+ def init
209
+ DESCRIPTER.each do |k, (default, vname, desc, default2)|
210
+ @table[k] = default
211
+ end
212
+ end
213
+ private :init
214
+
215
+ def save
216
+ File.open( SAVE_FILE, 'w' ) {|f|
217
+ @table.each do |k, v|
218
+ f.printf "%s=%s\n", k, v if v
219
+ end
220
+ }
221
+ end
222
+
223
+ def []=( k, v )
224
+ ConfigTable.config_key? k or raise InstallError, "unknown config option #{k}"
225
+ if ConfigTable.path_config? k then
226
+ @table[k] = (v[0,1] != '$') ? File.expand_path(v) : v
227
+ else
228
+ @table[k] = v
229
+ end
230
+ end
231
+
232
+ def []( key )
233
+ @table[key] or return nil
234
+ @table[key].gsub( %r<\$([^/]+)> ) { self[$1] }
235
+ end
236
+
237
+ def set_raw( key, val )
238
+ @table[key] = val
239
+ end
240
+
241
+ def get_raw( key )
242
+ @table[key]
243
+ end
244
+
245
+ end
246
+
247
+
248
+ class MetaConfigEnvironment
249
+
250
+ def self.eval_file( file )
251
+ return unless File.file? file
252
+ new.instance_eval File.read_all(file), file, 1
253
+ end
254
+
255
+ private
256
+
257
+ def config_names
258
+ ConfigTable.keys
259
+ end
260
+
261
+ def config?( name )
262
+ ConfigTable.config_key? name
263
+ end
264
+
265
+ def bool_config?( name )
266
+ ConfigTable.bool_config? name
267
+ end
268
+
269
+ def value_config?( name )
270
+ ConfigTable.value_config? name
271
+ end
272
+
273
+ def path_config?( name )
274
+ ConfigTable.path_config? name
275
+ end
276
+
277
+ def add_config( name, argname, default, desc )
278
+ ConfigTable.add_entry name,[default,argname,desc]
279
+ end
280
+
281
+ def add_path_config( name, default, desc )
282
+ add_config name, 'path', default, desc
283
+ end
284
+
285
+ def add_bool_config( name, default, desc )
286
+ add_config name, 'yes/no', default ? 'yes' : 'no', desc
287
+ end
288
+
289
+ def set_config_default( name, default )
290
+ if bool_config? name then
291
+ ConfigTable.get_entry!(name)[0] = default ? 'yes' : 'no'
292
+ else
293
+ ConfigTable.get_entry!(name)[0] = default
294
+ end
295
+ end
296
+
297
+ def remove_config( name )
298
+ ent = ConfigTable.get_entry(name)
299
+ ConfigTable.remove_entry name
300
+ ent
301
+ end
302
+
303
+ end
304
+
305
+ ### end config.rb
306
+ ### begin fileop.rb
307
+
308
+ module FileOperations
309
+
310
+ def mkdir_p( dname, prefix = nil )
311
+ dname = prefix + dname if prefix
312
+ $stderr.puts "mkdir -p #{dname}" if verbose?
313
+ return if no_harm?
314
+
315
+ # does not check '/'... it's too abnormal case
316
+ dirs = dname.split(%r_(?=/)_)
317
+ if /\A[a-z]:\z/i === dirs[0] then
318
+ disk = dirs.shift
319
+ dirs[0] = disk + dirs[0]
320
+ end
321
+ dirs.each_index do |idx|
322
+ path = dirs[0..idx].join('')
323
+ Dir.mkdir path unless dir? path
324
+ end
325
+ end
326
+
327
+ def rm_f( fname )
328
+ $stderr.puts "rm -f #{fname}" if verbose?
329
+ return if no_harm?
330
+
331
+ if File.exist? fname or File.symlink? fname then
332
+ File.chmod 0777, fname
333
+ File.unlink fname
334
+ end
335
+ end
336
+
337
+ def rm_rf( dn )
338
+ $stderr.puts "rm -rf #{dn}" if verbose?
339
+ return if no_harm?
340
+
341
+ Dir.chdir dn
342
+ Dir.foreach('.') do |fn|
343
+ next if fn == '.'
344
+ next if fn == '..'
345
+ if dir? fn then
346
+ verbose_off {
347
+ rm_rf fn
348
+ }
349
+ else
350
+ verbose_off {
351
+ rm_f fn
352
+ }
353
+ end
354
+ end
355
+ Dir.chdir '..'
356
+ Dir.rmdir dn
357
+ end
358
+
359
+ def mv( src, dest )
360
+ rm_f dest
361
+ begin
362
+ File.link src, dest
363
+ rescue
364
+ File.write dest, File.read_all(src)
365
+ File.chmod File.stat(src).mode, dest
366
+ end
367
+ rm_f src
368
+ end
369
+
370
+ def install( from, dest, mode, prefix = nil )
371
+ $stderr.puts "install #{from} #{dest}" if verbose?
372
+ return if no_harm?
373
+
374
+ realdest = prefix + dest if prefix
375
+ if dir? realdest then
376
+ realdest += '/' + File.basename(from)
377
+ end
378
+ str = File.read_all(from)
379
+ if diff? str, realdest then
380
+ verbose_off {
381
+ rm_f realdest if File.exist? realdest
382
+ }
383
+ File.write realdest, str
384
+ File.chmod mode, realdest
385
+
386
+ File.open( objdir + '/InstalledFiles', 'a' ) {|f| f.puts realdest }
387
+ end
388
+ end
389
+
390
+ def diff?( orig, targ )
391
+ return true unless File.exist? targ
392
+ orig != File.read_all(targ)
393
+ end
394
+
395
+ def command( str )
396
+ $stderr.puts str if verbose?
397
+ system str or raise RuntimeError, "'system #{str}' failed"
398
+ end
399
+
400
+ def ruby( str )
401
+ command config('ruby-prog') + ' ' + str
402
+ end
403
+
404
+ def dir?( dname )
405
+ # for corrupted windows stat()
406
+ File.directory?( (dname[-1,1] == '/') ? dname : dname + '/' )
407
+ end
408
+
409
+ def all_files( dname )
410
+ Dir.open( dname ) {|d|
411
+ return d.find_all {|n| File.file? "#{dname}/#{n}" }
412
+ }
413
+ end
414
+
415
+ def all_dirs( dname )
416
+ Dir.open( dname ) {|d|
417
+ return d.find_all {|n| dir? "#{dname}/#{n}" } - %w(. ..)
418
+ }
419
+ end
420
+
421
+ end
422
+
423
+ ### end fileop.rb
424
+ ### begin base.rb
425
+
426
+ class InstallError < StandardError; end
427
+
428
+
429
+ class Installer
430
+
431
+ Version = '3.1.2'
432
+ Copyright = 'Copyright (c) 2000-2002 Minero Aoki'
433
+
434
+
435
+ @toplevel = nil
436
+
437
+ def self.declear_toplevel_installer( inst )
438
+ @toplevel and
439
+ raise ArgumentError, 'more than one toplevel installer decleared'
440
+ @toplevel = inst
441
+ end
442
+
443
+ def self.toplevel_installer
444
+ @toplevel
445
+ end
446
+
447
+
448
+ FILETYPES = %w( bin lib ext data )
449
+
450
+ include FileOperations
451
+
452
+ def initialize( config, opt, srcroot, objroot )
453
+ @config = config
454
+ @options = opt
455
+ @srcdir = File.expand_path(srcroot)
456
+ @objdir = File.expand_path(objroot)
457
+ @currdir = '.'
458
+ end
459
+
460
+ def inspect
461
+ "#<#{type} #{__id__}>"
462
+ end
463
+
464
+ #
465
+ # configs/options
466
+ #
467
+
468
+ def get_config( key )
469
+ @config[key]
470
+ end
471
+
472
+ alias config get_config
473
+
474
+ def set_config( key, val )
475
+ @config[key] = val
476
+ end
477
+
478
+ def no_harm?
479
+ @options['no-harm']
480
+ end
481
+
482
+ def verbose?
483
+ @options['verbose']
484
+ end
485
+
486
+ def verbose_off
487
+ save, @options['verbose'] = @options['verbose'], false
488
+ yield
489
+ @options['verbose'] = save
490
+ end
491
+
492
+ #
493
+ # srcdir/objdir
494
+ #
495
+
496
+ attr_reader :srcdir
497
+ alias srcdir_root srcdir
498
+ alias package_root srcdir
499
+
500
+ def curr_srcdir
501
+ "#{@srcdir}/#{@currdir}"
502
+ end
503
+
504
+ attr_reader :objdir
505
+ alias objdir_root objdir
506
+
507
+ def curr_objdir
508
+ "#{@objdir}/#{@currdir}"
509
+ end
510
+
511
+ def srcfile( path )
512
+ curr_srcdir + '/' + path
513
+ end
514
+
515
+ def srcexist?( path )
516
+ File.exist? srcfile(path)
517
+ end
518
+
519
+ def srcdirectory?( path )
520
+ dir? srcfile(path)
521
+ end
522
+
523
+ def srcfile?( path )
524
+ File.file? srcfile(path)
525
+ end
526
+
527
+ def srcentries( path = '.' )
528
+ Dir.open( curr_srcdir + '/' + path ) {|d|
529
+ return d.to_a - %w(. ..) - hookfilenames
530
+ }
531
+ end
532
+
533
+ def srcfiles( path = '.' )
534
+ srcentries(path).find_all {|fname|
535
+ File.file? File.join(curr_srcdir, path, fname)
536
+ }
537
+ end
538
+
539
+ def srcdirectories( path = '.' )
540
+ srcentries(path).find_all {|fname|
541
+ dir? File.join(curr_srcdir, path, fname)
542
+ }
543
+ end
544
+
545
+ def dive_into( rel )
546
+ # skip source control directories
547
+ if (File.basename(rel) =~ /^(\.svn|CVS)$/)
548
+ return
549
+ end
550
+ return unless dir? "#{@srcdir}/#{rel}"
551
+
552
+ dir = File.basename(rel)
553
+ Dir.mkdir dir unless dir? dir
554
+ save = Dir.pwd
555
+ Dir.chdir dir
556
+ $stderr.puts '---> ' + rel if verbose?
557
+ @currdir = rel
558
+ yield
559
+ Dir.chdir save
560
+ $stderr.puts '<--- ' + rel if verbose?
561
+ @currdir = File.dirname(rel)
562
+ end
563
+
564
+ #
565
+ # config
566
+ #
567
+
568
+ def exec_config
569
+ exec_task_traverse 'config'
570
+ end
571
+
572
+ def config_dir_bin( rel )
573
+ end
574
+
575
+ def config_dir_lib( rel )
576
+ end
577
+
578
+ def config_dir_ext( rel )
579
+ extconf if extdir? curr_srcdir
580
+ end
581
+
582
+ def extconf
583
+ opt = @options['config-opt'].join(' ')
584
+ command "#{config('ruby-prog')} #{curr_srcdir}/extconf.rb #{opt}"
585
+ end
586
+
587
+ def config_dir_data( rel )
588
+ end
589
+
590
+ #
591
+ # setup
592
+ #
593
+
594
+ def exec_setup
595
+ exec_task_traverse 'setup'
596
+ end
597
+
598
+ def setup_dir_bin( relpath )
599
+ all_files( curr_srcdir ).each do |fname|
600
+ add_rubypath "#{curr_srcdir}/#{fname}"
601
+ end
602
+ end
603
+
604
+ SHEBANG_RE = /\A\#!\s*\S*ruby\S*/
605
+
606
+ def add_rubypath( path )
607
+ $stderr.puts %Q<set #! line to "\#!#{config('ruby-path')}" for #{path} ...> if verbose?
608
+ return if no_harm?
609
+
610
+ tmpfile = File.basename(path) + '.tmp'
611
+ begin
612
+ File.open( path ) {|r|
613
+ File.open( tmpfile, 'w' ) {|w|
614
+ first = r.gets
615
+ return unless SHEBANG_RE === first # reject '/usr/bin/env ruby'
616
+
617
+ w.print first.sub( SHEBANG_RE, '#!' + config('ruby-path') )
618
+ w.write r.read
619
+ } }
620
+ mv tmpfile, File.basename(path)
621
+ ensure
622
+ rm_f tmpfile if File.exist? tmpfile
623
+ end
624
+ end
625
+
626
+ def setup_dir_lib( relpath )
627
+ end
628
+
629
+ def setup_dir_ext( relpath )
630
+ if extdir? curr_srcdir then
631
+ make
632
+ end
633
+ end
634
+
635
+ def make
636
+ command config('make-prog')
637
+ end
638
+
639
+ def setup_dir_data( relpath )
640
+ end
641
+
642
+ #
643
+ # install
644
+ #
645
+
646
+ def exec_install
647
+ exec_task_traverse 'install'
648
+ end
649
+
650
+ def install_dir_bin( rel )
651
+ install_files targfiles, config('bin-dir') + '/' + rel, 0755
652
+ end
653
+
654
+ def install_dir_lib( rel )
655
+ install_files targfiles, config('rb-dir') + '/' + rel, 0644
656
+ end
657
+
658
+ def install_dir_ext( rel )
659
+ if extdir? curr_srcdir then
660
+ install_dir_ext_main File.dirname(rel)
661
+ end
662
+ end
663
+
664
+ def install_dir_ext_main( rel )
665
+ install_files allext('.'), config('so-dir') + '/' + rel, 0555
666
+ end
667
+
668
+ def install_dir_data( rel )
669
+ install_files targfiles, config('data-dir') + '/' + rel, 0644
670
+ end
671
+
672
+ def install_files( list, dest, mode )
673
+ # Skip the narf CVS directories
674
+ unless dest =~ /CVS/
675
+ mkdir_p dest, @options['install-prefix']
676
+ list.each do |fname|
677
+ install fname, dest, mode, @options['install-prefix']
678
+ end
679
+ end
680
+ end
681
+
682
+ def targfiles
683
+ (targfilenames() - hookfilenames()).collect {|fname|
684
+ File.exist?(fname) ? fname : File.join(curr_srcdir(), fname)
685
+ }
686
+ end
687
+
688
+ def targfilenames
689
+ [ curr_srcdir(), '.' ].inject([]) {|ret, dir|
690
+ ret | all_files(dir)
691
+ }
692
+ end
693
+
694
+ def hookfilenames
695
+ %w( pre-%s post-%s pre-%s.rb post-%s.rb ).collect {|fmt|
696
+ %w( config setup install clean ).collect {|t| sprintf fmt, t }
697
+ }.flatten
698
+ end
699
+
700
+ def allext( dir )
701
+ _allext(dir) or raise InstallError,
702
+ "no extention exists: Have you done 'ruby #{$0} setup' ?"
703
+ end
704
+
705
+ DLEXT = /\.#{ ::Config::CONFIG['DLEXT'] }\z/
706
+
707
+ def _allext( dir )
708
+ Dir.open( dir ) {|d|
709
+ return d.find_all {|fname| DLEXT === fname }
710
+ }
711
+ end
712
+
713
+ #
714
+ # clean
715
+ #
716
+
717
+ def exec_clean
718
+ exec_task_traverse 'clean'
719
+ rm_f 'config.save'
720
+ rm_f 'InstalledFiles'
721
+ end
722
+
723
+ def clean_dir_bin( rel )
724
+ end
725
+
726
+ def clean_dir_lib( rel )
727
+ end
728
+
729
+ def clean_dir_ext( rel )
730
+ clean
731
+ end
732
+
733
+ def clean
734
+ command config('make-prog') + ' clean' if File.file? 'Makefile'
735
+ end
736
+
737
+ def clean_dir_data( rel )
738
+ end
739
+
740
+ #
741
+ # lib
742
+ #
743
+
744
+ def exec_task_traverse( task )
745
+ run_hook 'pre-' + task
746
+ FILETYPES.each do |type|
747
+ if config('without-ext') == 'yes' and type == 'ext' then
748
+ $stderr.puts 'skipping ext/* by user option' if verbose?
749
+ next
750
+ end
751
+ traverse task, type, task + '_dir_' + type
752
+ end
753
+ run_hook 'post-' + task
754
+ end
755
+
756
+ def traverse( task, rel, mid )
757
+ dive_into( rel ) {
758
+ run_hook 'pre-' + task
759
+ __send__ mid, rel.sub( %r_\A.*?(?:/|\z)_, '' )
760
+ all_dirs( curr_srcdir ).each do |d|
761
+ traverse task, rel + '/' + d, mid
762
+ end
763
+ run_hook 'post-' + task
764
+ }
765
+ end
766
+
767
+ def run_hook( name )
768
+ try_run_hook curr_srcdir + '/' + name or
769
+ try_run_hook curr_srcdir + '/' + name + '.rb'
770
+ end
771
+
772
+ def try_run_hook( fname )
773
+ return false unless File.file? fname
774
+
775
+ env = self.dup
776
+ begin
777
+ env.instance_eval File.read_all(fname), fname, 1
778
+ rescue
779
+ raise InstallError, "hook #{fname} failed:\n" + $!.message
780
+ end
781
+ true
782
+ end
783
+
784
+ def extdir?( dir )
785
+ File.exist? dir + '/MANIFEST'
786
+ end
787
+
788
+ end
789
+
790
+ ### end base.rb
791
+ ### begin toplevel.rb
792
+
793
+ class ToplevelInstaller < Installer
794
+
795
+ TASKS = [
796
+ [ 'config', 'saves your configurations' ],
797
+ [ 'show', 'shows current configuration' ],
798
+ [ 'setup', 'compiles extention or else' ],
799
+ [ 'install', 'installs files' ],
800
+ [ 'clean', "does `make clean' for each extention" ]
801
+ ]
802
+
803
+
804
+ def initialize( root )
805
+ super nil, {'verbose' => true}, root, '.'
806
+ Installer.declear_toplevel_installer self
807
+ end
808
+
809
+
810
+ def execute
811
+ run_metaconfigs
812
+
813
+ case task = parsearg_global()
814
+ when 'config'
815
+ @config = ConfigTable.new
816
+ else
817
+ @config = ConfigTable.load
818
+ end
819
+ parsearg_TASK task
820
+
821
+ exectask task
822
+ end
823
+
824
+
825
+ def run_metaconfigs
826
+ MetaConfigEnvironment.eval_file "#{srcdir_root}/#{metaconfig}"
827
+ end
828
+
829
+ def metaconfig
830
+ 'metaconfig'
831
+ end
832
+
833
+
834
+ def exectask( task )
835
+ if task == 'show' then
836
+ exec_show
837
+ else
838
+ try task
839
+ end
840
+ end
841
+
842
+ def try( task )
843
+ $stderr.printf "#{File.basename $0}: entering %s phase...\n", task if verbose?
844
+ begin
845
+ __send__ 'exec_' + task
846
+ rescue
847
+ $stderr.printf "%s failed\n", task
848
+ raise
849
+ end
850
+ $stderr.printf "#{File.basename $0}: %s done.\n", task if verbose?
851
+ end
852
+
853
+ #
854
+ # processing arguments
855
+ #
856
+
857
+ def parsearg_global
858
+ task_re = /\A(?:#{TASKS.collect {|i| i[0] }.join '|'})\z/
859
+
860
+ while arg = ARGV.shift do
861
+ case arg
862
+ when /\A\w+\z/
863
+ task_re === arg or raise InstallError, "wrong task: #{arg}"
864
+ return arg
865
+
866
+ when '-q', '--quiet'
867
+ @options['verbose'] = false
868
+
869
+ when '--verbose'
870
+ @options['verbose'] = true
871
+
872
+ when '-h', '--help'
873
+ print_usage $stdout
874
+ exit 0
875
+
876
+ when '-v', '--version'
877
+ puts "#{File.basename $0} version #{Version}"
878
+ exit 0
879
+
880
+ when '--copyright'
881
+ puts Copyright
882
+ exit 0
883
+
884
+ else
885
+ raise InstallError, "unknown global option '#{arg}'"
886
+ end
887
+ end
888
+
889
+ raise InstallError, 'no task or global option given'
890
+ end
891
+
892
+
893
+ def parsearg_TASK( task )
894
+ mid = "parsearg_#{task}"
895
+ if respond_to? mid, true then
896
+ __send__ mid
897
+ else
898
+ ARGV.empty? or
899
+ raise InstallError, "#{task}: unknown options: #{ARGV.join ' '}"
900
+ end
901
+ end
902
+
903
+ def parsearg_config
904
+ re = /\A--(#{ConfigTable.keys.join '|'})(?:=(.*))?\z/
905
+ @options['config-opt'] = []
906
+
907
+ while i = ARGV.shift do
908
+ if /\A--?\z/ === i then
909
+ @options['config-opt'] = ARGV.dup
910
+ break
911
+ end
912
+ m = re.match(i) or raise InstallError, "config: unknown option #{i}"
913
+ name, value = m.to_a[1,2]
914
+ if value then
915
+ if ConfigTable.bool_config?(name) then
916
+ /\A(y(es)?|n(o)?|t(rue)?|f(alse))\z/i === value or raise InstallError, "config: --#{name} allows only yes/no for argument"
917
+ value = (/\Ay(es)?|\At(rue)/i === value) ? 'yes' : 'no'
918
+ end
919
+ else
920
+ ConfigTable.bool_config?(name) or raise InstallError, "config: --#{name} requires argument"
921
+ value = 'yes'
922
+ end
923
+ @config[name] = value
924
+ end
925
+ end
926
+
927
+ def parsearg_install
928
+ @options['no-harm'] = false
929
+ @options['install-prefix'] = ''
930
+ while a = ARGV.shift do
931
+ case a
932
+ when /\A--no-harm\z/
933
+ @options['no-harm'] = true
934
+ when /\A--prefix=(.*)\z/
935
+ path = $1
936
+ path = File.expand_path(path) unless path[0,1] == '/'
937
+ @options['install-prefix'] = path
938
+ else
939
+ raise InstallError, "install: unknown option #{a}"
940
+ end
941
+ end
942
+ end
943
+
944
+
945
+ def print_usage( out )
946
+ out.puts
947
+ out.puts 'Usage:'
948
+ out.puts " ruby #{File.basename $0} <global option>"
949
+ out.puts " ruby #{File.basename $0} [<global options>] <task> [<task options>]"
950
+
951
+ fmt = " %-20s %s\n"
952
+ out.puts
953
+ out.puts 'Global options:'
954
+ out.printf fmt, '-q,--quiet', 'suppress message outputs'
955
+ out.printf fmt, ' --verbose', 'output messages verbosely'
956
+ out.printf fmt, '-h,--help', 'print this message'
957
+ out.printf fmt, '-v,--version', 'print version and quit'
958
+ out.printf fmt, '--copyright', 'print copyright and quit'
959
+
960
+ out.puts
961
+ out.puts 'Tasks:'
962
+ TASKS.each do |name, desc|
963
+ out.printf " %-10s %s\n", name, desc
964
+ end
965
+
966
+ out.puts
967
+ out.puts 'Options for config:'
968
+ ConfigTable.each_definition do |name, (default, arg, desc, default2)|
969
+ out.printf " %-20s %s [%s]\n",
970
+ '--'+ name + (ConfigTable.bool_config?(name) ? '' : '='+arg),
971
+ desc,
972
+ default2 || default
973
+ end
974
+ out.printf " %-20s %s [%s]\n",
975
+ '--rbconfig=path', 'your rbconfig.rb to load', "running ruby's"
976
+
977
+ out.puts
978
+ out.puts 'Options for install:'
979
+ out.printf " %-20s %s [%s]\n",
980
+ '--no-harm', 'only display what to do if given', 'off'
981
+
982
+ out.puts
983
+ end
984
+
985
+ #
986
+ # config
987
+ #
988
+
989
+ def exec_config
990
+ super
991
+ @config.save
992
+ end
993
+
994
+ #
995
+ # show
996
+ #
997
+
998
+ def exec_show
999
+ ConfigTable.each_name do |k|
1000
+ v = @config.get_raw(k)
1001
+ if not v or v.empty? then
1002
+ v = '(not specified)'
1003
+ end
1004
+ printf "%-10s %s\n", k, v
1005
+ end
1006
+ end
1007
+
1008
+ end
1009
+
1010
+ ### end toplevel.rb
1011
+
1012
+ if $0 == __FILE__ then
1013
+ begin
1014
+ installer = ToplevelInstaller.new( File.dirname($0) )
1015
+ installer.execute
1016
+ rescue
1017
+ raise if $DEBUG
1018
+ $stderr.puts $!.message
1019
+ $stderr.puts "try 'ruby #{$0} --help' for usage"
1020
+ exit 1
1021
+ end
1022
+ end