dokkit 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,41 @@
1
+ # $Id$
2
+
3
+ if HAVE_GIT
4
+
5
+ namespace :git do
6
+
7
+ # A prerequisites task that all other tasks depend upon
8
+ task :prereqs
9
+
10
+ desc 'Show tags from the Git repository'
11
+ task :show_tags => 'git:prereqs' do |t|
12
+ puts %x/git tag/
13
+ end
14
+
15
+ desc 'Create a new tag in the Git repository'
16
+ task :create_tag => 'git:prereqs' do |t|
17
+ v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
18
+ abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
19
+
20
+ tag = "%s-%s" % [PROJ.name, PROJ.version]
21
+ msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
22
+
23
+ puts "Creating Git tag '#{tag}'"
24
+ unless system "git tag -a -m '#{msg}' #{tag}"
25
+ abort "Tag creation failed"
26
+ end
27
+
28
+ if %x/git remote/ =~ %r/^origin\s*$/
29
+ unless system "git push origin #{tag}"
30
+ abort "Could not push tag to remote Git repository"
31
+ end
32
+ end
33
+ end
34
+
35
+ end # namespace :git
36
+
37
+ task 'gem:release' => 'git:create_tag'
38
+
39
+ end # if HAVE_GIT
40
+
41
+ # EOF
@@ -6,36 +6,44 @@ namespace :manifest do
6
6
 
7
7
  desc 'Verify the manifest'
8
8
  task :check do
9
- fn = 'Manifest.tmp'
10
- files = []
11
- exclude = Regexp.new(PROJ.exclude.join('|'))
12
- Find.find '.' do |path|
13
- path.sub! %r/^(\.\/|\/)/o, ''
14
- next unless test ?f, path
15
- next if path =~ exclude
16
- files << path
17
- end
9
+ fn = PROJ.manifest_file + '.tmp'
10
+ files = manifest_files
18
11
 
