blackwinter-hen 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +676 -0
- data/ChangeLog +59 -0
- data/README +42 -0
- data/Rakefile +18 -0
- data/bin/hen +151 -0
- data/example/.henrc +30 -0
- data/example/hens/sample.rake +31 -0
- data/example/project/COPYING +3 -0
- data/example/project/ChangeLog +5 -0
- data/example/project/README +20 -0
- data/example/project/Rakefile +24 -0
- data/example/project/lib/__progname__/version.rb +27 -0
- data/example/project/lib/__progname__.rb +2 -0
- data/lib/hen/cli.rb +85 -0
- data/lib/hen/dsl.rb +121 -0
- data/lib/hen/version.rb +27 -0
- data/lib/hen.rb +305 -0
- data/lib/hens/gem.rake +129 -0
- data/lib/hens/rdoc.rake +79 -0
- data/lib/hens/spec.rake +36 -0
- data/lib/hens/test.rake +19 -0
- metadata +104 -0
data/lib/hen.rb
ADDED
@@ -0,0 +1,305 @@
|
|
1
|
+
#--
|
2
|
+
###############################################################################
|
3
|
+
# #
|
4
|
+
# hen -- Just a Rake helper #
|
5
|
+
# #
|
6
|
+
# Copyright (C) 2007-2008 University of Cologne, #
|
7
|
+
# Albertus-Magnus-Platz, #
|
8
|
+
# 50932 Cologne, Germany #
|
9
|
+
# #
|
10
|
+
# Authors: #
|
11
|
+
# Jens Wille <jens.wille@uni-koeln.de> #
|
12
|
+
# #
|
13
|
+
# hen is free software; you can redistribute it and/or modify it under the #
|
14
|
+
# terms of the GNU General Public License as published by the Free Software #
|
15
|
+
# Foundation; either version 3 of the License, or (at your option) any later #
|
16
|
+
# version. #
|
17
|
+
# #
|
18
|
+
# hen is distributed in the hope that it will be useful, but WITHOUT ANY #
|
19
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
20
|
+
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more #
|
21
|
+
# details. #
|
22
|
+
# #
|
23
|
+
# You should have received a copy of the GNU General Public License along #
|
24
|
+
# with hen. If not, see <http://www.gnu.org/licenses/>. #
|
25
|
+
# #
|
26
|
+
###############################################################################
|
27
|
+
#++
|
28
|
+
|
29
|
+
require 'yaml'
|
30
|
+
require 'forwardable'
|
31
|
+
|
32
|
+
require 'rubygems'
|
33
|
+
require 'rake'
|
34
|
+
require 'nuggets/env/user_home'
|
35
|
+
require 'nuggets/proc/bind'
|
36
|
+
|
37
|
+
require 'hen/dsl'
|
38
|
+
require 'hen/version'
|
39
|
+
|
40
|
+
class Hen
|
41
|
+
|
42
|
+
# The directories which contain the hen files
|
43
|
+
HENDIRS = [File.join(File.dirname(__FILE__), 'hens')] +
|
44
|
+
(ENV['HENPATH'] || '').split(File::PATH_SEPARATOR)
|
45
|
+
|
46
|
+
# All hens found, mapped by their name
|
47
|
+
HENS = Dir[*HENDIRS.map { |d| "#{d}/*.rake" }].uniq.inject(
|
48
|
+
Hash.new { |h, k| h[k] = [] }
|
49
|
+
) { |hash, hen|
|
50
|
+
hash[File.basename(hen, '.rake')] << hen; hash
|
51
|
+
}
|
52
|
+
|
53
|
+
# Directories to search for .henrc
|
54
|
+
RCDIRS = ['.', ENV.user_home]
|
55
|
+
|
56
|
+
# A container for all loaded hens
|
57
|
+
@hens = {}
|
58
|
+
|
59
|
+
# The verbosity concerning errors and warnings
|
60
|
+
@verbose = true
|
61
|
+
|
62
|
+
class << self
|
63
|
+
|
64
|
+
attr_reader :hens, :verbose
|
65
|
+
|
66
|
+
# call-seq:
|
67
|
+
# lay!
|
68
|
+
# lay!(:some_hen, :some_other_hen)
|
69
|
+
# lay!(:exclude => [:some_hen, :some_other_hen])
|
70
|
+
#
|
71
|
+
# Loads the hens, causing them to lay their eggs^H^H^Htasks. Either all,
|
72
|
+
# if no restrictions are specified, or the given hens, or all but those
|
73
|
+
# given in the <tt>:exclude</tt> option.
|
74
|
+
def lay!(*args)
|
75
|
+
# Extract potential options hash
|
76
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
77
|
+
|
78
|
+
@verbose = options[:verbose] if options.has_key?(:verbose)
|
79
|
+
|
80
|
+
if block_given?
|
81
|
+
yield.each { |key, value|
|
82
|
+
config[key].update(value)
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
# Handle include/exclude requirements
|
87
|
+
excl = options[:exclude]
|
88
|
+
args, default = args.empty? ? [excl ? [*excl] : [], true] : [args, false]
|
89
|
+
|
90
|
+
inclexcl = Hash.new(default)
|
91
|
+
args.each { |arg|
|
92
|
+
inclexcl[arg.to_s] = !default
|
93
|
+
}
|
94
|
+
|
95
|
+
# Load all available hens (as far as the
|
96
|
+
# include/exclude conditions are met)
|
97
|
+
load_hens { |hen|
|
98
|
+
inclexcl[hen]
|
99
|
+
}
|
100
|
+
|
101
|
+
# Execute each hen definition
|
102
|
+
hens.each { |name, hen|
|
103
|
+
# Load any dependencies, in case they're not included yet
|
104
|
+
begin
|
105
|
+
load_hens(*hen.dependencies)
|
106
|
+
rescue LoadError => err
|
107
|
+
warn "#{name}: Required dependency missing: " <<
|
108
|
+
File.basename(err.to_s, '.rake') if verbose
|
109
|
+
next
|
110
|
+
end
|
111
|
+
|
112
|
+
hen.lay!
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
# call-seq:
|
117
|
+
# add_hen(hen, overwrite = false)
|
118
|
+
#
|
119
|
+
# Adds +hen+ to the global container. Overwrites
|
120
|
+
# an existing hen only if +overwrite+ is true.
|
121
|
+
def add_hen(hen, overwrite = false)
|
122
|
+
if overwrite
|
123
|
+
@hens[hen.name] = hen
|
124
|
+
else
|
125
|
+
@hens[hen.name] ||= hen
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# call-seq:
|
130
|
+
# Hen[hen] => aHen
|
131
|
+
#
|
132
|
+
# Get hen by name.
|
133
|
+
def [](hen)
|
134
|
+
@hens[hen]
|
135
|
+
end
|
136
|
+
|
137
|
+
# call-seq:
|
138
|
+
# henrc => aString
|
139
|
+
#
|
140
|
+
# The path to the user's .henrc
|
141
|
+
def henrc(location_only = false)
|
142
|
+
@henrc ||= find_henrc(location_only)
|
143
|
+
end
|
144
|
+
|
145
|
+
# call-seq:
|
146
|
+
# config => aHash
|
147
|
+
# config(key) => aValue
|
148
|
+
#
|
149
|
+
# The configuration resulting from the user's .henrc. Takes optional
|
150
|
+
# +key+ argument as "path" into the config hash, returning the thusly
|
151
|
+
# retrieved value.
|
152
|
+
#
|
153
|
+
# Example:
|
154
|
+
# config('a/b/c') #=> @config[:a][:b][:c]
|
155
|
+
def config(key = nil)
|
156
|
+
@config ||= YAML.load_file(henrc)
|
157
|
+
return @config unless key
|
158
|
+
|
159
|
+
key.split('/').inject(@config) { |value, k|
|
160
|
+
value.fetch(k.to_sym)
|
161
|
+
}
|
162
|
+
rescue IndexError, NoMethodError
|
163
|
+
end
|
164
|
+
|
165
|
+
private
|
166
|
+
|
167
|
+
# call-seq:
|
168
|
+
# find_henrc(location_only = false) => aString
|
169
|
+
#
|
170
|
+
# Search for a readable .henrc, or, if +location_only+ is true, just return
|
171
|
+
# a suitable default location.
|
172
|
+
def find_henrc(location_only = false)
|
173
|
+
return ENV['HENRC'] || File.join(RCDIRS.last, '.henrc') if location_only
|
174
|
+
|
175
|
+
if henrc = ENV['HENRC']
|
176
|
+
abort "The specified .henrc file could not be found: #{henrc}" \
|
177
|
+
unless File.readable?(henrc)
|
178
|
+
elsif henrc = RCDIRS.find { |dir|
|
179
|
+
h = File.join(dir, '.henrc')
|
180
|
+
break h if File.readable?(h)
|
181
|
+
}
|
182
|
+
else
|
183
|
+
abort "No .henrc file could be found! Please " <<
|
184
|
+
"create one first by running 'hen config'."
|
185
|
+
end
|
186
|
+
|
187
|
+
henrc
|
188
|
+
end
|
189
|
+
|
190
|
+
# call-seq:
|
191
|
+
# load_hens(*hens)
|
192
|
+
# load_hens(*hens) { |hen_name| ... }
|
193
|
+
#
|
194
|
+
# Actually loads the hen files for +hens+, or all available if none are
|
195
|
+
# specified. If a block is given, only those hen files are loaded for
|
196
|
+
# which the block evaluates to true.
|
197
|
+
def load_hens(*hens, &block)
|
198
|
+
# By default, include all
|
199
|
+
block ||= lambda { |_| true }
|
200
|
+
|
201
|
+
(hens.empty? ? HENS.keys : hens).each { |hen|
|
202
|
+
hen = hen.to_s
|
203
|
+
next unless block[hen]
|
204
|
+
|
205
|
+
HENS[hen].each { |h| load h }
|
206
|
+
}
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
210
|
+
|
211
|
+
extend Forwardable
|
212
|
+
|
213
|
+
# Forward to the class
|
214
|
+
def_delegators self, :verbose
|
215
|
+
|
216
|
+
attr_reader :name, :dependencies, :block
|
217
|
+
|
218
|
+
# call-seq:
|
219
|
+
# new(args, overwrite = false) { ... }
|
220
|
+
#
|
221
|
+
# Creates a new Hen instance of a certain name and optional
|
222
|
+
# dependencies; see #resolve_args for details on the +args+
|
223
|
+
# argument. Requires a definition block; see #lay! for details.
|
224
|
+
#
|
225
|
+
# Adds itself to the global hen container via add_hen.
|
226
|
+
def initialize(args, overwrite = false, &block)
|
227
|
+
@name, @dependencies = resolve_args(args)
|
228
|
+
|
229
|
+
unless @block = block
|
230
|
+
raise LocalJumpError, "#{@name}: no block given" if verbose
|
231
|
+
return
|
232
|
+
end
|
233
|
+
|
234
|
+
self.class.add_hen(self, overwrite)
|
235
|
+
end
|
236
|
+
|
237
|
+
# call-seq:
|
238
|
+
# hen.lay!
|
239
|
+
#
|
240
|
+
# Runs the definition block, exposing helper methods from the DSL.
|
241
|
+
def lay!
|
242
|
+
return if laid?
|
243
|
+
|
244
|
+
# Call dependencies first
|
245
|
+
dependencies.each { |hen|
|
246
|
+
self.class[hen].lay!
|
247
|
+
}
|
248
|
+
|
249
|
+
block.bind(DSL).call
|
250
|
+
rescue => err
|
251
|
+
warn "#{name}: #{err} (#{err.class})" if verbose
|
252
|
+
end
|
253
|
+
|
254
|
+
private
|
255
|
+
|
256
|
+
# call-seq:
|
257
|
+
# resolve_args(args) => [name, dependencies]
|
258
|
+
#
|
259
|
+
# Splits into hen name and optional dependencies: +args+ may be a single
|
260
|
+
# symbol (or string), or a hash with a single key pointing to a list of
|
261
|
+
# hens this one depends upon.
|
262
|
+
def resolve_args(args)
|
263
|
+
name, dependencies = case args
|
264
|
+
when Hash
|
265
|
+
raise ArgumentError, "Too many hen names: #{args.keys.join(' ')}" \
|
266
|
+
if args.size > 1
|
267
|
+
raise ArgumentError, 'No hen name given' \
|
268
|
+
if args.size < 1
|
269
|
+
|
270
|
+
[args.keys.first, [*args.values.first]]
|
271
|
+
else
|
272
|
+
[args, []]
|
273
|
+
end
|
274
|
+
|
275
|
+
[name.to_sym, dependencies.map { |d| d.to_sym }]
|
276
|
+
end
|
277
|
+
|
278
|
+
# call-seq:
|
279
|
+
# laid? => true or false
|
280
|
+
#
|
281
|
+
# Keeps track of whether the block has already been executed.
|
282
|
+
def laid?
|
283
|
+
return @laid if @laid
|
284
|
+
|
285
|
+
@laid = true
|
286
|
+
false
|
287
|
+
end
|
288
|
+
|
289
|
+
end
|
290
|
+
|
291
|
+
# call-seq:
|
292
|
+
# Hen(args) { ... }
|
293
|
+
#
|
294
|
+
# Just forwards to Hen.new.
|
295
|
+
def Hen(args, &block)
|
296
|
+
Hen.new(args, &block)
|
297
|
+
end
|
298
|
+
|
299
|
+
# call-seq:
|
300
|
+
# Hen!(args) { ... }
|
301
|
+
#
|
302
|
+
# Same as above, but overwrites any existing hen with the same name.
|
303
|
+
def Hen!(args, &block)
|
304
|
+
Hen.new(args, true, &block)
|
305
|
+
end
|
data/lib/hens/gem.rake
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
Hen :gem => :rdoc do
|
2
|
+
# Dependencies:
|
3
|
+
# * rdoc -- Uses RDOC_OPTIONS and 'publish_docs' task
|
4
|
+
|
5
|
+
require 'rake/gempackagetask'
|
6
|
+
|
7
|
+
gem_options = config[:gem]
|
8
|
+
rf_config = config[:rubyforge]
|
9
|
+
|
10
|
+
if Object.const_defined?(:RDOC_OPTIONS)
|
11
|
+
gem_options[:rdoc_options] ||= RDOC_OPTIONS[:options]
|
12
|
+
rdoc_files = RDOC_OPTIONS[:rdoc_files]
|
13
|
+
end
|
14
|
+
|
15
|
+
gem_spec = Gem::Specification.new { |spec|
|
16
|
+
|
17
|
+
### name
|
18
|
+
|
19
|
+
gem_options[:name] ||= rf_config[:package]
|
20
|
+
|
21
|
+
abort 'Gem name missing' unless gem_options[:name]
|
22
|
+
|
23
|
+
### version
|
24
|
+
|
25
|
+
abort 'Gem version missing' unless gem_options[:version]
|
26
|
+
|
27
|
+
if gem_options.delete(:append_svnversion) && svnversion = `svnversion`[/\d+/]
|
28
|
+
gem_options[:version] << '.' << svnversion
|
29
|
+
end
|
30
|
+
|
31
|
+
### author(s)
|
32
|
+
|
33
|
+
if author = gem_options.delete(:author)
|
34
|
+
gem_options[:authors] ||= [author]
|
35
|
+
end
|
36
|
+
|
37
|
+
### description
|
38
|
+
|
39
|
+
gem_options[:description] ||= gem_options[:summary]
|
40
|
+
|
41
|
+
### rubyforge project, homepage
|
42
|
+
|
43
|
+
gem_options[:rubyforge_project] ||= rf_config[:project]
|
44
|
+
|
45
|
+
if rf_project = gem_options[:rubyforge_project]
|
46
|
+
rdoc_dir = rf_config[:rdoc_dir] == :package ?
|
47
|
+
rf_config[:package] || gem_options[:name] : RDOC_OPTIONS[:rdoc_dir]
|
48
|
+
|
49
|
+
gem_options[:homepage] ||= "#{rf_project}.rubyforge.org/#{rdoc_dir}"
|
50
|
+
end
|
51
|
+
|
52
|
+
if gem_options[:homepage] && gem_options[:homepage] !~ %r{://}
|
53
|
+
gem_options[:homepage] = 'http://' << gem_options[:homepage]
|
54
|
+
end
|
55
|
+
|
56
|
+
### extra_rdoc_files, files, executables, bindir
|
57
|
+
|
58
|
+
gem_options[:files] ||= []
|
59
|
+
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
|
+
|
64
|
+
[:extra_rdoc_files, :files, :executables].each { |files|
|
65
|
+
gem_options[files].delete_if { |file| !File.exists?(file) }
|
66
|
+
}
|
67
|
+
|
68
|
+
unless gem_options[:executables].empty?
|
69
|
+
gem_options[:bindir] ||= File.dirname(gem_options[:executables].first)
|
70
|
+
gem_options[:executables].map! { |executable| File.basename(executable) }
|
71
|
+
end
|
72
|
+
|
73
|
+
### dependencies
|
74
|
+
|
75
|
+
(gem_options.delete(:dependencies) || []).each { |dependency|
|
76
|
+
spec.add_dependency(*dependency)
|
77
|
+
}
|
78
|
+
|
79
|
+
### => set options!
|
80
|
+
|
81
|
+
gem_options.each { |option, value|
|
82
|
+
spec.send("#{option}=", value)
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
desc 'Display the gem specification'
|
87
|
+
task :gemspec do
|
88
|
+
puts gem_spec.to_ruby
|
89
|
+
end
|
90
|
+
|
91
|
+
desc "Update (or create) the project's gemspec file"
|
92
|
+
task 'gemspec:update' do
|
93
|
+
file = "#{gem_spec.name}.gemspec"
|
94
|
+
action = File.exists?(file) ? 'Updated' : 'Created'
|
95
|
+
|
96
|
+
File.open(file, 'w') { |f| f.puts gem_spec.to_ruby }
|
97
|
+
|
98
|
+
puts "#{action} #{file}"
|
99
|
+
end
|
100
|
+
|
101
|
+
pkg_task = Rake::GemPackageTask.new(gem_spec) do |pkg|
|
102
|
+
pkg.need_tar_gz = true
|
103
|
+
pkg.need_zip = true
|
104
|
+
end
|
105
|
+
|
106
|
+
rubyforge do |rf_config, rf_pool|
|
107
|
+
|
108
|
+
desc 'Package and upload the release to Rubyforge'
|
109
|
+
task :release => [:package, :publish_docs] do
|
110
|
+
files = Dir[File.join('pkg', "#{pkg_task.package_name}.*")]
|
111
|
+
abort 'Nothing to release!' if files.empty?
|
112
|
+
|
113
|
+
# shorten to (at most) three digits
|
114
|
+
version = pkg_task.version.to_s.split(/([.])/)[0..4].join
|
115
|
+
|
116
|
+
rf = rf_pool.call
|
117
|
+
|
118
|
+
# TODO: Add release notes and changes.
|
119
|
+
#uc = rf.userconfig
|
120
|
+
#uc['release_notes'] = description if description
|
121
|
+
#uc['release_changes'] = changes if changes
|
122
|
+
#uc['preformatted'] = true
|
123
|
+
|
124
|
+
rf.add_release rf_config[:project], pkg_task.name, version, *files
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
data/lib/hens/rdoc.rake
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
Hen :rdoc do
|
2
|
+
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
rdoc_options = config[:rdoc]
|
6
|
+
|
7
|
+
if rf_package = config[:rubyforge][:package]
|
8
|
+
rdoc_options[:title] ||= "#{rf_package} Application documentation"
|
9
|
+
end
|
10
|
+
|
11
|
+
### rdoc_dir
|
12
|
+
|
13
|
+
rdoc_dir = rdoc_options.delete(:rdoc_dir)
|
14
|
+
|
15
|
+
### rdoc_files
|
16
|
+
|
17
|
+
rdoc_files = FileList[rdoc_options.delete(:rdoc_files)].
|
18
|
+
sort.uniq.select { |file| File.exists?(file) }
|
19
|
+
|
20
|
+
### rdoc_options
|
21
|
+
|
22
|
+
rdoc_options.delete(:main) unless rdoc_files.include?(rdoc_options[:main])
|
23
|
+
|
24
|
+
rdoc_options = rdoc_options.map { |option, value|
|
25
|
+
option = '--' << option.to_s.tr('_', '-')
|
26
|
+
value.is_a?(String) ? [option, value] : value ? option : nil
|
27
|
+
}.compact.flatten
|
28
|
+
|
29
|
+
# Make settings available to other hens
|
30
|
+
RDOC_OPTIONS = {
|
31
|
+
:rdoc_dir => rdoc_dir,
|
32
|
+
:rdoc_files => rdoc_files,
|
33
|
+
:options => rdoc_options
|
34
|
+
}
|
35
|
+
|
36
|
+
unless rdoc_files.empty?
|
37
|
+
rdoc_task = Rake::RDocTask.new(:doc) { |rdoc|
|
38
|
+
rdoc.rdoc_dir = rdoc_dir
|
39
|
+
rdoc.rdoc_files = rdoc_files
|
40
|
+
rdoc.options = rdoc_options
|
41
|
+
}
|
42
|
+
else
|
43
|
+
task :doc do
|
44
|
+
warn 'No files to generate documentation for!'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
rubyforge do |rf_config|
|
49
|
+
|
50
|
+
desc 'Publish RDoc to Rubyforge'
|
51
|
+
task :publish_docs => :doc do
|
52
|
+
rf_project = rf_config[:project]
|
53
|
+
abort 'Rubyforge project name missing' unless rf_project
|
54
|
+
|
55
|
+
rf_user = rf_config[:username]
|
56
|
+
abort 'Rubyforge user name missing' unless rf_user
|
57
|
+
|
58
|
+
rf_host = "#{rf_user}@rubyforge.org"
|
59
|
+
|
60
|
+
local_dir = rdoc_task.rdoc_dir
|
61
|
+
remote_dir = "/var/www/gforge-projects/#{rf_project}"
|
62
|
+
|
63
|
+
if rdoc_dir = rf_config[:rdoc_dir]
|
64
|
+
if rf_package = rf_config[:package]
|
65
|
+
rdoc_dir = rf_package if rdoc_dir == :package
|
66
|
+
end
|
67
|
+
|
68
|
+
remote_dir = File.join(remote_dir, rdoc_dir)
|
69
|
+
end
|
70
|
+
|
71
|
+
execute(
|
72
|
+
"rsync -av --delete #{local_dir}/ #{rf_host}:#{remote_dir}/",
|
73
|
+
"scp -r #{local_dir}/ #{rf_host}:#{remote_dir}/"
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/lib/hens/spec.rake
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
Hen :spec do
|
2
|
+
|
3
|
+
require 'spec/rake/spectask'
|
4
|
+
|
5
|
+
spec_options = config[:spec]
|
6
|
+
|
7
|
+
spec_files = spec_options.delete(:files) || FileList[spec_options.delete(:pattern)]
|
8
|
+
|
9
|
+
if spec_files && !spec_files.empty?
|
10
|
+
if spec_helper = spec_options.delete(:helper) and File.readable?(spec_helper)
|
11
|
+
spec_files.delete(spec_helper)
|
12
|
+
spec_files.unshift(spec_helper)
|
13
|
+
end
|
14
|
+
|
15
|
+
spec_opts = spec_options.map { |option, value|
|
16
|
+
option = '--' << option.to_s.tr('_', '-')
|
17
|
+
value.is_a?(String) ? [option, value] : value ? option : nil
|
18
|
+
}.compact.flatten
|
19
|
+
|
20
|
+
spec_task = lambda { |t|
|
21
|
+
t.spec_files = spec_files
|
22
|
+
t.spec_opts = spec_opts
|
23
|
+
}
|
24
|
+
|
25
|
+
Spec::Rake::SpecTask.new(&spec_task)
|
26
|
+
|
27
|
+
#desc "Run specs with RCov"
|
28
|
+
Spec::Rake::SpecTask.new('spec:rcov') do |t|
|
29
|
+
spec_task[t]
|
30
|
+
|
31
|
+
t.rcov = true
|
32
|
+
t.rcov_opts = ['--exclude', spec_files.join(',')]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/lib/hens/test.rake
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Hen :test do
|
2
|
+
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
test_options = config[:test]
|
6
|
+
|
7
|
+
test_files = test_options.delete(:files) || FileList[test_options.delete(:pattern)]
|
8
|
+
|
9
|
+
if test_files && !test_files.empty?
|
10
|
+
Rake::TestTask.new { |t|
|
11
|
+
t.test_files = test_files
|
12
|
+
|
13
|
+
test_options.each { |option, value|
|
14
|
+
t.send("#{option}=", value)
|
15
|
+
}
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: blackwinter-hen
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jens Wille
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-01-22 00:00:00 -08:00
|
13
|
+
default_executable: hen
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rubyforge
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: ruby-nuggets
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 0.3.3
|
32
|
+
version:
|
33
|
+
description: Hoe or Echoe? No, thanks! Just a Rake helper that fits my own personal style.
|
34
|
+
email: jens.wille@uni-koeln.de
|
35
|
+
executables:
|
36
|
+
- hen
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files:
|
40
|
+
- COPYING
|
41
|
+
- ChangeLog
|
42
|
+
- README
|
43
|
+
files:
|
44
|
+
- lib/hen.rb
|
45
|
+
- lib/hen/cli.rb
|
46
|
+
- lib/hen/dsl.rb
|
47
|
+
- lib/hen/version.rb
|
48
|
+
- bin/hen
|
49
|
+
- Rakefile
|
50
|
+
- COPYING
|
51
|
+
- ChangeLog
|
52
|
+
- README
|
53
|
+
- lib/hens/rdoc.rake
|
54
|
+
- lib/hens/gem.rake
|
55
|
+
- lib/hens/test.rake
|
56
|
+
- lib/hens/spec.rake
|
57
|
+
- example/hens
|
58
|
+
- example/hens/sample.rake
|
59
|
+
- example/project
|
60
|
+
- example/project/Rakefile
|
61
|
+
- example/project/COPYING
|
62
|
+
- example/project/ChangeLog
|
63
|
+
- example/project/lib
|
64
|
+
- example/project/lib/__progname__
|
65
|
+
- example/project/lib/__progname__/version.rb
|
66
|
+
- example/project/lib/__progname__.rb
|
67
|
+
- example/project/README
|
68
|
+
- example/.henrc
|
69
|
+
has_rdoc: true
|
70
|
+
homepage: http://prometheus.rubyforge.org/hen
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options:
|
73
|
+
- --inline-source
|
74
|
+
- --title
|
75
|
+
- hen Application documentation
|
76
|
+
- --charset
|
77
|
+
- UTF-8
|
78
|
+
- --main
|
79
|
+
- README
|
80
|
+
- --all
|
81
|
+
- --line-numbers
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: "0"
|
89
|
+
version:
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: "0"
|
95
|
+
version:
|
96
|
+
requirements: []
|
97
|
+
|
98
|
+
rubyforge_project: prometheus
|
99
|
+
rubygems_version: 1.2.0
|
100
|
+
signing_key:
|
101
|
+
specification_version: 2
|
102
|
+
summary: Hoe or Echoe? No, thanks! Just a Rake helper that fits my own personal style.
|
103
|
+
test_files: []
|
104
|
+
|