jsus 0.3.4 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +7 -0
- data/Gemfile +15 -2
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/autotest/discover.rb +1 -1
- data/bin/jsus +87 -341
- data/features/command-line/compression.feature +24 -1
- data/jsus.gemspec +30 -9
- data/lib/extensions/rgl.rb +37 -0
- data/lib/jsus.rb +5 -4
- data/lib/jsus/cli.rb +206 -0
- data/lib/jsus/compiler.rb +28 -0
- data/lib/jsus/container.rb +24 -17
- data/lib/jsus/middleware.rb +10 -9
- data/lib/jsus/package.rb +1 -1
- data/lib/jsus/util.rb +20 -0
- data/lib/jsus/util/compressor.rb +67 -16
- data/lib/jsus/util/watcher.rb +79 -0
- data/spec/benchmarks/topsort.rb +29 -0
- data/spec/data/ComplexDependencies/Mootools/Source/Core.js +2 -0
- data/spec/extensions/rgl_spec.rb +34 -0
- data/spec/jsus/middleware_spec.rb +23 -1
- data/spec/jsus/util/compressor_spec.rb +44 -0
- data/spec/jsus/util/watcher_spec.rb +122 -0
- data/spec/jsus/util_spec.rb +32 -0
- data/spec/spec_helper.rb +1 -1
- metadata +207 -214
    
        data/CHANGELOG
    CHANGED
    
    | @@ -1,4 +1,11 @@ | |
| 1 1 | 
             
            = Jsus Changelog
         | 
| 2 | 
            +
            == Version 0.3.5
         | 
| 3 | 
            +
            Other changes:
         | 
| 4 | 
            +
            * Faster cycle search; fails fast and makes --no-cycle-search option obsolete
         | 
| 5 | 
            +
            * Fixed error reporting routine when package.json / .yml was missing.
         | 
| 6 | 
            +
            * New compression methods: frontcompiler, closure, uglifier
         | 
| 7 | 
            +
              (besides the default yui) [Thanks to Pavel Evstigneev]
         | 
| 8 | 
            +
             | 
| 2 9 | 
             
            == Version 0.3.4
         | 
| 3 10 | 
             
            Middleware changes:
         | 
| 4 11 | 
             
            * support for /compressed/ path component, which acts like /require/, but
         | 
    
        data/Gemfile
    CHANGED
    
    | @@ -8,13 +8,26 @@ gem "rgl" | |
| 8 8 | 
             
            group :development do
         | 
| 9 9 | 
             
              gem "rake"
         | 
| 10 10 | 
             
              gem "rspec"
         | 
| 11 | 
            -
             | 
| 11 | 
            +
             | 
| 12 | 
            +
              # FIXME: change to the latest cucumber version when cucumber bug gets fixed
         | 
| 13 | 
            +
              # https://github.com/cucumber/cucumber/issues/136
         | 
| 14 | 
            +
              gem "cucumber", "1.0.3"
         | 
| 15 | 
            +
             | 
| 12 16 | 
             
              gem "jeweler"
         | 
| 13 17 | 
             
              gem "murdoc", "~> 0.1.11"
         | 
| 14 18 | 
             
              gem "ruby-debug19", :platforms => :ruby_19
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              # FIXME: linecache being ruby1.9+only
         | 
| 21 | 
            +
              gem "linecache", "= 0.45", :platforms => :ruby_18
         | 
| 22 | 
            +
             | 
| 15 23 | 
             
              gem "ruby-debug",   :platforms => :ruby_18
         | 
| 16 24 | 
             
              gem 'fssm'
         | 
| 17 | 
            -
             | 
| 25 | 
            +
             | 
| 26 | 
            +
              gem 'yuicompressor',    :require => false
         | 
| 27 | 
            +
              gem 'uglifier',         :require => false
         | 
| 28 | 
            +
              gem 'front-compiler',   :require => false
         | 
| 29 | 
            +
              gem 'closure-compiler', :require => false
         | 
| 30 | 
            +
             | 
| 18 31 | 
             
              gem 'sinatra'
         | 
| 19 32 | 
             
              gem 'rack-test'
         | 
| 20 33 | 
             
              gem 'yard'
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -13,7 +13,7 @@ require 'jeweler' | |
| 13 13 | 
             
            Jeweler::Tasks.new do |gem|
         | 
| 14 14 | 
             
              # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
         | 
| 15 15 | 
             
              gem.name = "jsus"
         | 
