requirejs_optimizer 0.0.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.
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