requirejs_optimizer 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +21 -0
- data/.rspec +1 -0
- data/.travis.yml +12 -0
- data/Gemfile +17 -0
- data/LICENSE +22 -0
- data/README.md +135 -0
- data/Rakefile +17 -0
- data/bin/r.js +9822 -0
- data/lib/generators/install_generator.rb +26 -0
- data/lib/generators/templates/README +8 -0
- data/lib/generators/templates/main.js.coffee +3 -0
- data/lib/generators/templates/require.build.js +6 -0
- data/lib/requirejs_optimizer/build.rb +21 -0
- data/lib/requirejs_optimizer/errors.rb +21 -0
- data/lib/requirejs_optimizer/railtie.rb +32 -0
- data/lib/requirejs_optimizer/rake/task.rb +50 -0
- data/lib/requirejs_optimizer/rake/utils.rb +32 -0
- data/lib/requirejs_optimizer/step/base.rb +19 -0
- data/lib/requirejs_optimizer/step/clean.rb +15 -0
- data/lib/requirejs_optimizer/step/compress.rb +21 -0
- data/lib/requirejs_optimizer/step/digestify.rb +27 -0
- data/lib/requirejs_optimizer/step/finalize.rb +16 -0
- data/lib/requirejs_optimizer/step/manifest.rb +31 -0
- data/lib/requirejs_optimizer/step/optimize.rb +26 -0
- data/lib/requirejs_optimizer/step/prepare.rb +32 -0
- data/lib/requirejs_optimizer/version.rb +3 -0
- data/lib/requirejs_optimizer.rb +49 -0
- data/requirejs_optimizer.gemspec +20 -0
- data/spec/integrations/rake_task_spec.rb +31 -0
- data/spec/lib/requirejs_optimizer/rake/task_spec.rb +19 -0
- data/spec/lib/requirejs_optimizer/rake/utils_spec.rb +78 -0
- data/spec/lib/requirejs_optimizer/step/clean_spec.rb +23 -0
- data/spec/lib/requirejs_optimizer/step/compress_spec.rb +26 -0
- data/spec/lib/requirejs_optimizer/step/digestify_spec.rb +70 -0
- data/spec/lib/requirejs_optimizer/step/finalize_spec.rb +33 -0
- data/spec/lib/requirejs_optimizer/step/manifest_spec.rb +37 -0
- data/spec/lib/requirejs_optimizer/step/optimize_spec.rb +42 -0
- data/spec/lib/requirejs_optimizer/step/prepare_spec.rb +53 -0
- data/spec/lib/requirejs_optimizer_spec.rb +24 -0
- data/spec/rails_app/.gitignore +15 -0
- data/spec/rails_app/README.rdoc +261 -0
- data/spec/rails_app/Rakefile +7 -0
- data/spec/rails_app/app/assets/images/rails.png +0 -0
- data/spec/rails_app/app/assets/javascripts/application.js +15 -0
- data/spec/rails_app/app/assets/javascripts/modules/bar/two.coffee +2 -0
- data/spec/rails_app/app/assets/javascripts/modules/baz/three.coffee +2 -0
- data/spec/rails_app/app/assets/javascripts/modules/foo/one.coffee +2 -0
- data/spec/rails_app/app/assets/javascripts/modules/main.coffee +1 -0
- data/spec/rails_app/app/assets/javascripts/modules/require.build.js +6 -0
- data/spec/rails_app/app/assets/stylesheets/application.css +13 -0
- data/spec/rails_app/app/controllers/application_controller.rb +3 -0
- data/spec/rails_app/app/helpers/application_helper.rb +2 -0
- data/spec/rails_app/app/mailers/.gitkeep +0 -0
- data/spec/rails_app/app/models/.gitkeep +0 -0
- data/spec/rails_app/app/views/layouts/application.html.erb +14 -0
- data/spec/rails_app/config/application.rb +59 -0
- data/spec/rails_app/config/boot.rb +7 -0
- data/spec/rails_app/config/database.yml +25 -0
- data/spec/rails_app/config/environment.rb +5 -0
- data/spec/rails_app/config/environments/development.rb +37 -0
- data/spec/rails_app/config/environments/production.rb +67 -0
- data/spec/rails_app/config/environments/test.rb +37 -0
- data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/rails_app/config/initializers/inflections.rb +15 -0
- data/spec/rails_app/config/initializers/mime_types.rb +5 -0
- data/spec/rails_app/config/initializers/secret_token.rb +7 -0
- data/spec/rails_app/config/initializers/session_store.rb +8 -0
- data/spec/rails_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/rails_app/config/locales/en.yml +5 -0
- data/spec/rails_app/config/routes.rb +58 -0
- data/spec/rails_app/config.ru +4 -0
- data/spec/rails_app/db/seeds.rb +7 -0
- data/spec/rails_app/lib/assets/.gitkeep +0 -0
- data/spec/rails_app/lib/tasks/.gitkeep +0 -0
- data/spec/rails_app/log/.gitkeep +0 -0
- data/spec/rails_app/public/404.html +26 -0
- data/spec/rails_app/public/422.html +26 -0
- data/spec/rails_app/public/500.html +25 -0
- data/spec/rails_app/public/favicon.ico +0 -0
- data/spec/rails_app/public/index.html +241 -0
- data/spec/rails_app/public/robots.txt +5 -0
- data/spec/rails_app/script/rails +6 -0
- data/spec/rails_app/test/fixtures/.gitkeep +0 -0
- data/spec/rails_app/test/functional/.gitkeep +0 -0
- data/spec/rails_app/test/integration/.gitkeep +0 -0
- data/spec/rails_app/test/performance/browsing_test.rb +12 -0
- data/spec/rails_app/test/test_helper.rb +13 -0
- data/spec/rails_app/test/unit/.gitkeep +0 -0
- data/spec/rails_app/vendor/assets/javascripts/.gitkeep +0 -0
- data/spec/rails_app/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/rails_app/vendor/plugins/.gitkeep +0 -0
- data/spec/spec_helper.rb +12 -0
- 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,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,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,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,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
|