| 16 | 
            -
              gem.homepage = "http://github.com/ | 
| 16 | 
            +
              gem.homepage = "http://github.com/jsus/jsus"
         | 
| 17 17 | 
             
              gem.license = "Public Domain"
         | 
| 18 18 | 
             
              gem.summary = "Javascript packager and dependency resolver"
         | 
| 19 19 | 
             
              gem.description = "Javascript packager and dependency resolver"
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.3. | 
| 1 | 
            +
            0.3.5
         | 
    
        data/autotest/discover.rb
    CHANGED
    
    | @@ -1,2 +1,2 @@ | |
| 1 1 | 
             
            Autotest.add_discovery { "rspec2" }
         | 
| 2 | 
            -
            Autotest.add_discovery { "cucumber" }
         | 
| 2 | 
            +
            Autotest.add_discovery { "cucumber" }
         | 
    
        data/bin/jsus
    CHANGED
    
    | @@ -1,380 +1,126 @@ | |
| 1 1 | 
             
            #!/usr/bin/env ruby
         | 
| 2 2 | 
             
            require 'rubygems'
         | 
| 3 | 
            -
             | 
| 4 3 | 
             
            require 'pathname'
         | 
| 4 | 
            +
             | 
| 5 5 | 
             
            begin
         | 
| 6 6 | 
             
              gem_home = Pathname.new(ENV["GEM_HOME"]).realpath.to_s
         | 
| 7 | 
            -
              current_dir =  | 
| 8 | 
            -
              if current_dir.index(gem_home) != 0 &&  | 
| 7 | 
            +
              current_dir = Pathname.new(__FILE__).realpath.dirname
         | 
| 8 | 
            +
              if current_dir.to_s.index(gem_home) != 0 && current_dir.join('../lib/jsus.rb').exist?
         | 
| 9 9 | 
             
                # If we are outside gem home,
         | 
| 10 10 | 
             
                # override whatever they got there
         | 
| 11 11 | 
             
                # with local version of jsus
         | 
| 12 | 
            -
                $:.unshift | 
| 12 | 
            +
                $:.unshift((current_dir + "../lib").expand_path.to_s)
         | 
| 13 13 | 
             
              end
         | 
| 14 14 | 
             
            rescue Exception => e
         | 
| 15 | 
            +
              raise e
         | 
| 15 16 | 
             
              # Something weird happened during our checks,
         | 
| 16 17 | 
             
              # but it's probably nothing.
         | 
| 17 18 | 
             
            end
         | 
| 18 | 
            -
            require 'jsus'
         | 
| 19 19 |  | 
| 20 | 
            -
            require  | 
| 20 | 
            +
            require 'jsus'
         | 
| 21 21 | 
             
            require "optparse"
         | 
| 22 22 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
                      opts.banner = "jsus #{Jsus.version}. Usage: jsus [options] <input_dir> <output_dir>"
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                      opts.on('-i', '--input-directory [DIR]', '[DEPRECATED] path to input directory ') do |dir|
         | 
| 34 | 
            -
                        $stderr.puts "DEPRECATION NOTICE: please do not use -i command-line argument"
         | 
| 35 | 
            -
                        options[:input_dir] = dir
         | 
| 36 | 
            -
                      end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                      opts.on('-o', '--output-directory [DIR]', '[DEPRECATED] path to output directory ') do |dir|
         | 
| 39 | 
            -
                        $stderr.puts "DEPRECATION NOTICE: please do not use -o command-line argument"
         | 
| 40 | 
            -
                        options[:output_dir] = dir
         | 
| 41 | 
            -
                      end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                      opts.on('-d', '--with-dependencies [DEPS]', 'path to directory containing dependency packages')  do |dir|
         | 
| 44 | 
            -
                        options[:deps_dir] = dir
         | 
| 45 | 
            -
                      end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                      opts.on('-g', '--generate-includes [ROOT]', 'generates includes.js file that you may use for ad-hoc requiring of dependencies, defaults to output directory') do |dir|
         | 
| 48 | 
            -
                        options[:generate_includes] = true
         | 
| 49 | 
            -
                        options[:includes_root] = dir
         | 
| 50 | 
            -
                      end
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                      opts.on('--generate-docs [*CLASSES]', Array, "generate docs for some of the sources. When given empty array, defaults to /**/*") do |docs|
         | 
| 53 | 
            -
                        if !docs
         | 
| 54 | 
            -
                          options[:documented_classes] = ["/**/*"]
         | 
