mongo_rack 0.0.1

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.
@@ -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