configuration 0.0.5 → 1.1.0

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.
data/README CHANGED
@@ -80,14 +80,6 @@ SAMPLES
80
80
 
81
81
  p c.a + c.b - c.c
82
82
 
83
- ~ > cat config/a.rb
84
-
85
- Configuration.for('a'){
86
- a 40
87
- b 4
88
- c 2
89
- }
90
-
91
83
  ~ > ruby samples/a.rb
92
84
 
93
85
  42
@@ -109,28 +101,6 @@ SAMPLES
109
101
  p c.db.url
110
102
  p c.mail.url
111
103
 
112
- ~ > cat config/b.rb
113
-
114
- Configuration.for('b'){
115
- host "codeforpeople.com"
116
-
117
- www {
118
- port 80
119
- url "http://#{ host }:#{ port }"
120
- }
121
-
122
- db {
123
- port 5342
124
- url "db://#{ host }:#{ port }"
125
- }
126
-
127
- mail {
128
- host "gmail.com"
129
- port 25
130
- url "mail://#{ host }:#{ port }"
131
- }
132
- }
133
-
134
104
  ~ > ruby samples/b.rb
135
105
 
136
106
  "http://codeforpeople.com:80"
@@ -154,17 +124,6 @@ SAMPLES
154
124
  p Configuration.for('production').db
155
125
  p Configuration.for('testing').db
156
126
 
157
- ~ > cat config/c.rb
158
-
159
- %w( development production testing ).each do |environment|
160
-
161
- Configuration.for(environment){
162
- adapter "sqlite3"
163
- db "db/#{ environment }"
164
- }
165
-
166
- end
167
-
168
127
  ~ > ruby samples/c.rb
169
128
 
170
129
  "db/development"
@@ -191,19 +150,22 @@ SAMPLES
191
150
  p c.inspect
192
151
  p c.p
193
152
 
194
- ~ > cat config/d.rb
195
-
196
- Configuration.for('d'){
197
- object_id 42
198
- inspect 'forty-two'
199
- p 42.0
200
- }
201
-
202
153
  ~ > ruby samples/d.rb
203
154
 
