requirejs_optimizer 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/.gitignore +21 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +12 -0
  4. data/Gemfile +17 -0
  5. data/LICENSE +22 -0
  6. data/README.md +135 -0
  7. data/Rakefile +17 -0
  8. data/bin/r.js +9822 -0
  9. data/lib/generators/install_generator.rb +26 -0
  10. data/lib/generators/templates/README +8 -0
  11. data/lib/generators/templates/main.js.coffee +3 -0
  12. data/lib/generators/templates/require.build.js +6 -0
  13. data/lib/requirejs_optimizer/build.rb +21 -0
  14. data/lib/requirejs_optimizer/errors.rb +21 -0
  15. data/lib/requirejs_optimizer/railtie.rb +32 -0
  16. data/lib/requirejs_optimizer/rake/task.rb +50 -0
  17. data/lib/requirejs_optimizer/rake/utils.rb +32 -0
  18. data/lib/requirejs_optimizer/step/base.rb +19 -0
  19. data/lib/requirejs_optimizer/step/clean.rb +15 -0
  20. data/lib/requirejs_optimizer/step/compress.rb +21 -0
  21. data/lib/requirejs_optimizer/step/digestify.rb +27 -0
  22. data/lib/requirejs_optimizer/step/finalize.rb +16 -0
  23. data/lib/requirejs_optimizer/step/manifest.rb +31 -0
  24. data/lib/requirejs_optimizer/step/optimize.rb +26 -0
  25. data/lib/requirejs_optimizer/step/prepare.rb +32 -0
  26. data/lib/requirejs_optimizer/version.rb +3 -0
  27. data/lib/requirejs_optimizer.rb +49 -0
  28. data/requirejs_optimizer.gemspec +20 -0
  29. data/spec/integrations/rake_task_spec.rb +31 -0
  30. data/spec/lib/requirejs_optimizer/rake/task_spec.rb +19 -0
  31. data/spec/lib/requirejs_optimizer/rake/utils_spec.rb +78 -0
  32. data/spec/lib/requirejs_optimizer/step/clean_spec.rb +23 -0
  33. data/spec/lib/requirejs_optimizer/step/compress_spec.rb +26 -0
  34. data/spec/lib/requirejs_optimizer/step/digestify_spec.rb +70 -0
  35. data/spec/lib/requirejs_optimizer/step/finalize_spec.rb +33 -0
  36. data/spec/lib/requirejs_optimizer/step/manifest_spec.rb +37 -0
  37. data/spec/lib/requirejs_optimizer/step/optimize_spec.rb +42 -0
  38. data/spec/lib/requirejs_optimizer/step/prepare_spec.rb +53 -0
  39. data/spec/lib/requirejs_optimizer_spec.rb +24 -0
  40. data/spec/rails_app/.gitignore +15 -0
  41. data/spec/rails_app/README.rdoc +261 -0
  42. data/spec/rails_app/Rakefile +7 -0
  43. data/spec/rails_app/app/assets/images/rails.png +0 -0
  44. data/spec/rails_app/app/assets/javascripts/application.js +15 -0
  45. data/spec/rails_app/app/assets/javascripts/modules/bar/two.coffee +2 -0
  46. data/spec/rails_app/app/assets/javascripts/modules/baz/three.coffee +2 -0
  47. data/spec/rails_app/app/assets/javascripts/modules/foo/one.coffee +2 -0
  48. data/spec/rails_app/app/assets/javascripts/modules/main.coffee +1 -0
  49. data/spec/rails_app/app/assets/javascripts/modules/require.build.js +6 -0
  50. data/spec/rails_app/app/assets/stylesheets/application.css +13 -0
  51. data/spec/rails_app/app/controllers/application_controller.rb +3 -0
  52. data/spec/rails_app/app/helpers/application_helper.rb +2 -0
  53. data/spec/rails_app/app/mailers/.gitkeep +0 -0
  54. data/spec/rails_app/app/models/.gitkeep +0 -0
  55. data/spec/rails_app/app/views/layouts/application.html.erb +14 -0
  56. data/spec/rails_app/config/application.rb +59 -0
  57. data/spec/rails_app/config/boot.rb +7 -0
  58. data/spec/rails_app/config/database.yml +25 -0
  59. data/spec/rails_app/config/environment.rb +5 -0
  60. data/spec/rails_app/config/environments/development.rb +37 -0
  61. data/spec/rails_app/config/environments/production.rb +67 -0
  62. data/spec/rails_app/config/environments/test.rb +37 -0
  63. data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  64. data/spec/rails_app/config/initializers/inflections.rb +15 -0
  65. data/spec/rails_app/config/initializers/mime_types.rb +5 -0
  66. data/spec/rails_app/config/initializers/secret_token.rb +7 -0
  67. data/spec/rails_app/config/initializers/session_store.rb +8 -0
  68. data/spec/rails_app/config/initializers/wrap_parameters.rb +14 -0
  69. data/spec/rails_app/config/locales/en.yml +5 -0
  70. data/spec/rails_app/config/routes.rb +58 -0
  71. data/spec/rails_app/config.ru +4 -0
  72. data/spec/rails_app/db/seeds.rb +7 -0
  73. data/spec/rails_app/lib/assets/.gitkeep +0 -0
  74. data/spec/rails_app/lib/tasks/.gitkeep +0 -0
  75. data/spec/rails_app/log/.gitkeep +0 -0
  76. data/spec/rails_app/public/404.html +26 -0
  77. data/spec/rails_app/public/422.html +26 -0
  78. data/spec/rails_app/public/500.html +25 -0
  79. data/spec/rails_app/public/favicon.ico +0 -0
  80. data/spec/rails_app/public/index.html +241 -0
  81. data/spec/rails_app/public/robots.txt +5 -0
  82. data/spec/rails_app/script/rails +6 -0
  83. data/spec/rails_app/test/fixtures/.gitkeep +0 -0
  84. data/spec/rails_app/test/functional/.gitkeep +0 -0
  85. data/spec/rails_app/test/integration/.gitkeep +0 -0
  86. data/spec/rails_app/test/performance/browsing_test.rb +12 -0
  87. data/spec/rails_app/test/test_helper.rb +13 -0
  88. data/spec/rails_app/test/unit/.gitkeep +0 -0
  89. data/spec/rails_app/vendor/assets/javascripts/.gitkeep +0 -0
  90. data/spec/rails_app/vendor/assets/stylesheets/.gitkeep +0 -0
  91. data/spec/rails_app/vendor/plugins/.gitkeep +0 -0
  92. data/spec/spec_helper.rb +12 -0
  93. metadata +224 -0
