bee 0.4.0 → 0.5.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/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)
         
     |