| 55 | 
            -
                        else
         | 
| 56 | 
            -
                          options[:documented_classes] = docs
         | 
| 57 | 
            -
                        end
         | 
| 58 | 
            -
                      end
         | 
| 59 | 
            -
             | 
| 60 | 
            -
                      opts.on('--no-syntax-highlight', 'if you turned on docs generation, it will use syntax highlighting by default. This option prevents it') do
         | 
| 61 | 
            -
                        options[:no_syntax_highlight] = true
         | 
| 62 | 
            -
                      end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                      opts.on('--validate-with [*VALIDATORS]', Array, 'performs a check against some of the validators. Available validators: mooforge') do |validators|
         | 
| 65 | 
            -
                        options[:validators] = (validators || []).map {|v| v.downcase }
         | 
| 66 | 
            -
                      end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
                      opts.on('--postproc [*PROCESSORS]', Array, 'performs postprocessing. Available postprocs:\n* moocompat12 -- removes mootools 1.2compat tags and their contents\n* mooltIE8 -- removes mootools ltIE8 compat tags and their contents') do |postprocs|
         | 
| 69 | 
            -
                        options[:postproc] = postprocs
         | 
| 70 | 
            -
                      end
         | 
| 71 | 
            -
             | 
| 72 | 
            -
                      opts.on('--compress', 'compresses resulting file with YUI compressor') do
         | 
| 73 | 
            -
                        options[:compress] = true
         | 
| 74 | 
            -
                      end
         | 
| 75 | 
            -
             | 
| 76 | 
            -
                      opts.on('--no-cycle-search', 'disables search for circular dependencies which may take quite some time during compilation') do
         | 
| 77 | 
            -
                        Jsus.look_for_cycles = false
         | 
| 78 | 
            -
                      end
         | 
| 79 | 
            -
             | 
| 80 | 
            -
                      opts.on_tail('-v', '--verbose', 'verbose mode, shows various debug messages') do
         | 
| 81 | 
            -
                        Jsus.verbose = true
         | 
| 82 | 
            -
                      end
         | 
| 83 | 
            -
             | 
| 84 | 
            -
                      opts.on_tail('--very-verbose', 'very verbose mode, shows pool stats beside usual verbose stuff') do
         | 
| 85 | 
            -
                        Jsus.verbose = true
         | 
| 86 | 
            -
                        options[:display_pool_stats] = true
         | 
| 87 | 
            -
                      end
         | 
| 88 | 
            -
             | 
| 89 | 
            -
                      opts.on_tail('-b', '--benchmark', 'shows time spent on various stages') do
         | 
| 90 | 
            -
                        options[:benchmark] = true
         | 
| 91 | 
            -
                      end
         | 
| 92 | 
            -
             | 
| 93 | 
            -
                      opts.on_tail('--without-scripts-info', 'do not generate scripts.json') do
         | 
| 94 | 
            -
                        options[:without_scripts_info] = true
         | 
| 95 | 
            -
                      end
         | 
| 96 | 
            -
             | 
| 97 | 
            -
                      opts.on_tail('--without-tree-info', 'do not generate tree.json') do
         | 
| 98 | 
            -
                        options[:without_tree_info] = true
         | 
| 99 | 
            -
                      end
         | 
| 100 | 
            -
             | 
| 101 | 
            -
                      opts.on_tail('--watch', 'watch file system events for *.js files in subdirectories and rerun jsus with the same parameters') do
         | 
| 102 | 
            -
                        options[:watch] = true
         | 
| 103 | 
            -
                      end
         | 
| 104 | 
            -
             | 
| 105 | 
            -
                      opts.on_tail('-h', '--help', 'Show this message') do
         | 
| 106 | 
            -
                        puts opts
         | 
| 107 | 
            -
                        exit
         | 
| 108 | 
            -
                      end
         | 
| 109 | 
            -
                    end
         | 
| 110 | 
            -
                    cli.parse!
         | 
| 111 | 
            -
             | 
| 112 | 
            -
                    options[:input_dir]  ||= ARGV[0]
         | 
| 113 | 
            -
                    options[:output_dir] ||= ARGV[1]
         | 
| 114 | 
            -
             | 
| 115 | 
            -
                    if !(options[:input_dir] && options[:output_dir])
         | 
| 116 | 
            -
                      puts cli
         | 
| 117 | 
            -
                      exit
         | 
| 118 | 
            -
                    end
         | 
