hen 0.2.7 → 0.3.2
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/ChangeLog +37 -0
- data/README +47 -2
- data/Rakefile +5 -4
- data/bin/hen +21 -28
- data/example/_henrc +7 -0
- data/example/project/COPYING +1 -1
- data/example/project/ChangeLog +1 -1
- data/example/project/README +6 -6
- data/example/project/Rakefile +8 -10
- data/example/project/_gitignore +6 -0
- data/example/project/lib/__progname__.rb +1 -1
- data/example/project/lib/__progname__/version.rb +1 -1
- data/lib/hen.rb +111 -77
- data/lib/hen/cli.rb +113 -38
- data/lib/hen/dsl.rb +207 -100
- data/lib/hen/version.rb +2 -2
- data/lib/hens/gem.rake +84 -45
- data/lib/hens/rdoc.rake +83 -42
- data/lib/hens/spec.rake +29 -18
- data/lib/hens/test.rake +8 -3
- metadata +20 -38
- data/example/.henrc +0 -27
data/lib/hen/version.rb
CHANGED
data/lib/hens/gem.rake
CHANGED
@@ -1,38 +1,58 @@
|
|
1
1
|
Hen :gem => :rdoc do
|
2
2
|
# Dependencies:
|
3
|
-
# * rdoc -- Uses RDOC_OPTIONS and '
|
3
|
+
# * rdoc -- Uses RDOC_OPTIONS and 'doc:publish' task
|
4
4
|
|
5
5
|
require 'rake/gempackagetask'
|
6
6
|
|
7
|
-
gem_options = config[:gem]
|
8
|
-
|
7
|
+
gem_options = config[:gem].merge(
|
8
|
+
:files => FileList[
|
9
|
+
'lib/**/*.rb',
|
10
|
+
'bin/*'
|
11
|
+
].to_a,
|
12
|
+
:default_extra_files => FileList[
|
13
|
+
'[A-Z]*',
|
14
|
+
'example/**/*',
|
15
|
+
'ext/**/*',
|
16
|
+
'spec/**/*', '.rspec',
|
17
|
+
'test/**/*', '.autotest'
|
18
|
+
].to_a,
|
19
|
+
:extensions => FileList[
|
20
|
+
'ext/**/extconf.rb'
|
21
|
+
].to_a,
|
22
|
+
:require_path => 'lib'
|
23
|
+
)
|
24
|
+
|
25
|
+
rf_config = config[:rubyforge]
|
9
26
|
|
10
27
|
if Object.const_defined?(:RDOC_OPTIONS)
|
28
|
+
rdoc_files = RDOC_OPTIONS[:rdoc_files]
|
29
|
+
gem_options[:has_rdoc] = !rdoc_files.empty?
|
30
|
+
|
11
31
|
gem_options[:rdoc_options] ||= RDOC_OPTIONS[:options]
|
12
|
-
rdoc_files = RDOC_OPTIONS[:rdoc_files]
|
13
32
|
end
|
14
33
|
|
15
34
|
gem_spec = Gem::Specification.new { |spec|
|
16
35
|
|
17
36
|
### name
|
18
37
|
|
19
|
-
gem_options[:name] ||= rf_config[:package]
|
38
|
+
gem_name = gem_options[:name] ||= rf_config[:package]
|
20
39
|
|
21
|
-
abort 'Gem name missing' unless
|
40
|
+
abort 'Gem name missing' unless gem_name
|
22
41
|
|
23
42
|
### version
|
24
43
|
|
25
44
|
abort 'Gem version missing' unless gem_options[:version]
|
26
45
|
|
27
|
-
|
28
|
-
gem_options[:version] << '.' <<
|
29
|
-
|
46
|
+
svn { |svn|
|
47
|
+
gem_options[:version] << '.' << svn.version
|
48
|
+
} if gem_options.delete(:append_svnversion)
|
30
49
|
|
31
50
|
### author(s)
|
32
51
|
|
33
|
-
|
34
|
-
|
35
|
-
|
52
|
+
authors = gem_options[:authors] ||= []
|
53
|
+
authors.concat(Array(gem_options.delete(:author))).uniq!
|
54
|
+
|
55
|
+
warn 'Gem author(s) missing' if authors.empty?
|
36
56
|
|
37
57
|
### description
|
38
58
|
|
@@ -43,28 +63,35 @@ Hen :gem => :rdoc do
|
|
43
63
|
gem_options[:rubyforge_project] ||= rf_config[:project]
|
44
64
|
|
45
65
|
if rf_project = gem_options[:rubyforge_project] and !rf_project.empty?
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
gem_options[:homepage] ||= "#{rf_project}.rubyforge.org/#{rdoc_dir}"
|
66
|
+
rf_rdoc_dir = RDOC_OPTIONS[:rf_rdoc_dir] if Object.const_defined?(:RDOC_OPTIONS)
|
67
|
+
gem_options[:homepage] ||= "#{rf_project}.rubyforge.org/#{rf_rdoc_dir}"
|
50
68
|
end
|
51
69
|
|
52
|
-
if
|
53
|
-
|
70
|
+
if homepage = gem_options[:homepage]
|
71
|
+
homepage = "github.com/#{homepage}/#{gem_name}" if homepage.is_a?(Symbol)
|
72
|
+
homepage.insert(0, 'http://') unless homepage.empty? || homepage =~ %r{://}
|
54
73
|
end
|
55
74
|
|
56
|
-
### extra_rdoc_files, files, executables, bindir
|
75
|
+
### extra_rdoc_files, files, extensions, executables, bindir
|
57
76
|
|
58
77
|
gem_options[:files] ||= []
|
78
|
+
gem_options[:extensions] ||= []
|
59
79
|
gem_options[:extra_rdoc_files] ||= rdoc_files - gem_options[:files] if rdoc_files
|
60
|
-
gem_options[:files] += gem_options.delete(:extra_files) || []
|
61
|
-
|
62
|
-
gem_options[:executables] ||= gem_options[:files].grep(/\Abin\//)
|
63
80
|
|
64
|
-
[:
|
65
|
-
gem_options[files].
|
81
|
+
[:extra_files, :default_extra_files].each { |files|
|
82
|
+
gem_options[:files].concat(gem_options.delete(files) || [])
|
66
83
|
}
|
67
84
|
|
85
|
+
if exclude_files = gem_options.delete(:exclude_files)
|
86
|
+
gem_options[:files] -= exclude_files
|
87
|
+
end
|
88
|
+
|
89
|
+
gem_options[:executables] ||= gem_options[:files].grep(%r{\Abin/})
|
90
|
+
|
91
|
+
mangle_files!(*gem_options.values_at(
|
92
|
+
:extra_rdoc_files, :files, :executables, :extensions
|
93
|
+
))
|
94
|
+
|
68
95
|
unless gem_options[:executables].empty?
|
69
96
|
gem_options[:bindir] ||= File.dirname(gem_options[:executables].first)
|
70
97
|
gem_options[:executables].map! { |executable| File.basename(executable) }
|
@@ -76,20 +103,22 @@ Hen :gem => :rdoc do
|
|
76
103
|
spec.add_dependency(*dependency)
|
77
104
|
}
|
78
105
|
|
106
|
+
(gem_options.delete(:development_dependencies) || []).each { |dependency|
|
107
|
+
spec.add_development_dependency(*dependency)
|
108
|
+
}
|
109
|
+
|
79
110
|
### => set options!
|
80
111
|
|
81
|
-
gem_options.each { |option, value|
|
82
|
-
spec.send("#{option}=", value)
|
83
|
-
}
|
112
|
+
gem_options.each { |option, value| spec.send("#{option}=", value) }
|
84
113
|
}
|
85
114
|
|
86
115
|
desc 'Display the gem specification'
|
87
|
-
task :
|
116
|
+
task 'gem:spec' do
|
88
117
|
puts gem_spec.to_ruby
|
89
118
|
end
|
90
119
|
|
91
120
|
desc "Update (or create) the project's gemspec file"
|
92
|
-
task '
|
121
|
+
task 'gem:spec:update' do
|
93
122
|
file = "#{gem_spec.name}.gemspec"
|
94
123
|
action = File.exists?(file) ? 'Updated' : 'Created'
|
95
124
|
|
@@ -98,7 +127,7 @@ Hen :gem => :rdoc do
|
|
98
127
|
puts "#{action} #{file}"
|
99
128
|
end
|
100
129
|
|
101
|
-
pkg_task = Rake::GemPackageTask.new(gem_spec)
|
130
|
+
pkg_task = Rake::GemPackageTask.new(gem_spec) { |pkg|
|
102
131
|
pkg.need_tar_gz = true
|
103
132
|
pkg.need_zip = true
|
104
133
|
|
@@ -106,13 +135,33 @@ Hen :gem => :rdoc do
|
|
106
135
|
require 'nuggets/file/which'
|
107
136
|
pkg.zip_command = File.which_command(ZIP_COMMANDS) || ZIP_COMMANDS.first
|
108
137
|
end
|
138
|
+
}
|
139
|
+
|
140
|
+
release_desc = "Release #{pkg_task.name} version #{pkg_task.version}"
|
141
|
+
|
142
|
+
rubygems do |rg_pool|
|
143
|
+
|
144
|
+
gem_path = File.join(pkg_task.package_dir, pkg_task.gem_file)
|
145
|
+
|
146
|
+
desc "Create the gem and install it"
|
147
|
+
task 'gem:install' => :gem do
|
148
|
+
rg_pool.call.install(gem_path)
|
149
|
+
end
|
150
|
+
|
151
|
+
desc 'Create the gem and upload it to RubyGems.org'
|
152
|
+
task 'gem:push' => :gem do
|
153
|
+
rg_pool.call.push(gem_path)
|
154
|
+
end
|
155
|
+
|
156
|
+
desc release_desc; release_desc = nil
|
157
|
+
task :release => 'gem:push'
|
158
|
+
|
109
159
|
end
|
110
160
|
|
111
|
-
begin
|
112
161
|
rubyforge do |rf_config, rf_pool|
|
113
162
|
|
114
|
-
desc 'Package and upload the release to
|
115
|
-
task :
|
163
|
+
desc 'Package and upload the release to RubyForge'
|
164
|
+
task 'release:rubyforge' => [:package, 'doc:publish'] do
|
116
165
|
files = Dir[File.join(pkg_task.package_dir, "#{pkg_task.package_name}.*")]
|
117
166
|
abort 'Nothing to release!' if files.empty?
|
118
167
|
|
@@ -130,19 +179,9 @@ begin
|
|
130
179
|
rf.add_release(rf_config[:project], pkg_task.name, version, *files)
|
131
180
|
end
|
132
181
|
|
133
|
-
|
134
|
-
|
135
|
-
raise unless err.to_s == 'Skipping Rubyforge tasks'
|
136
|
-
|
137
|
-
gemcutter do |gc_pool|
|
138
|
-
|
139
|
-
desc 'Create the gem and upload it to Gemcutter'
|
140
|
-
task :release => [:gem] do
|
141
|
-
gc = gc_pool.call
|
142
|
-
gc.push(File.join(pkg_task.package_dir, pkg_task.gem_file))
|
143
|
-
end
|
182
|
+
desc release_desc
|
183
|
+
task :release => 'release:rubyforge'
|
144
184
|
|
145
185
|
end
|
146
|
-
end
|
147
186
|
|
148
187
|
end
|
data/lib/hens/rdoc.rake
CHANGED
@@ -1,8 +1,25 @@
|
|
1
1
|
Hen :rdoc do
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
rdoc_options = config[:rdoc].merge(
|
4
|
+
:rdoc_dir => 'doc',
|
5
|
+
:rdoc_files => %w[README COPYING ChangeLog lib/**/*.rb],
|
6
|
+
:charset => 'UTF-8',
|
7
|
+
:inline_source => true,
|
8
|
+
:line_numbers => true,
|
9
|
+
:all => true
|
10
|
+
)
|
11
|
+
|
12
|
+
rdoc_klass = begin
|
13
|
+
raise LoadError if rdoc_options.delete(:legacy)
|
14
|
+
|
15
|
+
require 'rdoc/task'
|
16
|
+
|
17
|
+
rdoc_options.delete(:inline_source) # deprecated
|
18
|
+
RDoc::Task
|
19
|
+
rescue LoadError
|
20
|
+
require 'rake/rdoctask'
|
21
|
+
Rake::RDocTask
|
22
|
+
end
|
6
23
|
|
7
24
|
rdoc_options[:title] ||= begin
|
8
25
|
title = 'Application documentation'
|
@@ -22,14 +39,21 @@ Hen :rdoc do
|
|
22
39
|
|
23
40
|
rdoc_dir = rdoc_options.delete(:rdoc_dir)
|
24
41
|
|
25
|
-
### rdoc_files
|
42
|
+
### rdoc_files, main
|
26
43
|
|
27
|
-
rdoc_files = FileList[rdoc_options.delete(:rdoc_files)].
|
28
|
-
|
44
|
+
rdoc_files = FileList[rdoc_options.delete(:rdoc_files)].to_a
|
45
|
+
rdoc_files_local = rdoc_files.dup
|
29
46
|
|
30
|
-
|
47
|
+
if mangle_files!(rdoc_files)
|
48
|
+
mangle_files!(rdoc_files_local, :managed => false)
|
49
|
+
else
|
50
|
+
rdoc_files_local = nil
|
51
|
+
end
|
31
52
|
|
32
53
|
rdoc_options.delete(:main) unless rdoc_files.include?(rdoc_options[:main])
|
54
|
+
rdoc_options[:main] ||= rdoc_files.first
|
55
|
+
|
56
|
+
### rdoc_options
|
33
57
|
|
34
58
|
rdoc_options = rdoc_options.map { |option, value|
|
35
59
|
option = '--' << option.to_s.tr('_', '-')
|
@@ -44,8 +68,7 @@ Hen :rdoc do
|
|
44
68
|
}
|
45
69
|
|
46
70
|
unless rdoc_files.empty?
|
47
|
-
|
48
|
-
rdoc_task = Rake::RDocTask.new(:doc) { |rdoc|
|
71
|
+
rdoc_task = rdoc_klass.new(:doc) { |rdoc|
|
49
72
|
rdoc.rdoc_dir = rdoc_dir
|
50
73
|
rdoc.rdoc_files = rdoc_files
|
51
74
|
rdoc.options = rdoc_options
|
@@ -56,39 +79,23 @@ Hen :rdoc do
|
|
56
79
|
end
|
57
80
|
end
|
58
81
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
rf_project = rf_config[:project]
|
65
|
-
abort 'Rubyforge project name missing' unless rf_project
|
66
|
-
|
67
|
-
rf_user = rf_config[:username]
|
68
|
-
abort 'Rubyforge user name missing' unless rf_user
|
69
|
-
|
70
|
-
rf_host = "#{rf_user}@rubyforge.org"
|
71
|
-
|
72
|
-
local_dir = rdoc_task.rdoc_dir
|
73
|
-
remote_dir = "/var/www/gforge-projects/#{rf_project}"
|
74
|
-
|
75
|
-
if rdoc_dir = rf_config[:rdoc_dir]
|
76
|
-
if rf_package = rf_config[:package]
|
77
|
-
rdoc_dir = rf_package if rdoc_dir == :package
|
78
|
-
end
|
79
|
-
|
80
|
-
remote_dir = File.join(remote_dir, rdoc_dir)
|
81
|
-
end
|
82
|
+
unless rdoc_files_local.nil? || rdoc_files_local.empty?
|
83
|
+
rdoc_klass.new('doc:local') { |rdoc|
|
84
|
+
rdoc.rdoc_dir = rdoc_dir + '.local'
|
85
|
+
rdoc.rdoc_files = rdoc_files_local
|
86
|
+
rdoc.options = rdoc_options
|
82
87
|
|
83
|
-
|
84
|
-
|
85
|
-
"scp -r #{local_dir}/ #{rf_host}:#{remote_dir}/"
|
86
|
-
)
|
87
|
-
end
|
88
|
+
extend_object(rdoc) {
|
89
|
+
def local_description(desc); "#{desc} (including unmanaged files)"; end
|
88
90
|
|
91
|
+
def clobber_task_description; local_description(super); end
|
92
|
+
def rdoc_task_description; local_description(super); end
|
93
|
+
def rerdoc_task_description; local_description(super); end
|
94
|
+
}
|
95
|
+
}
|
89
96
|
end
|
90
|
-
|
91
|
-
|
97
|
+
|
98
|
+
publish_desc = "Publish RDoc documentation"
|
92
99
|
|
93
100
|
git do |git|
|
94
101
|
|
@@ -105,7 +112,7 @@ rescue RuntimeError => err
|
|
105
112
|
if pages_url # inside git repo and found gh-pages branch
|
106
113
|
|
107
114
|
desc "Publish RDoc to GitHub pages"
|
108
|
-
task :
|
115
|
+
task 'doc:publish:github' => :doc do
|
109
116
|
rm_rf clone_dir
|
110
117
|
|
111
118
|
git.easy_clone pages_url, clone_dir, git_remote
|
@@ -120,10 +127,13 @@ rescue RuntimeError => err
|
|
120
127
|
}
|
121
128
|
end
|
122
129
|
|
130
|
+
desc publish_desc; publish_desc = nil
|
131
|
+
task 'doc:publish' => 'doc:publish:github'
|
132
|
+
|
123
133
|
elsif clone_url # still git repo, but no gh-pages branch
|
124
134
|
|
125
135
|
desc "Create #{git_branch} branch on #{git_remote}"
|
126
|
-
task :make_ghpages do
|
136
|
+
task 'doc:make_ghpages' do
|
127
137
|
git.easy_clone clone_url, clone_dir, git_remote
|
128
138
|
|
129
139
|
Dir.chdir(clone_dir) {
|
@@ -146,6 +156,37 @@ rescue RuntimeError => err
|
|
146
156
|
end
|
147
157
|
|
148
158
|
end
|
149
|
-
|
159
|
+
|
160
|
+
rubyforge do |rf_config|
|
161
|
+
|
162
|
+
rf_project = rf_config[:project]
|
163
|
+
|
164
|
+
rf_rdoc_dir, rf_package = rf_config.values_at(:rdoc_dir, :package)
|
165
|
+
rf_rdoc_dir ||= :package if rf_package && rf_package != rf_project
|
166
|
+
rf_rdoc_dir = rf_package if rf_package && rf_rdoc_dir == :package
|
167
|
+
|
168
|
+
RDOC_OPTIONS[:rf_rdoc_dir] = rf_rdoc_dir
|
169
|
+
|
170
|
+
desc 'Publish RDoc to RubyForge'
|
171
|
+
task 'doc:publish:rubyforge' => :doc do
|
172
|
+
rf_user = rf_config[:username]
|
173
|
+
abort 'RubyForge user name missing' unless rf_user
|
174
|
+
|
175
|
+
rf_host = "#{rf_user}@rubyforge.org"
|
176
|
+
|
177
|
+
local_dir = rdoc_task.rdoc_dir
|
178
|
+
remote_dir = "/var/www/gforge-projects/#{rf_project}"
|
179
|
+
remote_dir = File.join(remote_dir, rf_rdoc_dir) if rf_rdoc_dir
|
180
|
+
|
181
|
+
execute(
|
182
|
+
"rsync -av --delete #{local_dir}/ #{rf_host}:#{remote_dir}/",
|
183
|
+
"scp -r #{local_dir}/ #{rf_host}:#{remote_dir}/"
|
184
|
+
)
|
185
|
+
end
|
186
|
+
|
187
|
+
desc publish_desc
|
188
|
+
task 'doc:publish' => 'doc:publish:rubyforge'
|
189
|
+
|
190
|
+
end
|
150
191
|
|
151
192
|
end
|
data/lib/hens/spec.rake
CHANGED
@@ -1,17 +1,30 @@
|
|
1
1
|
Hen :spec do
|
2
2
|
|
3
|
-
|
3
|
+
spec_options = config[:spec].merge(
|
4
|
+
:pattern => 'spec/**/*_spec.rb',
|
5
|
+
:helper => 'spec/spec_helper.rb',
|
6
|
+
:options => 'spec/spec.opts'
|
7
|
+
)
|
8
|
+
|
9
|
+
spec_klass = begin
|
10
|
+
raise LoadError if spec_options.delete(:legacy)
|
11
|
+
|
4
12
|
require 'rspec/core/rake_task'
|
13
|
+
RSpec::Core::RakeTask
|
5
14
|
rescue LoadError
|
6
15
|
require 'spec/rake/spectask'
|
16
|
+
Spec::Rake::SpecTask
|
7
17
|
end
|
8
18
|
|
9
|
-
|
19
|
+
spec_files = spec_options.delete(:files) ||
|
20
|
+
FileList[spec_options.delete(:pattern)].to_a
|
10
21
|
|
11
|
-
spec_files
|
22
|
+
mangle_files!(spec_files, :managed => false)
|
12
23
|
|
13
|
-
|
14
|
-
|
24
|
+
unless spec_files.empty?
|
25
|
+
spec_helper = spec_options.delete(:helper)
|
26
|
+
|
27
|
+
if spec_helper && File.readable?(spec_helper)
|
15
28
|
spec_files.delete(spec_helper)
|
16
29
|
spec_files.unshift(spec_helper)
|
17
30
|
end
|
@@ -27,30 +40,28 @@ Hen :spec do
|
|
27
40
|
File.readlines(opts_file).each { |l| spec_opts << l.chomp }
|
28
41
|
end
|
29
42
|
|
30
|
-
|
31
|
-
|
32
|
-
t.pattern = spec_files
|
33
|
-
t.rspec_opts = spec_opts
|
34
|
-
}]
|
35
|
-
else
|
36
|
-
[Spec::Rake::SpecTask, lambda { |t|
|
43
|
+
spec_block = lambda { |t|
|
44
|
+
if t.respond_to?(:spec_files=)
|
37
45
|
t.spec_files = spec_files
|
38
46
|
t.spec_opts = spec_opts
|
39
|
-
|
40
|
-
|
47
|
+
else
|
48
|
+
t.pattern = spec_files
|
49
|
+
t.rspec_opts = spec_opts
|
50
|
+
end
|
51
|
+
}
|
41
52
|
|
42
|
-
|
53
|
+
spec_klass.new(&spec_block)
|
43
54
|
|
44
55
|
rcov_opts = ['--exclude', spec_files.join(',')]
|
45
|
-
rcov_file = File.join(spec_files.first[
|
56
|
+
rcov_file = File.join(spec_files.first[%r{[^/.]+}], 'rcov.opts')
|
46
57
|
|
47
58
|
if rcov_file && File.readable?(rcov_file)
|
48
|
-
File.readlines(rcov_file).each { |
|
59
|
+
File.readlines(rcov_file).each { |line| rcov_opts << line.chomp }
|
49
60
|
end
|
50
61
|
|
51
62
|
#desc "Run specs with RCov"
|
52
63
|
klass.new('spec:rcov') do |t|
|
53
|
-
|
64
|
+
spec_block[t]
|
54
65
|
|
55
66
|
t.rcov = true
|
56
67
|
t.rcov_opts = rcov_opts
|