setup 4.2.0 → 5.0.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.
Files changed (55) hide show
  1. data/HISTORY +47 -3
  2. data/MANIFEST +49 -16
  3. data/README.rdoc +148 -0
  4. data/bin/setup.rb +1 -5
  5. data/lib/setup.rb +2 -2
  6. data/lib/setup/base.rb +143 -0
  7. data/lib/setup/command.rb +218 -114
  8. data/lib/setup/compiler.rb +69 -0
  9. data/lib/setup/configuration.rb +822 -0
  10. data/lib/setup/constants.rb +12 -0
  11. data/lib/setup/{rubyver.rb → core_ext.rb} +0 -0
  12. data/lib/setup/documentor.rb +149 -0
  13. data/lib/setup/installer.rb +363 -0
  14. data/lib/setup/project.rb +68 -0
  15. data/lib/setup/rake.rb +44 -45
  16. data/lib/setup/session.rb +233 -0
  17. data/lib/setup/tester.rb +92 -0
  18. data/lib/setup/uninstaller.rb +76 -0
  19. data/meta/active +1 -0
  20. data/meta/collection +1 -0
  21. data/meta/{abstract → description} +0 -0
  22. data/meta/{package → name} +0 -0
  23. data/meta/repository +1 -0
  24. data/meta/ruby +3 -0
  25. data/meta/version +1 -1
  26. data/script/bstrap +5 -0
  27. data/script/bundle +64 -0
  28. data/script/setup +1338 -0
  29. data/script/test +3 -0
  30. data/test/cases/installer.rb +28 -0
  31. data/test/features/config.feature +16 -0
  32. data/test/features/document.feature +2 -0
  33. data/test/features/install.feature +72 -0
  34. data/test/features/make.feature +18 -0
  35. data/test/features/step_definitions/common_steps.rb +34 -0
  36. data/test/features/step_definitions/config_steps.rb +24 -0
  37. data/test/features/step_definitions/env.rb +37 -0
  38. data/test/features/step_definitions/install_steps.rb +75 -0
  39. data/test/features/step_definitions/setup_steps.rb +30 -0
  40. data/test/features/step_definitions/uninstall_steps.rb +8 -0
  41. data/test/features/test.feature +2 -0
  42. data/test/features/uninstall.feature +13 -0
  43. data/test/fixtures/faux-project/bin/faux +3 -0
  44. data/test/fixtures/faux-project/ext/faux/extconf.rb +12 -0
  45. data/test/fixtures/faux-project/ext/faux/faux.c +24 -0
  46. data/test/fixtures/faux-project/lib/faux.rb +1 -0
  47. metadata +58 -29
  48. data/README +0 -106
  49. data/RELEASE +0 -41
  50. data/lib/setup/build.rb +0 -2
  51. data/lib/setup/config.rb +0 -452
  52. data/lib/setup/error.rb +0 -4
  53. data/lib/setup/install.rb +0 -1007
  54. data/meta/setup/metaconfig.rb +0 -3
  55. data/test/test_installer.rb +0 -139