| 119 | 
            -
                    options[:input_dir]  = File.expand_path(options[:input_dir])
         | 
| 120 | 
            -
                    options[:output_dir] = File.expand_path(options[:output_dir])
         | 
| 121 | 
            -
                    self.cli_options = options
         | 
| 122 | 
            -
                  end
         | 
| 123 | 
            -
             | 
| 124 | 
            -
                  def watch?
         | 
| 125 | 
            -
                    cli_options[:watch]
         | 
| 126 | 
            -
                  end
         | 
| 127 | 
            -
             | 
| 128 | 
            -
                  def launch!
         | 
| 129 | 
            -
                    new.launch
         | 
| 130 | 
            -
                  end
         | 
| 131 | 
            -
             | 
| 132 | 
            -
                  def run!
         | 
| 133 | 
            -
                    parse_command_line!
         | 
| 134 | 
            -
                    launch!
         | 
| 135 | 
            -
                    if watch?
         | 
| 136 | 
            -
                      watch do |base, match|
         | 
| 137 | 
            -
                        full_path = File.join(base, match)
         | 
| 138 | 
            -
                        unless full_path.include?(cli_options[:output_dir])
         | 
| 139 | 
            -
                          puts "#{match} has changed, relaunching jsus..."
         | 
| 140 | 
            -
                          begin
         | 
| 141 | 
            -
                            launch!
         | 
| 142 | 
            -
                            puts "... done"
         | 
| 143 | 
            -
                          rescue Exception => e
         | 
| 144 | 
            -
                            puts "Exception happened: #{e}, #{e.inspect}"
         | 
| 145 | 
            -
                            puts "\t#{e.backtrace.join("\n\t")}" if Jsus.verbose?
         | 
| 146 | 
            -
                            puts "Compilation FAILED."
         | 
| 147 | 
            -
                          end
         | 
| 148 | 
            -
                          puts ""
         | 
| 149 | 
            -
                        end
         | 
| 150 | 
            -
                      end
         | 
| 151 | 
            -
                    end
         | 
| 152 | 
            -
                  end
         | 
| 153 | 
            -
             | 
| 154 | 
            -
                  def watch
         | 
| 155 | 
            -
                    require 'fssm'
         | 
| 156 | 
            -
                    puts "Jsus enters watch mode, it will watch your files for changes and relaunch itself"
         | 
| 157 | 
            -
                    puts ""
         | 
| 158 | 
            -
                    start_directory = Dir.pwd
         | 
| 159 | 
            -
                    watched_dirs = [cli_options[:input_dir], cli_options[:deps_dir]].compact.map {|path| File.expand_path(path)}
         | 
| 160 | 
            -
             | 
| 161 | 
            -
                    watched_dirs.reject! do |dir|
         | 
| 162 | 
            -
                      # This is a work around for rb-fsevent quirk
         | 
| 163 | 
            -
                      # Apparently, when your dependency dir is a child directory for your input dir,
         | 
| 164 | 
            -
                      # You get problems.
         | 
| 165 | 
            -
                      result = false
         | 
| 166 | 
            -
                      pathname_traversal = Pathname.new(dir).descend do |parent|
         | 
| 167 | 
            -
                        parent = parent.to_s
         | 
| 168 | 
            -
                        result ||= watched_dirs.include?(parent) && parent != dir
         | 
| 169 | 
            -
                      end
         | 
| 170 | 
            -
                      result
         | 
| 171 | 
            -
                    end
         | 
| 172 | 
            -
             | 
| 173 | 
            -
                    puts "Watching directories: " + watched_dirs.inspect if Jsus.verbose?
         | 
| 174 | 
            -
                    FSSM.monitor do
         | 
| 175 | 
            -
                      watched_dirs.each do |dir|
         | 
| 176 | 
            -
                        path dir do
         | 
| 177 | 
            -
                          glob ["**/*.js", "**/package.yml", "**/package.json"]
         | 
| 178 | 
            -
                          update {|base, relative| yield base, relative }
         | 
| 179 | 
            -
                          delete {|base, relative| yield base, relative }
         | 
| 180 | 
            -
                          create {|base, relative| yield base, relative }
         | 
| 181 | 
            -
                        end
         | 
| 182 | 
            -
                      end
         | 
| 183 | 
            -
                    end
         | 
| 184 | 
            -
             | 
| 185 | 
            -
                  rescue LoadError => e
         | 
| 186 | 
            -
                    puts "You need to install fssm gem for --watch option."
         | 
