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