@@ -0,0 +1,822 @@
1
+ require 'rbconfig'
2
+ require 'fileutils'
3
+ require 'erb'
4
+ require 'yaml'
5
+ require 'setup/core_ext'
6
+ require 'setup/constants'
7
+
8
+ module Setup
9
+
10
+ # Stores platform information and general install settings.
11
+ #
12
+ class Configuration
13
+
14
+ # Ruby System Configuration
15
+ RBCONFIG = ::Config::CONFIG
16
+
17
+ # Confgiuration file
18
+ CONFIG_FILE = 'SetupConfig' # '.cache/setup/config'
19
+
20
+ # Custom configuration file.
21
+ META_CONFIG_FILE = META_EXTENSION_DIR + '/configuration.rb'
22
+
23
+ #
24
+ def self.options
25
+ @@options ||= []
26
+ end
27
+
28
+ # TODO: better methods for path type
29
+ def self.option(name, *args) #type, description)
30
+ options << [name.to_s, *args] #type, description]
31
+ attr_accessor(name)
32
+ end
33
+
34
+ option :prefix , :path, 'path prefix of target environment'
35
+ option :bindir , :path, 'directory for commands'
36
+ option :libdir , :path, 'directory for libraries'
37
+ option :datadir , :path, 'directory for shared data'
38
+ option :mandir , :path, 'directory for man pages'
39
+ option :docdir , :path, 'directory for documentation'
40
+ option :rbdir , :path, 'directory for ruby scripts'
41
+ option :sodir , :path, 'directory for ruby extentions'
42
+ option :sysconfdir , :path, 'directory for system configuration files'
43
+ option :localstatedir , :path, 'directory for local state data'
44
+
45
+ option :libruby , :path, 'directory for ruby libraries'
46
+ option :librubyver , :path, 'directory for standard ruby libraries'
47
+ option :librubyverarch , :path, 'directory for standard ruby extensions'
48
+ option :siteruby , :path, 'directory for version-independent aux ruby libraries'
49
+ option :siterubyver , :path, 'directory for aux ruby libraries'
50
+ option :siterubyverarch , :path, 'directory for aux ruby binaries'
51
+
52
+ option :rubypath , :prog, 'path to set to #! line'
53
+ option :rubyprog , :prog, 'ruby program used for installation'
54
+ option :makeprog , :prog, 'make program to compile ruby extentions'
55
+
56
+ option :extconfopt , :opts, 'options to pass-thru to extconf.rb'
57
+
58
+ option :shebang , :pick, 'shebang line (#!) editing mode (all,ruby,never)'
59
+
60
+ option :no_test, :t , :bool, 'run pre-installation tests'
61
+ option :no_ri, :d , :bool, 'generate ri documentation'
62
+ option :no_doc , :bool, 'install doc/ directory'
63
+ option :no_ext , :bool, 'compile/install ruby extentions'
64
+
65
+ #option :rdoc , :pick, 'generate rdoc documentation'
66
+ #option :rdoc_template , :pick, 'rdoc document template to use'
67
+ #option :testrunner , :pick, 'Runner to use for testing (auto|console|tk|gtk|gtk2)'
68
+
69
+ option :install_prefix , :path, 'install to alternate root location'
70
+ option :root , :path, 'install to alternate root location'
71
+
72
+ option :installdirs , :pick, 'install location mode (site,std,home)' #, local)
73
+ option :type , :pick, 'install location mode (site,std,home)'
74
+
75
+ # Turn all of CONFIG into methods.
76
+
77
+ ::Config::CONFIG.each do |key,val|
78
+ next if key == "configure_args"
79
+ name = key.to_s.downcase
80
+ #name = name.sub(/^--/,'')
81
+ #name = name.gsub(/-/,'_')
82
+ define_method(name){ val }
83
+ end
84
+
85
+ # Turn all of CONFIG["configure_args"] into methods.
86
+
87
+ ::Config::CONFIG["configure_args"].each do |ent|
88
+ key, val = *ent.split("=")
89
+ name = key.downcase
90
+ name = name.sub(/^--/,'')
91
+ name = name.gsub(/-/,'_')
92
+ define_method(name){ val }
93
+ end
94
+
95
+ #
96
+ def options
97
+ #(class << self ; self ; end).options
98
+ self.class.options
99
+ end
100
+
101
+ # # I N I T I A L I Z E # #
102
+
103
+ # New ConfigTable
104
+ def initialize(values={})
105
+ initialize_metaconfig
106
+ initialize_defaults
107
+ initialize_environment
108
+ initialize_configfile
109
+ values.each{ |k,v| __send__("#{k}=", v) }
110
+ yeild(self) if block_given?
111
+ end
112
+
113
+ #
114
+ def initialize_metaconfig
115
+ if File.exist?(META_CONFIG_FILE)
116
+ script = File.read(META_CONFIG_FILE)
117
+ (class << self; self; end).class_eval(script)
118
+ end
119
+ end
120
+
121
+ # By default installation is to site locations, tests will
122
+ # not be run, ri documentation will not be generated, but
123
+ # the +doc/+ directory will be installed.
124
+ def initialize_defaults
125
+ self.type = 'site'
126
+ self.no_ri = true
127
+ self.no_test = true
128
+ self.no_doc = false
129
+ self.no_ext = false
130
+ #@rbdir = siterubyver #'$siterubyver'
131
+ #@sodir = siterubyverarch #'$siterubyverarch'
132
+ end
133
+
134
+ # Get configuration from environment.
135
+ def initialize_environment
136
+ options.each do |name, *args|
137
+ if value = ENV["RUBYSETUP_#{name.to_s.upcase}"]
138
+ __send__("#{name}=", value)
139
+ end
140
+ end
141
+ end
142
+
143
+ # Load configuration.
144
+ def initialize_configfile
145
+ if File.exist?(CONFIG_FILE)
146
+ erb = ERB.new(File.read(CONFIG_FILE))
147
+ txt = erb.result(binding)
148
+ dat = YAML.load(txt)
149
+ dat.each do |k, v|
150
+ next if 'type' == k
151
+ next if 'installdirs' == k
152
+ k = k.gsub('-','_')
153
+ __send__("#{k}=", v)
154
+ end
155
+ # do these last
156
+ if dat['type']
157
+ self.type = dat['type']
158
+ end
159
+ if dat['installdirs']
160
+ self.installdirs = dat['installdirs']
161
+ end
162
+ #else
163
+ # raise Error, $!.message + "\n#{File.basename($0)} config first"
164
+ end
165
+ end
166
+
167
+ #def initialize_configfile
168
+ # begin
169
+ # File.foreach(CONFIG_FILE) do |line|
170
+ # k, v = *line.split(/=/, 2)
171
+ # k.gsub!('-','_')
172
+ # __send__("#{k}=",v.strip) #self[k] = v.strip
173
+ # end
174
+ # rescue Errno::ENOENT
175
+ # raise Error, $!.message + "\n#{File.basename($0)} config first"
176
+ # end
177
+ #end
178
+
179
+ # # B A S E D I R E C T O R I E S # #
180
+
181
+ #
182
+ #def base_libruby
183
+ # "lib/ruby"
184
+ #end
185
+
186
+ # Base bin directory
187
+ def base_bindir
188
+ @base_bindir ||= subprefix('bindir')
189
+ end
190
+
191
+ # Base libdir
192
+ def base_libdir
193
+ @base_libdir ||= subprefix('libdir')
194
+ end
195
+
196
+ #
197
+ def base_datadir
198
+ @base_datadir ||= subprefix('datadir')
199
+ end
200
+
201
+ #
202
+ def base_mandir
203
+ @base_mandir ||= subprefix('mandir')
204
+ end
205
+
206
+ # NOTE: This removed the trailing <tt>$(PACKAGE)</tt>.
207
+ def base_docdir
208
+ @base_docdir || File.dirname(subprefix('docdir'))
209
+ end
210
+
211
+ #
212
+ def base_rubylibdir
213
+ @rubylibdir ||= subprefix('rubylibdir')
214
+ end
215
+
216
+ #
217
+ def base_rubyarchdir
218
+ @base_rubyarchdir ||= subprefix('archdir')
219
+ end
220
+
221
+ # Base directory for system configuration files
222
+ def base_sysconfdir
223
+ @base_sysconfdir ||= subprefix('sysconfdir')
224
+ end
225
+
226
+ # Base directory for local state data
227
+ def base_localstatedir
228
+ @base_localstatedir ||= subprefix('localstatedir')
229
+ end
230
+
231
+
232
+ # # C O N F I G U R A T I O N # #
233
+
234
+ #
235
+ def type
236
+ @type ||= 'site'
237
+ end
238
+
239
+ #
240
+ def type=(val)
241
+ @type = val
242
+ case val.to_s
243
+ when 'std', 'ruby'
244
+ @rbdir = librubyver #'$librubyver'
245
+ @sodir = librubyverarch #'$librubyverarch'
246
+ when 'site'
247
+ @rbdir = siterubyver #'$siterubyver'
248
+ @sodir = siterubyverarch #'$siterubyverarch'
249
+ when 'home'
250
+ self.prefix = File.join(home, '.local') # TODO: Use XDG
251
+ @rbdir = nil #'$libdir/ruby'
252
+ @sodir = nil #'$libdir/ruby'
253
+ #when 'local'
254
+ # rbdir = subprefix(librubyver, '')
255
+ # sodir = subprefix(librubyverarch, '')
256
+ # self.prefix = '/usr/local' # FIXME: how?
257
+ # self.rbdir = File.join(prefix, rbdir) #'$libdir/ruby'
258
+ # self.sodir = File.join(prefix, sodir) #'$libdir/ruby'
259
+ else
260
+ raise Error, "bad config: use type=(std|site|home) [#{val}]"
261
+ end
262
+ end
263
+
264
+ #
265
+ alias_method :installdirs, :type
266
+
267
+ #
268
+ alias_method :installdirs=, :type=
269
+
270
+
271
+ #
272
+ alias_method :install_prefix, :root
273
+
274
+ #
275
+ alias_method :install_prefix=, :root=
276
+
277
+
278
+ # Path prefix of target environment
279
+ def prefix
280
+ @prefix ||= RBCONFIG['prefix']
281
+ end
282
+
283
+ # Set path prefix of target environment
284
+ def prefix=(path)
285
+ @prefix = pathname(path)
286
+ end
287
+
288
+ # Directory for ruby libraries
289
+ def libruby
290
+ @libruby ||= RBCONFIG['prefix'] + "/lib/ruby"
291
+ end
292
+
293
+ # Set directory for ruby libraries
294
+ def libruby=(path)
295
+ path = pathname(path)
296
+ @librubyver = librubyver.sub(libruby, path)
297
+ @librubyverarch = librubyverarch.sub(libruby, path)
298
+ @libruby = path
299
+ end
300
+
301
+ # Directory for standard ruby libraries
302
+ def librubyver
303
+ @librubyver ||= RBCONFIG['rubylibdir']
304
+ end
305
+
306
+ # Set directory for standard ruby libraries
307
+ def librubyver=(path)
308
+ @librubyver = pathname(path)
309
+ end
310
+
311
+ # Directory for standard ruby extensions
312
+ def librubyverarch
313
+ @librubyverarch ||= RBCONFIG['archdir']
314
+ end
315
+
316
+ # Set directory for standard ruby extensions
317
+ def librubyverarch=(path)
318
+ @librubyverarch = pathname(path)
319
+ end
320
+
321
+ # Directory for version-independent aux ruby libraries
322
+ def siteruby
323
+ @siteruby ||= RBCONFIG['sitedir']
324
+ end
325
+
326
+ # Set directory for version-independent aux ruby libraries
327
+ def siteruby=(path)
328
+ path = pathname(path)
329
+ @siterubyver = siterubyver.sub(siteruby, path)
330
+ @siterubyverarch = siterubyverarch.sub(siteruby, path)
331
+ @siteruby = path
332
+ end
333
+
334
+ # Directory for aux ruby libraries
335
+ def siterubyver
336
+ @siterubyver ||= RBCONFIG['sitelibdir']
337
+ end
338
+
339
+ # Set directory for aux ruby libraries
340
+ def siterubyver=(path)
341
+ @siterubyver = pathname(path)
342
+ end
343
+
344
+ # Directory for aux ruby binary libraries
345
+ def siterubyverarch
346
+ @siterubyverarch ||= RBCONFIG['sitearchdir']
347
+ end
348
+
349
+ # Set directory for aux arch ruby binaries
350
+ def siterubyverarch=(path)
351
+ @siterubyverarch = pathname(path)
352
+ end
353
+
354
+ # Directory for commands
355
+ def bindir
356
+ @bindir || File.join(prefix, base_bindir)
357
+ end
358
+
359
+ # Set directory for commands
360
+ def bindir=(path)
361
+ @bindir = pathname(path)
362
+ end
363
+
364
+ # Directory for libraries
365
+ def libdir
366
+ @libdir || File.join(prefix, base_libdir)
367
+ end
368
+
369
+ # Set directory for libraries
370
+ def libdir=(path)
371
+ @libdir = pathname(path)
372
+ end
373
+
374
+ # Directory for shared data
375
+ def datadir
376
+ @datadir || File.join(prefix, base_datadir)
377
+ end
378
+
379
+ # Set directory for shared data
380
+ def datadir=(path)
381
+ @datadir = pathname(path)
382
+ end
383
+
384
+ # Directory for man pages
385
+ def mandir
386
+ @mandir || File.join(prefix, base_mandir)
387
+ end
388
+
389
+ # Set directory for man pages
390
+ def mandir=(path)
391
+ @mandir = pathname(path)
392
+ end
393
+
394
+ # Directory for documentation
395
+ def docdir
396
+ @docdir || File.join(prefix, base_docdir)
397
+ end
398
+
399
+ # Set directory for documentation
400
+ def docdir=(path)
401
+ @docdir = pathname(path)
402
+ end
403
+
404
+ # Directory for ruby scripts
405
+ def rbdir
406
+ @rbdir || File.join(prefix, base_rubylibdir)
407
+ end
408
+
409
+ # Directory for ruby extentions
410
+ def sodir
411
+ @sodir || File.join(prefix, base_rubyarchdir)
412
+ end
413
+
414
+ # Directory for system configuration files
415
+ # TODO: Can this be prefixed?
416
+ def sysconfdir
417
+ @sysconfdir ||= base_sysconfdir
418
+ end
419
+
420
+ # Set directory for system configuration files
421
+ def sysconfdir=(path)
422
+ @sysconfdir = pathname(path)
423
+ end
424
+
425
+ # Directory for local state data
426
+ # TODO: Can this be prefixed?
427
+ def localstatedir
428
+ @localstatedir ||= base_localstatedir
429
+ end
430
+
431
+ # Set directory for local state data
432
+ def localstatedir=(path)
433
+ @localstatedir = pathname(path)
434
+ end
435
+
436
+ #
437
+ def rubypath
438
+ #@rubypath ||= RBCONFIG['libexecdir']
439
+ @rubypath ||= File.join(RBCONFIG['bindir'], RBCONFIG['ruby_install_name'] + RBCONFIG['EXEEXT'])
440
+ end
441
+
442
+ #
443
+ def rubypath=(path)
444
+ @rubypath = pathname(path)
445
+ end
446
+
447
+ #
448
+ def rubyprog
449
+ @rubyprog || rubypath
450
+ end
451
+
452
+ #
453
+ def rubyprog=(command)
454
+ @rubyprog = command
455
+ end
456
+
457
+ # TODO: Does this handle 'nmake' on windows?
458
+ def makeprog
459
+ @makeprog ||= (
460
+ if arg = RBCONFIG['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
461
+ arg.sub(/'/, '').split(/=/, 2)[1]
462
+ else
463
+ 'make'
464
+ end
465
+ )
466
+ end
467
+
468
+ #
469
+ def makeprog=(command)
470
+ @makeprog = command
471
+ end
472
+
473
+ #
474
+ def extconfopt
475
+ @extconfopt ||= ''
476
+ end
477
+
478
+ #
479
+ def extconfopt=(string)
480
+ @extconfopt = string
481
+ end
482
+
483
+ # Default is +ruby+.
484
+ def shebang
485
+ @shebang ||= 'ruby'
486
+ end
487
+
488
+ # There are three options: +all+, +ruby+, +never+.
489
+ def shebang=(val)
490
+ if %w(all ruby never).include?(val)
491
+ @shebang = val
492
+ else
493
+ raise Error, "bad config: use SHEBANG=(all|ruby|never) [#{val}]"
494
+ end
495
+ end
496
+
497
+ #
498
+ def no_ext
499
+ @no_ext
500
+ end
501
+
502
+ #
503
+ def no_ext=(val)
504
+ @no_ext = boolean(val)
505
+ end
506
+
507
+ #
508
+ def no_test
509
+ @no_test
510
+ end
511
+
512
+ #
513
+ def no_test=(val)
514
+ @no_test = boolean(val)
515
+ end
516
+
517
+ #
518
+ def no_doc
519
+ @no_doc
520
+ end
521
+
522
+ #
523
+ def no_doc=(val)
524
+ @no_doc = boolean(val)
525
+ end
526
+
527
+ #
528
+ def no_ri
529
+ @no_ri
530
+ end
531
+
532
+ #
533
+ def no_ri=(val)
534
+ @no_ri = boolean(val)
535
+ end
536
+
537
+ #def rdoc = 'no'
538
+ #def rdoctemplate = nil
539
+ #def testrunner = 'auto' # needed?
540
+
541
+ # Compile native extensions?
542
+ def compile?
543
+ !no_ext
544
+ end
545
+
546
+ # Run unit tests?
547
+ def test?
548
+ !no_test
549
+ end
550
+
551
+ # Generate ri documentation?
552
+ def ri?
553
+ !no_ri
554
+ end
555
+
556
+ # Install doc directory?
557
+ def doc?
558
+ !no_doc
559
+ end
560
+
561
+
562
+ # # C O N V E R S I O N # #
563
+
564
+ #
565
+ def to_h
566
+ h = {}
567
+ options.each do |name, *args|
568
+ h[name.to_s] = __send__(name)
569
+ end
570
+ h
571
+ end
572
+
573
+ #
574
+ def to_s
575
+ to_yaml.sub(/\A---\s*\n/,'')
576
+ end
577
+
578
+ #
579
+ def to_yaml(*args)
580
+ to_h.to_yaml(*args)
581
+ end
582
+
583
+ # Save configuration.
584
+ def save_config
585
+ out = to_yaml
586
+ if not File.exist?(File.dirname(CONFIG_FILE))
587
+ FileUtils.mkdir_p(File.dirname(CONFIG_FILE))
588
+ end
589
+ if File.exist?(CONFIG_FILE)
590
+ txt = File.read(CONFIG_FILE)
591
+ return nil if txt == out
592
+ end
593
+ File.open(CONFIG_FILE, 'w'){ |f| f << out }
594
+ true
595
+ end
596
+
597
+ # Does the configuration file exist?
598
+ def exist?
599
+ File.exist?(CONFIG_FILE)
600
+ end
601
+
602
+ #
603
+ #def show
604
+ # fmt = "%-20s %s\n"
605
+ # OPTIONS.each do |name|
606
+ # value = self[name]
607
+ # reslv = __send__(name)
608
+ # case reslv
609
+ # when String
610
+ # reslv = "(none)" if reslv.empty?
611
+ # when false, nil
612
+ # reslv = "no"
613
+ # when true
614
+ # reslv = "yes"
615
+ # end
616
+ # printf fmt, name, reslv
617
+ # end
618
+ #end
619
+
620
+ private
621
+
622
+ def pathname(path)
623
+ path.gsub(%r<\\$([^/]+)>){ self[$1] }
624
+ end
625
+
626
+ #def absolute_pathname(path)
627
+ # File.expand_path(path).gsub(%r<\\$([^/]+)>){ self[$1] }
628
+ #end
629
+
630
+ # Boolean attribute. Can be assigned true, false, nil, or
631
+ # a string matching yes|true|y|t or no|false|n|f.
632
+ def boolean(val, name=nil)
633
+ case val
634
+ when true, false, nil
635
+ val
636
+ else
637
+ case val.to_s.downcase
638
+ when 'y', 'yes', 't', 'true'
639
+ true
640
+ when 'n', 'no', 'f', 'false'
641
+ false
642
+ else
643
+ raise Error, "bad config: use --#{name}=(yes|no) [\#{val}]"
644
+ end
645
+ end
646
+ end
647
+
648
+ #
649
+ def subprefix(path, with='')
650
+ val = RBCONFIG[path]
651
+ raise "Unknown path -- #{path}" if val.nil?
652
+ prefix = Regexp.quote(RBCONFIG['prefix'])
653
+ val.sub(/\A#{prefix}/, with)
654
+ end
655
+
656
+ #
657
+ def home
658
+ ENV['HOME'] || raise(Error, 'HOME is not set.')
659
+ end
660
+
661
+ # Get unresloved attribute.
662
+ #def [](name)
663
+ # instance_variable_get("@#{name}")
664
+ #end
665
+
666
+ # Set attribute.
667
+ #def []=(name, value)
668
+ # instance_variable_set("@#{name}", value)
669
+ #end
670
+
671
+ # Resolved attribute. (for paths)
672
+ #def resolve(name)
673
+ # self[name].gsub(%r<\\$([^/]+)>){ self[$1] }
674
+ #end
675
+
676
+ end #class ConfigTable
677
+
678
+ end #module Setup
679
+
680
+
681
+
682
+
683
+
684
+
685
+
686
+
687
+ # Pathname attribute. Pathnames are automatically expanded
688
+ # unless they start with '$', a path variable.
689
+ #def self.attr_pathname(name)
690
+ # class_eval %{
691
+ # def #{name}
692
+ # @#{name}.gsub(%r<\\$([^/]+)>){ self[$1] }
693
+ # end
694
+ # def #{name}=(path)
695
+ # raise Error, "bad config: #{name.to_s.upcase} requires argument" unless path
696
+ # @#{name} = (path[0,1] == '$' ? path : File.expand_path(path))
697
+ # end
698
+ # }
699
+ #end
700
+
701
+ # List of pathnames. These are not expanded though.
702
+ #def self.attr_pathlist(name)
703
+ # class_eval %{
704
+ # def #{name}
705
+ # @#{name}
706
+ # end
707
+ # def #{name}=(pathlist)
708
+ # case pathlist
709
+ # when Array
710
+ # @#{name} = pathlist
711
+ # else
712
+ # @#{name} = pathlist.to_s.split(/[:;,]/)
713
+ # end
714
+ # end
715
+ # }
716
+ #end
717
+
718
+ # Adds boolean support.
719
+ #def self.attr_accessor(*names)
720
+ # bools, attrs = names.partition{ |name| name.to_s =~ /\?$/ }
721
+ # attr_boolean *bools
722
+ # super *attrs
723
+ #end
724
+
725
+
726
+ # # provide verbosity (default is true)
727
+ # attr_accessor :verbose?
728
+
729
+ # # don't actually write files to system
730
+ # attr_accessor :no_harm?
731
+
732
+ =begin
733
+ # Metaconfig file is '.config/setup/metaconfig{,.rb}'.
734
+ def inintialize_metaconfig
735
+ path = Dir.glob(METACONFIG_FILE).first
736
+ if path && File.file?(path)
737
+ MetaConfigEnvironment.new(self).instance_eval(File.read(path), path)
738
+ end
739
+ end
740
+
741
+ #= Meta Configuration
742
+ # This works a bit differently from 3.4.1.
743
+ # Defaults are currently not supported but remain in the method interfaces.
744
+ class MetaConfigEnvironment
745
+ def initialize(config) #, installer)
746
+ @config = config
747
+ #@installer = installer
748
+ end
749
+
750
+ #
751
+ def config_names
752
+ @config.descriptions.collect{ |n, t, d| n.to_s }
753
+ end
754
+
755
+ #
756
+ def config?(name)
757
+ @config.descriptions.find do |sym, type, desc|
758
+ sym.to_s == name.to_s
759
+ end
760
+ end
761
+
762
+ #
763
+ def bool_config?(name)
764
+ @config.descriptions.find do |sym, type, desc|
765
+ sym.to_s == name.to_s && type == :bool
766
+ end
767
+ #@config.lookup(name).config_type == 'bool'
768
+ end
769
+
770
+ #
771
+ def path_config?(name)
772
+ @config.descriptions.find do |sym, type, desc|
773
+ sym.to_s == name.to_s && type == :path
774
+ end
775
+ #@config.lookup(name).config_type == 'path'
776
+ end
777
+
778
+ #
779
+ def value_config?(name)
780
+ @config.descriptions.find do |sym, type, desc|
781
+ sym.to_s == name.to_s && type != :prog
782
+ end
783
+ #@config.lookup(name).config_type != 'exec'
784
+ end
785
+
786
+ #
787
+ def add_config(name, default, desc)
788
+ @config.descriptions << [name.to_sym, nil, desc]
789
+ #@config.add item
790
+ end
791
+
792
+ #
793
+ def add_bool_config(name, default, desc)
794
+ @config.descriptions << [name.to_sym, :bool, desc]
795
+ #@config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
796
+ end
797
+
798
+ #
799
+ def add_path_config(name, default, desc)
800
+ @config.descriptions << [name.to_sym, :path, desc]
801
+ #@config.add PathItem.new(name, 'path', default, desc)
802
+ end
803
+
804
+ #
805
+ def set_config_default(name, default)
806
+ @config[name] = default
807
+ end
808
+
809
+ #
810
+ def remove_config(name)
811
+ item = @config.descriptions.find do |sym, type, desc|
812
+ sym.to_s == name.to_s
813
+ end
814
+ index = @config.descriptions.index(item)
815
+ @config.descriptions.delete(index)
816
+ #@config.remove(name)
817
+ end
818
+ end
819
+ =end
820
+
821
+ # Designed to work with Ruby 1.6.3 or greater.
822
+