heel 2.0.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/spec/rackapp_spec.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'spec/spec_helper'
1
+ require 'spec_helper'
2
2
  require 'rack/mock'
3
3
  require 'heel/rackapp'
4
4
 
@@ -10,34 +10,34 @@ describe Heel::RackApp do
10
10
 
11
11
  it "should return the a listing for the currrent directory" do
12
12
  res = @request.get("/")
13
- res.should be_ok
14
- res['Content-Type'].should == "text/html"
15
- res.body.should =~ /Rakefile/
13
+ res.must_be :ok?
14
+ res['Content-Type'].must_equal "text/html"
15
+ res.body.must_match( /Rakefile/ )
16
16
  end
17
17
 
18
18
  it 'should highlight a ruby file' do
19
- res = @request.get("/gemspec.rb")
20
- res.should be_ok
21
- res['Content-Type'].should == "text/html"
22
- res.body.should =~ /class="CodeRay"/
19
+ res = @request.get("/lib/heel.rb")
20
+ res.must_be :ok?
21
+ res['Content-Type'].must_equal "text/html"
22
+ res.body.must_match( /class="CodeRay"/ )
23
23
  end
24
24
 
25
25
  it "should not highlight a ruby file if told not to" do
26
- res = @request.get("/gemspec.rb?highlighting=off")
27
- res.should be_ok
28
- res.body.size.should == File.size("gemspec.rb")
29
- res['Content-Type'].should == "application/x-ruby"
26
+ res = @request.get("/lib/heel.rb?highlighting=off")
27
+ res.must_be :ok?
28
+ res.body.size.must_equal File.size("lib/heel.rb")
29
+ res['Content-Type'].must_equal "application/x-ruby"
30
30
  end
31
31
 
32
32
  it "should return a 405 if given a non-GET request" do
33
33
  res = @request.post("/")
34
- res.should_not be_ok
35
- res.status.should == 405
34
+ res.wont_be :ok?
35
+ res.status.must_equal 405
36
36
  end
37
37
 
38
38
  it "should return a 403 if accessing an invalid location" do
39
39
  res = @request.get("/../../../../etc/passwd")
40
- res.should_not be_ok
41
- res.status.should == 403
40
+ res.wont_be :ok?
41
+ res.status.must_equal 403
42
42
  end
43
43
  end
data/spec/server_spec.rb CHANGED
@@ -1,4 +1,5 @@
1
- require "spec/spec_helper"
1
+ require "spec_helper"
2
+
2
3
  describe Heel::Server do
3
4
  before(:each) do
4
5
  @stdin = StringIO.new
@@ -18,8 +19,8 @@ describe Heel::Server do
18
19
  begin
19
20
  server.run
20
21
  rescue SystemExit => se