@@ -0,0 +1,26 @@
1
+ module RequirejsOptimizer
2
+
3
+ class InstallGenerator < Rails::Generators::Base
4
+ source_root File.expand_path("../templates", __FILE__)
5
+
6
+ desc 'Set up for optimizing require.js modules'
7
+
8
+ def install
9
+ @main_name = ask("What is the name of your main module without the extension? (Leave blank for \"main\"):").tap { |s| s.replace "main" if s.blank? }
10
+ template "require.build.js", "app/assets/javascripts/modules/require.build.js"
11
+ copy_file "main.js.coffee", "app/assets/javascripts/modules/#{@main_name}.js.coffee"
12
+ copy_file "README", "app/assets/javascripts/modules/README"
13
+
14
+ say <<-README
15
+
16
+ requirejs_optimzier doesn't include require.js for use in you're app. If you
17
+ need it, you can get it via:
18
+
19
+ $ curl http://requirejs.org/docs/release/1.0.7/comments/require.js > vendor/assets/javascripts/require.js
20
+
21
+ README
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,8 @@
1
+ IMPORTANT
2
+ =========
3
+ All Require.js modules you want to create build(s) from need to go in `app/assets/javascripts/modules`
4
+
5
+ Everything under `modules` is automatically added to the app's asset precompile list, so all of these
6
+ files will get processed by the asset pipeline as part of a requirejs build. This is normal.
7
+
8
+ You can delete this README file if you want, it's only here to let you know what's going on.
@@ -0,0 +1,3 @@
1
+ # The following assumes that app/assets/javascripts/modules/one/foo.js(.coffee) exists as require.js modules:
2
+ #
3
+ # require ['one/foo', 'two/bar'], (foo, bar) -> console.log(foo, bar)
@@ -0,0 +1,6 @@
1
+ ({
2
+ appDir: "../../../../tmp/assets"
3
+ , baseUrl: "./modules"
4
+ , dir: "../../../../tmp/assets/build"
5
+ , name: "<%= @main_name %>"
6
+ })
@@ -0,0 +1,21 @@
1
+ module RequirejsOptimizer
2
+
3
+ class Build
4
+
5
+ attr_accessor :steps
6
+
7
+ def initialize(*args)
8
+ @steps = args.inject({}) { |m, s| m[s.name] = s.new; m }
9
+ end
10
+
11
+ def run
12
+ @steps.each { |s| s.last.perform }
13
+ end
14
+
15
+ def step(name)
16
+ @steps[name]
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ module RequirejsOptimizer
2
+
3
+ module Errors
4
+
5
+ # Raised if the node.js executable is unavailable
6
+ #
7
+ class NodeUnavailable < RuntimeError
8
+ def message
9
+ "Node wasn't found. Make sure the node executable is available somewhere in PATH"
10
+ end
11
+ end
12
+
13
+ class RjsOptimizationFailed < RuntimeError
14
+ def message
15
+ "R.js optimization failed. See STDOUT for details"
16
+ end
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,32 @@
1
+ require 'pathname'
2
+
3
+ # This will fail when initializing assets, but we don't need
4
+ # generators for asset initialization anyway. Let it fail
5
+ # silently
6
+ #
7
+ begin; require "generators/install_generator"
8
+ rescue NameError => e; end
9
+
10
+ class RequirejsOptimizerRailtie < Rails::Railtie
11
+
12
+ config.before_initialize do
13
+ Rails.application.config.assets.compress = false
14
+ javascripts_root_path = Rails.root.join(*%w(app/assets/javascripts/))
15
+ modules_path = javascripts_root_path.join("modules", '**', '*.{coffee,js}')
16
+
17
+ modules = Dir[modules_path].reject { |f| f =~ /require\.build\.js$/ }.map do |path_with_filename|
18
+ filename = path_with_filename.gsub(/^#{javascripts_root_path}\/?/, '').gsub(/\.coffee$/, '')
19
+ filename = "#{filename}.js" unless File.extname(filename) == ".js"
20
+ filename
21
+ end
22
+
23
+ Rails.application.config.assets.precompile += modules
24
+ end
25
+
26
+ rake_tasks do
27
+ raketask = RequirejsOptimizer::Rake::Task.new
28
+ raketask.define_tasks
29
+ raketask.extend_default_precompile unless ENV['NO_RJS']
30
+ end
31
+
32
+ end
@@ -0,0 +1,50 @@
1
+ require 'zlib'
2
+ require 'rake/tasklib'
3
+
4
+ module RequirejsOptimizer
5
+ class Rake::Task < ::Rake::TaskLib
6
+ include ::Rake::DSL
7
+ include ::RequirejsOptimizer::Rake::Utils
8
+
9
+ attr_accessor :name
10
+
11
+ def initialize(name="requirejs")
12
+ @name = name
13
+ end
14
+
15
+ def define_tasks
16
+ define_task_deeply(name, "Optimize assets using the r.js optimization tool") { default_build.run }
17
+ define_task_deeply("#{name}:nocopy", "Perform optimization but don't copy the files into public/assets") { nocopy_build.run }
18
+ define_task_deeply "#{name}:clean", "Remove the temp build directory (tmp/assets by default)", &Step::Clean.new
19
+ end
20
+
21
+ def extend_default_precompile
22
+ define_task_deeply("assets:precompile:nondigest") { invoke_or_reboot_rake_task @name }
23
+ end
24
+
25
+ private
26
+
27
+ def nocopy_build
28
+ RequirejsOptimizer::Build.new \
29
+ RequirejsOptimizer::Step::Clean,
30
+ RequirejsOptimizer::Step::Prepare,
31
+ RequirejsOptimizer::Step::Optimize,
32
+ RequirejsOptimizer::Step::Digestify,
33
+ RequirejsOptimizer::Step::Compress,
34
+ RequirejsOptimizer::Step::Manifest
35
+ end
36
+
37
+ def default_build
38
+ RequirejsOptimizer::Build.new \
39
+ RequirejsOptimizer::Step::Clean,
40
+ RequirejsOptimizer::Step::Prepare,
41
+ RequirejsOptimizer::Step::Optimize,
42
+ RequirejsOptimizer::Step::Digestify,
43
+ RequirejsOptimizer::Step::Compress,
44
+ RequirejsOptimizer::Step::Manifest,
45
+ RequirejsOptimizer::Step::Finalize
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -0,0 +1,32 @@
1
+ module RequirejsOptimizer
2
+
3
+ module Rake
4
+
5
+ module Utils
6
+
7
+ def define_task_deeply(name, taskdesc="", work_to_do=nil, &block)
8
+ current, *rest = *name.split(":")
9
+
10
+ if rest.any?
11
+ namespace(current) { define_task_deeply rest.join(":"), taskdesc, work_to_do || block }
12
+ else
13
+ desc taskdesc
14
+ task current, &(work_to_do || block)
15
+ end
16
+ end
17
+
18
+ # Not sure if we actually need this or not.
19
+ #
20
+ def invoke_or_reboot_rake_task(task)
21
+ if ENV['RAILS_GROUPS'].to_s.empty? || ENV['RAILS_ENV'].to_s.empty?
22
+ ruby_rake_task task
23
+ else
24
+ ::Rake::Task[task].invoke
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,19 @@
1
+ module RequirejsOptimizer
2
+
3
+ module Step
4
+
5
+ class Base
6
+
7
+ def perform(*)
8
+ raise NotImplementedError
9
+ end
10
+
11
+ def to_proc
12
+ self.method(:perform).to_proc
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,15 @@
1
+ module RequirejsOptimizer
2
+
3
+ module Step
4
+
5
+ class Clean < Base
6
+
7
+ def perform(*)
8
+ FileUtils.rm_rf RequirejsOptimizer.build_dir
9
+ end
10
+
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,21 @@
1
+ module RequirejsOptimizer
2
+
3
+ module Step
4
+
5
+ class Compress < Base
6
+
7
+ def perform(*)
8
+ RequirejsOptimizer.target_files("*.{js,css}").each do |f|
9
+ gzip_file f
10
+ end
11
+ end
12
+
13
+ def gzip_file(path)
14
+ Zlib::GzipWriter.open("#{path}.gz") { |gz| gz.write(File.read(path)) }
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,27 @@
1
+ module RequirejsOptimizer
2
+
3
+ module Step
4
+
5
+ class Digestify < Base
6
+
7
+ def initialize
8
+ Rails.application.initialize!(:assets) unless Rails.application.assets.present?
9
+ end
10
+
11
+ def perform(*)
12
+ RequirejsOptimizer.target_files.each do |f|
13
+ digestify_file f
14
+ end
15
+ end
16
+
17
+ def digestify_file(path)
18
+ digest = Rails.application.assets.file_digest(path).hexdigest
19
+ new_path = path.gsub(/\.([^\.]*)$/) { "-#{digest}.#{$1}" }
20
+ FileUtils.cp(path, new_path)
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,16 @@
1
+ module RequirejsOptimizer
2
+
3
+ module Step
4
+
5
+ class Finalize < Base
6
+
7
+ def perform(*)
8
+ FileUtils.rm_r(Rails.root.join("public/assets"))
9
+ FileUtils.cp_r(RequirejsOptimizer.target_dir.to_s, Rails.root.join("public/assets"))
10
+ end
11
+
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,31 @@
1
+ module RequirejsOptimizer
2
+
3
+ module Step
4
+
5
+ class Manifest < Base
6
+
7
+ def perform(*)
8
+ manifest_entries = RequirejsOptimizer.target_files.map do |f|
9
+ file_is_digestified = f =~ /-[0-9a-f]{32}\./
10
+ manifest_entry_for f if file_is_digestified
11
+ end
12
+ write_manifest manifest_entries.compact.join("\n")
13
+ end
14
+
15
+ private
16
+
17
+ def manifest_entry_for(file_at_path)
18
+ path_to_remove = RequirejsOptimizer.target_dir.to_s.gsub(/(\/)?$/) { $1 || '/' }
19
+ nondigest, digest = file_at_path.gsub(/-[0-9a-f]{32}\./, '.').gsub(/^#{path_to_remove}/, ''), file_at_path.gsub(/^#{path_to_remove}/, '')
20
+ "#{nondigest}: #{digest}"
21
+ end
22
+
23
+ def write_manifest(contents)
24
+ open(RequirejsOptimizer.target_dir.join("manifest.yml"), "w") { |f| f.write contents }
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,26 @@
1
+ module RequirejsOptimizer
2
+
3
+ module Step
4
+
5
+ class Optimize < Base
6
+
7
+ def perform(*)
8
+ raise RequirejsOptimizer::Errors::NodeUnavailable unless node_exists?
9
+ raise RequirejsOptimizer::Errors::RjsOptimizationFailed unless optimize
10
+ end
11
+
12
+ private
13
+
14
+ def optimize
15
+ system("node #{RequirejsOptimizer.root.join 'bin', 'r.js'} -o app/assets/javascripts/modules/require.build.js")
16
+ end
17
+
18
+ def node_exists?
19
+ system("which node 2>&1 > /dev/null")
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,32 @@
1
+ module RequirejsOptimizer
2
+
3
+ module Step
4
+
5
+ class Prepare < Base
6
+
7
+ def perform(*)
8
+ # Copy build directory into place
9
+ FileUtils.cp_r Rails.root.join('public', 'assets').to_s, RequirejsOptimizer.build_dir.to_s
10
+
11
+ remove_gzipped_files
12
+ remove_digestified_files
13
+ end
14
+
15
+ private
16
+
17
+ def remove_gzipped_files
18
+ FileUtils.rm RequirejsOptimizer.build_files("*.gz")
19
+ end
20
+
21
+ def remove_digestified_files
22
+ RequirejsOptimizer.build_files.each do |f|
23
+ file_is_digestified = f =~ /-[0-9a-f]{32}\./
24
+ FileUtils.rm(f) if file_is_digestified
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,3 @@
1
+ module RequirejsOptimizer
2
+ VERSION = "0.0.5"
3
+ end
@@ -0,0 +1,49 @@
1
+ require 'sprockets'
2
+ require 'fileutils'
3
+
4
+ require "requirejs_optimizer/errors"
5
+ require "requirejs_optimizer/step/base"
6
+ require "requirejs_optimizer/step/clean"
7
+ require "requirejs_optimizer/step/compress"
8
+ require "requirejs_optimizer/step/digestify"
9
+ require "requirejs_optimizer/step/finalize"
10
+ require "requirejs_optimizer/step/manifest"
11
+ require "requirejs_optimizer/step/optimize"
12
+ require "requirejs_optimizer/step/prepare"
13
+
14
+ require "requirejs_optimizer/build"
15
+ require "requirejs_optimizer/rake/utils"
16
+ require "requirejs_optimizer/rake/task"
17
+
18
+ require "requirejs_optimizer/version"
19
+
20
+
21
+ module RequirejsOptimizer
22
+
23
+ def self.root
24
+ Pathname.new(File.expand_path("../..", __FILE__))
25
+ end
26
+
27
+ def self.build_dir=(value)
28
+ @build_dir = value
29
+ end
30
+
31
+ def self.build_dir
32
+ Rails.root.join(@build_dir || "tmp/assets")
33
+ end
34
+
35
+ def self.target_dir
36
+ build_dir.join("build")
37
+ end
38
+
39
+ def self.build_files(file_glob="*.*")
40
+ Dir.glob(RequirejsOptimizer.build_dir.join('**', file_glob).to_s).reject { |f| f =~ /manifest\.yml$|build\.txt$/ }
41
+ end
42
+
43
+ def self.target_files(file_glob="*.*")
44
+ Dir.glob(RequirejsOptimizer.target_dir.join('**', file_glob).to_s).reject { |f| f =~ /manifest\.yml$|build\.txt$/ }
45
+ end
46
+
47
+ end
48
+
49
+ require "requirejs_optimizer/railtie" if defined?(Rails)
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/requirejs_optimizer/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Jesse Trimble"]
6
+ gem.email = ["jesseltrimble@gmail.com"]
7
+ gem.description = %q{A tool for optimizing Require.js modules using r.js under the asset pipeline.}
8
+ gem.summary = %q{A tool for optimizing Require.js modules using r.js under the asset pipeline.}
9
+ gem.homepage = ""
10
+
11
+ gem.add_dependency "rails", "~> 3.1"
12
+ gem.add_development_dependency "rspec"
13
+
14
+ gem.files = `git ls-files`.split($\)
15
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
17
+ gem.name = "requirejs_optimizer"
18
+ gem.require_paths = ["lib"]
19
+ gem.version = RequirejsOptimizer::VERSION
20
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Output from `rake -T`" do
4
+
5
+ def rake_t_output
6
+ `cd spec/rails_app && rake -T`
7
+ end
8
+
9
+ it "should include the default requirejs task" do
10
+ rake_t_output.should =~ /requirejs\s/
11
+ end
12
+
13
+ it "should include the clean task" do
14
+ rake_t_output.should =~ /requirejs:clean\s/
15
+ end
16
+
17
+ end
18
+
19
+ describe "the environment post-asset precompilation" do
20
+
21
+ it "has a public/assets directory that's identical in contents and structure to tmp/assets/build" do
22
+ result = `cd spec/rails_app && RAILS_ENV=production rake assets:clean assets:precompile --trace 2>&1`
23
+ $?.exitstatus.should == 0
24
+
25
+ public_files = Dir[Rails.root.join("public/assets/**/*").to_s].map { |f| f.gsub /^#{Rails.root.join("public/assets")}/, '' }
26
+ build_files = Dir[RequirejsOptimizer.target_dir.join("**/*").to_s].map { |f| f.gsub /^#{RequirejsOptimizer.target_dir}/, '' }
27
+
28
+ public_files.should =~ build_files
29
+ end
30
+
31
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ module RequirejsOptimizer
4
+
5
+ module Rake
6
+
7
+ describe Task do
8
+
9
+ subject { Task.new("foo") }
10
+
11
+ describe "#initialize" do
12
+ its(:name) { should == "foo" }
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ module RequirejsOptimizer
4
+
5
+ module Rake
6
+
7
+ describe Utils do
8
+
9
+ describe "#define_task_deeply" do
10
+
11
+ # Since #define_task_deeply recurses to do work, we can't test it with mocks
12
+ # so here we're creating a clean-room scenario with a class that responds
13
+ # to the part of the rake api that #define_task_deeply uses, but
14
+ # implements it differently so we can inspect what it's doing internally.
15
+ #
16
+ # Not the best approach, and definitely not what I consider a unit test,
17
+ # but it gets the job done. Any help here would be appreciated.
18
+ #
19
+ def klass
20
+ Class.new do
21
+
22
+ ####################
23
+ # What we're testing
24
+ include Utils
25
+ ####################
26
+
27
+ # Task assign's it's block to this for inspection
28
+ attr_accessor :task_block
29
+
30
+ # Adds the name it was called with to an array to track
31
+ # namespace calls.
32
+ #
33
+ def namespace(name)
34
+ @names ||= []
35
+ @names << name
36
+ yield if block_given?
37
+ end
38
+
39
+ # Calls #namespace to track the name, then stores the block
40
+ # it was given so we can inspect it from the test
41
+ #
42
+ def task(name, &block)
43
+ namespace(name)
44
+ self.task_block = block
45
+ end
46
+
47
+ # Joins the names we were given on : so we can verify things are
48
+ # recursing correclty.
49
+ #
50
+ def names
51
+ @names.join(":")
52
+ end
53
+
54
+ end
55
+ end
56
+
57
+ subject do
58
+ klass.new.tap { |k| k.stub(:desc) }
59
+ end
60
+
61
+ it "defines namespaces and tasks appropriately" do
62
+ subject.define_task_deeply("foo:bar:baz")
63
+ subject.names.should == "foo:bar:baz"
64
+ end
65
+
66
+ it "passes the given block to :task" do
67
+ expected_block = proc { called! }
68
+ subject.define_task_deeply "foo", &expected_block
69
+ subject.task_block.should == expected_block
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+
78
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ module RequirejsOptimizer
4
+
5
+ module Step
6
+
7
+ describe Clean do
8
+
9
+ describe '#perform' do
10
+
11
+ it 'removes the temporary build directory' do
12
+ RequirejsOptimizer.stub(:build_dir).and_return("foo")
13
+ FileUtils.should_receive(:rm_rf).with('foo')
14
+ Clean.new.perform
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ module RequirejsOptimizer
4
+
5
+ module Step
6
+
7
+ describe Compress do
8
+
9
+ describe "#perform" do
10
+
11
+ it "creates gzipped files for all js/css files" do
12
+ Dir.should_receive(:glob).with(target_path_for("**", "*.{js,css}")).and_return(%w(file.css file-0123456789abcdef0123456789abcdef.css img.png))
13
+ subject.should_receive(:gzip_file).with('file-0123456789abcdef0123456789abcdef.css')
14
+ subject.should_receive(:gzip_file).with('file.css')
15
+ subject.should_receive(:gzip_file).with('img.png')
16
+
17
+ subject.perform
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+
26
+ end