mongo_rack 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,42 @@
1
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
2
+ require File.join(File.dirname(__FILE__), %w[.. lib core_ext hash])
3
+
4
+ describe MongoRack::SessionHash do
5
+ before :all do
6
+ @sessions = MongoRack::SessionHash.new( :fred => 10, :blee => "duh", 'crap' => 20 )
7
+ end
8
+
9
+ it "should pass non hash arg to hash class correctly" do
10
+ hash = MongoRack::SessionHash.new( "BumbleBeeTuna" )
11
+ hash[:c].should == "BumbleBeeTuna"
12
+ end
13
+
14
+ describe "indiscrement access" do
15
+ it "should find a symbol keys correctly" do
16
+ @sessions[:fred].should == 10
17
+ @sessions[:blee].should == "duh"
18
+ end
19
+
20
+ it "should find a string key correctly" do
21
+ @sessions['fred'].should == 10
22
+ @sessions[:crap].should == 20
23
+ @sessions.fetch(:crap).should == @sessions.fetch('crap')
24
+ end
25
+
26
+ it "should return nil if a key is not in the hash" do
27
+ @sessions[:zob].should be_nil
28
+ end
29
+
30
+ it "should find values at indices correctly" do
31
+ @sessions.values_at( :fred, :blee ).should == [10, 'duh']
32
+ @sessions.values_at( 'fred', 'blee' ).should == [10, 'duh']
33
+ @sessions.values_at( :fred, 'blee' ).should == [10, 'duh']
34
+ end
35
+
36
+ it "should convert sub hashes correctly" do
37
+ @sessions[:blee] = { "bobo" => 10, :ema => "Hello" }
38
+ @sessions[:blee][:bobo].should == 10
39
+ @sessions[:blee]['ema'].should == "Hello"
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,20 @@
1
+ require 'rubygems'
2
+ require 'rack'
3
+ require 'rack/test'
4
+ require 'rack/response'
5
+
6
+ require File.join(File.dirname(__FILE__), %w[.. lib mongo_rack])
7
+
8
+ Spec::Runner.configure do |config|
9
+ end
10
+
11
+ def mongo_check( res, key, val )
12
+ session_id = res['Set-Cookie'].match( /^#{@session_key}=(.*?);.*?/ )[1]
13
+ ses = @sessions.find_one( { :_id => session_id } )
14
+ ses.should_not be_nil
15
+ ses['data'][key.to_s].should == val
16
+ end
17
+
18
+ def clear_sessions
19
+ @sessions.remove()
20
+ end
@@ -0,0 +1,20 @@
1
+
2
+ if HAVE_BONES
3
+
4
+ namespace :bones do
5
+
6
+ desc 'Show the PROJ open struct'
7
+ task :debug do |t|
8
+ atr = if t.application.top_level_tasks.length == 2
9
+ t.application.top_level_tasks.pop
10
+ end
11
+
12
+ if atr then Bones::Debug.show_attr(PROJ, atr)
13
+ else Bones::Debug.show PROJ end
14
+ end
15
+
16
+ end # namespace :bones
17
+
18
+ end # HAVE_BONES
19
+
20
+ # EOF
@@ -0,0 +1,202 @@
1
+
2
+ require 'find'
3
+ require 'rake/packagetask'
4
+ require 'rubygems/user_interaction'
5
+ require 'rubygems/builder'
6
+
7
+ module Bones
8
+ class GemPackageTask < Rake::PackageTask
9
+ # Ruby GEM spec containing the metadata for this package. The
10
+ # name, version and package_files are automatically determined
11
+ # from the GEM spec and don't need to be explicitly provided.
12
+ #
13
+ attr_accessor :gem_spec
14
+
15
+ # Tasks from the Bones gem directory
16
+ attr_reader :bones_files
17
+
18
+ # Create a GEM Package task library. Automatically define the gem
19
+ # if a block is given. If no block is supplied, then +define+
20
+ # needs to be called to define the task.
21
+ #
22
+ def initialize(gem_spec)
23
+ init(gem_spec)
24
+ yield self if block_given?
25
+ define if block_given?
26
+ end
27
+
28
+ # Initialization tasks without the "yield self" or define
29
+ # operations.
30
+ #
31
+ def init(gem)
32
+ super(gem.name, gem.version)
33
+ @gem_spec = gem
34
+ @package_files += gem_spec.files if gem_spec.files
35
+ @bones_files = []
36
+
37
+ local_setup = File.join(Dir.pwd, %w[tasks setup.rb])
38
+ if !test(?e, local_setup)
39
+ Dir.glob(::Bones.path(%w[lib bones tasks *])).each {|fn| bones_files << fn}
40
+ end
41
+ end
42
+
43
+ # Create the Rake tasks and actions specified by this
44
+ # GemPackageTask. (+define+ is automatically called if a block is
45
+ # given to +new+).
46
+ #
47
+ def define
48
+ super
49
+ task :prereqs
50
+ task :package => ['gem:prereqs', "#{package_dir_path}/#{gem_file}"]
51
+ file "#{package_dir_path}/#{gem_file}" => [package_dir_path] + package_files + bones_files do
52
+ when_writing("Creating GEM") {
53
+ chdir(package_dir_path) do
54
+ puts gem_spec.inspect
55
+ Gem::Builder.new(gem_spec).build
56
+ verbose(true) {
57
+ mv gem_file, "../#{gem_file}"
58
+ }
59
+ end
60
+ }
61
+ end
62
+
63
+ file package_dir_path => bones_files do
64
+ mkdir_p package_dir rescue nil
65
+
66
+ gem_spec.files = (gem_spec.files +
67
+ bones_files.map {|fn| File.join('tasks', File.basename(fn))}).sort
68
+
69
+ bones_files.each do |fn|
70
+ base_fn = File.join('tasks', File.basename(fn))
71
+ f = File.join(package_dir_path, base_fn)
72
+ fdir = File.dirname(f)
73
+ mkdir_p(fdir) if !File.exist?(fdir)
74
+ if File.directory?(fn)
75
+ mkdir_p(f)
76
+ else
77
+ raise "file name conflict for '#{base_fn}' (conflicts with '#{fn}')" if test(?e, f)
78
+ safe_ln(fn, f)
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ def gem_file
85
+ if @gem_spec.platform == Gem::Platform::RUBY
86
+ "#{package_name}.gem"
87
+ else
88
+ "#{package_name}-#{@gem_spec.platform}.gem"
89
+ end
90
+ end
91
+ end # class GemPackageTask
92
+ end # module Bones
93
+
94
+ namespace :gem do
95
+
96
+ PROJ.gem._spec = Gem::Specification.new do |s|
97
+ s.name = PROJ.name
98
+ s.version = PROJ.version
99
+ s.summary = PROJ.summary
100
+ s.authors = Array(PROJ.authors)
101
+ s.email = PROJ.email
102
+ s.homepage = Array(PROJ.url).first
103
+ s.rubyforge_project = PROJ.rubyforge.name
104
+
105
+ s.description = PROJ.description
106
+
107
+ PROJ.gem.dependencies.each do |dep|
108
+ s.add_dependency(*dep)
109
+ end
110
+
111
+ PROJ.gem.development_dependencies.each do |dep|
112
+ s.add_development_dependency(*dep)
113
+ end
114
+
115
+ s.files = PROJ.gem.files
116
+ s.executables = PROJ.gem.executables.map {|fn| File.basename(fn)}
117
+ s.extensions = PROJ.gem.files.grep %r/extconf\.rb$/
118
+
119
+ s.bindir = 'bin'
120
+ dirs = Dir["{#{PROJ.libs.join(',')}}"]
121
+ s.require_paths = dirs unless dirs.empty?
122
+
123
+ incl = Regexp.new(PROJ.rdoc.include.join('|'))
124
+ excl = PROJ.rdoc.exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
125
+ excl = Regexp.new(excl.join('|'))
126
+ rdoc_files = PROJ.gem.files.find_all do |fn|
127
+ case fn
128
+ when excl; false
129
+ when incl; true
130
+ else false end
131
+ end
132
+ s.rdoc_options = PROJ.rdoc.opts + ['--main', PROJ.rdoc.main]
133
+ s.extra_rdoc_files = rdoc_files
134
+ s.has_rdoc = true
135
+
136
+ if test ?f, PROJ.test.file
137
+ s.test_file = PROJ.test.file
138
+ else
139
+ s.test_files = PROJ.test.files.to_a
140
+ end
141
+
142
+ # Do any extra stuff the user wants
143
+ PROJ.gem.extras.each do |msg, val|
144
+ case val
145
+ when Proc
146
+ val.call(s.send(msg))
147
+ else
148
+ s.send "#{msg}=", val
149
+ end
150
+ end
151
+ end # Gem::Specification.new
152
+
153
+ Bones::GemPackageTask.new(PROJ.gem._spec) do |pkg|
154
+ pkg.need_tar = PROJ.gem.need_tar
155
+ pkg.need_zip = PROJ.gem.need_zip
156
+ end
157
+
158
+ desc 'Show information about the gem'
159
+ task :debug => 'gem:prereqs' do
160
+ puts PROJ.gem._spec.to_ruby
161
+ end
162
+
163
+ desc 'Write the gemspec '
164
+ task :spec => 'gem:prereqs' do
165
+ File.open("#{PROJ.name}.gemspec", 'w') do |f|
166
+ f.write PROJ.gem._spec.to_ruby
167
+ end
168
+ end
169
+
170
+ desc 'Install the gem'
171
+ task :install => [:clobber, 'gem:package'] do
172
+ sh "#{SUDO} #{GEM} install --local pkg/#{PROJ.gem._spec.full_name}"
173
+
174
+ # use this version of the command for rubygems > 1.0.0
175
+ #sh "#{SUDO} #{GEM} install --no-update-sources pkg/#{PROJ.gem._spec.full_name}"
176
+ end
177
+
178
+ desc 'Uninstall the gem'
179
+ task :uninstall do
180
+ installed_list = Gem.source_index.find_name(PROJ.name)
181
+ if installed_list and installed_list.collect { |s| s.version.to_s}.include?(PROJ.version) then
182
+ sh "#{SUDO} #{GEM} uninstall --version '#{PROJ.version}' --ignore-dependencies --executables #{PROJ.name}"
183
+ end
184
+ end
185
+
186
+ desc 'Reinstall the gem'
187
+ task :reinstall => [:uninstall, :install]
188
+
189
+ desc 'Cleanup the gem'
190
+ task :cleanup do
191
+ sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
192
+ end
193
+ end # namespace :gem
194
+
195
+
196
+ desc 'Alias to gem:package'
197
+ task :gem => 'gem:package'
198
+
199
+ task :clobber => 'gem:clobber_package'
200
+ remove_desc_for_task 'gem:clobber_package'
201
+
202
+ # EOF
@@ -0,0 +1,40 @@
1
+
2
+ if HAVE_GIT
3
+
4
+ namespace :git do
5
+
6
+ # A prerequisites task that all other tasks depend upon
7
+ task :prereqs
8
+
9
+ desc 'Show tags from the Git repository'
10
+ task :show_tags => 'git:prereqs' do |t|
11
+ puts %x/git tag/
12
+ end
13
+
14
+ desc 'Create a new tag in the Git repository'
15
+ task :create_tag => 'git:prereqs' do |t|
16
+ v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
17
+ abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
18
+
19
+ tag = "%s-%s" % [PROJ.name, PROJ.version]
20
+ msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
21
+
22
+ puts "Creating Git tag '#{tag}'"
23
+ unless system "git tag -a -m '#{msg}' #{tag}"
24
+ abort "Tag creation failed"
25
+ end
26
+
27
+ if %x/git remote/ =~ %r/^origin\s*$/
28
+ unless system "git push origin #{tag}"
29
+ abort "Could not push tag to remote Git repository"
30
+ end
31
+ end
32
+ end
33
+
34
+ end # namespace :git
35
+
36
+ task 'gem:release' => 'git:create_tag'
37
+
38
+ end # if HAVE_GIT
39
+
40
+ # EOF
@@ -0,0 +1,27 @@
1
+
2
+ if HAVE_BONES
3
+
4
+ desc "Enumerate all annotations"
5
+ task :notes do |t|
6
+ id = if t.application.top_level_tasks.length > 1
7
+ t.application.top_level_tasks.slice!(1..-1).join(' ')
8
+ end
9
+ Bones::AnnotationExtractor.enumerate(
10
+ PROJ, PROJ.notes.tags.join('|'), id, :tag => true)
11
+ end
12
+
13
+ namespace :notes do
14
+ PROJ.notes.tags.each do |tag|
15
+ desc "Enumerate all #{tag} annotations"
16
+ task tag.downcase.to_sym do |t|
17
+ id = if t.application.top_level_tasks.length > 1
18
+ t.application.top_level_tasks.slice!(1..-1).join(' ')
19
+ end
20
+ Bones::AnnotationExtractor.enumerate(PROJ, tag, id)
21
+ end
22
+ end
23
+ end
24
+
25
+ end # if HAVE_BONES
26
+
27
+ # EOF
@@ -0,0 +1,32 @@
1
+
2
+ # This file does not define any rake tasks. It is used to load some project
3
+ # settings if they are not defined by the user.
4
+
5
+ PROJ.exclude << ["^#{Regexp.escape(PROJ.ann.file)}$",
6
+ "^#{Regexp.escape(PROJ.ignore_file)}$",
7
+ "^#{Regexp.escape(PROJ.rdoc.dir)}/",
8
+ "^#{Regexp.escape(PROJ.rcov.dir)}/"]
9
+
10
+ flatten_arrays = lambda do |this,os|
11
+ os.instance_variable_get(:@table).each do |key,val|
12
+ next if key == :dependencies \
13
+ or key == :development_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.description ||= paragraphs_of(PROJ.readme_file, 'description').join("\n\n")
23
+
24
+ PROJ.summary ||= PROJ.description.split('.').first
25
+
26
+ PROJ.gem.files ||= manifest
27
+
28
+ PROJ.gem.executables ||= PROJ.gem.files.find_all {|fn| fn =~ %r/^bin/}
29
+
30
+ PROJ.rdoc.main ||= PROJ.readme_file
31
+
32
+ # EOF
@@ -0,0 +1,54 @@
1
+ require 'rake/rdoctask'
2
+ require 'darkfish-rdoc'
3
+
4
+ namespace :doc do
5
+
6
+ desc 'Generate RDoc documentation'
7
+ Rake::RDocTask.new do |rd|
8
+ rdoc = PROJ.rdoc
9
+ rd.main = rdoc.main
10
+ rd.rdoc_dir = rdoc.dir
11
+
12
+ incl = Regexp.new(rdoc.include.join('|'))
13
+ excl = Regexp.new(rdoc.exclude.join('|'))
14
+ files = PROJ.gem.files.find_all do |fn|
15
+ case fn
16
+ when excl; false
17
+ when incl; true
18
+ else false end
19
+ end
20
+ rd.rdoc_files.push(*files)
21
+
22
+ name = PROJ.name
23
+ rf_name = PROJ.rubyforge.name
24
+
25
+ title = "#{name}-#{PROJ.version} Documentation"
26
+ title = "#{rf_name}'s " + title if rf_name.valid? and rf_name != name
27
+
28
+ rd.options << "-t #{title}"
29
+ rd.options << "-SHN"
30
+ rd.options << "-f"
31
+ rd.options << "darkfish"
32
+ rd.options.concat(rdoc.opts)
33
+ end
34
+
35
+ desc 'Generate ri locally for testing'
36
+ task :ri => :clobber_ri do
37
+ sh "#{RDOC} --ri -o ri ."
38
+ end
39
+
40
+ task :clobber_ri do
41
+ rm_r 'ri' rescue nil
42
+ end
43
+
44
+ end # namespace :doc
45
+
46
+ desc 'Alias to doc:rdoc'
47
+ task :doc => 'doc:rdoc'
48
+
49
+ desc 'Remove all build products'
50
+ task :clobber => %w(doc:clobber_rdoc doc:clobber_ri)
51
+
52
+ remove_desc_for_task %w(doc:clobber_rdoc)
53
+
54
+ # EOF
@@ -0,0 +1,292 @@
1
+
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'rake/clean'
5
+ require 'fileutils'
6
+ require 'ostruct'
7
+ require 'find'
8
+
9
+ class OpenStruct; undef :gem if defined? :gem; end
10
+
11
+ # TODO: make my own openstruct type object that includes descriptions
12
+ # TODO: use the descriptions to output help on the available bones options
13
+
14
+ PROJ = OpenStruct.new(
15
+ # Project Defaults
16
+ :name => nil,
17
+ :summary => nil,
18
+ :description => nil,
19
+ :changes => nil,
20
+ :authors => nil,
21
+ :email => nil,
22
+ :url => "\000",
23
+ :version => ENV['VERSION'] || '0.0.0',
24
+ :exclude => %w(tmp$ bak$ ~$ CVS \.svn/ \.git/ ^pkg/),
25
+ :release_name => ENV['RELEASE'],
26
+
27
+ # System Defaults
28
+ :ruby_opts => %w(-w),
29
+ :libs => [],
30
+ :history_file => 'History.txt',
31
+ :readme_file => 'README.rdoc',
32
+ :ignore_file => '.bnsignore',
33
+
34
+ # Announce
35
+ :ann => OpenStruct.new(
36
+ :file => 'announcement.txt',
37
+ :text => nil,
38
+ :paragraphs => [],
39
+ :email => {
40
+ :from => nil,
41
+ :to => %w(ruby-talk@ruby-lang.org),
42
+ :server => 'localhost',
43
+ :port => 25,
44
+ :domain => ENV['HOSTNAME'],
45
+ :acct => nil,
46
+ :passwd => nil,
47
+ :authtype => :plain
48
+ }
49
+ ),
50
+
51
+ # Gem Packaging
52
+ :gem => OpenStruct.new(
53
+ :dependencies => [],
54
+ :development_dependencies => [],
55
+ :executables => nil,
56
+ :extensions => FileList['ext/**/extconf.rb'],
57
+ :files => nil,
58
+ :need_tar => true,
59
+ :need_zip => false,
60
+ :extras => {}
61
+ ),
62
+
63
+ # File Annotations
64
+ :notes => OpenStruct.new(
65
+ :exclude => %w(^tasks/setup\.rb$),
66
+ :extensions => %w(.txt .rb .erb .rdoc) << '',
67
+ :tags => %w(FIXME OPTIMIZE TODO)
68
+ ),
69
+
70
+ # Rcov
71
+ :rcov => OpenStruct.new(
72
+ :dir => 'coverage',
73
+ :opts => %w[--sort coverage -T],
74
+ :threshold => 90.0,
75
+ :threshold_exact => false
76
+ ),
77
+
78
+ # Rdoc
79
+ :rdoc => OpenStruct.new(
80
+ :opts => [],
81
+ :include => %w(^lib/ ^bin/ ^ext/ \.txt$ \.rdoc$),
82
+ :exclude => %w(extconf\.rb$),
83
+ :main => nil,
84
+ :dir => 'doc',
85
+ :remote_dir => nil
86
+ ),
87
+
88
+ # Rubyforge
89
+ :rubyforge => OpenStruct.new(
90
+ :name => "\000"
91
+ ),
92
+
93
+ # Rspec
94
+ :spec => OpenStruct.new(
95
+ :files => FileList['spec/**/*_spec.rb'],
96
+ :opts => []
97
+ ),
98
+
99
+ # Subversion Repository
100
+ :svn => OpenStruct.new(
101
+ :root => nil,
102
+ :path => '',
103
+ :trunk => 'trunk',
104
+ :tags => 'tags',
105
+ :branches => 'branches'
106
+ ),
107
+
108
+ # Test::Unit
109
+ :test => OpenStruct.new(
110
+ :files => FileList['test/**/test_*.rb'],
111
+ :file => 'test/all.rb',
112
+ :opts => []
113
+ )
114
+ )
115
+
116
+ # Load the other rake files in the tasks folder
117
+ tasks_dir = File.expand_path(File.dirname(__FILE__))
118
+ post_load_fn = File.join(tasks_dir, 'post_load.rake')
119
+ rakefiles = Dir.glob(File.join(tasks_dir, '*.rake')).sort
120
+ rakefiles.unshift(rakefiles.delete(post_load_fn)).compact!
121
+ import(*rakefiles)
122
+
123
+ # Setup the project libraries
124
+ %w(lib ext).each {|dir| PROJ.libs << dir if test ?d, dir}
125
+
126
+ # Setup some constants
127
+ DEV_NULL = File.exist?('/dev/null') ? '/dev/null' : 'NUL:'
128
+
129
+ def quiet( &block )
130
+ io = [STDOUT.dup, STDERR.dup]
131
+ STDOUT.reopen DEV_NULL
132
+ STDERR.reopen DEV_NULL
133
+ block.call
134
+ ensure
135
+ STDOUT.reopen io.first
136
+ STDERR.reopen io.last
137
+ $stdout, $stderr = STDOUT, STDERR
138
+ end
139
+
140
+ DIFF = if system("gdiff '#{__FILE__}' '#{__FILE__}' > #{DEV_NULL} 2>&1") then 'gdiff'
141
+ else 'diff' end unless defined? DIFF
142
+
143
+ SUDO = if system("which sudo > #{DEV_NULL} 2>&1") then 'sudo'
144
+ else '' end unless defined? SUDO
145
+
146
+ RCOV = "#{RUBY} -S rcov"
147
+ RDOC = "#{RUBY} -S rdoc"
148
+ GEM = "#{RUBY} -S gem"
149
+
150
+ %w(rcov spec/rake/spectask rubyforge bones facets/ansicode zentest).each do |lib|
151
+ begin
152
+ require lib
153
+ Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", true}
154
+ rescue LoadError
155
+ Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", false}
156
+ end
157
+ end
158
+ HAVE_SVN = (Dir.entries(Dir.pwd).include?('.svn') and
159
+ system("svn --version 2>&1 > #{DEV_NULL}"))
160
+ HAVE_GIT = (Dir.entries(Dir.pwd).include?('.git') and
161
+ system("git --version 2>&1 > #{DEV_NULL}"))
162
+
163
+ # Add bones as a development dependency
164
+ #
165
+ if HAVE_BONES
166
+ PROJ.gem.development_dependencies << ['bones', ">= #{Bones::VERSION}"]
167
+ end
168
+
169
+ # Reads a file at +path+ and spits out an array of the +paragraphs+
170
+ # specified.
171
+ #
172
+ # changes = paragraphs_of('History.txt', 0..1).join("\n\n")
173
+ # summary, *description = paragraphs_of('README.txt', 3, 3..8)
174
+ #
175
+ def paragraphs_of( path, *paragraphs )
176
+ title = String === paragraphs.first ? paragraphs.shift : nil
177
+ ary = File.read(path).delete("\r").split(/\n\n+/)
178
+
179
+ result = if title
180
+ tmp, matching = [], false
181
+ rgxp = %r/^=+\s*#{Regexp.escape(title)}/i
182
+ paragraphs << (0..-1) if paragraphs.empty?
183
+
184
+ ary.each do |val|
185
+ if val =~ rgxp
186
+ break if matching
187
+ matching = true
188
+ rgxp = %r/^=+/i
189
+ elsif matching
190
+ tmp << val
191
+ end
192
+ end
193
+ tmp
194
+ else ary end
195
+
196
+ result.values_at(*paragraphs)
197
+ end
198
+
199
+ # Adds the given gem _name_ to the current project's dependency list. An
200
+ # optional gem _version_ can be given. If omitted, the newest gem version
201
+ # will be used.
202
+ #
203
+ def depend_on( name, version = nil )
204
+ spec = Gem.source_index.find_name(name).last
205
+ version = spec.version.to_s if version.nil? and !spec.nil?
206
+
207
+ PROJ.gem.dependencies << case version
208
+ when nil; [name]
209
+ when %r/^\d/; [name, ">= #{version}"]
210
+ else [name, version] end
211
+ end
212
+
213
+ # Adds the given arguments to the include path if they are not already there
214
+ #
215
+ def ensure_in_path( *args )
216
+ args.each do |path|
217
+ path = File.expand_path(path)
218
+ $:.unshift(path) if test(?d, path) and not $:.include?(path)
219
+ end
220
+ end
221
+
222
+ # Find a rake task using the task name and remove any description text. This
223
+ # will prevent the task from being displayed in the list of available tasks.
224
+ #
225
+ def remove_desc_for_task( names )
226
+ Array(names).each do |task_name|
227
+ task = Rake.application.tasks.find {|t| t.name == task_name}
228
+ next if task.nil?
229
+ task.instance_variable_set :@comment, nil
230
+ end
231
+ end
232
+
233
+ # Change working directories to _dir_, call the _block_ of code, and then
234
+ # change back to the original working directory (the current directory when
235
+ # this method was called).
236
+ #
237
+ def in_directory( dir, &block )
238
+ curdir = pwd
239
+ begin
240
+ cd dir
241
+ return block.call
242
+ ensure
243
+ cd curdir
244
+ end
245
+ end
246
+
247
+ # Scans the current working directory and creates a list of files that are
248
+ # candidates to be in the manifest.
249
+ #
250
+ def manifest
251
+ files = []
252
+ exclude = PROJ.exclude.dup
253
+ comment = %r/^\s*#/
254
+
255
+ # process the ignore file and add the items there to the exclude list
256
+ if test(?f, PROJ.ignore_file)
257
+ ary = []
258
+ File.readlines(PROJ.ignore_file).each do |line|
259
+ next if line =~ comment
260
+ line.chomp!
261
+ line.strip!
262
+ next if line.nil? or line.empty?
263
+
264
+ glob = line =~ %r/\*\./ ? File.join('**', line) : line
265
+ Dir.glob(glob).each {|fn| ary << "^#{Regexp.escape(fn)}"}
266
+ end
267
+ exclude.concat ary
268
+ end
269
+
270
+ # generate a regular expression from the exclude list
271
+ exclude = Regexp.new(exclude.join('|'))
272
+
273
+ Find.find '.' do |path|
274
+ path.sub! %r/^(\.\/|\/)/o, ''
275
+ next unless test ?f, path
276
+ next if path =~ exclude
277
+ files << path
278
+ end
279
+ files.sort!
280
+ end
281
+
282
+ # We need a "valid" method thtat determines if a string is suitable for use
283
+ # in the gem specification.
284
+ #
285
+ class Object
286
+ def valid?
287
+ return !(self.empty? or self == "\000") if self.respond_to?(:to_str)
288
+ return false
289
+ end
290
+ end
291
+
292
+ # EOF