| 187 | 
            -
                    puts "You may also want to install rb-fsevent for OS X"
         | 
| 188 | 
            -
                    raise e
         | 
| 189 | 
            -
                  end
         | 
| 190 | 
            -
             | 
| 191 | 
            -
                end
         | 
| 23 | 
            +
            Jsus.logger = Jsus::Util::Logger.new(STDOUT)
         | 
| 24 | 
            +
            Jsus.logger.formatter = lambda {|severity, time, progname, msg|
         | 
| 25 | 
            +
              prefix = case severity
         | 
| 26 | 
            +
              when /error/i, /fatal/i, /warn/i then "[#{severity}]: "
         | 
| 27 | 
            +
              else ""
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
              "#{prefix}#{msg}\n"
         | 
| 30 | 
            +
            }
         | 
| 192 31 |  | 
| 193 | 
            -
             | 
| 32 | 
            +
            options = {}
         | 
| 33 | 
            +
            cli = OptionParser.new do |opts|
         | 
| 34 | 
            +
              opts.banner = "jsus #{Jsus.version}. Usage: jsus [options] <input_dir> <output_dir>"
         | 
| 194 35 |  | 
| 195 | 
            -
             | 
| 196 | 
            -
             | 
| 197 | 
            -
                 | 
| 36 | 
            +
              opts.on('-i', '--input-directory [DIR]', '[DEPRECATED] path to input directory ') do |dir|
         | 
| 37 | 
            +
                Jsus.logger.warn "DEPRECATION NOTICE: please do not use -i command-line argument"
         | 
| 38 | 
            +
                options[:input_dir] = dir
         | 
| 39 | 
            +
              end
         | 
| 198 40 |  | 
| 199 | 
            -
             | 
| 200 | 
            -
             | 
| 201 | 
            -
             | 
| 202 | 
            -
             | 
| 203 | 
            -
                  load_package
         | 
| 204 | 
            -
                  display_pool_stats if options[:display_pool_stats]
         | 
| 205 | 
            -
                  compile_package
         | 
| 206 | 
            -
                  post_process if options[:postproc]
         | 
| 207 | 
            -
                  compress_package if options[:compress]
         | 
| 208 | 
            -
                  package_filename = File.join(@output_dir, @package.filename)
         | 
| 209 | 
            -
                  File.open(package_filename, 'w') {|f| f << @package_content  }
         | 
| 210 | 
            -
                  generate_supplemental_files
         | 
| 211 | 
            -
                  validate_sources
         | 
| 212 | 
            -
                  generate_includes if options[:generate_includes]
         | 
| 213 | 
            -
                  generate_docs if options[:documented_classes] && !options[:documented_classes].empty?
         | 
| 214 | 
            -
                  output_benchmarks
         | 
| 215 | 
            -
                end
         | 
| 41 | 
            +
              opts.on('-o', '--output-directory [DIR]', '[DEPRECATED] path to output directory ') do |dir|
         | 
| 42 | 
            +
                Jsus.logger.warn "DEPRECATION NOTICE: please do not use -o command-line argument"
         | 
| 43 | 
            +
                options[:output_dir] = dir
         | 
| 44 | 
            +
              end
         | 
| 216 45 |  | 
| 217 | 
            -
             | 
| 218 | 
            -
             | 
| 219 | 
            -
             | 
| 220 | 
            -
                end
         | 
| 46 | 
            +
              opts.on('-d', '--with-dependencies [DEPS]', 'path to directory containing dependency packages')  do |dir|
         | 
| 47 | 
            +
                options[:deps_dir] = dir
         | 
| 48 | 
            +
              end
         | 
| 221 49 |  | 
| 222 | 
            -
             | 
| 223 | 
            -
             | 
| 224 | 
            -
             | 
| 225 | 
            -
             | 
| 226 | 
            -
                    Jsus::Pool.new
         | 
| 227 | 
            -
                  end
         | 
| 228 | 
            -
                  checkpoint(:pool)
         | 
| 229 | 
            -
                end
         | 
| 50 | 
            +
              opts.on('-g', '--generate-includes [ROOT]', 'generates includes.js file that you may use for ad-hoc requiring of dependencies, defaults to output directory') do |dir|
         | 
| 51 | 
            +
                options[:generate_includes] = true
         | 
| 52 | 
            +
                options[:includes_root] = dir
         | 
| 53 | 
            +
              end
         | 
