shoe 0.5.1 → 0.6.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/{doc/bundler.rdoc → BUNDLER.rdoc} +0 -0
- data/CHANGELOG.rdoc +15 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +21 -3
- data/README.rdoc +22 -2
- data/TODO.rdoc +3 -3
- data/bin/shoe +16 -2
- data/data/shoe/templates/application.erb +23 -0
- data/data/shoe/templates/executable.erb +18 -0
- data/data/shoe/templates/extconf.erb +2 -0
- data/data/shoe/templates/extension.erb +9 -0
- data/data/shoe/templates/gemspec.erb +50 -0
- data/data/shoe/templates/gitignore.erb +4 -0
- data/data/shoe/templates/gitkeep.erb +0 -0
- data/data/shoe/templates/manpage.erb +30 -0
- data/data/shoe/templates/module.erb +31 -0
- data/data/shoe/templates/module_test.rb +7 -0
- data/data/shoe/templates/rakefile.erb +3 -0
- data/data/shoe/templates/readme.erb +3 -0
- data/data/shoe/templates/test_helper.erb +2 -0
- data/features/cucumber.feature +7 -8
- data/features/generator.feature +32 -0
- data/features/release.feature +8 -8
- data/features/step_definitions/shoe_steps.rb +0 -9
- data/features/support/env.rb +5 -9
- data/features/test.feature +4 -4
- data/lib/shoe.rb +20 -2
- data/lib/shoe/extensions.rb +10 -0
- data/lib/shoe/extensions/doc_manager.rb +11 -0
- data/lib/shoe/extensions/option_parser.rb +25 -0
- data/lib/shoe/extensions/pathname.rb +16 -0
- data/lib/shoe/extensions/source_index.rb +17 -0
- data/lib/shoe/extensions/specification.rb +19 -0
- data/lib/shoe/extensions/validator.rb +15 -0
- data/lib/shoe/generator.rb +122 -40
- data/lib/shoe/tasks.rb +2 -0
- data/lib/shoe/tasks/abstract.rb +3 -69
- data/lib/shoe/tasks/compile.rb +3 -1
- data/lib/shoe/tasks/cucumber.rb +13 -10
- data/lib/shoe/tasks/rdoc.rb +3 -22
- data/lib/shoe/tasks/release.rb +7 -12
- data/lib/shoe/tasks/ronn.rb +77 -0
- data/lib/shoe/tasks/test.rb +2 -26
- data/man/shoe.1 +64 -0
- data/man/shoe.1.ronn +63 -0
- data/shoe.gemspec +4 -1
- metadata +59 -15
- data/features/getting_started.feature +0 -29
- data/lib/shoe/templates/gemspec.erb +0 -41
- data/lib/shoe/templates/rakefile.erb +0 -3
- data/lib/shoe/templates/readme.erb +0 -3
- data/lib/shoe/templates/version.erb +0 -3
- data/lib/shoe/version.rb +0 -3
@@ -1,12 +1,3 @@
|
|
1
|
-
Given /^I have created a project called "([^\"]*)"$/ do |name|
|
2
|
-
create_directory(name)
|
3
|
-
create_file("#{name}/Gemfile", <<-END.gsub(/^\s*/, ''))
|
4
|
-
source :rubygems
|
5
|
-
gem 'shoe', :group => :development
|
6
|
-
END
|
7
|
-
run('bundle exec shoe .', name)
|
8
|
-
end
|
9
|
-
|
10
1
|
Given /^I have created a directory called "([^\"]*)"$/ do |name|
|
11
2
|
create_directory(name)
|
12
3
|
end
|
data/features/support/env.rb
CHANGED
@@ -19,7 +19,7 @@ class WorkingDirectory
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def create_file(path, contents)
|
22
|
-
file(path).open('w') { |file| file.write(
|
22
|
+
file(path).open('w') { |file| file.write(contents) }
|
23
23
|
end
|
24
24
|
|
25
25
|
def append_file(path, contents)
|
@@ -47,19 +47,15 @@ class WorkingDirectory
|
|
47
47
|
|
48
48
|
private
|
49
49
|
|
50
|
-
def be_sneaky_with_the_gemfile(contents)
|
51
|
-
contents.sub("gem 'shoe'", "gem 'shoe', :path => '#{PROJECT_ROOT.expand_path}'")
|
52
|
-
end
|
53
|
-
|
54
50
|
def isolate_environment(command)
|
55
|
-
# set the PATH so
|
51
|
+
# set the PATH so tests can just run shoe
|
56
52
|
ENV['PATH'] = ENV['PATH'].split(File::PATH_SEPARATOR).
|
57
53
|
unshift(PROJECT_ROOT.join('bin')).uniq.
|
58
54
|
join(File::PATH_SEPARATOR)
|
55
|
+
ENV['RUBYLIB'] = PROJECT_ROOT.join('lib')
|
59
56
|
|
60
|
-
# whack most environment variables
|
61
|
-
#
|
62
|
-
"/usr/bin/env -i #{preserve_environment 'HOME', 'PATH', 'GEM_HOME', 'GEM_PATH'} #{command}"
|
57
|
+
# whack most environment variables for good hygiene
|
58
|
+
"/usr/bin/env -i #{preserve_environment 'HOME', 'PATH', 'GEM_HOME', 'GEM_PATH', 'RUBYLIB'} #{command}"
|
63
59
|
end
|
64
60
|
|
65
61
|
def preserve_environment(*variables)
|
data/features/test.feature
CHANGED
@@ -4,15 +4,15 @@ Feature: Test
|
|
4
4
|
I want shoe to give me a rake task
|
5
5
|
|
6
6
|
Scenario: Running rake --tasks in a shoe project without tests
|
7
|
-
Given I have
|
7
|
+
Given I have run shoe --no-test-unit my_project inside "."
|
8
8
|
And I have run git init inside "my_project"
|
9
|
-
When I run
|
9
|
+
When I run rake --tasks inside "my_project"
|
10
10
|
Then I should not see "rake test" on standard out
|
11
11
|
|
12
12
|
Scenario: Running rake --tasks in a shoe project with tests
|
13
|
-
Given I have
|
13
|
+
Given I have run shoe --no-test-unit my_project inside "."
|
14
14
|
And I have run git init inside "my_project"
|
15
15
|
And I have created a directory called "my_project/test"
|
16
16
|
And I have created a file called "my_project/test/foo_test.rb" containing ""
|
17
|
-
When I run
|
17
|
+
When I run rake --tasks inside "my_project"
|
18
18
|
Then I should see "rake test" on standard out
|
data/lib/shoe.rb
CHANGED
@@ -1,4 +1,22 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'rbconfig'
|
3
|
+
require 'rbconfig/datadir'
|
4
|
+
|
1
5
|
module Shoe
|
2
|
-
|
3
|
-
|
6
|
+
VERSION = '0.6.0'
|
7
|
+
|
8
|
+
autoload :Extensions, 'shoe/extensions'
|
9
|
+
autoload :Generator, 'shoe/generator'
|
10
|
+
autoload :Tasks, 'shoe/tasks'
|
11
|
+
|
12
|
+
def self.datadir
|
13
|
+
@@datadir ||= begin
|
14
|
+
datadir = RbConfig.datadir('shoe')
|
15
|
+
if !File.exist?(datadir)
|
16
|
+
warn "#{datadir} does not exist. Trying again with relative data directory."
|
17
|
+
datadir = File.expand_path('../../data/shoe', __FILE__)
|
18
|
+
end
|
19
|
+
Pathname.new(datadir)
|
20
|
+
end
|
21
|
+
end
|
4
22
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module Shoe
|
2
|
+
module Extensions
|
3
|
+
autoload :DocManager, 'shoe/extensions/doc_manager'
|
4
|
+
autoload :OptionParser, 'shoe/extensions/option_parser'
|
5
|
+
autoload :Pathname, 'shoe/extensions/pathname'
|
6
|
+
autoload :SourceIndex, 'shoe/extensions/source_index'
|
7
|
+
autoload :Specification, 'shoe/extensions/specification'
|
8
|
+
autoload :Validator, 'shoe/extensions/validator'
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Shoe
|
2
|
+
module Extensions
|
3
|
+
|
4
|
+
module OptionParser
|
5
|
+
attr_accessor :defaults
|
6
|
+
|
7
|
+
def order(*args, &block)
|
8
|
+
begin
|
9
|
+
super(defaults.dup.concat(*args), &block)
|
10
|
+
rescue ::OptionParser::ParseError
|
11
|
+
abort($!)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def summarize(*args, &block)
|
16
|
+
return <<-END.gsub(/^ {10}/, '')
|
17
|
+
#{super}
|
18
|
+
Defaults:
|
19
|
+
#{summary_indent}#{defaults.join(' ')}
|
20
|
+
END
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Shoe
|
2
|
+
module Extensions
|
3
|
+
|
4
|
+
module Specification
|
5
|
+
def self.extended(specification)
|
6
|
+
specification.loaded_from = Dir.pwd
|
7
|
+
end
|
8
|
+
|
9
|
+
def full_gem_path
|
10
|
+
Dir.pwd
|
11
|
+
end
|
12
|
+
|
13
|
+
def has_version_greater_than?(string)
|
14
|
+
version > Gem::Version.new(string)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
data/lib/shoe/generator.rb
CHANGED
@@ -1,63 +1,145 @@
|
|
1
1
|
require 'erb'
|
2
|
+
require 'optparse'
|
2
3
|
require 'pathname'
|
3
4
|
|
4
5
|
module Shoe
|
5
6
|
class Generator
|
6
|
-
def initialize
|
7
|
-
@
|
8
|
-
@
|
7
|
+
def initialize
|
8
|
+
@options = {}
|
9
|
+
@parser = OptionParser.new do |opts|
|
10
|
+
opts.extend(Extensions::OptionParser)
|
11
|
+
|
12
|
+
opts.banner = "Usage: #{File.basename($0)} [-adehtv] [path]"
|
13
|
+
opts.defaults = %w(--no-application --no-data --no-extension --test-unit .)
|
14
|
+
opts.version = Shoe::VERSION
|
15
|
+
|
16
|
+
opts.on('-a', '--[no-]application', 'Generate a command-line application.') do |application|
|
17
|
+
@options[:application] = application
|
18
|
+
end
|
19
|
+
|
20
|
+
opts.on('-d', '--[no-]data', 'Generate a data directory.') do |data|
|
21
|
+
@options[:data] = data
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on('-e', '--[no-]extension', 'Generate a C extension.') do |extension|
|
25
|
+
@options[:extension] = extension
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on('-t', '--[no-]test-unit', 'Generate Test::Unit tests.') do |test_unit|
|
29
|
+
@options[:test_unit] = test_unit
|
30
|
+
end
|
31
|
+
end
|
9
32
|
end
|
10
33
|
|
11
|
-
def run
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
path(gemspec_path).install template('gemspec.erb')
|
34
|
+
def run(arguments)
|
35
|
+
@parser.order(arguments) { |path| @project = Project.new(path, @options) }
|
36
|
+
|
37
|
+
@project.generate
|
16
38
|
end
|
17
39
|
|
18
40
|
private
|
19
41
|
|
20
|
-
def project_name
|
21
|
-
@root.basename.to_s
|
22
|
-
end
|
23
42
|
|
24
|
-
|
25
|
-
|
26
|
-
|
43
|
+
class Project
|
44
|
+
def initialize(path, options)
|
45
|
+
@path = Pathname.new(path)
|
46
|
+
@options = options
|
47
|
+
end
|
27
48
|
|
28
|
-
|
29
|
-
|
30
|
-
|
49
|
+
def generate
|
50
|
+
install('gitignore.erb', '.gitignore')
|
51
|
+
install('readme.erb', 'README.rdoc')
|
52
|
+
install('rakefile.erb', 'Rakefile')
|
53
|
+
install('gemspec.erb', "#{name}.gemspec")
|
54
|
+
install('module.erb', "lib/#{name}.rb")
|
31
55
|
|
32
|
-
|
33
|
-
|
34
|
-
|
56
|
+
if application?
|
57
|
+
install('executable.erb', "bin/#{name}", 0755)
|
58
|
+
install('application.erb', "lib/#{name}/application.rb")
|
59
|
+
install('manpage.erb', "man/#{name}.1.ronn")
|
60
|
+
end
|
35
61
|
|
36
|
-
|
37
|
-
|
38
|
-
|
62
|
+
if data?
|
63
|
+
install('gitkeep.erb', "data/#{name}/.gitkeep")
|
64
|
+
end
|
39
65
|
|
40
|
-
|
41
|
-
|
42
|
-
|
66
|
+
if extension?
|
67
|
+
install('extconf.erb', "ext/#{name}/extconf.rb")
|
68
|
+
install('extension.erb', "ext/#{name}/#{extension_name}.c")
|
69
|
+
end
|
43
70
|
|
44
|
-
|
45
|
-
|
46
|
-
|
71
|
+
if test_unit?
|
72
|
+
install('test_helper.erb', "test/helper.rb")
|
73
|
+
install('module_test.rb', "test/#{name}_test.rb")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def install(template, path, mode=0644)
|
80
|
+
installable_path(path).install(contents(template), mode)
|
81
|
+
end
|
47
82
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
83
|
+
def application?
|
84
|
+
@options[:application]
|
85
|
+
end
|
86
|
+
|
87
|
+
def data?
|
88
|
+
@options[:data]
|
89
|
+
end
|
90
|
+
|
91
|
+
def extension?
|
92
|
+
@options[:extension]
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_unit?
|
96
|
+
@options[:test_unit]
|
97
|
+
end
|
98
|
+
|
99
|
+
def name
|
100
|
+
@path.expand_path.basename.to_s
|
101
|
+
end
|
102
|
+
|
103
|
+
def module_name
|
104
|
+
name.capitalize.gsub(/_(\w)/) { $1.upcase }
|
105
|
+
end
|
106
|
+
|
107
|
+
def version
|
108
|
+
'0.0.0'
|
109
|
+
end
|
110
|
+
|
111
|
+
def extension_name
|
112
|
+
'extension'
|
113
|
+
end
|
114
|
+
|
115
|
+
def extension_module_name
|
116
|
+
extension_name.capitalize.gsub(/_(\w)/) { $1.upcase }
|
117
|
+
end
|
118
|
+
|
119
|
+
def installable_path(name)
|
120
|
+
path = @path.join(name)
|
121
|
+
path.dirname.mkpath
|
122
|
+
path.extend(Extensions::Pathname)
|
123
|
+
end
|
124
|
+
|
125
|
+
def contents(template)
|
126
|
+
Template.new(template).evaluate(binding)
|
127
|
+
end
|
52
128
|
end
|
53
129
|
|
54
|
-
|
55
|
-
def
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
130
|
+
class Template
|
131
|
+
def initialize(name)
|
132
|
+
@name = name
|
133
|
+
end
|
134
|
+
|
135
|
+
def evaluate(binding)
|
136
|
+
ERB.new(contents, nil, '<>').result(binding)
|
137
|
+
end
|
138
|
+
|
139
|
+
private
|
140
|
+
|
141
|
+
def contents
|
142
|
+
Shoe.datadir.join('templates', @name).read
|
61
143
|
end
|
62
144
|
end
|
63
145
|
end
|
data/lib/shoe/tasks.rb
CHANGED
@@ -6,6 +6,7 @@ module Shoe
|
|
6
6
|
autoload :Compile, 'shoe/tasks/compile'
|
7
7
|
autoload :Cucumber, 'shoe/tasks/cucumber'
|
8
8
|
autoload :Rdoc, 'shoe/tasks/rdoc'
|
9
|
+
autoload :Ronn, 'shoe/tasks/ronn'
|
9
10
|
autoload :Release, 'shoe/tasks/release'
|
10
11
|
autoload :Test, 'shoe/tasks/test'
|
11
12
|
|
@@ -14,6 +15,7 @@ module Shoe
|
|
14
15
|
Compile
|
15
16
|
Cucumber
|
16
17
|
Rdoc
|
18
|
+
Ronn
|
17
19
|
Release
|
18
20
|
Test
|
19
21
|
)
|
data/lib/shoe/tasks/abstract.rb
CHANGED
@@ -5,75 +5,9 @@ module Shoe
|
|
5
5
|
attr_reader :spec
|
6
6
|
|
7
7
|
def initialize(spec)
|
8
|
-
@spec =
|
9
|
-
|
10
|
-
|
11
|
-
Gem::Specification.load(spec)
|
12
|
-
end
|
13
|
-
|
14
|
-
@spec.extend(LocalGemspecExtensions)
|
15
|
-
|
16
|
-
if active?
|
17
|
-
define
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
module LocalGemspecExtensions #:nodoc:
|
24
|
-
def full_gem_path
|
25
|
-
Dir.pwd
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def warn(subject, *paragraphs)
|
30
|
-
$stderr.extend(Colored).
|
31
|
-
extend(Formatted).
|
32
|
-
message(subject, paragraphs)
|
33
|
-
end
|
34
|
-
|
35
|
-
module Colored #:nodoc:
|
36
|
-
YELLOW = "\e[33m"
|
37
|
-
CLEAR = "\e[0m"
|
38
|
-
|
39
|
-
def write(string)
|
40
|
-
super(YELLOW) if tty?
|
41
|
-
super
|
42
|
-
super(CLEAR) if tty?
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
module Formatted #:nodoc:
|
47
|
-
WIDTH = 72
|
48
|
-
WRAP = /(.{1,#{WIDTH}})( +|$\n?)|(.{1,#{WIDTH}})/
|
49
|
-
|
50
|
-
def message(subject, paragraphs)
|
51
|
-
border
|
52
|
-
heading(subject)
|
53
|
-
body(paragraphs)
|
54
|
-
border
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def border
|
60
|
-
puts '-' * WIDTH
|
61
|
-
end
|
62
|
-
|
63
|
-
def heading(string)
|
64
|
-
puts "#{string} warning from shoe".upcase
|
65
|
-
end
|
66
|
-
|
67
|
-
def body(paragraphs)
|
68
|
-
paragraphs.each do |paragraph|
|
69
|
-
puts
|
70
|
-
puts wrap(paragraph)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def wrap(string)
|
75
|
-
string.gsub(WRAP, "\\1\\3\n")
|
76
|
-
end
|
8
|
+
@spec = Gem::Specification.load(spec)
|
9
|
+
@spec.extend(Extensions::Specification)
|
10
|
+
define if active?
|
77
11
|
end
|
78
12
|
end
|
79
13
|
|