bee 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/bin/bee +1 -1
- data/bin/bee.bat +1 -1
- data/egg/package.yml +100 -0
- data/egg/package/bee_task.erb +25 -0
- data/egg/package/build.erb +70 -0
- data/egg/package/egg.yml +58 -0
- data/egg/package/egg_build.erb +57 -0
- data/egg/package/egg_launcher.erb +6 -0
- data/egg/package/egg_script.rb +31 -0
- data/egg/package/gem_spec.erb +23 -0
- data/egg/package/license +202 -0
- data/egg/package/readme.erb +23 -0
- data/egg/package/test.erb +28 -0
- data/egg/package/test_build.erb +16 -0
- data/{test → egg/package}/test_build.rb +1 -1
- data/{test → egg/package}/test_build_listener.rb +3 -1
- data/{test/ts_bee.rb → egg/package/test_suite.rb} +1 -1
- data/lib/bee.rb +468 -167
- data/lib/bee_console.rb +174 -94
- data/lib/bee_task.rb +121 -19
- data/lib/bee_task_default.rb +1016 -229
- data/lib/bee_util.rb +217 -64
- metadata +73 -58
- data/test/tc_bee_build.rb +0 -216
- data/test/tc_bee_console.rb +0 -106
- data/test/tc_bee_console_formatter.rb +0 -81
- data/test/tc_bee_context.rb +0 -84
- data/test/tc_bee_task_default.rb +0 -467
- data/test/tc_bee_util.rb +0 -85
- data/test/tmp_test_case.rb +0 -58
data/lib/bee_console.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2006-
|
1
|
+
# Copyright 2006-2008 Michel Casabianca <michel.casabianca@gmail.com>
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -16,6 +16,7 @@ require 'bee'
|
|
16
16
|
require 'bee_task'
|
17
17
|
require 'bee_util'
|
18
18
|
require 'getoptlong'
|
19
|
+
require 'yaml'
|
19
20
|
|
20
21
|
# Module for Bee stuff.
|
21
22
|
module Bee
|
@@ -24,17 +25,22 @@ module Bee
|
|
24
25
|
|
25
26
|
# Command line help.
|
26
27
|
HELP = 'Usage: bee [options] [targets]
|
27
|
-
-
|
28
|
-
-
|
29
|
-
-
|
30
|
-
|
31
|
-
-
|
32
|
-
|
33
|
-
-
|
34
|
-
|
35
|
-
-
|
36
|
-
-
|
37
|
-
|
28
|
+
-V Print version and exit.
|
29
|
+
-h Print help about usage and exit.
|
30
|
+
-b Print help about build and exit.
|
31
|
+
-n Don\'t actually run any commands; just print them.
|
32
|
+
-k task Print help about tasks in a package (writing "foo.?") or a
|
33
|
+
given one (writing "foo.bar") and exit.
|
34
|
+
-e egg Print help about templates in a given package (writing
|
35
|
+
"foo.?") or a given one (writing "foo.bar") and exit.
|
36
|
+
-p name=value Set a named property with a given value.
|
37
|
+
-t egg Run a given egg to generate a template project.
|
38
|
+
-v Enable verbose mode.
|
39
|
+
-s style Define style for output (see documentation).
|
40
|
+
-f file Build file to run (defaults to "build.yml").
|
41
|
+
-r Look for build file recursively up in file system.
|
42
|
+
-l Print bee logo on console.
|
43
|
+
targets Targets to run (default target if omitted).'
|
38
44
|
# Name for default build file.
|
39
45
|
DEFAULT_BUILD_FILE = 'build.yml'
|
40
46
|
# Exit value on error parsing command line
|
@@ -45,36 +51,55 @@ targets Targets to run (default target if omitted).'
|
|
45
51
|
EXIT_UNKNOWN_ERROR = 3
|
46
52
|
# Bee options environment variable.
|
47
53
|
BEE_OPT_ENV = 'BEEOPT'
|
48
|
-
#
|
49
|
-
|
54
|
+
# Bee text logo (generated with http://www.network-science.de/ascii/)
|
55
|
+
BEE_LOGO = <<'EOF'
|
56
|
+
_
|
57
|
+
| |__ ___ ___
|
58
|
+
_____ | '_ \ / _ \/ _ \ _____ _____ _____ _____ _____ _____ _____ _____
|
59
|
+
|_____| | |_) | __/ __/ |_____|_____|_____|_____|_____|_____|_____|_____|
|
60
|
+
|_.__/ \___|\___| 0.5.0 http://bee.rubyforge.org
|
61
|
+
|
62
|
+
EOF
|
50
63
|
|
51
64
|
# Parse command line and return parsed arguments.
|
52
65
|
def self.parse_command_line
|
66
|
+
version = false
|
53
67
|
help = false
|
54
68
|
help_build = false
|
55
69
|
help_task = false
|
70
|
+
help_template = false
|
71
|
+
properties = {}
|
56
72
|
task = nil
|
57
|
-
|
73
|
+
dry_run = false
|
74
|
+
template = nil
|
58
75
|
verbose = false
|
59
76
|
style = nil
|
60
77
|
file = DEFAULT_BUILD_FILE
|
61
78
|
recursive = false
|
79
|
+
logo = false
|
62
80
|
targets = []
|
63
81
|
# read options in BEEOPT environment variable
|
64
82
|
options = ENV[BEE_OPT_ENV]
|
65
83
|
options.split(' ').reverse.each { |option| ARGV.unshift(option) } if
|
66
84
|
options
|
67
85
|
# parse command line arguments
|
68
|
-
opts = GetoptLong.new(['--
|
86
|
+
opts = GetoptLong.new(['--version', '-V', GetoptLong::NO_ARGUMENT],
|
87
|
+
['--help', '-h', GetoptLong::NO_ARGUMENT],
|
69
88
|
['--help-build', '-b', GetoptLong::NO_ARGUMENT],
|
70
89
|
['--help-task','-k', GetoptLong::REQUIRED_ARGUMENT],
|
71
|
-
['--template',
|
90
|
+
['--help-template','-e', GetoptLong::REQUIRED_ARGUMENT],
|
91
|
+
['--dry-run', '-n', GetoptLong::NO_ARGUMENT],
|
92
|
+
['--property', '-p', GetoptLong::REQUIRED_ARGUMENT],
|
93
|
+
['--template', '-t', GetoptLong::REQUIRED_ARGUMENT],
|
72
94
|
['--verbose', '-v', GetoptLong::NO_ARGUMENT],
|
73
95
|
['--style', '-s', GetoptLong::REQUIRED_ARGUMENT],
|
74
96
|
['--file', '-f', GetoptLong::REQUIRED_ARGUMENT],
|
75
|
-
['--recursive', '-r', GetoptLong::NO_ARGUMENT]
|
97
|
+
['--recursive', '-r', GetoptLong::NO_ARGUMENT],
|
98
|
+
['--logo', '-l', GetoptLong::NO_ARGUMENT])
|
76
99
|
opts.each do |opt, arg|
|
77
100
|
case opt
|
101
|
+
when '--version'
|
102
|
+
version = true
|
78
103
|
when '--help'
|
79
104
|
help = true
|
80
105
|
when '--help-build'
|
@@ -82,8 +107,17 @@ targets Targets to run (default target if omitted).'
|
|
82
107
|
when '--help-task'
|
83
108
|
help_task = true
|
84
109
|
task = arg
|
110
|
+
when '--help-template'
|
111
|
+
help_template = true
|
112
|
+
template = arg
|
113
|
+
when '--dry-run'
|
114
|
+
dry_run = true
|
115
|
+
verbose = true
|
116
|
+
when '--property'
|
117
|
+
name, value = parse_property(arg)
|
118
|
+
properties[name] = value
|
85
119
|
when '--template'
|
86
|
-
template =
|
120
|
+
template = arg
|
87
121
|
when '--verbose'
|
88
122
|
verbose = true
|
89
123
|
when '--style'
|
@@ -92,48 +126,69 @@ targets Targets to run (default target if omitted).'
|
|
92
126
|
file = arg
|
93
127
|
when '--recursive'
|
94
128
|
recursive = true
|
129
|
+
when '--logo'
|
130
|
+
logo = true
|
95
131
|
end
|
96
132
|
end
|
97
|
-
targets = ARGV
|
98
|
-
return [help, help_build, help_task,
|
99
|
-
file, recursive,
|
133
|
+
targets = Array.new(ARGV)
|
134
|
+
return [version, help, help_build, help_task, help_template, task,
|
135
|
+
properties, dry_run, template, verbose, style, file, recursive,
|
136
|
+
logo, targets]
|
137
|
+
end
|
138
|
+
|
139
|
+
# Parse a command line property.
|
140
|
+
# - property: property definition as "name=value".
|
141
|
+
# Return: name and value of the property.
|
142
|
+
def self.parse_property(property)
|
143
|
+
begin
|
144
|
+
index = property.index('=')
|
145
|
+
raise "No = sign" if not index
|
146
|
+
name = property[0..index-1]
|
147
|
+
value = YAML::load(property[index+1..-1])
|
148
|
+
return name, value
|
149
|
+
rescue
|
150
|
+
raise "Error parsing property '#{property}': #{$!}"
|
151
|
+
end
|
100
152
|
end
|
101
153
|
|
102
154
|
# Start build from command line.
|
103
155
|
def self.start_command_line
|
104
156
|
STDOUT.sync = true
|
105
157
|
begin
|
106
|
-
help, help_build, help_task,
|
107
|
-
|
158
|
+
version, help, help_build, help_task, help_template, task,
|
159
|
+
properties, dry_run, template, verbose, style, file, recursive,
|
160
|
+
logo, targets = parse_command_line
|
108
161
|
rescue
|
109
162
|
puts "ERROR: parsing command line (type 'bee -h' for help)"
|
110
163
|
exit(EXIT_PARSING_CMDLINE)
|
111
164
|
end
|
112
165
|
formatter = Formatter.new(style)
|
113
166
|
begin
|
114
|
-
if
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
167
|
+
if logo
|
168
|
+
puts BEE_LOGO
|
169
|
+
end
|
170
|
+
if version
|
171
|
+
copyright = Bee::Util::copyright
|
172
|
+
puts copyright if copyright
|
173
|
+
elsif help
|
121
174
|
puts HELP
|
122
175
|
elsif help_build
|
123
|
-
build = Build.load(file, recursive)
|
176
|
+
build = Build.load(file, recursive, properties)
|
177
|
+
build.evaluate_properties
|
124
178
|
puts formatter.help_build(build)
|
125
179
|
elsif help_task
|
126
180
|
puts formatter.help_task(task)
|
181
|
+
elsif help_template
|
182
|
+
puts formatter.help_template(template)
|
127
183
|
elsif template
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
puts formatter.format_success("OK")
|
184
|
+
file = Bee::Util::find_template(template)
|
185
|
+
listener = Listener.new(formatter, verbose)
|
186
|
+
build = Build.load(file, false, properties)
|
187
|
+
build.run(targets, listener, dry_run)
|
133
188
|
else
|
134
189
|
listener = Listener.new(formatter, verbose)
|
135
|
-
build = Build.load(file, recursive)
|
136
|
-
build.run(targets, listener)
|
190
|
+
build = Build.load(file, recursive, properties)
|
191
|
+
build.run(targets, listener, dry_run)
|
137
192
|
end
|
138
193
|
rescue Bee::Util::BuildError => e
|
139
194
|
puts "#{formatter.format_error('ERROR')}: #{$!}"
|
@@ -192,8 +247,6 @@ targets Targets to run (default target if omitted).'
|
|
192
247
|
DEFAULT_STYLE = {
|
193
248
|
:line_character => '-'
|
194
249
|
}
|
195
|
-
# Default line length.
|
196
|
-
DEFAULT_LINE_LENGTH = 80
|
197
250
|
# Short style keys for command line
|
198
251
|
SHORT_STYLE_KEYS = {
|
199
252
|
'lc' => 'line_character',
|
@@ -279,7 +332,10 @@ targets Targets to run (default target if omitted).'
|
|
279
332
|
help = ''
|
280
333
|
# print build name and description
|
281
334
|
if build.name
|
282
|
-
help << "- Build: #{build.name
|
335
|
+
help << "- Build: #{build.name}\n"
|
336
|
+
end
|
337
|
+
if build.extends
|
338
|
+
help << " Extends: #{build.extends}\n"
|
283
339
|
end
|
284
340
|
if build.description
|
285
341
|
help << format_description('Description', build.description, 2, false)
|
@@ -293,28 +349,63 @@ targets Targets to run (default target if omitted).'
|
|
293
349
|
end
|
294
350
|
end
|
295
351
|
# print build targets
|
296
|
-
|
352
|
+
description = build.targets.description
|
353
|
+
if description.length > 0
|
297
354
|
help << "- Targets:\n"
|
298
|
-
for
|
299
|
-
help << format_description(
|
355
|
+
for name in description.keys.sort
|
356
|
+
help << format_description(name, description[name], 2)
|
300
357
|
end
|
301
358
|
end
|
302
359
|
# print default target
|
303
|
-
help << "- Default: #{build.default}"
|
360
|
+
help << "- Default: #{build.default}\n"
|
304
361
|
return help.strip
|
305
362
|
end
|
306
363
|
|
307
364
|
# Return help about task(s).
|
308
365
|
# - task: task to print help about (all tasks if nil).
|
309
366
|
def help_task(task)
|
310
|
-
task = '
|
367
|
+
task = '?' if task == nil or task.length == 0
|
311
368
|
package_manager = Bee::Task::PackageManager.new(nil)
|
312
369
|
methods = package_manager.help_task(task)
|
313
370
|
help = ''
|
314
|
-
for method in methods.keys
|
371
|
+
for method in methods.keys.sort
|
372
|
+
text = methods[method].strip
|
315
373
|
help << format_title(method)
|
316
374
|
help << "\n"
|
317
|
-
help <<
|
375
|
+
help << text
|
376
|
+
help << "\n"
|
377
|
+
if text =~ /Alias for \w+/
|
378
|
+
alias_method = text.scan(/Alias for (\w+)/).flatten[0]
|
379
|
+
help << "\n"
|
380
|
+
help << package_manager.help_task(alias_method)[alias_method].strip
|
381
|
+
help << "\n"
|
382
|
+
end
|
383
|
+
end
|
384
|
+
return help
|
385
|
+
end
|
386
|
+
|
387
|
+
# Return help about template(s).
|
388
|
+
# - template: template to print help about (all templates if nil).
|
389
|
+
def help_template(template)
|
390
|
+
templates = Bee::Util::search_templates(template)
|
391
|
+
help = ''
|
392
|
+
for name in templates.keys
|
393
|
+
build = YAML::load(File.read(templates[name]))
|
394
|
+
properties = nil
|
395
|
+
for entry in build
|
396
|
+
properties = entry['properties'] if entry['properties']
|
397
|
+
end
|
398
|
+
description = 'No description found'
|
399
|
+
if properties
|
400
|
+
for property in properties
|
401
|
+
if property.keys == ['description']
|
402
|
+
description = property['description']
|
403
|
+
end
|
404
|
+
end
|
405
|
+
end
|
406
|
+
help << format_title(name)
|
407
|
+
help << "\n"
|
408
|
+
help << description
|
318
409
|
help << "\n"
|
319
410
|
end
|
320
411
|
return help
|
@@ -400,15 +491,15 @@ targets Targets to run (default target if omitted).'
|
|
400
491
|
end
|
401
492
|
return string
|
402
493
|
end
|
403
|
-
|
494
|
+
|
404
495
|
# Format a title.
|
405
496
|
# - title: title to format.
|
406
497
|
def format_title(title)
|
407
|
-
length = @style[:line_length] ||
|
408
|
-
Bee::Util::term_width ||
|
409
|
-
DEFAULT_LINE_LENGTH
|
498
|
+
length = @style[:line_length] || Bee::Util::term_width
|
410
499
|
right = ' ' + @style[:line_character]*2
|
411
|
-
|
500
|
+
size = length - (title.length + 4)
|
501
|
+
size = 2 if size <= 0
|
502
|
+
left = @style[:line_character]*size + ' '
|
412
503
|
line = left + title + right
|
413
504
|
# apply style
|
414
505
|
formatted = style(line,
|
@@ -451,24 +542,15 @@ targets Targets to run (default target if omitted).'
|
|
451
542
|
|
452
543
|
# Called when build is started.
|
453
544
|
# - build: the build object.
|
454
|
-
def build_started(build)
|
545
|
+
def build_started(build, dry_run)
|
455
546
|
@start_time = Time.now
|
456
547
|
@end_time = nil
|
457
548
|
@duration = nil
|
458
549
|
@success = nil
|
459
550
|
@last_target = nil
|
460
551
|
@last_task = nil
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
# Called when build is finished.
|
465
|
-
# - build: the build object.
|
466
|
-
def build_finished(build)
|
467
|
-
@end_time = Time.now
|
468
|
-
@duration = @end_time - @start_time
|
469
|
-
@success = true
|
470
|
-
puts "Built in #{@duration} s" if @verbose
|
471
|
-
puts @formatter.format_success('OK')
|
552
|
+
build_type = dry_run ? "dry run of" : "build"
|
553
|
+
puts "Starting #{build_type} '#{build.file}'..." if @verbose
|
472
554
|
end
|
473
555
|
|
474
556
|
# Called when a target is met.
|
@@ -486,22 +568,28 @@ targets Targets to run (default target if omitted).'
|
|
486
568
|
puts @formatter.format_task(task) if @verbose
|
487
569
|
end
|
488
570
|
|
571
|
+
# Called when build is finished.
|
572
|
+
# - build: the build object.
|
573
|
+
def build_finished(build, dry_run)
|
574
|
+
duration unless dry_run
|
575
|
+
@success = true
|
576
|
+
puts @formatter.format_success('OK')
|
577
|
+
end
|
578
|
+
|
489
579
|
# Called when an error was raised.
|
490
580
|
# - exception: raised exception.
|
491
581
|
def error(exception)
|
492
|
-
|
493
|
-
@duration = @end_time - @start_time
|
582
|
+
duration
|
494
583
|
@success = false
|
495
|
-
puts "Built in #{@duration} s" if @verbose
|
496
584
|
message = ''
|
497
585
|
message << "In target '#{@last_target.name}'" if @last_target
|
498
586
|
message << ", in task:\n#{@formatter.format_task(@last_task)}\n" if
|
499
587
|
@last_task
|
500
588
|
message << ': ' if @last_target and not @last_task
|
501
589
|
message << exception.to_s
|
502
|
-
|
590
|
+
raise Bee::Util::BuildError.new(message)
|
503
591
|
end
|
504
|
-
|
592
|
+
|
505
593
|
# Print text on the console.
|
506
594
|
# - text: text to print.
|
507
595
|
def print(text)
|
@@ -514,30 +602,22 @@ targets Targets to run (default target if omitted).'
|
|
514
602
|
Kernel.puts(text)
|
515
603
|
end
|
516
604
|
|
517
|
-
|
605
|
+
# Get input string.
|
606
|
+
# Return string entered by the user.
|
607
|
+
def gets
|
608
|
+
return STDIN.gets
|
609
|
+
end
|
610
|
+
|
611
|
+
private
|
518
612
|
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
- properties:
|
528
|
-
- user: "#{ENV[\'USER\']}"
|
529
|
-
|
530
|
-
# Build targets
|
531
|
-
- target: capitalize
|
532
|
-
description: Capitalize user name
|
533
|
-
script:
|
534
|
-
- rb: "who = user.capitalize"
|
535
|
-
|
536
|
-
- target: hello
|
537
|
-
depends: capitalize
|
538
|
-
description: Print greatings.
|
539
|
-
script:
|
540
|
-
- print: "Hello #{who}!"'
|
613
|
+
# Compute build duration and print it if verbose.
|
614
|
+
def duration
|
615
|
+
@end_time = Time.now
|
616
|
+
@duration = @end_time - @start_time
|
617
|
+
puts "Built in #{@duration} s" if @verbose
|
618
|
+
end
|
619
|
+
|
620
|
+
end
|
541
621
|
|
542
622
|
end
|
543
623
|
|
data/lib/bee_task.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2006-
|
1
|
+
# Copyright 2006-2008 Michel Casabianca <michel.casabianca@gmail.com>
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -20,8 +20,10 @@ module Bee
|
|
20
20
|
# Module for bee tasks.
|
21
21
|
module Task
|
22
22
|
|
23
|
-
# Base class for task package. Provides methods to
|
24
|
-
#
|
23
|
+
# Base class for task package. Provides methods to print output using
|
24
|
+
# the build formatter and a method to check task parameters. Furthermore,
|
25
|
+
# this base class extends MethodInfoBase which provides methods
|
26
|
+
# comments, for autodocumentation purpose.
|
25
27
|
class Package < Bee::Util::MethodInfoBase
|
26
28
|
|
27
29
|
include Bee::Util::BuildErrorMixin
|
@@ -34,22 +36,116 @@ module Bee
|
|
34
36
|
|
35
37
|
protected
|
36
38
|
|
37
|
-
# Check
|
39
|
+
# Check task parameters. Raise a RuntimeError with explanation message
|
38
40
|
# if a mandatory parameter is missing or an unknown parameter was found.
|
39
41
|
# - params: task parameters as a Hash.
|
40
|
-
# - description: parameters description as a Hash
|
41
|
-
#
|
42
|
-
|
43
|
-
|
42
|
+
# - description: parameters description as a Hash with following keys:
|
43
|
+
# :mandatory telling if the parameter is mandatory (true or false),
|
44
|
+
# :type which is the class name of the parameter and
|
45
|
+
# :default for default value.
|
46
|
+
def check_parameters(params, description)
|
47
|
+
task = caller[0].match(/`(.*)'/)[1]
|
48
|
+
error "'#{task}' parameters must be a hash" unless params.kind_of?(Hash)
|
44
49
|
for param in description.keys
|
45
|
-
error "
|
46
|
-
|
50
|
+
error "#{task} '#{param}' parameter is mandatory" unless
|
51
|
+
params[param.to_s] or description[param][:mandatory] == false
|
52
|
+
if params[param.to_s]
|
53
|
+
case description[param][:type]
|
54
|
+
when :string
|
55
|
+
error "#{task} '#{param}' parameter must be a string" unless
|
56
|
+
params[param.to_s].kind_of?(String)
|
57
|
+
when :integer
|
58
|
+
error "#{task} '#{param}' parameter must be an integer" unless
|
59
|
+
params[param.to_s].kind_of?(Integer)
|
60
|
+
when :float
|
61
|
+
error "#{task} '#{param}' parameter must be a float" unless
|
62
|
+
params[param.to_s].kind_of?(Float)
|
63
|
+
when :number
|
64
|
+
error "#{task} '#{param}' parameter must be a number" unless
|
65
|
+
params[param.to_s].kind_of?(Numeric)
|
66
|
+
when :boolean
|
67
|
+
error "#{task} '#{param}' parameter must be a boolean" unless
|
68
|
+
params[param.to_s] == true or params[param] == false
|
69
|
+
when :array
|
70
|
+
error "#{task} '#{param}' parameter must be an array" unless
|
71
|
+
params[param.to_s].kind_of?(Array)
|
72
|
+
when :string_or_array
|
73
|
+
error "#{task} '#{param}' parameter must be a string or an array" unless
|
74
|
+
params[param.to_s].kind_of?(String) or params[param.to_s].kind_of?(Array)
|
75
|
+
when :string_or_integer
|
76
|
+
error "#{task} '#{param}' parameter must be a string or an integer" unless
|
77
|
+
params[param.to_s].kind_of?(String) or params[param.to_s].kind_of?(Integer)
|
78
|
+
when :hash
|
79
|
+
error "#{task} '#{param}' parameter must be a hash" unless
|
80
|
+
params[param.to_s].kind_of?(Hash)
|
81
|
+
else
|
82
|
+
error "Unknown parameter type '#{description[param][:type]}'"
|
83
|
+
end
|
84
|
+
params[param.to_sym] = params[param.to_s]
|
85
|
+
else
|
86
|
+
params[param.to_sym] = description[param][:default] if
|
87
|
+
description[param][:default]
|
88
|
+
params[param.to_s] = description[param][:default] if
|
89
|
+
description[param][:default]
|
90
|
+
end
|
47
91
|
end
|
48
92
|
for param in params.keys
|
49
|
-
error "Unknown parameter '#{param}'" if
|
93
|
+
error "Unknown parameter '#{param}'" if
|
94
|
+
not (description.key?(param) or description.key?(param.to_sym))
|
50
95
|
end
|
51
96
|
end
|
52
97
|
|
98
|
+
# Utility method to find and filter files.
|
99
|
+
# - root: root directory for files to search.
|
100
|
+
# - includes: list of globs for files to include in search.
|
101
|
+
# - excludes: list of globs for files to exclude from search.
|
102
|
+
# - dotmatch: tells if joker matches dot files.
|
103
|
+
# Return: the list of found files (no directories included).
|
104
|
+
def filter_files(includes, excludes, root, dotmatch=true)
|
105
|
+
error "includes must be a glob or a list of globs" unless
|
106
|
+
!includes or includes.kind_of?(String) or includes.kind_of?(Array)
|
107
|
+
error "excludes must be a glob or a list of globs" unless
|
108
|
+
!excludes or excludes.kind_of?(String) or excludes.kind_of?(Array)
|
109
|
+
error "root must be an existing directory" unless
|
110
|
+
!root or File.exists?(root)
|
111
|
+
current_dir = Dir.pwd
|
112
|
+
begin
|
113
|
+
if dotmatch
|
114
|
+
options = File::FNM_PATHNAME | File::FNM_DOTMATCH
|
115
|
+
else
|
116
|
+
options = File::FNM_PATHNAME
|
117
|
+
end
|
118
|
+
Dir.chdir(root) if root
|
119
|
+
included = []
|
120
|
+
includes = '**/*' if not includes
|
121
|
+
for include in includes
|
122
|
+
error "includes must be a glob or a list of globs" unless
|
123
|
+
include.kind_of?(String)
|
124
|
+
# should expand directories ?
|
125
|
+
# include = "#{include}/**/*" if File.directory?(include)
|
126
|
+
entries = Dir.glob(include, options)
|
127
|
+
included += entries if entries
|
128
|
+
end
|
129
|
+
included.uniq!
|
130
|
+
if excludes
|
131
|
+
included.reject! do |file|
|
132
|
+
rejected = false
|
133
|
+
for exclude in excludes
|
134
|
+
if File.fnmatch?(exclude, file, options)
|
135
|
+
rejected = true
|
136
|
+
break
|
137
|
+
end
|
138
|
+
end
|
139
|
+
rejected
|
140
|
+
end
|
141
|
+
end
|
142
|
+
included.reject! { |file| File.directory?(file) }
|
143
|
+
return included
|
144
|
+
ensure
|
145
|
+
Dir.chdir(current_dir)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
53
149
|
# Print text on the console.
|
54
150
|
# - text: text to print.
|
55
151
|
def print(text)
|
@@ -69,6 +165,16 @@ module Bee
|
|
69
165
|
Kernel.puts(text)
|
70
166
|
end
|
71
167
|
end
|
168
|
+
|
169
|
+
# Prompts the user for a string.
|
170
|
+
# Return the user input string.
|
171
|
+
def gets
|
172
|
+
if @build.listener
|
173
|
+
return @build.listener.gets
|
174
|
+
else
|
175
|
+
return Kernel::STDIN.gets
|
176
|
+
end
|
177
|
+
end
|
72
178
|
|
73
179
|
end
|
74
180
|
|
@@ -126,14 +232,10 @@ module Bee
|
|
126
232
|
# named after the package capitalized, in module Bee::Task.
|
127
233
|
# - package: the package name.
|
128
234
|
def load_package(package)
|
129
|
-
if package
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
else
|
134
|
-
script = 'bee_task'
|
135
|
-
clazz = 'Default'
|
136
|
-
end
|
235
|
+
package = 'default' if not package
|
236
|
+
package.downcase!
|
237
|
+
script = "bee_task_#{package}"
|
238
|
+
clazz = package.capitalize
|
137
239
|
begin
|
138
240
|
require script
|
139
241
|
@packages[package] = Bee::Task.const_get(clazz).new(@build)
|