| 230 54 |  | 
| 231 | 
            -
             | 
| 232 | 
            -
             | 
| 233 | 
            -
                   | 
| 234 | 
            -
             | 
| 55 | 
            +
              opts.on('--generate-docs [*CLASSES]', Array, "generate docs for some of the sources. When given empty array, defaults to /**/*") do |docs|
         | 
| 56 | 
            +
                if !docs
         | 
| 57 | 
            +
                  options[:documented_classes] = ["/**/*"]
         | 
| 58 | 
            +
                else
         | 
| 59 | 
            +
                  options[:documented_classes] = docs
         | 
| 235 60 | 
             
                end
         | 
| 61 | 
            +
              end
         | 
| 236 62 |  | 
| 237 | 
            -
             | 
| 238 | 
            -
             | 
| 239 | 
            -
             | 
| 240 | 
            -
                  puts "Pool stats:"
         | 
| 241 | 
            -
                  puts ""
         | 
| 242 | 
            -
                  puts "Main package:"
         | 
| 243 | 
            -
                  display_package @package
         | 
| 244 | 
            -
                  puts "Supplementary packages:"
         | 
| 245 | 
            -
                  @pool.packages.each do |package|
         | 
| 246 | 
            -
                    display_package package
         | 
| 247 | 
            -
                  end
         | 
| 248 | 
            -
                  puts ""
         | 
| 249 | 
            -
                end
         | 
| 63 | 
            +
              opts.on('--no-syntax-highlight', 'if you turned on docs generation, it will use syntax highlighting by default. This option prevents it') do
         | 
| 64 | 
            +
                options[:no_syntax_highlight] = true
         | 
| 65 | 
            +
              end
         | 
| 250 66 |  | 
| 251 | 
            -
             | 
| 252 | 
            -
             | 
| 253 | 
            -
             | 
| 254 | 
            -
                    puts "    [#{sf.relative_filename}]"
         | 
| 255 | 
            -
                    puts "        Provides: [#{sf.provides_names.join(", ")}]"
         | 
| 256 | 
            -
                    puts "        Requires: [#{sf.requires_names.join(", ")}]"
         | 
| 257 | 
            -
                  end
         | 
| 258 | 
            -
                  puts ""
         | 
| 259 | 
            -
                end
         | 
| 67 | 
            +
              opts.on('--validate-with [*VALIDATORS]', Array, 'performs a check against some of the validators. Available validators: mooforge') do |validators|
         | 
| 68 | 
            +
                options[:validators] = (validators || []).map {|v| v.downcase }
         | 
| 69 | 
            +
              end
         | 
| 260 70 |  | 
| 261 | 
            -
             | 
| 262 | 
            -
             | 
| 263 | 
            -
             | 
| 264 | 
            -
                end
         | 
| 71 | 
            +
              opts.on('--postproc [*PROCESSORS]', Array, 'performs postprocessing. Available postprocs:\n* moocompat12 -- removes mootools 1.2compat tags and their contents\n* mooltIE8 -- removes mootools ltIE8 compat tags and their contents') do |postprocs|
         | 
| 72 | 
            +
                options[:postproc] = postprocs
         | 
| 73 | 
            +
              end
         | 
| 265 74 |  | 
| 266 | 
            -
             | 
| 267 | 
            -
             | 
| 268 | 
            -
             | 
| 269 | 
            -
                    when /^moocompat12$/i
         | 
| 270 | 
            -
                      @package_content.gsub!(/\/\/<1.2compat>.*?\/\/<\/1.2compat>/m, '')
         | 