21
- se.status.should == 0
22
- @stdout.string.should =~ /version #{Heel::VERSION}/
22
+ se.status.must_equal 0
23
+ @stdout.string.must_match( /version #{Heel::VERSION}/ )
23
24
  end
24
25
  end
25
26
 
@@ -29,8 +30,8 @@ describe Heel::Server do
29
30
  begin
30
31
  server.run
31
32
  rescue SystemExit => se
32
- se.status.should == 0
33
- @stdout.string.should =~ /Usage/m
33
+ se.status.must_equal 0
34
+ @stdout.string.must_match( /Usage/m )
34
35
  end
35
36
  end
36
37
 
@@ -40,8 +41,8 @@ describe Heel::Server do
40
41
  begin
41
42
  server.run
42
43
  rescue SystemExit => se
43
- se.status.should == 1
44
- @stdout.string.should =~ /Try .*--help/m
44
+ se.status.must_equal 1
45
+ @stdout.string.must_match( /Try .*--help/m )
45
46
  end
46
47
  end
47
48
 
@@ -51,34 +52,34 @@ describe Heel::Server do
51
52
  begin
52
53
  server.run
53
54
  rescue SystemExit => se
54
- se.status.should == 1
55
- @stdout.string.should =~ /Try .*--help/m
55
+ se.status.must_equal 1
56
+ @stdout.string.must_match( /Try .*--help/m )
56
57
  end
57
58
  end
58
59
 
59
60
  it "should allow port and address to be set" do
60
61
  server = Heel::Server.new(%w[--port 4242 --address 192.168.1.1])
61
62
  server.merge_options
62
- server.options.address.should == "192.168.1.1"
63
- server.options.port.should == 4242
63
+ server.options.address.must_equal "192.168.1.1"
64
+ server.options.port.must_equal 4242
64
65
  end
65
66
 
66
67
  it "should allow the highlighting option to be set" do
67
68
  server = Heel::Server.new(%w[--highlighting])
68
69
  server.merge_options
69
- server.options.highlighting.should == true
70
+ server.options.highlighting.must_equal true
70
71
  end
71
72
 
72
73
  it "should have highlighting off as a default" do
73
74
  server = Heel::Server.new
74
75
  server.merge_options
75
- server.options.highlighting.should == false
76
+ server.options.highlighting.must_equal false
76
77
  end
77
78
 
78
- it "should set no-launch-browser option and kill option" do
79
+ it "should set no-launch-browser option" do
79
80
  server = Heel::Server.new(%w[--no-launch-browser])
80
81
  server.merge_options
81
- server.options.launch_browser.should == false
82
+ server.options.launch_browser.must_equal false
82
83
  end
83
84
 
84
85
  it "should attempt to kill the process" do
@@ -89,18 +90,18 @@ describe Heel::Server do
89
90
  server.run
90
91
  violated("Should have thrown SystemExit")
91
92
  rescue SystemExit => se
92
- se.status.should == 0
93
- @stdout.string.should =~ /Done/m
93
+ se.status.must_equal 0
94
+ @stdout.string.must_match( /Done/m )
94
95
  end
95
96
  end
96
97
 
97
98
  it "should setup a heel directory" do
98
99
  server = Heel::Server.new(%w[--daemonize])
99
100
  server.set_io(@stdin,@stdout)
100
- File.directory?(server.default_directory).should == false
101
+ File.directory?(server.default_directory).must_equal false
101
102
  server.setup_heel_dir
102
- File.directory?(server.default_directory).should == true
103
- @stdout.string.should =~ /Created/m
103
+ File.directory?(server.default_directory).must_equal true
104
+ @stdout.string.must_match( /Created/m )
104
105
  end
105
106
 
106
107
  it "should send a signal to a pid" do
@@ -113,8 +114,8 @@ describe Heel::Server do
113
114
  server.run
114
115
  violated("Should have exited")
115
116
  rescue SystemExit => se
116
- se.status.should == 0
117
- @stdout.string.should =~ /Sending TERM to process -42/m
117
+ se.status.must_equal 0
118
+ @stdout.string.must_match( /Sending TERM to process -42/m )
118
119
  end
119
120
  end
120
121
  end
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,10 @@
1
- begin
2
- require 'rubygems'
3
- require 'heel'
4
- require 'spec'
5
- require 'net/http'
6
- rescue LoadError
7
- $: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib"))
8
- require 'heel'
9
- end
1
+ if RUBY_VERSION >= '1.9.2' then
2
+ require 'simplecov'
3
+ puts "Using coverage!"
4
+ SimpleCov.start if ENV['COVERAGE']
5
+ end
6
+
7
+ gem 'minitest'
8
+ require 'heel'
9
+ require 'minitest/autorun'
10
+ require 'minitest/pride'
@@ -0,0 +1,212 @@
1
+ # vim: syntax=ruby
2
+ require 'rake/clean'
3
+ #------------------------------------------------------------------------------
4
+ # If you want to Develop on this project just run 'rake develop' and you'll
5
+ # have all you need to get going. If you want to use bundler for development,
6
+ # then run 'rake develop:using_bundler'
7
+ #------------------------------------------------------------------------------
8
+ namespace :develop do
9
+
10
+ # Install all the development and runtime dependencies of this gem using the
11
+ # gemspec.
12
+ task :default do
13
+ require 'rubygems/dependency_installer'
14
+ installer = Gem::DependencyInstaller.new
15
+
16
+ This.set_coverage_gem
17
+
18
+ puts "Installing gem depedencies needed for development"
19
+ This.platform_gemspec.dependencies.each do |dep|
20
+ if dep.matching_specs.empty? then
21
+ puts "Installing : #{dep}"
22
+ installer.install dep
23
+ else
24
+ puts "Skipping : #{dep} -> already installed #{dep.matching_specs.first.full_name}"
25
+ end
26
+ end
27
+ puts "\n\nNow run 'rake test'"
28
+ end
29
+
30
+ # Create a Gemfile that just references the gemspec
31
+ file 'Gemfile' => :gemspec do
32
+ File.open( "Gemfile", "w+" ) do |f|
33
+ f.puts 'source :rubygems'
34
+ f.puts 'gemspec'
35
+ end
36
+ end
37
+
38
+ desc "Create a bundler Gemfile"
39
+ task :using_bundler => 'Gemfile' do
40
+ puts "Now you can 'bundle'"
41
+ end
42
+
43
+ # Gemfiles are build artifacts
44
+ CLOBBER << FileList['Gemfile*']
45
+ end
46
+ desc "Boostrap development"
47
+ task :develop => "develop:default"
48
+
49
+ #------------------------------------------------------------------------------
50
+ # Minitest - standard TestTask
51
+ #------------------------------------------------------------------------------
52
+ begin
53
+ require 'rake/testtask'
54
+ Rake::TestTask.new( :test ) do |t|
55
+ t.ruby_opts = %w[ -w -rubygems ]
56
+ t.libs = %w[ lib spec ]
57
+ t.pattern = "spec/**/*_spec.rb"
58
+ end
59
+ task :default => :test
60
+ rescue LoadError
61
+ This.task_warning( 'test' )
62
+ end
63
+
64
+ #------------------------------------------------------------------------------
65
+ # RDoc - standard rdoc rake task, although we must make sure to use a more
66
+ # recent version of rdoc since it is the one that has 'tomdoc' markup
67
+ #------------------------------------------------------------------------------
68
+ begin
69
+ gem 'rdoc' # otherwise we get the wrong task from stdlib
70
+ require 'rdoc/task'
71
+ RDoc::Task.new do |t|
72
+ t.markup = 'tomdoc'
73
+ t.rdoc_dir = 'doc'
74
+ t.main = 'README.rdoc'
75
+ t.title = "#{This.name} #{This.version}"
76
+ t.rdoc_files.include( '*.rdoc', 'lib/**/*.rb' )
77
+ end
78
+ rescue LoadError => le
79
+ This.task_warning( 'rdoc' )
80
+ end
81
+
82
+ #------------------------------------------------------------------------------
83
+ # Coverage - optional code coverage, rcov for 1.8 and simplecov for 1.9, so
84
+ # for the moment only rcov is listed.
85
+ #------------------------------------------------------------------------------
86
+ if RUBY_VERSION < "1.9.0"
87
+ begin
88
+ require 'rcov/rcovtask'
89
+ Rcov::RcovTask.new( 'coverage' ) do |t|
90
+ t.libs << 'spec'
91
+ t.pattern = 'spec/**/*_spec.rb'
92
+ t.verbose = true
93
+ t.rcov_opts << "-x ^/" # remove all the global files
94
+ t.rcov_opts << "--sort coverage" # so we see the worst files at the top
95
+ end
96
+ rescue LoadError
97
+ This.task_warning( 'rcov' )
98
+ end
99
+ else
100
+ begin
101
+ require 'simplecov'
102
+ desc 'Run tests with code coverage'
103
+ task :coverage do
104
+ ENV['COVERAGE'] = 'true'
105
+ Rake::Task[:test].execute
106
+ end
107
+ CLOBBER << FileList["coverage"]
108
+ rescue LoadError
109
+ This.task_warning( 'simplecov' )
110
+ end
111
+ end
112
+
113
+ #------------------------------------------------------------------------------
114
+ # Manifest - We want an explicit list of thos files that are to be packaged in
115
+ # the gem. Most of this is from Hoe.
116
+ #------------------------------------------------------------------------------
117
+ namespace 'manifest' do
118
+ desc "Check the manifest"
119
+ task :check => :clean do
120
+ files = FileList["**/*", ".*"].exclude( This.exclude_from_manifest ).to_a.sort
121
+ files = files.select{ |f| File.file?( f ) }
122
+
123
+ tmp = "Manifest.tmp"
124
+ File.open( tmp, 'w' ) do |f|
125
+ f.puts files.join("\n")
126
+ end
127
+
128
+ begin
129
+ sh "diff -du Manifest.txt #{tmp}"
130
+ ensure
131
+ rm tmp
132
+ end
133
+ puts "Manifest looks good"
134
+ end
135
+
136
+ desc "Generate the manifest"
137
+ task :generate => :clean do
138
+ files = %x[ git ls-files ].split("\n").sort
139
+ files.reject! { |f| f =~ This.exclude_from_manifest }
140
+ File.open( "Manifest.txt", "w" ) do |f|
141
+ f.puts files.join("\n")
142
+ end
143
+ end
144
+ end
145
+
146
+ #------------------------------------------------------------------------------
147
+ # Fixme - look for fixmes and report them
148
+ #------------------------------------------------------------------------------
149
+ desc "Look for fixmes and report them"
150
+ task :fixme => 'manifest:check' do
151
+ This.manifest.each do |file|
152
+ next if file == __FILE__
153
+ next unless file =~ %r/(txt|rb|md|rdoc|css|html|xml|css)\Z/
154
+ puts "FIXME: Rename #{file}" if file =~ /fixme/i
155
+ IO.readlines( file ).each_with_index do |line, idx|
156
+ prefix = "FIXME: #{file}:#{idx+1}".ljust(42)
157
+ puts "#{prefix} => #{line.strip}" if line =~ /fixme/i
158
+ end
159
+ end
160
+ end
161
+
162
+ #------------------------------------------------------------------------------
163
+ # Gem Specification
164
+ #------------------------------------------------------------------------------
165
+ # Really this is only here to support those who use bundler
166
+ desc "Build the #{This.name}.gemspec file"
167
+ task :gemspec do
168
+ File.open( This.gemspec_file, "wb+" ) do |f|
169
+ f.write This.platform_gemspec.to_ruby
170
+ end
171
+ end
172
+
173
+ # the gemspec is also a dev artifact and should not be kept around.
174
+ CLOBBER << This.gemspec_file
175
+
176
+ # The standard gem packaging task, everyone has it.
177
+ require 'rubygems/package_task'
178
+ Gem::PackageTask.new( This.platform_gemspec ) do
179
+ # nothing
180
+ end
181
+
182
+ #------------------------------------------------------------------------------
183
+ # Release - the steps we go through to do a final release, this is pulled from
184
+ # a compbination of mojombo's rakegem, hoe and hoe-git
185
+ #
186
+ # 1) make sure we are on the master branch
187
+ # 2) make sure there are no uncommitted items
188
+ # 3) check the manifest and make sure all looks good
189
+ # 4) build the gem
190
+ # 5) do an empty commit to have the commit message of the version
191
+ # 6) tag that commit as the version
192
+ # 7) push master
193
+ # 8) push the tag
194
+ # 7) pus the gem
195
+ #------------------------------------------------------------------------------
196
+ task :release_check do
197
+ unless `git branch` =~ /^\* master$/
198
+ abort "You must be on the master branch to release!"
199
+ end
200
+ unless `git status` =~ /^nothing to commit/m
201
+ abort "Nope, sorry, you have unfinished business"
202
+ end
203
+ end
204
+
205
+ desc "Create tag v#{This.version}, build and push #{This.platform_gemspec.full_name} to rubygems.org"
206
+ task :release => [ :release_check, 'manifest:check', :gem ] do
207
+ sh "git commit --allow-empty -a -m 'Release #{This.version}'"
208
+ sh "git tag -a -m 'v#{This.version}' v#{This.version}"
209
+ sh "git push origin master"
210
+ sh "git push origin v#{This.version}"
211
+ sh "gem push pkg/#{This.platform_gemspec.full_name}.gem"
212
+ end
data/tasks/this.rb ADDED
@@ -0,0 +1,202 @@
1
+ require 'pathname'
2
+
3
+ # Public: A Class containing all the metadata and utilities needed to manage a
4
+ # ruby project.
5
+ class ThisProject
6
+ # The name of this project
7
+ attr_accessor :name
8
+
9
+ # The author's name
10
+ attr_accessor :author
11
+
12
+ # The email address of the author(s)
13
+ attr_accessor :email
14
+
15
+ # The homepage of this project
16
+ attr_accessor :homepage
17
+
18
+ # The regex of files to exclude from the manifest
19
+ attr_accessor :exclude_from_manifest
20
+
21
+ # The hash of Gem::Specifications keyed' by platform
22
+ attr_accessor :gemspecs
23
+
24
+ # Public: Initialize ThisProject
25
+ #
26
+ # Yields self
27
+ def initialize(&block)
28
+ @exclude_from_manifest = %r/tmp$|\.(git|DS_Store)|^(doc|coverage|pkg)|Gemfile*|\.gemspec$|\.swp$|\.jar|\.rvmrc$|~$/
29
+ @gemspecs = Hash.new
30
+ yield self if block_given?
31
+ end
32
+
33
+ # Public: return the version of ThisProject
34
+ #
35
+ # Search the ruby files in the project looking for the one that has the
36
+ # version string in it. This does not eval any code in the project, it parses
37
+ # the source code looking for the string.
38
+ #
39
+ # Returns a String version
40
+ def version
41
+ [ "lib/#{ name }.rb", "lib/#{ name }/version.rb" ].each do |v|
42
+ path = project_path( v )
43
+ line = path.read[/^\s*VERSION\s*=\s*.*/]
44
+ if line then
45
+ return line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
46
+ end
47
+ end
48
+ end
49
+
50
+ # Internal: Return a section of an RDoc file with the given section name
51
+ #
52
+ # path - the relative path in the project of the file to parse
53
+ # section_name - the section out of the file from which to parse data
54
+ #
55
+ # Retuns the text of the section as an array of paragrphs.
56
+ def section_of( file, section_name )
57
+ re = /^=+ (.*)$/
58
+ sectional = project_path( file )
59
+ parts = sectional.read.split( re )[1..-1]
60
+ parts.map! { |p| p.strip }
61
+
62
+ sections = Hash.new
63
+ Hash[*parts].each do |k,v|
64
+ sections[k] = v.split("\n\n")
65
+ end
66
+ return sections[section_name]
67
+ end
68
+
69
+ # Internal: print out a warning about the give task
70
+ def task_warning( task )
71
+ warn "WARNING: '#{task}' tasks are not defined. Please run 'rake develop'"
72
+ end
73
+
74
+ # Internal: Return the full path to the file that is relative to the project
75
+ # root.
76
+ #
77
+ # path - the relative path of the file from the project root
78
+ #
79
+ # Returns the Pathname of the file
80
+ def project_path( relative_path )
81
+ project_root.join( relative_path )
82
+ end
83
+
84
+ # Internal: The absolute path of this file
85
+ #
86
+ # Returns the Pathname of this file.
87
+ def this_file_path
88
+ Pathname.new( __FILE__ ).expand_path
89
+ end
90
+
91
+ # Internal: The root directory of this project
92
+ #
93
+ # This is defined as being the directory that is in the path of this project
94
+ # that has the first Rakefile
95
+ #
96
+ # Returns the Pathname of the directory
97
+ def project_root
98
+ this_file_path.ascend do |p|
99
+ rakefile = p.join( 'Rakefile' )
100
+ return p if rakefile.exist?
101
+ end
102
+ end
103
+
104
+ # Internal: Returns the contents of the Manifest.txt file as an array
105
+ #
106
+ # Returns an Array of strings
107
+ def manifest
108
+ manifest_file = project_path( "Manifest.txt" )
109
+ abort "You need a Manifest.txt" unless manifest_file.readable?
110
+ manifest_file.readlines.map { |l| l.strip }
111
+ end
112
+
113
+ # Internal: Returns the gemspace associated with the current ruby platform
114
+ def platform_gemspec
115
+ gemspecs.fetch( platform, ruby_gemspec )
116
+ end
117
+
118
+ def core_gemspec
119
+ Gem::Specification.new do |spec|
120
+ spec.name = name
121
+ spec.version = version
122
+ spec.author = author
123
+ spec.email = email
124
+ spec.homepage = homepage
125
+
126
+ spec.summary = summary
127
+ spec.description = description
128
+
129
+ spec.files = manifest
130
+ spec.executables = spec.files.grep(/^bin/) { |f| File.basename(f) }
131
+ spec.test_files = spec.files.grep(/^spec/)
132
+
133
+ spec.extra_rdoc_files += spec.files.grep(/(txt|rdoc)$/)
134
+ spec.rdoc_options = [ "--main" , 'README.rdoc',
135
+ "--markup", "tomdoc" ]
136
+ end
137
+ end
138
+
139
+ # Internal: Return the gemspec for the ruby platform
140
+ def ruby_gemspec( core = core_gemspec, &block )
141
+ yielding_gemspec( 'ruby', core, &block )
142
+ end
143
+
144
+ # Internal: Return the gemspec for the jruby platform
145
+ def java_gemspec( core = core_gemspec, &block )
146
+ yielding_gemspec( 'java', core, &block )
147
+ end
148
+
149
+ # Internal: give an initial spec and a key, create a new gemspec based off of
150
+ # it.
151
+ #
152
+ # This will force the new gemspecs 'platform' to be that of the key, since the
153
+ # only reason you would have multiple gemspecs at this point is to deal with
154
+ # different platforms.
155
+ def yielding_gemspec( key, core )
156
+ spec = gemspecs[key] ||= core.dup
157
+ spec.platform = key
158
+ yield spec if block_given?
159
+ return spec
160
+ end
161
+
162
+ # Internal: Set the recovery gem development dependency
163
+ #
164
+ # These are dynamically set since they cannot be hard coded as there is
165
+ # no way to ship them correctly in the gemspec
166
+ #
167
+ # Returns nothing.
168
+ def set_coverage_gem
169
+ if RUBY_VERSION < "1.9.0"
170
+ platform_gemspec.add_development_dependency( 'rcov', '~> 1.0.0' )
171
+ else
172
+ platform_gemspec.add_development_dependency( 'simplecov', '~> 0.7.1' )
173
+ end
174
+ end
175
+
176
+ # Internal: Return the platform of ThisProject at the current moment in time.
177
+ def platform
178
+ (RUBY_PLATFORM == "java") ? 'java' : Gem::Platform::RUBY
179
+ end
180
+
181
+ # Internal: Return the DESCRIPTION section of the README.rdoc file
182
+ def description_section
183
+ section_of( 'README.rdoc', 'DESCRIPTION')
184
+ end
185
+
186
+ # Internal: Return the summary text from the README
187
+ def summary
188
+ description_section.first
189
+ end
190
+
191
+ # Internal: Return the full description text from the READEM
192
+ def description
193
+ description_section.join(" ").tr("\n", ' ').gsub(/[{}]/,'').gsub(/\[[^\]]+\]/,'') # strip rdoc
194
+ end
195
+
196
+ # Internal: The path to the gemspec file
197
+ def gemspec_file
198
+ project_path( "#{ name }.gemspec" )
199
+ end
200
+ end
201
+
202
+ This = ThisProject.new