shoe 0.1.13 → 0.2.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.
- data/BUNDLER.rdoc +38 -0
- data/README.rdoc +46 -13
- data/Rakefile +2 -5
- data/bin/shoe +2 -30
- data/features/cucumber.feature +5 -24
- data/features/getting_started.feature +14 -11
- data/features/release.feature +11 -22
- data/features/step_definitions/shoe_steps.rb +15 -5
- data/features/support/env.rb +16 -4
- data/lib/shoe.rb +12 -179
- data/lib/shoe/cli.rb +94 -0
- data/lib/shoe/project.rb +26 -0
- data/lib/shoe/tasks.rb +80 -0
- data/lib/shoe/tasks/bin.rb +14 -0
- data/lib/shoe/tasks/clean.rb +18 -0
- data/lib/shoe/tasks/compile.rb +46 -0
- data/lib/shoe/tasks/cucumber.rb +42 -0
- data/lib/shoe/tasks/gemspec.rb +14 -0
- data/lib/shoe/tasks/rdoc.rb +63 -0
- data/lib/shoe/tasks/release.rb +94 -0
- data/lib/shoe/tasks/resources.rb +11 -0
- data/lib/shoe/tasks/shell.rb +20 -0
- data/lib/shoe/tasks/shoulda.rb +12 -0
- data/lib/shoe/tasks/test.rb +28 -0
- data/lib/shoe/templates/gemfile.erb +1 -0
- data/lib/shoe/templates/rakefile.erb +7 -0
- data/lib/shoe/templates/readme.erb +3 -0
- data/lib/shoe/templates/version.erb +3 -0
- data/lib/shoe/version.rb +3 -0
- data/shoe.gemspec +5 -11
- metadata +27 -26
data/BUNDLER.rdoc
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
= Notes on <tt>`bundle exec bash`</tt>
|
2
|
+
|
3
|
+
If your <tt>$SHELL</tt> happens to be +bash+, you may run into some of the same problems I did.
|
4
|
+
|
5
|
+
Here they are, with fixes:
|
6
|
+
|
7
|
+
== Functions and Aliases Aren't Available
|
8
|
+
|
9
|
+
I had all of my +bash+ configuration in <tt>~/.profile</tt>. But,
|
10
|
+
<tt>~/.profile</tt> isn't read when you execute +bash+ from the command-line
|
11
|
+
(i.e. as a non-login shell), and only environment variables are inherited from
|
12
|
+
the parent shell; not functions, aliases, or completion rules.
|
13
|
+
|
14
|
+
So, just move all your non-environment-variable configuration out of
|
15
|
+
<tt>~/.profile</tt> and into <tt>~/.bashrc</tt>, and then add something like
|
16
|
+
this to your <tt>~/.profile</tt>:
|
17
|
+
|
18
|
+
if [ -f ~/.bashrc ]; then
|
19
|
+
source ~/.bashrc
|
20
|
+
fi
|
21
|
+
|
22
|
+
== Prompts are SLOW!
|
23
|
+
|
24
|
+
Once I got that sorted, I still had the problem that my bash prompts were way
|
25
|
+
slow to generate. I was using the <tt>__git_ps1</tt> function and had the
|
26
|
+
standalone version of Chris Wanstrath's hub[http://github.com/defunkt/hub]
|
27
|
+
installed, with <tt>alias git=hub</tt> in my <tt>~/.bashrc</tt>.
|
28
|
+
|
29
|
+
The issue is that <tt>`bundle exec`</tt> adds <tt>-rbundler/setup</tt> to the
|
30
|
+
+RUBYOPT+ environment variable, so every +ruby+ invocation first requires all
|
31
|
+
of your bundled gems. Since +hub+ is a ruby script, and <tt>__git_ps1</tt>
|
32
|
+
invokes +git+ multiple times, generating a prompt gets expensive quickly. I was
|
33
|
+
seeing something like 3-second delays!
|
34
|
+
|
35
|
+
One way to work around this issue is to change the way you call +hub+, clearing
|
36
|
+
out +RUBYOPT+ first:
|
37
|
+
|
38
|
+
$ alias git='RUBYOPT= hub'
|
data/README.rdoc
CHANGED
@@ -1,25 +1,28 @@
|
|
1
1
|
= Shoe
|
2
2
|
|
3
|
-
You probably don't want to use
|
3
|
+
You probably don't want to use shoe -- especially if you're like me!
|
4
4
|
|
5
|
-
I like tinkering with my build scripts
|
5
|
+
I like tinkering with my build scripts, so I made shoe, even though
|
6
|
+
hoe[http://seattlerb.rubyforge.org/hoe] and
|
7
|
+
jeweler[http://github.com/technicalpickles/jeweler] are awesome.
|
6
8
|
|
7
9
|
== Behold
|
8
10
|
|
9
|
-
Here's how your Rakefile looks:
|
11
|
+
Here's how your +Rakefile+ looks:
|
10
12
|
|
11
13
|
require 'shoe'
|
14
|
+
require 'my_project/version'
|
12
15
|
|
13
|
-
Shoe.tie('
|
16
|
+
Shoe.tie('my_project', MyProject::VERSION, "This is my project, and it's awesome!") do |spec|
|
14
17
|
# do whatever you want with the Gem::Specification here, for example:
|
15
|
-
# spec.
|
18
|
+
# spec.add_runtime_dependency 'dnssd'
|
16
19
|
end
|
17
20
|
|
18
21
|
And here's what you get, at most:
|
19
22
|
|
20
23
|
rake clean # Remove ignored files
|
21
24
|
rake compile # Compile C extensions
|
22
|
-
rake cucumber
|
25
|
+
rake cucumber:ok # Run features
|
23
26
|
rake cucumber:wip # Run work-in-progress features
|
24
27
|
rake default # Run features
|
25
28
|
rake gemspec # Show latest gemspec contents
|
@@ -28,16 +31,46 @@ And here's what you get, at most:
|
|
28
31
|
rake shell # Run an irb console
|
29
32
|
rake test # Run tests
|
30
33
|
|
31
|
-
Most of the time, though, you won't see all of these: when possible, tasks are
|
34
|
+
Most of the time, though, you won't see all of these: when possible, tasks are
|
35
|
+
conditionally defined.
|
32
36
|
|
33
|
-
See what I mean by reading Shoe#define_tasks
|
37
|
+
See what I mean by reading <tt>Shoe#define_tasks</tt>.
|
34
38
|
|
35
|
-
==
|
39
|
+
== Getting Started
|
36
40
|
|
37
|
-
|
41
|
+
=== With Bundler[http://github.com/carlhuda/bundler]
|
38
42
|
|
39
|
-
|
43
|
+
1. Start with just shoe in your +Gemfile+:
|
44
|
+
|
45
|
+
source :gemcutter
|
46
|
+
gem 'shoe'
|
47
|
+
|
48
|
+
2. Open a sub-shell configured for the bundler environment:
|
49
|
+
|
50
|
+
$ bundle exec $SHELL
|
51
|
+
|
52
|
+
(See BUNDLER.rdoc if you run into trouble with <tt>`bundle exec`</tt>.)
|
53
|
+
|
54
|
+
3. Use +shoe+ to generate some skeleton project files:
|
55
|
+
|
56
|
+
$ shoe
|
40
57
|
|
41
|
-
|
58
|
+
4. And then you can poke around with
|
59
|
+
|
60
|
+
$ rake -T
|
61
|
+
|
62
|
+
=== Without Bundler
|
63
|
+
|
64
|
+
If you're not using bundler, it's probably best not to use the +shoe+
|
65
|
+
generator. Instead, just install shoe normally:
|
66
|
+
|
67
|
+
$ gem install shoe
|
68
|
+
|
69
|
+
And then <tt>require 'shoe'</tt> and add a <tt>Shoe.tie</tt> clause to your +Rakefile+:
|
70
|
+
|
71
|
+
Shoe.tie('my_project', '0.0.0', 'My project is awesome.') do |spec|
|
72
|
+
# spec.add_runtime_dependency 'dnssd' # or whatever...
|
73
|
+
end
|
42
74
|
|
43
|
-
|
75
|
+
Shoe also assumes you have a <tt>README.rdoc</tt>, so you'll need to create one if you
|
76
|
+
want to avoid warnings running <tt>`rake rdoc`</tt>.
|
data/Rakefile
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
2
1
|
require 'shoe'
|
2
|
+
require 'shoe/version'
|
3
3
|
|
4
|
-
Shoe.tie('shoe',
|
5
|
-
spec.remove_development_dependency_on_shoe
|
4
|
+
Shoe.tie('shoe', Shoe::VERSION, 'Another take on hoe, jeweler & friends.') do |spec|
|
6
5
|
spec.requirements = ['git']
|
7
|
-
spec.add_runtime_dependency 'cucumber'
|
8
|
-
spec.add_runtime_dependency 'gemcutter'
|
9
6
|
spec.add_runtime_dependency 'rake'
|
10
7
|
end
|
data/bin/shoe
CHANGED
@@ -1,31 +1,3 @@
|
|
1
|
-
|
1
|
+
require 'shoe/cli'
|
2
2
|
|
3
|
-
|
4
|
-
project_name = File.basename(File.expand_path(Dir.pwd))
|
5
|
-
|
6
|
-
if File.exists?(name)
|
7
|
-
STDERR.puts("#{name} exists. Not clobbering.")
|
8
|
-
else
|
9
|
-
File.open(name, 'w') { |file| file.write(contents.gsub('NAME', project_name)) }
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
# TODO read about heredocs at http://tomayko.com to see if I can clean this up a little.
|
14
|
-
create_file 'Rakefile', <<-END
|
15
|
-
begin
|
16
|
-
require 'shoe'
|
17
|
-
rescue LoadError
|
18
|
-
abort 'Please `gem install shoe` to get started.'
|
19
|
-
end
|
20
|
-
|
21
|
-
Shoe.tie('NAME', '0.0.0', 'TODO write a summary of NAME here.') do |spec|
|
22
|
-
# do whatever you want with the Gem::Specification here, for example:
|
23
|
-
# spec.add_development_dependency 'shoulda'
|
24
|
-
end
|
25
|
-
END
|
26
|
-
|
27
|
-
create_file 'README.rdoc', <<-END
|
28
|
-
= NAME
|
29
|
-
|
30
|
-
NAME is one of my favorite things! Let me tell you about it:
|
31
|
-
END
|
3
|
+
Shoe::CLI.run
|
data/features/cucumber.feature
CHANGED
@@ -4,33 +4,14 @@ Feature: Cucumber
|
|
4
4
|
I want shoe to give me a rake task
|
5
5
|
|
6
6
|
Scenario: Running rake --tasks in a shoe project without Cucumber features
|
7
|
-
Given I have created a
|
8
|
-
|
9
|
-
When I run rake --tasks inside "my_project"
|
7
|
+
Given I have created a project called "my_project"
|
8
|
+
When I run bundle exec rake --tasks inside "my_project"
|
10
9
|
Then I should not see "rake cucumber" on standard out
|
11
10
|
|
12
11
|
Scenario: Running rake --tasks in a shoe project with Cucumber features
|
13
|
-
Given I have created a
|
12
|
+
Given I have created a project called "my_project"
|
14
13
|
And I have created a directory called "my_project/features"
|
15
|
-
|
16
|
-
When I run rake --tasks inside "my_project"
|
14
|
+
When I run bundle exec rake --tasks inside "my_project"
|
17
15
|
Then I should see "rake cucumber" on standard out
|
18
|
-
And I should
|
16
|
+
And I should see "rake cucumber:wip" on standard out
|
19
17
|
|
20
|
-
Scenario: Running rake --tasks in a shoe project with work-in-progress Cucumber features
|
21
|
-
Given I have created a directory called "my_project"
|
22
|
-
And I have created a directory called "my_project/features"
|
23
|
-
And I have created a file called "my_project/features/some.feature" containing:
|
24
|
-
"""
|
25
|
-
Feature: Cucumber
|
26
|
-
In order to use cucumber conveniently
|
27
|
-
As a developer
|
28
|
-
I want shoe to give me a rake task
|
29
|
-
|
30
|
-
@wip
|
31
|
-
Scenario: Running rake --tasks in a shoe project with work-in-progress Cucumber features
|
32
|
-
Given I have created a directory called "my_project"
|
33
|
-
"""
|
34
|
-
And I have run shoe inside "my_project"
|
35
|
-
When I run rake --tasks inside "my_project"
|
36
|
-
Then I should see "rake cucumber:wip" on standard out
|
@@ -5,22 +5,25 @@ Feature: Getting started
|
|
5
5
|
|
6
6
|
Scenario: Running shoe with no arguments in an empty directory
|
7
7
|
Given I have created a directory called "my_project"
|
8
|
-
|
8
|
+
And I have created a file called "my_project/Gemfile" containing:
|
9
|
+
"""
|
10
|
+
source :gemcutter
|
11
|
+
gem 'shoe'
|
12
|
+
"""
|
13
|
+
When I run bundle exec shoe inside "my_project"
|
9
14
|
Then I should see a file "my_project/Rakefile"
|
10
15
|
And I should see a file "my_project/README.rdoc"
|
16
|
+
And I should see a file "my_project/lib/my_project/version.rb"
|
17
|
+
And I should see a file "my_project/my_project.gemspec"
|
11
18
|
|
12
19
|
Scenario: Running shoe with no arguments in a directory that already has a Rakefile
|
13
20
|
Given I have created a directory called "my_project"
|
21
|
+
And I have created a file called "my_project/Gemfile" containing:
|
22
|
+
"""
|
23
|
+
source :gemcutter
|
24
|
+
gem 'shoe'
|
25
|
+
"""
|
14
26
|
And I have created a file called "my_project/Rakefile" containing "# RAKEFILE CONTENTS"
|
15
|
-
When I run shoe inside "my_project"
|
27
|
+
When I run bundle exec shoe inside "my_project"
|
16
28
|
Then I should see "Rakefile exists. Not clobbering." on standard error
|
17
29
|
And the contents of "my_project/Rakefile" should still be "# RAKEFILE CONTENTS"
|
18
|
-
And I should see a file "my_project/README.rdoc"
|
19
|
-
|
20
|
-
Scenario: Running shoe with no arguments in a directory that already has a README.rdoc
|
21
|
-
Given I have created a directory called "my_project"
|
22
|
-
And I have created a file called "my_project/README.rdoc" containing "= README CONTENTS"
|
23
|
-
When I run shoe inside "my_project"
|
24
|
-
Then I should see a file "my_project/Rakefile"
|
25
|
-
Then I should see "README.rdoc exists. Not clobbering." on standard error
|
26
|
-
And the contents of "my_project/README.rdoc" should still be "= README CONTENTS"
|
data/features/release.feature
CHANGED
@@ -5,40 +5,29 @@ Feature: Release
|
|
5
5
|
|
6
6
|
Background:
|
7
7
|
Given I have created a directory called "origin"
|
8
|
-
And I have run git init inside "origin"
|
9
|
-
Given I have created a
|
10
|
-
And I have run shoe inside "my_project"
|
8
|
+
And I have run git init --bare inside "origin"
|
9
|
+
Given I have created a project called "my_project"
|
11
10
|
And I have run git init inside "my_project"
|
12
11
|
And I have run git add . inside "my_project"
|
13
12
|
And I have run git commit -m "Initial commit" inside "my_project"
|
14
|
-
And I have run git remote add origin ../origin inside "my_project"
|
15
13
|
|
16
14
|
Scenario: I can release
|
17
|
-
When I
|
18
|
-
And I
|
19
|
-
And I run rake --tasks inside "my_project"
|
15
|
+
When I replace "0.0.0" with "0.1.0" in the file "my_project/lib/my_project/version.rb"
|
16
|
+
And I run bundle exec rake --tasks inside "my_project"
|
20
17
|
Then I should see "rake release" on standard out
|
21
18
|
|
22
19
|
Scenario: I cannot release when the version is 0.0.0
|
23
|
-
When I run
|
24
|
-
And I run rake --tasks inside "my_project"
|
20
|
+
When I run bundle exec rake --tasks inside "my_project"
|
25
21
|
Then I should not see "rake release" on standard out
|
26
22
|
|
27
23
|
Scenario: I cannot release when I already have a tag for the current version
|
28
|
-
When I run git
|
29
|
-
And I
|
30
|
-
And I
|
31
|
-
And I run rake --tasks inside "my_project"
|
32
|
-
Then I should not see "rake release" on standard out
|
33
|
-
|
34
|
-
Scenario: I cannot release when I have not yet pushed master to origin
|
35
|
-
When I replace "0.0.0" with "0.1.0" in the file "my_project/Rakefile"
|
36
|
-
And I run rake --tasks inside "my_project"
|
24
|
+
When I run git tag v0.1.0 inside "my_project"
|
25
|
+
And I replace "0.0.0" with "0.1.0" in the file "my_project/lib/my_project/version.rb"
|
26
|
+
And I run bundle exec rake --tasks inside "my_project"
|
37
27
|
Then I should not see "rake release" on standard out
|
38
28
|
|
39
29
|
Scenario: I cannot release from a branch other than master
|
40
|
-
When I run git
|
41
|
-
And I
|
42
|
-
And I
|
43
|
-
And I run rake --tasks inside "my_project"
|
30
|
+
When I run git checkout -b topic inside "my_project"
|
31
|
+
And I replace "0.0.0" with "0.1.0" in the file "my_project/lib/my_project/version.rb"
|
32
|
+
And I run bundle exec rake --tasks inside "my_project"
|
44
33
|
Then I should not see "rake release" on standard out
|
@@ -1,3 +1,12 @@
|
|
1
|
+
Given /^I have created a project called "([^\"]*)"$/ do |name|
|
2
|
+
create_directory(name)
|
3
|
+
create_file("#{name}/Gemfile", <<-END.gsub(/^\s*/, ''))
|
4
|
+
source :gemcutter
|
5
|
+
gem 'shoe'
|
6
|
+
END
|
7
|
+
run('bundle exec shoe', name)
|
8
|
+
end
|
9
|
+
|
1
10
|
Given /^I have created a directory called "([^\"]*)"$/ do |name|
|
2
11
|
create_directory(name)
|
3
12
|
end
|
@@ -18,17 +27,18 @@ When /^I (?:have )?run (.*) inside "([^\"]*)"$/ do |command, path|
|
|
18
27
|
run(command, path)
|
19
28
|
end
|
20
29
|
|
21
|
-
Then /^I (
|
30
|
+
Then /^I should(.*) see "([^\"]*)" on (standard.*)$/ do |negate, message, standard_out_or_error|
|
22
31
|
standard_out_or_error.tr!(' ', '_')
|
23
|
-
|
32
|
+
am_i_expecting_to_see_something = negate.strip.empty?
|
33
|
+
contents = send(standard_out_or_error)
|
24
34
|
|
25
|
-
|
35
|
+
assert_equal am_i_expecting_to_see_something, contents.include?(message), contents
|
26
36
|
end
|
27
37
|
|
28
38
|
Then /^I should see a file "([^\"]*)"$/ do |path|
|
29
|
-
file(path).exist
|
39
|
+
assert file(path).exist?
|
30
40
|
end
|
31
41
|
|
32
42
|
Then /^the contents of "([^\"]*)" should still be "([^\"]*)"$/ do |path, expected|
|
33
|
-
file(path).read
|
43
|
+
assert_equal expected, file(path).read
|
34
44
|
end
|
data/features/support/env.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'open3'
|
2
2
|
require 'pathname'
|
3
|
+
require 'test/unit/assertions'
|
3
4
|
require 'tmpdir'
|
4
5
|
|
5
6
|
class WorkingDirectory
|
@@ -18,7 +19,11 @@ class WorkingDirectory
|
|
18
19
|
end
|
19
20
|
|
20
21
|
def create_file(path, contents)
|
21
|
-
file(path).open('w') { |file| file.write(contents) }
|
22
|
+
file(path).open('w') { |file| file.write(be_sneaky_with_the_gemfile(contents)) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def append_file(path, contents)
|
26
|
+
file(path).open('a') { |file| file.write(contents) }
|
22
27
|
end
|
23
28
|
|
24
29
|
def edit_file(path, search, replace)
|
@@ -33,7 +38,7 @@ class WorkingDirectory
|
|
33
38
|
|
34
39
|
def run(command, path)
|
35
40
|
Dir.chdir(working_directory.join(path)) do
|
36
|
-
Open3.popen3(
|
41
|
+
Open3.popen3(isolate_environment(command)) do |stdin, stdout, stderr|
|
37
42
|
@standard_out = stdout.read
|
38
43
|
@standard_error = stderr.read
|
39
44
|
end
|
@@ -42,11 +47,18 @@ class WorkingDirectory
|
|
42
47
|
|
43
48
|
private
|
44
49
|
|
45
|
-
def
|
46
|
-
"
|
50
|
+
def be_sneaky_with_the_gemfile(contents)
|
51
|
+
contents.sub("gem 'shoe'", "gem 'shoe', :path => '#{Pathname.pwd.expand_path}'")
|
52
|
+
end
|
53
|
+
|
54
|
+
# bundle exec rake running from bundle exec cucumber otherwise gets confused
|
55
|
+
# about where the real Gemfile is.
|
56
|
+
def isolate_environment(command)
|
57
|
+
"/usr/bin/env -i HOME=#{ENV['HOME']} PATH=#{ENV['PATH']} #{command}"
|
47
58
|
end
|
48
59
|
end
|
49
60
|
|
61
|
+
World(Test::Unit::Assertions)
|
50
62
|
World { WorkingDirectory.new }
|
51
63
|
Before { working_directory.mkpath }
|
52
64
|
After { working_directory.rmtree }
|
data/lib/shoe.rb
CHANGED
@@ -1,192 +1,25 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
# Shoe defines some handy Rake tasks for your project, all built around your Gem::Specification.
|
1
|
+
# Shoe defines some handy Rake tasks for your project, all built around your
|
2
|
+
# Gem::Specification.
|
5
3
|
#
|
6
4
|
# Here's how you use it in your Rakefile:
|
7
5
|
#
|
8
6
|
# require 'shoe'
|
9
7
|
# Shoe.tie('myproject', '0.1.0', "This is my project, and it's awesome!") do |spec|
|
10
8
|
# # do whatever you want with the Gem::Specification here, for example:
|
11
|
-
# # spec.
|
9
|
+
# # spec.add_runtime_dependency 'dnssd'
|
12
10
|
# end
|
13
11
|
#
|
14
|
-
# Shoe comes with an executable named "shoe" that will generate a Rakefile like
|
15
|
-
|
12
|
+
# Shoe comes with an executable named "shoe" that will generate a Rakefile like
|
13
|
+
# this (but slightly fancier) for you.
|
14
|
+
module Shoe
|
15
|
+
autoload :Project, 'shoe/project'
|
16
|
+
autoload :Tasks, 'shoe/tasks'
|
17
|
+
|
16
18
|
# Here's where you start. In your Rakefile, you'll probably just call
|
17
19
|
# Shoe.tie, then add any dependencies in the block.
|
18
20
|
def self.tie(name, version, summary)
|
19
|
-
|
20
|
-
yield
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
# The Gem::Specification for your project.
|
25
|
-
attr_reader :spec
|
26
|
-
|
27
|
-
# Initializes a Gem::Specification with some nice conventions.
|
28
|
-
def initialize(name, version, summary)
|
29
|
-
@spec = Gem::Specification.new do |spec|
|
30
|
-
spec.name = name
|
31
|
-
spec.version = version
|
32
|
-
spec.summary = summary
|
33
|
-
spec.files = FileList['Rakefile', '*.gemspec', '**/*.rdoc', 'bin/**/*', 'examples/**/*', 'ext/**/extconf.rb', 'ext/**/*.c', 'features/**/*', 'lib/**/*', 'resources/**/*', 'shoulda_macros/**/*', 'test/**/*'].to_a
|
34
|
-
spec.executables = everything_in_the_bin_directory
|
35
|
-
spec.extensions = FileList['ext/**/extconf.rb'].to_a
|
36
|
-
spec.rdoc_options = %W(--main README.rdoc --title #{name}-#{version} --inline-source) # MAYBE include --all, so that we document private methods?
|
37
|
-
spec.extra_rdoc_files = FileList['**/*.rdoc', 'shoulda_macros/**/*'].to_a
|
38
|
-
spec.has_rdoc = true
|
39
|
-
spec.author = `git config --get user.name`.chomp
|
40
|
-
spec.email = `git config --get user.email`.chomp
|
41
|
-
spec.add_development_dependency 'shoe'
|
42
|
-
end
|
43
|
-
|
44
|
-
def @spec.remove_development_dependency_on_shoe
|
45
|
-
dependencies.delete_if { |d| d.name == 'shoe' }
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# This is where the magic happens.
|
50
|
-
def define_tasks
|
51
|
-
if File.directory?('.git')
|
52
|
-
desc 'Remove ignored files'
|
53
|
-
task :clean do
|
54
|
-
sh 'git clean -fdX'
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
if File.directory?('lib')
|
59
|
-
desc 'Generate documentation'
|
60
|
-
task :rdoc do
|
61
|
-
LocalDocManager.new(spec).generate_rdoc
|
62
|
-
|
63
|
-
case RUBY_PLATFORM
|
64
|
-
when /darwin/
|
65
|
-
sh 'open rdoc/index.html'
|
66
|
-
when /mswin|mingw/
|
67
|
-
sh 'start rdoc\index.html'
|
68
|
-
else
|
69
|
-
sh 'firefox rdoc/index.html'
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
if File.file?("lib/#{spec.name}.rb")
|
75
|
-
desc 'Run an irb console'
|
76
|
-
task :shell do
|
77
|
-
exec 'irb', '-Ilib', "-r#{spec.name}"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
if File.directory?('test')
|
82
|
-
require 'rake/testtask'
|
83
|
-
# MAYBE be a little more forgiving in test selection, using test/**/*_test.rb. Or create suites based on subdirectory?
|
84
|
-
Rake::TestTask.new do |task|
|
85
|
-
task.libs = ['lib', 'test']
|
86
|
-
task.pattern = 'test/*_test.rb'
|
87
|
-
end
|
88
|
-
default_depends_on(:test)
|
89
|
-
end
|
90
|
-
|
91
|
-
if File.directory?('features')
|
92
|
-
require 'cucumber/rake/task'
|
93
|
-
Cucumber::Rake::Task.new(:cucumber, 'Run features') { |task| task.cucumber_opts = '--tags ~@wip' }
|
94
|
-
default_depends_on(:cucumber)
|
95
|
-
|
96
|
-
if there_are_any_work_in_progress_features
|
97
|
-
namespace :cucumber do
|
98
|
-
Cucumber::Rake::Task.new(:wip, 'Run work-in-progress features') { |task| task.cucumber_opts = '--tags @wip --wip' }
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
desc 'Show latest gemspec contents'
|
104
|
-
task :gemspec do
|
105
|
-
puts spec.to_ruby
|
106
|
-
end
|
107
|
-
|
108
|
-
if the_current_version_is_greater_than_zero && there_is_no_tag_for_the_current_version && we_are_on_the_master_branch && we_have_already_pushed_the_master_branch_to_a_remote_called_origin
|
109
|
-
desc "Release #{spec.name}-#{spec.version}"
|
110
|
-
task :release do
|
111
|
-
File.open("#{spec.name}.gemspec", 'w') { |f| f.write spec.to_ruby }
|
112
|
-
sh "git add #{spec.name}.gemspec"
|
113
|
-
sh "git commit -a -m 'Release #{spec.version}'"
|
114
|
-
sh "git tag #{spec.version}"
|
115
|
-
sh 'git push'
|
116
|
-
sh 'git push --tags'
|
117
|
-
sh "gem build #{spec.name}.gemspec"
|
118
|
-
sh "gem push #{spec.file_name}"
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
if File.directory?('ext')
|
123
|
-
desc 'Compile C extensions'
|
124
|
-
task :compile do
|
125
|
-
top_level_path = File.expand_path('.')
|
126
|
-
destination_path = File.join(top_level_path, spec.require_paths.first)
|
127
|
-
|
128
|
-
spec.extensions.each do |extension|
|
129
|
-
Dir.chdir(File.dirname(extension)) do
|
130
|
-
Gem::Ext::ExtConfBuilder.build(extension, top_level_path, destination_path, results = [])
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
[:test, :cucumber, 'cucumber:wip', :release].each do |task_name|
|
136
|
-
if Rake.application.lookup(task_name)
|
137
|
-
task task_name => :compile
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
private
|
144
|
-
|
145
|
-
def default_depends_on(task_name)
|
146
|
-
desc Rake.application.lookup(task_name).comment
|
147
|
-
task :default => task_name
|
148
|
-
end
|
149
|
-
|
150
|
-
def everything_in_the_bin_directory
|
151
|
-
File.directory?('bin') ? Dir.entries('bin') - ['.', '..'] : []
|
152
|
-
end
|
153
|
-
|
154
|
-
def the_current_version_is_greater_than_zero
|
155
|
-
spec.version > Gem::Version.new('0.0.0')
|
156
|
-
end
|
157
|
-
|
158
|
-
def there_are_any_work_in_progress_features
|
159
|
-
Dir.glob('features/**/*.feature').detect do |path|
|
160
|
-
File.read(path).include?('@wip')
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
def there_is_no_tag_for_the_current_version
|
165
|
-
!File.file?(".git/refs/tags/#{spec.version}")
|
166
|
-
end
|
167
|
-
|
168
|
-
def we_are_on_the_master_branch
|
169
|
-
File.file?('.git/HEAD') && File.read('.git/HEAD').strip == 'ref: refs/heads/master'
|
170
|
-
end
|
171
|
-
|
172
|
-
def we_have_already_pushed_the_master_branch_to_a_remote_called_origin
|
173
|
-
File.file?('.git/refs/remotes/origin/master')
|
174
|
-
end
|
175
|
-
|
176
|
-
# Using Gem::DocManager instead of Rake::RDocTask means you get to see your
|
177
|
-
# rdoc *exactly* as users who install your gem will.
|
178
|
-
class LocalDocManager < Gem::DocManager #:nodoc:
|
179
|
-
def initialize(spec)
|
180
|
-
@spec = spec
|
181
|
-
@doc_dir = Dir.pwd
|
182
|
-
@rdoc_args = []
|
183
|
-
adjust_spec_so_that_we_can_generate_rdoc_locally
|
184
|
-
end
|
185
|
-
|
186
|
-
def adjust_spec_so_that_we_can_generate_rdoc_locally
|
187
|
-
def @spec.full_gem_path
|
188
|
-
Dir.pwd
|
189
|
-
end
|
190
|
-
end
|
21
|
+
project = Project.new(name, version, summary)
|
22
|
+
yield project.spec if block_given?
|
23
|
+
project.define_tasks
|
191
24
|
end
|
192
25
|
end
|