| 271 | 
            -
                      @package_content.gsub!(/\/\*<1.2compat>\*\/.*?\/\*<\/1.2compat>\*\//m, '')
         | 
| 272 | 
            -
                    when /^mooltie8$/i
         | 
| 273 | 
            -
                      @package_content.gsub!(/\/\/<ltIE8>.*?\/\/<\/ltIE8>/m, '')
         | 
| 274 | 
            -
                      @package_content.gsub!(/\/\*<ltIE8>\*\/.*?\/\*<\/ltIE8>\*\//m, '')
         | 
| 275 | 
            -
                    else
         | 
| 276 | 
            -
                      $stderr.puts "Unknown post-processor: #{processor}"
         | 
| 277 | 
            -
                    end
         | 
| 278 | 
            -
                  end
         | 
| 279 | 
            -
                  checkpoint(:postproc)
         | 
| 280 | 
            -
                end
         | 
| 75 | 
            +
              opts.on('--compress', 'compresses resulting file') do
         | 
| 76 | 
            +
                options[:compress] = true
         | 
| 77 | 
            +
              end
         | 
| 281 78 |  | 
| 282 | 
            -
             | 
| 283 | 
            -
             | 
| 284 | 
            -
             | 
| 285 | 
            -
                    @compression_ratio = compressed_content.size.to_f / @package_content.size.to_f
         | 
| 286 | 
            -
                    compressed_file_name = @package.filename.sub(/.js$/, ".min.js")
         | 
| 287 | 
            -
                    File.open(File.join(@output_dir, compressed_file_name), "w") {|f| f.write(compressed_content) }
         | 
| 288 | 
            -
                  else
         | 
| 289 | 
            -
                    @compression_ratio = 1.00
         | 
| 290 | 
            -
                    puts "ERROR: YUI compressor could not parse input. "
         | 
| 291 | 
            -
                    puts "Compressor command used: #{compressor.command.join(' ')}"
         | 
| 292 | 
            -
                  end
         | 
| 293 | 
            -
                  checkpoint(:compress)
         | 
| 294 | 
            -
                end
         | 
| 79 | 
            +
              opts.on('--compression-method [METHOD]', 'compression method: yui, closure, frontcompiler or uglifier') do |method|
         | 
| 80 | 
            +
                options[:compression_method] = method
         | 
| 81 | 
            +
              end
         | 
| 295 82 |  | 
| 296 | 
            -
             | 
| 297 | 
            -
             | 
| 298 | 
            -
             | 
| 299 | 
            -
                  checkpoint(:supplemental_files)
         | 
| 300 | 
            -
                end
         | 
| 83 | 
            +
              opts.on_tail('-v', '--verbose', 'verbose mode, shows various debug messages') do
         | 
| 84 | 
            +
                Jsus.verbose = true
         | 
| 85 | 
            +
              end
         | 
| 301 86 |  | 
| 302 | 
            -
             | 
| 303 | 
            -
             | 
| 304 | 
            -
             | 
| 305 | 
            -
             | 
| 306 | 
            -
                    paths = c.required_files(includes_root)
         | 
| 307 | 
            -
                    f.puts Jsus::Util::CodeGenerator.generate_includes(paths)
         | 
| 308 | 
            -
                  end
         | 
| 309 | 
            -
                  checkpoint(:includes)
         | 
| 310 | 
            -
                end
         | 
| 87 | 
            +
              opts.on_tail('--very-verbose', 'very verbose mode, shows pool stats beside usual verbose stuff') do
         | 
| 88 | 
            +
                Jsus.verbose = true
         | 
| 89 | 
            +
                options[:display_pool_stats] = true
         | 
| 90 | 
            +
              end
         | 
| 311 91 |  | 
| 312 | 
            -
             | 
| 313 | 
            -
             | 
| 314 | 
            -
             | 
| 315 | 
            -
                  @pool.sources.each {|source| documenter << source }
         | 
| 316 | 
            -
                  documenter.only(options[:documented_classes]).generate(@output_dir + "/docs")
         | 
| 317 | 
            -
                  checkpoint(:documentation)
         | 
| 318 | 
            -
                end
         | 
| 92 | 
            +
              opts.on_tail('-b', '--benchmark', 'shows time spent on various stages') do
         | 
| 93 | 
            +
                options[:benchmark] = true
         | 
| 94 | 
            +
              end
         | 
| 319 95 |  | 
| 320 | 
            -
             | 
| 321 | 
            -
             | 
| 322 | 
            -
             | 
| 323 | 
            -
                    if validator = validators_map[validator_name]
         | 
| 324 | 
            -
                      errors = validator.new(@pool.sources.to_a & @package.source_files.to_a).validation_errors
         | 
| 325 | 
            -
                      unless errors.empty?
         | 
| 326 | 
            -
                        puts "Validator #{validator_name} found errors: "
         | 
| 327 | 
            -
                        errors.each {|e| puts "  * #{e}"}
         | 
| 328 | 
            -
                      end
         | 
| 329 | 
            -
                    else
         | 
| 330 | 
            -
                      puts "No such validator: #{validator_name}"
         | 
| 331 | 
            -
                    end
         | 
| 332 | 
            -
                  end
         | 
| 333 | 
            -
                  checkpoint(:validators)
         | 
| 334 | 
            -
                end
         | 
| 96 | 
            +
              opts.on_tail('--without-scripts-info', 'do not generate scripts.json') do
         | 
| 97 | 
            +
                options[:without_scripts_info] = true
         | 
| 98 | 
            +
              end
         | 
| 335 99 |  | 
| 336 | 
            -
             | 
| 337 | 
            -
             | 
| 338 | 
            -
             | 
| 339 | 
            -
                    puts "Total execution time:   #{formatted_time_for(:all)}"
         | 
| 340 | 
            -
                    puts ""
         | 
| 341 | 
            -
                    puts "Of them:"
         | 
| 342 | 
            -
                    puts "Pool preloading time:   #{formatted_time_for(:pool)}"
         | 
| 343 | 
            -
                    puts "Docs generation time:   #{formatted_time_for(:documentation)}" if options[:documented_classes] && !options[:documented_classes].empty?
         | 
| 344 | 
            -
                    puts "Total compilation time: #{formatted_time_for(:compilation)}"
         | 
| 345 | 
            -
                    puts "Post-processing time:   #{formatted_time_for(:postproc)}" if options[:postproc]
         | 
| 346 | 
            -
                    puts "Compression time:       #{formatted_time_for(:compress)}" if options[:compress]
         | 
| 347 | 
            -
                    puts ""
         | 
| 348 | 
            -
                    puts "Compression ratio: #{sprintf("%.2f%%", @compression_ratio * 100)}" if Jsus.verbose? && @compression_ratio
         | 
| 349 | 
            -
                  end
         | 
| 350 | 
            -
                end
         | 
| 100 | 
            +
              opts.on_tail('--without-tree-info', 'do not generate tree.json') do
         | 
| 101 | 
            +
                options[:without_tree_info] = true
         | 
| 102 | 
            +
              end
         | 
| 351 103 |  | 
| 352 | 
            -
             | 
| 353 | 
            -
             | 
| 354 | 
            -
             | 
| 355 | 
            -
                  @checkpoints[checkpoint_name] = Time.now
         | 
| 356 | 
            -
                  if @last_checkpoint
         | 
| 357 | 
            -
                    @time_for[checkpoint_name] = @checkpoints[checkpoint_name] - @last_checkpoint
         | 
| 358 | 
            -
                  end
         | 
| 359 | 
            -
                  @last_checkpoint = Time.now
         | 
| 360 | 
            -
                end
         | 
| 104 | 
            +
              opts.on_tail('--watch', 'watch file system events for *.js files in subdirectories and rerun jsus with the same parameters') do
         | 
| 105 | 
            +
                options[:watch] = true
         | 
| 106 | 
            +
              end
         | 
| 361 107 |  | 
| 362 | 
            -
             | 
| 363 | 
            -
             | 
| 364 | 
            -
                 | 
| 108 | 
            +
              opts.on_tail('-h', '--help', 'Show this message') do
         | 
| 109 | 
            +
                puts opts
         | 
| 110 | 
            +
                exit
         | 
| 111 | 
            +
              end
         | 
| 112 | 
            +
            end
         | 
| 113 | 
            +
            cli.parse!
         | 
| 365 114 |  | 
| 366 | 
            -
             | 
| 367 | 
            -
             | 
| 368 | 
            -
                    @last_checkpoint - @checkpoints[:start]
         | 
| 369 | 
            -
                  else
         | 
| 370 | 
            -
                    @time_for[checkpoint_name]
         | 
| 371 | 
            -
                  end
         | 
| 372 | 
            -
                end
         | 
| 115 | 
            +
            options[:input_dir]  ||= ARGV[0]
         | 
| 116 | 
            +
            options[:output_dir] ||= ARGV[1]
         | 
| 373 117 |  | 
| 374 | 
            -
             | 
| 375 | 
            -
             | 
| 376 | 
            -
             | 
| 377 | 
            -
              end
         | 
| 118 | 
            +
            unless options[:input_dir] && options[:output_dir]
         | 
| 119 | 
            +
              puts cli
         | 
| 120 | 
            +
              exit
         | 
| 378 121 | 
             
            end
         | 
| 379 122 |  | 
| 380 | 
            -
             | 
| 123 | 
            +
            options[:input_dir]  = File.expand_path(options[:input_dir])
         | 
| 124 | 
            +
            options[:output_dir] = File.expand_path(options[:output_dir])
         | 
| 125 | 
            +
             | 
| 126 | 
            +
            Jsus::CLI.run!(options)
         |