204
- 42
205
- "forty-two"
206
- 42.0
155
+ config/d.rb:2:in `object_id': wrong number of arguments (1 for 0) (ArgumentError)
156
+ from config/d.rb:2
157
+ from ./lib/configuration.rb:159:in `instance_eval'
158
+ from ./lib/configuration.rb:159:in `call'
159
+ from ./lib/configuration.rb:159:in `method_missing'
160
+ from ./lib/configuration.rb:105:in `evaluate'
161
+ from ./lib/configuration.rb:68:in `initialize'
162
+ from ./lib/configuration.rb:29:in `new'
163
+ from ./lib/configuration.rb:29:in `for'
164
+ from config/d.rb:1
165
+ from ./lib/configuration.rb:53:in `load'
166
+ from ./lib/configuration.rb:53:in `load'
167
+ from ./lib/configuration.rb:31:in `for'
168
+ from samples/d.rb:10
207
169
 
208
170
 
209
171
  <========< samples/e.rb >========>
@@ -223,22 +185,6 @@ SAMPLES
223
185
  p c.bar
224
186
  p c.foobar
225
187
 
226
- ~ > cat config/e.rb
227
-
228
- Configuration.for('e'){
229
- foo 42
230
-
231
- if Send('respond_to?', 'foo')
232
- bar 'forty-two'
233
- end
234
-
235
- respond_to = Method('bar')
236
-
237
- if respond_to.call('bar')
238
- foobar 42.0
239
- end
240
- }
241
-
242
188
  ~ > ruby samples/e.rb
243
189
 
244
190
  42
@@ -246,5 +192,6 @@ SAMPLES
246
192
  42.0
247
193
 
248
194
 
195
+
249
196
  AUTHOR
250
197
  ara.t.howard@gmail.com
data/README.erb ADDED
@@ -0,0 +1,69 @@
1
+ NAME
2
+ configuration.rb
3
+
4
+ SYNOPSIS
5
+ pure ruby scoped configuration files
6
+
7
+ DESCRIPTION
8
+ configuration.rb provides a mechanism for configuring ruby programs with
9
+ ruby configuration files. a configuration.rb file, for example
10
+ 'config/app.rb', can be written simply as
11
+
12
+ Configuration.for('app'){
13
+ key 'value'
14
+ foo 'bar'
15
+ port 42
16
+ }
17
+
18
+ and loaded via the normal ruby require/load mechanism
19
+
20
+ Kernel.load 'config/app.rb'
21
+
22
+ or with a slightly augmented loading mechnanism which simply searches an
23
+ extra set of paths in *addition* to the standard ones
24
+
25
+ Configuration.path = %w( config configuration )
26
+
27
+ Configuration.load 'app'
28
+
29
+ configurations are completely open
30
+
31
+ Configuration.for('app'){
32
+ object_id 'very open'
33
+ }
34
+
35
+ support arbitrarily nested values
36
+
37
+ Configuration.for('app'){
38
+ a { b { c { d 42 } } }
39
+ }
40
+
41
+ c = Configuration.for 'app'
42
+
43
+ p c.a.b.c.d #=> 42
44
+
45
+ allow POLS scoped lookup of vars
46
+
47
+ Configuration.for('config'){
48
+ outer 'bar'
49
+
50
+ inner {
51
+ value 42
52
+ }
53
+ }
54
+
55
+ c = Configuration.for 'config'
56
+
57
+ p c.outer #=> 'bar'
58
+ p c.inner.value #=> 42
59
+ p c.inner.outer #=> 'bar'
60
+
61
+
62
+ and not a whole lot else - configuration.rb is s very small library
63
+ consisting of one file and < 150 loc
64
+
65
+ SAMPLES
66
+ <%= samples %>
67
+
68
+ AUTHOR
69
+ ara.t.howard@gmail.com
data/Rakefile ADDED
@@ -0,0 +1,241 @@
1
+ This.author = "Ara T. Howard"
2
+ This.email = "ara.t.howard@gmail.com"
3
+ This.homepage = "http://github.com/ahoward/#{ This.lib }/tree/master"
4
+ This.rubyforge_project = 'codeforpeople'
5
+
6
+ task :default do
7
+ puts(Rake::Task.tasks.map{|task| task.name} - ['default'])
8
+ end
9
+
10
+ task :spec do
11
+ require 'spec/rake/spectask'
12
+ Spec::Rake::SpecTask.new do |t|
13
+ t.spec_files = FileList['spec/*_spec.rb']
14
+ end
15
+ end
16
+
17
+ task :gemspec do
18
+ ignore_extensions = 'git', 'svn', 'tmp', /sw./, 'bak', 'gem'
19
+ ignore_directories = 'pkg'
20
+ ignore_files = 'test/log'
21
+
22
+ shiteless =
23
+ lambda do |list|
24
+ list.delete_if do |entry|
25
+ next unless test(?e, entry)
26
+ extension = File.basename(entry).split(%r/[.]/).last
27
+ ignore_extensions.any?{|ext| ext === extension}
28
+ end
29
+ list.delete_if do |entry|
30
+ next unless test(?d, entry)
31
+ dirname = File.expand_path(entry)
32
+ ignore_directories.any?{|dir| File.expand_path(dir) == dirname}
33
+ end
34
+ list.delete_if do |entry|
35
+ next unless test(?f, entry)
36
+ filename = File.expand_path(entry)
37
+ ignore_files.any?{|file| File.expand_path(file) == filename}
38
+ end
39
+ end
40
+
41
+ lib = This.lib
42
+ version = This.version
43
+ files = shiteless[Dir::glob("**/**")]
44
+ executables = shiteless[Dir::glob("bin/*")].map{|exe| File.basename(exe)}
45
+ has_rdoc = true #File.exist?('doc')
46
+ test_files = "test/#{ lib }.rb" if File.file?("test/#{ lib }.rb")
47
+
48
+ extensions = This.extensions
49
+ if extensions.nil?
50
+ %w( Makefile configure extconf.rb ).each do |ext|
51
+ extensions << ext if File.exists?(ext)
52
+ end
53
+ end
54
+ extensions = [extensions].flatten.compact
55
+
56
+ template =
57
+ if test(?e, 'gemspec.erb')
58
+ Template{ IO.read('gemspec.erb') }
59
+ else
60
+ Template {
61
+ <<-__
62
+ ## #{ lib }.gemspec
63
+ #
64
+
65
+ Gem::Specification::new do |spec|
66
+ spec.name = #{ lib.inspect }
67
+ spec.version = #{ version.inspect }
68
+ spec.platform = Gem::Platform::RUBY
69
+ spec.summary = #{ lib.inspect }
70
+
71
+ spec.files = #{ files.inspect }
72
+ spec.executables = #{ executables.inspect }
73
+
74
+ <% if test(?d, 'lib') %>
75
+ spec.require_path = "lib"
76
+ <% end %>
77
+
78
+ spec.has_rdoc = #{ has_rdoc.inspect }
79
+ spec.test_files = #{ test_files.inspect }
80
+ #spec.add_dependency 'lib', '>= version'
81
+ #spec.add_dependency 'fattr'
82
+
83
+ spec.extensions.push(*#{ extensions.inspect })
84
+
85
+ spec.rubyforge_project = #{ This.rubyforge_project.inspect }
86
+ spec.author = #{ This.author.inspect }
87
+ spec.email = #{ This.email.inspect }
88
+ spec.homepage = #{ This.homepage.inspect }
89
+ end
90
+ __
91
+ }
92
+ end
93
+
94
+ open("#{ lib }.gemspec", "w"){|fd| fd.puts template}
95
+ This.gemspec = "#{ lib }.gemspec"
96
+ end
97
+
98
+ task :gem => [:clean, :gemspec] do
99
+ Fu.mkdir_p This.pkgdir
100
+ before = Dir['*.gem']
101
+ cmd = "gem build #{ This.gemspec }"
102
+ `#{ cmd }`
103
+ after = Dir['*.gem']
104
+ gem = ((after - before).first || after.first) or abort('no gem!')
105
+ Fu.mv gem, This.pkgdir
106
+ This.gem = File.basename(gem)
107
+ end
108
+
109
+ task :readme do
110
+ samples = ''
111
+ prompt = '~ > '
112
+ lib = This.lib
113
+ version = This.version
114
+
115
+ Dir['sample*/*'].sort.each do |sample|
116
+ samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
117
+
118
+ cmd = "cat #{ sample }"
119
+ samples << Util.indent(prompt + cmd, 2) << "\n\n"
120
+ samples << Util.indent(`#{ cmd }`, 4) << "\n"
121
+
122
+ cmd = "ruby #{ sample }"
123
+ samples << Util.indent(prompt + cmd, 2) << "\n\n"
124
+
125
+ cmd = "ruby -e'STDOUT.sync=true; exec %(ruby -Ilib -Iconfig #{ sample })'"
126
+ samples << Util.indent(`#{ cmd } 2>&1`, 4) << "\n"
127
+ end
128
+
129
+ template =
130
+ if test(?e, 'readme.erb')
131
+ Template{ IO.read('readme.erb') }
132
+ else
133
+ Template {
134
+ <<-__
135
+ NAME
136
+ #{ lib }
137
+
138
+ DESCRIPTION
139
+
140
+ INSTALL
141
+ gem install #{ lib }
142
+
143
+ SAMPLES
144
+ #{ samples }
145
+ __
146
+ }
147
+ end
148
+
149
+ open("README", "w"){|fd| fd.puts template}
150
+ end
151
+
152
+
153
+ task :clean do
154
+ Dir[File.join(This.pkgdir, '**/**')].each{|entry| Fu.rm_rf(entry)}
155
+ end
156
+
157
+
158
+ task :release => [:clean, :gemspec, :gem] do
159
+ gems = Dir[File.join(This.pkgdir, '*.gem')].flatten
160
+ raise "which one? : #{ gems.inspect }" if gems.size > 1
161
+ raise "no gems?" if gems.size < 1
162
+ cmd = "rubyforge login && rubyforge add_release #{ This.rubyforge_project } #{ This.lib } #{ This.version } #{ This.pkgdir }/#{ This.gem }"
163
+ puts cmd
164
+ system cmd
165
+ end
166
+
167
+
168
+
169
+
170
+
171
+ BEGIN {
172
+ $VERBOSE = nil
173
+
174
+ require 'ostruct'
175
+ require 'erb'
176
+ require 'fileutils'
177
+
178
+ Fu = FileUtils
179
+
180
+ This = OpenStruct.new
181
+
182
+ This.file = File.expand_path(__FILE__)
183
+ This.dir = File.dirname(This.file)
184
+ This.pkgdir = File.join(This.dir, 'pkg')
185
+
186
+ lib = ENV['LIB']
187
+ unless lib
188
+ lib = File.basename(Dir.pwd)
189
+ end
190
+ This.lib = lib
191
+
192
+ version = ENV['VERSION']
193
+ unless version
194
+ name = lib.capitalize
195
+ library = "./lib/#{ lib }.rb"
196
+ program = "./bin/#{ lib }"
197
+ if test(?e, library)
198
+ require library
199
+ version = eval(name).send(:version)
200
+ elsif test(?e, program)
201
+ version = `#{ program } --version`.strip
202
+ end
203
+ abort('no version') if(version.nil? or version.empty?)
204
+ end
205
+ This.version = version
206
+
207
+ abort('no lib') unless This.lib
208
+ abort('no version') unless This.version
209
+
210
+ module Util
211
+ def indent(s, n = 2)
212
+ s = unindent(s)
213
+ ws = ' ' * n
214
+ s.gsub(%r/^/, ws)
215
+ end
216
+
217
+ def unindent(s)
218
+ indent = nil
219
+ s.each do |line|
220
+ next if line =~ %r/^\s*$/
221
+ indent = line[%r/^\s*/] and break
222
+ end
223
+ indent ? s.gsub(%r/^#{ indent }/, "") : s
224
+ end
225
+ extend self
226
+ end
227
+
228
+ class Template
229
+ def initialize(&block)
230
+ @block = block
231
+ @template = block.call.to_s
232
+ end
233
+ def expand(b=nil)
234
+ ERB.new(Util.unindent(@template)).result(b||@block)
235
+ end
236
+ alias_method 'to_s', 'expand'
237
+ end
238
+ def Template(*args, &block) Template.new(*args, &block) end
239
+
240
+ Dir.chdir(This.dir)
241
+ }
data/config/e.rb CHANGED
@@ -7,7 +7,7 @@ Configuration.for('e'){
7
7
 
8
8
  respond_to = Method('bar')
9
9
 
10
- if respond_to.call('bar')
10
+ if respond_to.call()
11
11
  foobar 42.0
12
12
  end
13
13
  }
@@ -0,0 +1,28 @@
1
+ ## configuration.gemspec
2
+ #
3
+
4
+ Gem::Specification::new do |spec|
5
+ spec.name = "configuration"
6
+ spec.version = "1.1.0"
7
+ spec.platform = Gem::Platform::RUBY
8
+ spec.summary = "configuration"
9
+
10
+ spec.files = ["config", "config/a.rb", "config/b.rb", "config/c.rb", "config/d.rb", "config/e.rb", "configuration.gemspec", "lib", "lib/configuration.rb", "Rakefile", "README", "README.erb", "samples", "samples/a.rb", "samples/b.rb", "samples/c.rb", "samples/d.rb", "samples/e.rb"]
11
+ spec.executables = []
12
+
13
+
14
+ spec.require_path = "lib"
15
+
16
+
17
+ spec.has_rdoc = true
18
+ spec.test_files = nil
19
+ #spec.add_dependency 'lib', '>= version'
20
+ #spec.add_dependency 'fattr'
21
+
22
+ spec.extensions.push(*[])
23
+
24
+ spec.rubyforge_project = "codeforpeople"
25
+ spec.author = "Ara T. Howard"
26
+ spec.email = "ara.t.howard@gmail.com"
27
+ spec.homepage = "http://github.com/ahoward/configuration/tree/master"
28
+ end
data/lib/configuration.rb CHANGED
@@ -1,7 +1,6 @@
1
-
2
1
  class Configuration
3
- Version = '0.0.5'
4
- def Configuration.version() Version end
2
+ Configuration::Version = '1.1.0'
3
+ def Configuration.version() Configuration::Version end
5
4
 
6
5
  Path = [
7
6
  if defined? CONFIGURATION_PATH
@@ -76,14 +75,15 @@ class Configuration
76
75
  end
77
76
  send :include, InstanceMethods
78
77
 
79
-
80
78
  class DSL
79
+ Protected = %r/^__|^object_id$/
80
+
81
81
  instance_methods.each do |m|
82
- undef_method m unless m[%r/^__/]
82
+ undef_method m unless m[Protected]
83
83
  end
84
84
 
85
85
  Kernel.methods.each do |m|
86
- next if m[%r/^__/]
86
+ next if m[Protected]
87
87
  module_eval <<-code
88
88
  def #{ m }(*a, &b)
89
89
  method_missing '#{ m }', *a, &b
@@ -101,7 +101,7 @@ class Configuration
101
101
 
102
102
  def self.evaluate configuration, options = {}, &block
103
103
  dsl = new configuration
104
- Pure[dsl].instance_eval &block if block
104
+ Pure[dsl].instance_eval(&block) if block
105
105
  options.each{|key, value| Pure[dsl].send key, value}
106
106
  Pure[dsl].instance_eval{ @__configuration }
107
107
  end
@@ -118,7 +118,8 @@ class Configuration
118
118
  @__configuration
119
119
  end
120
120
 
121
- def method_missing m, *a, &b
121
+ undef_method(:method_missing) rescue nil
122
+ def method_missing(m, *a, &b)
122
123
  if(a.empty? and b.nil?)
123
124
  return Pure[@__configuration].send(m, *a, &b)
124
125
  end
@@ -143,14 +144,35 @@ class Configuration
143
144
  define_method(m){ value }
144
145
  end
145
146
  end
147
+
148
+ verbose = $VERBOSE
149
+ begin
150
+ $VERBOSE = nil
151
+ def object_id(*args)
152
+ unless args.empty?
153
+ verbose = $VERBOSE
154
+ begin
155
+ $VERBOSE = nil
156
+ define_method(:object_id){ args.first }
157
+ ensure
158
+ $VERBOSE = verbose
159
+ end
160
+ else
161
+ return Pure[@__configuration].object_id
162
+ end
163
+ end
164
+ ensure
165
+ $VERBOSE = verbose
166
+ end
146
167
  end
147
168
 
148
- class Pure
169
+ class Pure
149
170
  Instance_Methods = Hash.new
171
+ Protected = %r/^__|^object_id$/
150
172
 
151
173
  ::Object.instance_methods.each do |m|
152
174
  Instance_Methods[m.to_s] = ::Object.instance_method m
153
- undef_method m unless m[%r/^__/]
175
+ undef_method m unless m[Protected]
154
176
  end
155
177
 
156
178
  def method_missing m, *a, &b
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: configuration
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ara T. Howard
8
- autorequire: configuration
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-02-20 00:00:00 -07:00
12
+ date: 2009-09-23 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -28,20 +28,20 @@ files:
28
28
  - config/c.rb
29
29
  - config/d.rb
30
30
  - config/e.rb
31
- - gemspec.rb
32
- - gen_readme.rb
33
- - install.rb
31
+ - configuration.gemspec
34
32
  - lib
35
33
  - lib/configuration.rb
34
+ - Rakefile
36
35
  - README
36
+ - README.erb
37
37
  - samples
38
38
  - samples/a.rb
39
39
  - samples/b.rb
40
40
  - samples/c.rb
41
41
  - samples/d.rb
42
42
  - samples/e.rb
43
- has_rdoc: false
44
- homepage: http://codeforpeople.com/lib/ruby/configuration/
43
+ has_rdoc: true
44
+ homepage: http://github.com/ahoward/configuration/tree/master
45
45
  post_install_message:
46
46
  rdoc_options: []
47
47
 
@@ -61,8 +61,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
61
  version:
62
62
  requirements: []
63
63
 
64
- rubyforge_project:
65
- rubygems_version: 1.0.1
64
+ rubyforge_project: codeforpeople
65
+ rubygems_version: 1.3.1
66
66
  signing_key:
67
67
  specification_version: 2
68
68
  summary: configuration
data/gemspec.rb DELETED
@@ -1,35 +0,0 @@
1
- lib, version = File::basename(File::dirname(File::expand_path(__FILE__))).split %r/-/, 2
2
-
3
- require 'rubygems'
4
-
5
- Gem::Specification::new do |spec|
6
- $VERBOSE = nil
7
-
8
- shiteless = lambda do |list|
9
- list.delete_if do |file|
10
- file =~ %r/\.svn/ or
11
- file =~ %r/\.tmp/
12
- end
13
- end
14
-
15
- spec.name = lib
16
- spec.version = version
17
- spec.platform = Gem::Platform::RUBY
18
- spec.summary = lib
19
-
20
- spec.files = shiteless[Dir::glob("**/**")]
21
- spec.executables = shiteless[Dir::glob("bin/*")].map{|exe| File::basename exe}
22
-
23
- spec.require_path = "lib"
24
- spec.autorequire = lib
25
-
26
- spec.has_rdoc = File::exist? "doc"
27
- spec.test_suite_file = "test/#{ lib }.rb" if File::directory? "test"
28
- #spec.add_dependency 'lib', '>= version'
29
-
30
- spec.extensions << "extconf.rb" if File::exists? "extconf.rb"
31
-
32
- spec.author = "Ara T. Howard"
33
- spec.email = "ara.t.howard@gmail.com"
34
- spec.homepage = "http://codeforpeople.com/lib/ruby/#{ lib }/"
35
- end
data/gen_readme.rb DELETED
@@ -1,37 +0,0 @@
1
- require 'pathname'
2
-
3
- $VERBOSE=nil
4
-
5
- def indent s, n = 2
6
- ws = ' ' * n
7
- s.gsub %r/^/, ws
8
- end
9
-
10
- template = IO::read 'README.tmpl'
11
-
12
- samples = ''
13
- prompt = '~ > '
14
-
15
- Dir['sample*/*'].sort.each do |sample|
16
- config = sample.gsub(%r/samples?/, 'config')
17
- samples << "\n" << " <========< #{ sample } >========>" << "\n\n"
18
-
19
- cmd = "cat #{ sample }"
20
- samples << indent(prompt + cmd, 2) << "\n\n"
21
- samples << indent(`#{ cmd }`, 4) << "\n"
22
-
23
- cmd = "cat #{ config }"
24
- samples << indent(prompt + cmd, 2) << "\n\n"
25
- samples << indent(`#{ cmd }`, 4) << "\n"
26
-
27
- cmd = "ruby #{ sample }"
28
- samples << indent(prompt + cmd, 2) << "\n\n"
29
-
30
- cmd = "ruby -Ilib -Iconfig #{ sample }"
31
- samples << indent(`#{ cmd } 2>&1`, 4) << "\n"
32
- end
33
-
34
- #samples.gsub! %r/^/, ' '
35
-
36
- readme = template.gsub %r/^\s*@samples\s*$/, samples
37
- print readme
data/install.rb DELETED
@@ -1,214 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'rbconfig'
3
- require 'find'
4
- require 'ftools'
5
- require 'tempfile'
6
- include Config
7
-
8
- LIBDIR = "lib"
9
- LIBDIR_MODE = 0644
10
-
11
- BINDIR = "bin"
12
- BINDIR_MODE = 0755
13
-
14
-
15
- $srcdir = CONFIG["srcdir"]
16
- $version = CONFIG["MAJOR"]+"."+CONFIG["MINOR"]
17
- $libdir = File.join(CONFIG["libdir"], "ruby", $version)
18
- $archdir = File.join($libdir, CONFIG["arch"])
19
- $site_libdir = $:.find {|x| x =~ /site_ruby$/}
20
- $bindir = CONFIG["bindir"] || CONFIG['BINDIR']
21
- $ruby_install_name = CONFIG['ruby_install_name'] || CONFIG['RUBY_INSTALL_NAME'] || 'ruby'
22
- $ruby_ext = CONFIG['EXEEXT'] || ''
23
- $ruby = File.join($bindir, ($ruby_install_name + $ruby_ext))
24
-
25
- if !$site_libdir
26
- $site_libdir = File.join($libdir, "site_ruby")
27
- elsif $site_libdir !~ %r/#{Regexp.quote($version)}/
28
- $site_libdir = File.join($site_libdir, $version)
29
- end
30
-
31
- def install_rb(srcdir=nil, destdir=nil, mode=nil, bin=nil)
32
- #{{{
33
- path = []
34
- dir = []
35
- Find.find(srcdir) do |f|
36
- next unless FileTest.file?(f)
37
- next if (f = f[srcdir.length+1..-1]) == nil
38
- next if (/CVS$/ =~ File.dirname(f))
39
- next if (/\.svn/ =~ File.dirname(f))
40
- next if f =~ %r/\.lnk/
41
- next if f =~ %r/\.svn/
42
- next if f =~ %r/\.swp/
43
- next if f =~ %r/\.svn/
44
- path.push f
45
- dir |= [File.dirname(f)]
46
- end
47
- for f in dir
48
- next if f == "."
49
- next if f == "CVS"
50
- File::makedirs(File.join(destdir, f))
51
- end
52
- for f in path
53
- next if (/\~$/ =~ f)
54
- next if (/^\./ =~ File.basename(f))
55
- unless bin
56
- File::install(File.join(srcdir, f), File.join(destdir, f), mode, true)
57
- else
58
- from = File.join(srcdir, f)
59
- to = File.join(destdir, f)
60
- shebangify(from) do |sf|
61
- $deferr.print from, " -> ", File::catname(from, to), "\n"
62
- $deferr.printf "chmod %04o %s\n", mode, to
63
- File::install(sf, to, mode, false)
64
- end
65
- end
66
- end
67
- #}}}
68
- end
69
- def shebangify f
70
- #{{{
71
- open(f) do |fd|
72
- buf = fd.read 42
73
- if buf =~ %r/^\s*#\s*!.*ruby/o
74
- ftmp = Tempfile::new("#{ $$ }_#{ File::basename(f) }")
75
- begin
76
- fd.rewind
77
- ftmp.puts "#!#{ $ruby }"
78
- while((buf = fd.read(8192)))
79
- ftmp.write buf
80
- end
81
- ftmp.close
82
- yield ftmp.path
83
- ensure
84
- ftmp.close!
85
- end
86
- else
87
- yield f
88
- end
89
- end
90
- #}}}
91
- end
92
- def ARGV.switch
93
- #{{{
94
- return nil if self.empty?
95
- arg = self.shift
96
- return nil if arg == '--'
97
- if arg =~ /^-(.)(.*)/
98
- return arg if $1 == '-'
99
- raise 'unknown switch "-"' if $2.index('-')
100
- self.unshift "-#{$2}" if $2.size > 0
101
- "-#{$1}"
102
- else
103
- self.unshift arg
104
- nil
105
- end
106
- #}}}
107
- end
108
- def ARGV.req_arg
109
- #{{{
110
- self.shift || raise('missing argument')
111
- #}}}
112
- end
113
- def linkify d, linked = []
114
- #--{{{
115
- if test ?d, d
116
- versioned = Dir[ File::join(d, "*-[0-9].[0-9].[0-9].rb") ]
117
- versioned.each do |v|
118
- src, dst = v, v.gsub(%r/\-[\d\.]+\.rb$/, '.rb')
119
- lnk = nil
120
- begin
121
- if test ?l, dst
122
- lnk = "#{ dst }.lnk"
123
- puts "#{ dst } -> #{ lnk }"
124
- File::rename dst, lnk
125
- end
126
- unless test ?e, dst
127
- puts "#{ src } -> #{ dst }"
128
- File::copy src, dst
129
- linked << dst
130
- end
131
- ensure
132
- if lnk
133
- at_exit do
134
- puts "#{ lnk } -> #{ dst }"
135
- File::rename lnk, dst
136
- end
137
- end
138
- end
139
- end
140
- end
141
- linked
142
- #--}}}
143
- end
144
-
145
-
146
- #
147
- # main program
148
- #
149
-
150
- libdir = $site_libdir
151
- bindir = $bindir
152
- no_linkify = false
153
- linked = nil
154
- help = false
155
-
156
- usage = <<-usage
157
- #{ File::basename $0 }
158
- -d, --destdir <destdir>
159
- -l, --libdir <libdir>
160
- -b, --bindir <bindir>
161
- -r, --ruby <ruby>
162
- -n, --no_linkify
163
- -s, --sudo
164
- -h, --help
165
- usage
166
-
167
- begin
168
- while switch = ARGV.switch
169
- case switch
170
- when '-d', '--destdir'
171
- libdir = ARGV.req_arg
172
- when '-l', '--libdir'
173
- libdir = ARGV.req_arg
174
- when '-b', '--bindir'
175
- bindir = ARGV.req_arg
176
- when '-r', '--ruby'
177
- $ruby = ARGV.req_arg
178
- when '-n', '--no_linkify'
179
- no_linkify = true
180
- when '-s', '--sudo'
181
- sudo = 'sudo'
182
- when '-h', '--help'
183
- help = true
184
- else
185
- raise "unknown switch #{switch.dump}"
186
- end
187
- end
188
- rescue
189
- STDERR.puts $!.to_s
190
- STDERR.puts usage
191
- exit 1
192
- end
193
-
194
- if help
195
- STDOUT.puts usage
196
- exit
197
- end
198
-
199
- system "#{ sudo } #{ $ruby } pre-install.rb" if test(?s, 'pre-install.rb')
200
-
201
- unless no_linkify
202
- linked = linkify('lib') + linkify('bin')
203
- end
204
-
205
- system "#{ $ruby } extconf.rb && make && #{ sudo } make install" if test(?s, 'extconf.rb')
206
-
207
- install_rb(LIBDIR, libdir, LIBDIR_MODE)
208
- install_rb(BINDIR, bindir, BINDIR_MODE, bin=true)
209
-
210
- if linked
211
- linked.each{|path| File::rm_f path}
212
- end
213
-
214
- system "#{ sudo } #{ $ruby } post-install.rb" if test(?s, 'post-install.rb')