ruby-web 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
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