19
- File.open(fn, 'w') {|fp| fp.puts files.sort}
20
- system "#{DIFF} -du Manifest.txt #{fn}"
12
+ File.open(fn, 'w') {|fp| fp.puts files}
13
+ lines = %x(#{DIFF} -du #{PROJ.manifest_file} #{fn}).split("\n")
14
+ if HAVE_FACETS_ANSICODE and ENV.has_key?('TERM')
15
+ lines.map! do |line|
16
+ case line
17
+ when %r/^(-{3}|\+{3})/; nil
18
+ when %r/^@/; Console::ANSICode.blue line
19
+ when %r/^\+/; Console::ANSICode.green line
20
+ when %r/^\-/; Console::ANSICode.red line
21
+ else line end
22
+ end
23
+ end
24
+ puts lines.compact
21
25
  rm fn rescue nil
22
26
  end
23
27
 
24
28
  desc 'Create a new manifest'
25
29
  task :create do
26
- fn = 'Manifest.txt'
27
- files = []
28
- exclude = Regexp.new(PROJ.exclude.join('|'))
29
- Find.find '.' do |path|
30
- path.sub! %r/^(\.\/|\/)/o, ''
31
- next unless test ?f, path
32
- next if path =~ exclude
33
- files << path
30
+ files = manifest_files
31
+ unless test(?f, PROJ.manifest_file)
32
+ files << PROJ.manifest_file
33
+ files.sort!
34
34
  end
35
+ File.open(PROJ.manifest_file, 'w') {|fp| fp.puts files}
36
+ end
35
37
 
36
- files << fn unless test ?f, fn
37
- File.open(fn, 'w') {|fp| fp.puts files.sort}
38
+ task :assert do
39
+ files = manifest_files
40
+ manifest = File.read(PROJ.manifest_file).split($/)
41
+ raise "ERROR: #{PROJ.manifest_file} is out of date" unless files == manifest
38
42
  end
39
- end
43
+
44
+ end # namespace :manifest
45
+
46
+ desc 'Alias to manifest:check'
47
+ task :manifest => 'manifest:check'
40
48
 
41
49
  # EOF
@@ -0,0 +1,28 @@
1
+ # $Id$
2
+
3
+ if HAVE_BONES
4
+
5
+ desc "Enumerate all annotations"
6
+ task :notes do |t|
7
+ id = if t.application.top_level_tasks.length > 1
8
+ t.application.top_level_tasks.slice!(1..-1).join(' ')
9
+ end
10
+ Bones::AnnotationExtractor.enumerate(
11
+ PROJ, PROJ.notes.tags.join('|'), id, :tag => true)
12
+ end
13
+
14
+ namespace :notes do
15
+ PROJ.notes.tags.each do |tag|
16
+ desc "Enumerate all #{tag} annotations"
17
+ task tag.downcase.to_sym do |t|
18
+ id = if t.application.top_level_tasks.length > 1
19
+ t.application.top_level_tasks.slice!(1..-1).join(' ')
20
+ end
21
+ Bones::AnnotationExtractor.enumerate(PROJ, tag, id)
22
+ end
23
+ end
24
+ end
25
+
26
+ end # if HAVE_BONES
27
+
28
+ # EOF
@@ -0,0 +1,39 @@
1
+ # $Id$
2
+
3
+ # This file does not define any rake tasks. It is used to load some project
4
+ # settings if they are not defined by the user.
5
+
6
+ PROJ.rdoc.exclude << "^#{Regexp.escape(PROJ.manifest_file)}$"
7
+ PROJ.exclude << ["^#{Regexp.escape(PROJ.ann.file)}$",
8
+ "^#{Regexp.escape(PROJ.rdoc.dir)}/",
9
+ "^#{Regexp.escape(PROJ.rcov.dir)}/"]
10
+
11
+ flatten_arrays = lambda do |this,os|
12
+ os.instance_variable_get(:@table).each do |key,val|
13
+ next if key == :dependencies
14
+ case val
15
+ when Array; val.flatten!
16
+ when OpenStruct; this.call(this,val)
17
+ end
18
+ end
19
+ end
20
+ flatten_arrays.call(flatten_arrays,PROJ)
21
+
22
+ PROJ.changes ||= paragraphs_of(PROJ.history_file, 0..1).join("\n\n")
23
+
24
+ PROJ.description ||= paragraphs_of(PROJ.readme_file, 'description').join("\n\n")
25
+
26
+ PROJ.summary ||= PROJ.description.split('.').first
27
+
28
+ PROJ.gem.files ||=
29
+ if test(?f, PROJ.manifest_file)
30
+ files = File.readlines(PROJ.manifest_file).map {|fn| fn.chomp.strip}
31
+ files.delete ''
32
+ files
33
+ else [] end
34
+
35
+ PROJ.gem.executables ||= PROJ.gem.files.find_all {|fn| fn =~ %r/^bin/}
36
+
37
+ PROJ.rdoc.main ||= PROJ.readme_file
38
+
39
+ # EOF
@@ -6,13 +6,13 @@ namespace :doc do
6
6
 
7
7
  desc 'Generate RDoc documentation'
8
8
  Rake::RDocTask.new do |rd|
9
- rd.main = PROJ.rdoc_main
10
- rd.options << '-d' if !WIN32 and `which dot` =~ %r/\/dot/
11
- rd.rdoc_dir = PROJ.rdoc_dir
9
+ rdoc = PROJ.rdoc
10
+ rd.main = rdoc.main
11
+ rd.rdoc_dir = rdoc.dir
12
12
 
13
- incl = Regexp.new(PROJ.rdoc_include.join('|'))
14
- excl = Regexp.new(PROJ.rdoc_exclude.join('|'))
15
- files = PROJ.files.find_all do |fn|
13
+ incl = Regexp.new(rdoc.include.join('|'))
14
+ excl = Regexp.new(rdoc.exclude.join('|'))
15
+ files = PROJ.gem.files.find_all do |fn|
16
16
  case fn
17
17
  when excl; false
18
18
  when incl; true
@@ -21,9 +21,12 @@ namespace :doc do
21
21
  rd.rdoc_files.push(*files)
22
22
 
23
23
  title = "#{PROJ.name}-#{PROJ.version} Documentation"
24
- title = "#{PROJ.rubyforge_name}'s " + title if PROJ.rubyforge_name != title
24
+
25
+ rf_name = PROJ.rubyforge.name
26
+ title = "#{rf_name}'s " + title if rf_name.valid? and rf_name != title
25
27
 
26
28
  rd.options << "-t #{title}"
29
+ rd.options.concat(rdoc.opts)
27
30
  end
28
31
 
29
32
  desc 'Generate ri locally for testing'
@@ -31,7 +34,6 @@ namespace :doc do
31
34
  sh "#{RDOC} --ri -o ri ."
32
35
  end
33
36
 
34
- desc 'Remove ri products'
35
37
  task :clobber_ri do
36
38
  rm_r 'ri' rescue nil
37
39
  end
@@ -44,6 +46,6 @@ task :doc => 'doc:rdoc'
44
46
  desc 'Remove all build products'
45
47
  task :clobber => %w(doc:clobber_rdoc doc:clobber_ri)
46
48
 
47
- remove_desc_for_task %w(doc:clobber_rdoc doc:clobber_ri)
49
+ remove_desc_for_task %w(doc:clobber_rdoc)
48
50
 
49
51
  # EOF
@@ -1,23 +1,23 @@
1
- # $Id$
2
1
 
3
- if PROJ.rubyforge_name && HAVE_RUBYFORGE
2
+ if PROJ.rubyforge.name.valid? && HAVE_RUBYFORGE
4
3
 
5
4
  require 'rubyforge'
6
5
  require 'rake/contrib/sshpublisher'
7
6
 
8
7
  namespace :gem do
9
8
  desc 'Package and upload to RubyForge'
10
- task :release => [:clobber, :package] do |t|
9
+ task :release => [:clobber, 'gem:package'] do |t|
11
10
  v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
12
11
  abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
13
- pkg = "pkg/#{PROJ.spec.full_name}"
12
+ pkg = "pkg/#{PROJ.gem._spec.full_name}"
14
13
 
15
14
  if $DEBUG then
16
- puts "release_id = rf.add_release #{PROJ.rubyforge_name.inspect}, #{PROJ.name.inspect}, #{PROJ.version.inspect}, \"#{pkg}.tgz\""
17
- puts "rf.add_file #{PROJ.rubyforge_name.inspect}, #{PROJ.name.inspect}, release_id, \"#{pkg}.gem\""
15
+ puts "release_id = rf.add_release #{PROJ.rubyforge.name.inspect}, #{PROJ.name.inspect}, #{PROJ.version.inspect}, \"#{pkg}.tgz\""
16
+ puts "rf.add_file #{PROJ.rubyforge.name.inspect}, #{PROJ.name.inspect}, release_id, \"#{pkg}.gem\""
18
17
  end
19
18
 
20
19
  rf = RubyForge.new
20
+ rf.configure rescue nil
21
21
  puts 'Logging in'
22
22
  rf.login
23
23
 
@@ -26,12 +26,12 @@ namespace :gem do
26
26
  c['release_changes'] = PROJ.changes if PROJ.changes
27
27
  c['preformatted'] = true
28
28
 
29
- files = [(PROJ.need_tar ? "#{pkg}.tgz" : nil),
30
- (PROJ.need_zip ? "#{pkg}.zip" : nil),
29
+ files = [(PROJ.gem.need_tar ? "#{pkg}.tgz" : nil),
30
+ (PROJ.gem.need_zip ? "#{pkg}.zip" : nil),
31
31
  "#{pkg}.gem"].compact
32
32
 
33
33
  puts "Releasing #{PROJ.name} v. #{PROJ.version}"
34
- rf.add_release PROJ.rubyforge_name, PROJ.name, PROJ.version, *files
34
+ rf.add_release PROJ.rubyforge.name, PROJ.name, PROJ.version, *files
35
35
  end
36
36
  end # namespace :gem
37
37
 
@@ -44,9 +44,9 @@ namespace :doc do
44
44
  )
45
45
 
46
46
  host = "#{config['username']}@rubyforge.org"
47
- remote_dir = "/var/www/gforge-projects/#{PROJ.rubyforge_name}/"
48
- remote_dir << PROJ.rdoc_remote_dir if PROJ.rdoc_remote_dir
49
- local_dir = PROJ.rdoc_dir
47
+ remote_dir = "/var/www/gforge-projects/#{PROJ.rubyforge.name}/"
48
+ remote_dir << PROJ.rdoc.remote_dir if PROJ.rdoc.remote_dir
49
+ local_dir = PROJ.rdoc.dir
50
50
 
51
51
  Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
52
52
  end
@@ -2,76 +2,123 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'rake'
5
+ require 'rake/clean'
5
6
  require 'fileutils'
6
7
  require 'ostruct'
7
8
 
8
- PROJ = OpenStruct.new
9
-
10
- PROJ.name = nil
11
- PROJ.summary = nil
12
- PROJ.description = nil
13
- PROJ.changes = nil
14
- PROJ.authors = nil
15
- PROJ.email = nil
16
- PROJ.url = nil
17
- PROJ.version = ENV['VERSION'] || '0.0.0'
18
- PROJ.rubyforge_name = nil
19
- PROJ.exclude = %w(tmp$ bak$ ~$ CVS .svn/ ^pkg/ ^doc/)
20
-
21
- # Rspec
22
- PROJ.specs = FileList['spec/**/*_spec.rb']
23
- PROJ.spec_opts = []
24
-
25
- # Test::Unit
26
- PROJ.tests = FileList['test/**/test_*.rb']
27
- PROJ.test_file = 'test/all.rb'
28
- PROJ.test_opts = []
29
-
30
- # Rcov
31
- PROJ.rcov_opts = ['--sort', 'coverage', '-T']
32
-
33
- # Rdoc
34
- PROJ.rdoc_opts = []
35
- PROJ.rdoc_include = %w(^lib/ ^bin/ ^ext/ .txt$)
36
- PROJ.rdoc_exclude = %w(extconf.rb$ ^Manifest.txt$)
37
- PROJ.rdoc_main = 'README.txt'
38
- PROJ.rdoc_dir = 'doc'
39
- PROJ.rdoc_remote_dir = nil
40
-
41
- # Extensions
42
- PROJ.extensions = FileList['ext/**/extconf.rb']
43
- PROJ.ruby_opts = %w(-w)
44
- PROJ.libs = []
45
- %w(lib ext).each {|dir| PROJ.libs << dir if test ?d, dir}
9
+ class OpenStruct; undef :gem; end
10
+
11
+ PROJ = OpenStruct.new(
12
+ # Project Defaults
13
+ :name => nil,
14
+ :summary => nil,
15
+ :description => nil,
16
+ :changes => nil,
17
+ :authors => nil,
18
+ :email => nil,
19
+ :url => "\000",
20
+ :version => ENV['VERSION'] || '0.0.0',
21
+ :exclude => %w(tmp$ bak$ ~$ CVS \.svn/ \.git/ ^pkg/),
22
+ :release_name => ENV['RELEASE'],
23
+
24
+ # System Defaults
25
+ :ruby_opts => %w(-w),
26
+ :libs => [],
27
+ :history_file => 'History.txt',
28
+ :manifest_file => 'Manifest.txt',
29
+ :readme_file => 'README.txt',
30
+
31
+ # Announce
32
+ :ann => OpenStruct.new(
33
+ :file => 'announcement.txt',
34
+ :text => nil,
35
+ :paragraphs => [],
36
+ :email => {
37
+ :from => nil,
38
+ :to => %w(ruby-talk@ruby-lang.org),
39
+ :server => 'localhost',
40
+ :port => 25,
41
+ :domain => ENV['HOSTNAME'],
42
+ :acct => nil,
43
+ :passwd => nil,
44
+ :authtype => :plain
45
+ }
46
+ ),
47
+
48
+ # Gem Packaging
49
+ :gem => OpenStruct.new(
50
+ :dependencies => [],
51
+ :executables => nil,
52
+ :extensions => FileList['ext/**/extconf.rb'],
53
+ :files => nil,
54
+ :need_tar => true,
55
+ :need_zip => false,
56
+ :extras => {}
57
+ ),
58
+
59
+ # File Annotations
60
+ :notes => OpenStruct.new(
61
+ :exclude => %w(^tasks/setup\.rb$),
62
+ :extensions => %w(.txt .rb .erb) << '',
63
+ :tags => %w(FIXME OPTIMIZE TODO)
64
+ ),
65
+
66
+ # Rcov
67
+ :rcov => OpenStruct.new(
68
+ :dir => 'coverage',
69
+ :opts => %w[--sort coverage -T],
70
+ :threshold => 90.0,
71
+ :threshold_exact => false
72
+ ),
73
+
74
+ # Rdoc
75
+ :rdoc => OpenStruct.new(
76
+ :opts => [],
77
+ :include => %w(^lib/ ^bin/ ^ext/ \.txt$),
78
+ :exclude => %w(extconf\.rb$),
79
+ :main => nil,
80
+ :dir => 'doc',
81
+ :remote_dir => nil
82
+ ),
46
83
 
47
- # Gem Packaging
48
- PROJ.files =
49
- if test ?f, 'Manifest.txt'
50
- files = File.readlines('Manifest.txt').map {|fn| fn.chomp.strip}
51
- files.delete ''
52
- files
53
- else [] end
54
- PROJ.executables = PROJ.files.find_all {|fn| fn =~ %r/^bin/}
55
- PROJ.dependencies = []
56
- PROJ.need_tar = true
57
- PROJ.need_zip = false
58
-
59
- # File Annotations
60
- PROJ.annotation_exclude = []
61
- PROJ.annotation_extensions = %w(.txt .rb .erb) << ''
62
-
63
- # Subversion Repository
64
- PROJ.svn = false
65
- PROJ.svn_root = nil
66
- PROJ.svn_trunk = 'trunk'
67
- PROJ.svn_tags = 'tags'
68
- PROJ.svn_branches = 'branches'
84
+ # Rubyforge
85
+ :rubyforge => OpenStruct.new(
86
+ :name => "\000"
87
+ ),
88
+
89
+ # Rspec
90
+ :spec => OpenStruct.new(
91
+ :files => FileList['spec/**/*_spec.rb'],
92
+ :opts => []
93
+ ),
94
+
95
+ # Subversion Repository
96
+ :svn => OpenStruct.new(
97
+ :root => nil,
98
+ :path => '',
99
+ :trunk => 'trunk',
100
+ :tags => 'tags',
101
+ :branches => 'branches'
102
+ ),
103
+
104
+ # Test::Unit
105
+ :test => OpenStruct.new(
106
+ :files => FileList['test/**/test_*.rb'],
107
+ :file => 'test/all.rb',
108
+ :opts => []
109
+ )
110
+ )
69
111
 
70
112
  # Load the other rake files in the tasks folder
71
- Dir.glob('tasks/*.rake').sort.each {|fn| import fn}
113
+ rakefiles = Dir.glob('tasks/*.rake').sort
114
+ rakefiles.unshift(rakefiles.delete('tasks/post_load.rake')).compact!
115
+ import(*rakefiles)
116
+
117
+ # Setup the project libraries
118
+ %w(lib ext).each {|dir| PROJ.libs << dir if test ?d, dir}
72
119
 
73
120
  # Setup some constants
74
- WIN32 = %r/win32/ =~ RUBY_PLATFORM unless defined? WIN32
121
+ WIN32 = %r/djgpp|(cyg|ms|bcc)win|mingw/ =~ RUBY_PLATFORM unless defined? WIN32
75
122
 
76
123
  DEV_NULL = WIN32 ? 'NUL:' : '/dev/null'
77
124
 
@@ -83,6 +130,7 @@ def quiet( &block )
83
130
  ensure
84
131
  STDOUT.reopen io.first
85
132
  STDERR.reopen io.last
133
+ $stdout, $stderr = STDOUT, STDERR
86
134
  end
87
135
 
88
136
  DIFF = if WIN32 then 'diff.exe'
@@ -97,10 +145,11 @@ SUDO = if WIN32 then ''
97
145
  else '' end
98
146
  end
99
147
 
100
- RCOV = WIN32 ? 'rcov.cmd' : 'rcov'
101
- GEM = WIN32 ? 'gem.cmd' : 'gem'
148
+ RCOV = WIN32 ? 'rcov.bat' : 'rcov'
149
+ RDOC = WIN32 ? 'rdoc.bat' : 'rdoc'
150
+ GEM = WIN32 ? 'gem.bat' : 'gem'
102
151
 
103
- %w(rcov spec/rake/spectask rubyforge bones).each do |lib|
152
+ %w(rcov spec/rake/spectask rubyforge bones facets/ansicode).each do |lib|
104
153
  begin
105
154
  require lib
106
155
  Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", true}
@@ -108,6 +157,10 @@ GEM = WIN32 ? 'gem.cmd' : 'gem'
108
157
  Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", false}
109
158
  end
110
159
  end
160
+ HAVE_SVN = (Dir.entries(Dir.pwd).include?('.svn') and
161
+ system("svn --version 2>&1 > #{DEV_NULL}"))
162
+ HAVE_GIT = (Dir.entries(Dir.pwd).include?('.git') and
163
+ system("git --version 2>&1 > #{DEV_NULL}"))
111
164
 
112
165
  # Reads a file at +path+ and spits out an array of the +paragraphs+
113
166
  # specified.
@@ -115,8 +168,28 @@ end
115
168
  # changes = paragraphs_of('History.txt', 0..1).join("\n\n")
116
169
  # summary, *description = paragraphs_of('README.txt', 3, 3..8)
117
170
  #
118
- def paragraphs_of(path, *paragraphs)
119
- File.read(path).delete("\r").split(/\n\n+/).values_at(*paragraphs)
171
+ def paragraphs_of( path, *paragraphs )
172
+ title = String === paragraphs.first ? paragraphs.shift : nil
173
+ ary = File.read(path).delete("\r").split(/\n\n+/)
174
+
175
+ result = if title
176
+ tmp, matching = [], false
177
+ rgxp = %r/^=+\s*#{Regexp.escape(title)}/i
178
+ paragraphs << (0..-1) if paragraphs.empty?
179
+
180
+ ary.each do |val|
181
+ if val =~ rgxp
182
+ break if matching
183
+ matching = true
184
+ rgxp = %r/^=+/i
185
+ elsif matching
186
+ tmp << val
187
+ end
188
+ end
189
+ tmp
190
+ else ary end
191
+
192
+ result.values_at(*paragraphs)
120
193
  end
121
194
 
122
195
  # Adds the given gem _name_ to the current project's dependency list. An
@@ -127,14 +200,19 @@ def depend_on( name, version = nil )
127
200
  spec = Gem.source_index.find_name(name).last
128
201
  version = spec.version.to_s if version.nil? and !spec.nil?
129
202
 
130
- PROJ.dependencies << (version.nil? ? [name] : [name, ">= #{version}"])
203
+ PROJ.gem.dependencies << case version
204
+ when nil; [name]
205
+ when %r/^\d/; [name, ">= #{version}"]
206
+ else [name, version] end
131
207
  end
132
208
 
133
- # Adds the given _path_ to the include path if it is not already there
209
+ # Adds the given arguments to the include path if they are not already there
134
210
  #
135
- def ensure_in_path( path )
136
- path = File.expand_path(path)
137
- $:.unshift(path) if test(?d, path) and not $:.include?(path)
211
+ def ensure_in_path( *args )
212
+ args.each do |path|
213
+ path = File.expand_path(path)
214
+ $:.unshift(path) if test(?d, path) and not $:.include?(path)
215
+ end
138
216
  end
139
217
 
140
218
  # Find a rake task using the task name and remove any description text. This
@@ -148,4 +226,43 @@ def remove_desc_for_task( names )
148
226
  end
149
227
  end
150
228
 
229
+ # Change working directories to _dir_, call the _block_ of code, and then
230
+ # change back to the original working directory (the current directory when
231
+ # this method was called).
232
+ #
233
+ def in_directory( dir, &block )
234
+ curdir = pwd
235
+ begin
236
+ cd dir
237
+ return block.call
238
+ ensure
239
+ cd curdir
240
+ end
241
+ end
242
+
243
+ # Scans the current working directory and creates a list of files that are
244
+ # candidates to be in the manifest.
245
+ #
246
+ def manifest_files
247
+ files = []
248
+ exclude = Regexp.new(PROJ.exclude.join('|'))
249
+ Find.find '.' do |path|
250
+ path.sub! %r/^(\.\/|\/)/o, ''
251
+ next unless test ?f, path
252
+ next if path =~ exclude
253
+ files << path
254
+ end
255
+ files.sort!
256
+ end
257
+
258
+ # We need a "valid" method thtat determines if a string is suitable for use
259
+ # in the gem specification.
260
+ #
261
+ class Object
262
+ def valid?
263
+ return !(self.empty? or self == "\000") if self.respond_to?(:to_str)
264
+ return false
265
+ end
266
+ end
267
+
151
268
  # EOF