engine-assets 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +10 -0
  3. data/Gemfile.lock +38 -0
  4. data/LICENSE +18 -17
  5. data/RAILS_VERSIONS +5 -0
  6. data/README.md +55 -0
  7. data/Rakefile +253 -26
  8. data/VERSION +1 -1
  9. data/app/controllers/engine_assets/assets_controller.rb +7 -1
  10. data/config/routes.rb +12 -1
  11. data/engine-assets.gemspec +53 -20
  12. data/features/rails.feature +127 -0
  13. data/features/step_definitions/rails_steps.rb +112 -0
  14. data/features/support/env.rb +15 -0
  15. data/features/support/rails.rb +125 -0
  16. data/features/support/terminal.rb +83 -0
  17. data/init.rb +1 -0
  18. data/lib/engine-assets.rb +8 -2
  19. data/lib/engine_assets/engine.rb +3 -0
  20. data/lib/engine_assets/extensions/rails/assets.rb +6 -0
  21. data/lib/engine_assets/public_locator.rb +20 -5
  22. data/spec/{controllers → app/controllers/engine_assets}/javascripts_controller_spec.rb +2 -2
  23. data/spec/{controllers → app/controllers/engine_assets}/stylesheets_controller_spec.rb +2 -2
  24. data/spec/lib/engine-assets_spec.rb +7 -0
  25. data/spec/lib/engine_assets/public_locator_spec.rb +28 -4
  26. data/spec/shared/assets_controller_spec.rb +39 -0
  27. data/spec/shared/assets_routing_spec.rb +59 -0
  28. data/spec/spec.opts +2 -2
  29. data/spec/spec_helper.rb +61 -22
  30. data/spec/support/Gemfile-2.3.5 +7 -0
  31. data/spec/support/Gemfile-2.3.5.lock +38 -0
  32. data/spec/support/Gemfile-2.3.9 +7 -0
  33. data/spec/support/Gemfile-2.3.9.lock +38 -0
  34. data/spec/support/Gemfile-3.0.0 +16 -0
  35. data/spec/support/Gemfile-3.0.0.lock +90 -0
  36. data/spec/support/rails.rb +32 -0
  37. data/spec/support/terminal.rb +54 -0
  38. metadata +123 -25
  39. data/README.rdoc +0 -18
  40. data/TODO.md +0 -4
  41. data/rails/init.rb +0 -7
  42. data/spec/spec_suite.rb +0 -26
  43. data/spec/support/shared/assets_controller_spec.rb +0 -34
  44. data/spec/support/shared/assets_routing_spec.rb +0 -55
@@ -0,0 +1,83 @@
1
+ require 'fileutils'
2
+
3
+ Before do
4
+ @terminal = Terminal.new
5
+ end
6
+
7
+ class Terminal
8
+ attr_reader :output, :status, :result
9
+ attr_accessor :environment_variables
10
+
11
+ def initialize
12
+ @cwd = FileUtils.pwd
13
+ @output = ""
14
+ @result = ""
15
+ @status = 0
16
+ @logger = Logger.new(File.join(TEMP_DIR, 'terminal.log'))
17
+
18
+ @environment_variables = {
19
+ "GEM_HOME" => LOCAL_GEM_ROOT,
20
+ "GEM_PATH" => "#{LOCAL_GEM_ROOT}:#{BUILT_GEM_ROOT}",
21
+ "PATH" => "#{gem_bin_path}:#{ENV['PATH']}"
22
+ }
23
+ end
24
+
25
+ def cd(directory)
26
+ @cwd = directory
27
+ end
28
+
29
+ def run(command)
30
+ @output = "#{command}\n"
31
+
32
+ FileUtils.cd(@cwd) do
33
+ cmdline = "#{environment_settings} #{command} 2>&1"
34
+ logger.debug(cmdline)
35
+ result = `#{cmdline}`
36
+ logger.debug(result)
37
+ output << result
38
+ @result = clean(result)
39
+ end
40
+
41
+ @status = $?
42
+ end
43
+
44
+ def clean(content)
45
+ content.split("\n").reject { |line| line.match('deprecated') }.join("\n")
46
+ end
47
+
48
+ def echo(string)
49
+ logger.debug(string)
50
+ end
51
+
52
+ def build_and_install(gemspec)
53
+ pkg_dir = File.join(TEMP_DIR, 'pkg')
54
+ FileUtils.mkdir_p(pkg_dir)
55
+
56
+ output = `gem build #{gemspec} 2>&1`
57
+ gem_file = Dir.glob("*.gem").first
58
+ unless gem_file
59
+ raise "Gem didn't build:\n#{output}"
60
+ end
61
+
62
+ target = File.join(pkg_dir, gem_file)
63
+ FileUtils.mv(gem_file, target)
64
+ install_to(BUILT_GEM_ROOT, target)
65
+ end
66
+
67
+
68
+ private
69
+
70
+ def install_to(root, gem)
71
+ `gem install -i #{root} --no-ri --no-rdoc #{gem}` # textmate!! `
72
+ end
73
+
74
+ def environment_settings
75
+ @environment_variables.map { |key, value| "#{key}=#{value}" }.join(' ')
76
+ end
77
+
78
+ def gem_bin_path
79
+ File.join(LOCAL_GEM_ROOT, "bin")
80
+ end
81
+
82
+ attr_reader :logger
83
+ end
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'engine-assets'
data/lib/engine-assets.rb CHANGED
@@ -1,5 +1,11 @@
1
- module EngineAssets ; end
1
+ module EngineAssets
2
+ class << self
3
+ def version
4
+ IO.read(File.join(File.dirname(__FILE__), '..', 'VERSION')).strip
5
+ end
6
+ end
7
+ end
2
8
 
3
- require 'action_view' unless defined?(Railss)
9
+ require 'engine_assets/engine' if defined?(Rails) && Rails::VERSION::MAJOR == 3
4
10
  require 'engine_assets/public_locator'
5
11
  require 'engine_assets/extensions/rails/assets'
@@ -0,0 +1,3 @@
1
+ require 'rails' unless defined?(Rails)
2
+
3
+ class EngineAssets::Engine < Rails::Engine ; end
@@ -1,3 +1,9 @@
1
+ # TODO:
2
+ # * find a mechanism to do this without monkey-patching Rails
3
+ # * add an autoload option to load all from plugins, or similar
4
+ # * allow engines to indicate (automatically when #register is called?)
5
+ # which assets to include.
6
+
1
7
  module ActionView::Helpers::AssetTagHelper
2
8
  def expand_javascript_sources_with_engine_assets(sources, recursive = false)
3
9
  if sources.include?(:all)
@@ -2,20 +2,35 @@ class EngineAssets::PublicLocator
2
2
  class << self
3
3
  attr_reader :paths
4
4
 
5
+ # TODO: expose this as EngineAssets.register(...)
5
6
  def register(full_path)
6
- @paths ||= []
7
+ raise ArgumentError unless File.exist?(full_path)
7
8
 
9
+ @paths ||= []
8
10
  public_path = File.join(full_path, 'public')
9
- File.open(public_path) {}
10
11
 
11
- paths << public_path
12
+ if File.exist?(public_path)
13
+ # TODO:
14
+ # * spec me
15
+ # * split me into separate implementations
16
+
17
+ if defined?(Rails) && Rails::VERSION::MAJOR == 3
18
+ # Rails 3
19
+ Rails.configuration.middleware.use ::ActionDispatch::Static, public_path
20
+ else
21
+ # Rails 2
22
+ paths << public_path
23
+ end
24
+ end
12
25
  end
13
26
 
14
27
  def locate(file_path)
15
- full_paths = paths.map { |base_path| File.join(base_path, file_path) }
28
+ full_paths = (paths || []).map { |base_path| File.join(base_path, file_path) }
29
+
16
30
  full_paths.each do |full_path|
17
31
  return full_path if File.exist?(full_path)
18
32
  end
33
+
19
34
  nil
20
35
  end
21
36
 
@@ -23,7 +38,7 @@ class EngineAssets::PublicLocator
23
38
  private
24
39
 
25
40
  def clear
26
- @paths = []
41
+ @paths = nil
27
42
  end
28
43
  end
29
44
  end
@@ -1,6 +1,6 @@
1
- require 'spec_helper'
1
+ require 'spec/spec_helper'
2
2
 
3
- describe EngineAssets::JavascriptsController do
3
+ describe EngineAssets::JavascriptsController, :type => :controller do
4
4
  before do
5
5
  @format = 'js'
6
6
  end
@@ -1,6 +1,6 @@
1
- require 'spec_helper'
1
+ require 'spec/spec_helper'
2
2
 
3
- describe EngineAssets::StylesheetsController do
3
+ describe EngineAssets::StylesheetsController, :type => :controller do
4
4
  before do
5
5
  @format = 'css'
6
6
  end
@@ -0,0 +1,7 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe EngineAssets do
4
+ it "is defined" do
5
+ EngineAssets.should be_a(Module)
6
+ end
7
+ end
@@ -5,7 +5,7 @@ describe EngineAssets::PublicLocator do
5
5
 
6
6
  before do
7
7
  @base_path = File.join('fixtures', 'public')
8
- @full_path = File.join(basedir, 'spec', 'support', 'fixtures')
8
+ @full_path = File.join(SPEC_DIR, 'support', 'fixtures')
9
9
  @find_path = '/javascripts/dual.js'
10
10
  @miss_path = '/javascripts/miss.js'
11
11
 
@@ -18,16 +18,30 @@ describe EngineAssets::PublicLocator do
18
18
  it "raises an exception" do
19
19
  lambda {
20
20
  EngineAssets::PublicLocator.register('bogus')
21
- }.should raise_error(Errno::ENOENT)
21
+ }.should raise_error(ArgumentError)
22
22
  end
23
23
  end
24
24
 
25
25
  context "when the suggest path does not contain a 'public' directory" do
26
- it "raises an exception" do
26
+ before do
27
+ EngineAssets::PublicLocator.send(:clear)
28
+ end
29
+
30
+ it "does not raise an exception" do
27
31
  lambda {
28
32
  EngineAssets::PublicLocator.register(File.dirname(__FILE__))
29
- }.should raise_error(Errno::ENOENT)
33
+ }.should_not raise_error
30
34
  end
35
+
36
+ it "does not add the path" do
37
+ EngineAssets::PublicLocator.register(File.dirname(__FILE__))
38
+ EngineAssets::PublicLocator.paths.should be_empty
39
+ end
40
+ # it "raises an exception" do
41
+ # lambda {
42
+ # EngineAssets::PublicLocator.register(File.dirname(__FILE__))
43
+ # }.should raise_error(Errno::ENOENT)
44
+ # end
31
45
  end
32
46
 
33
47
  context "when the suggest path is valid" do
@@ -49,5 +63,15 @@ describe EngineAssets::PublicLocator do
49
63
  EngineAssets::PublicLocator.locate(miss_path).should be_nil
50
64
  end
51
65
  end
66
+
67
+ context "when no asset-providing engines have registered" do
68
+ before do
69
+ EngineAssets::PublicLocator.send(:clear)
70
+ end
71
+
72
+ it "returns nil" do
73
+ EngineAssets::PublicLocator.locate(miss_path).should be_nil
74
+ end
75
+ end
52
76
  end
53
77
  end
@@ -0,0 +1,39 @@
1
+ require 'spec/spec_helper'
2
+
3
+ begin
4
+ shared_examples_for "A controller acting as an AssetsController" do
5
+ # describe "A controller acting as an AssetsController", :shared => true do
6
+ attr_reader :format
7
+
8
+ integrate_views
9
+
10
+ before do
11
+ load_view_fixtures(@controller.class)
12
+ end
13
+
14
+ describe "response" do
15
+ context "with a matching file found in 'public'" do
16
+ it "renders that file" do
17
+ get :show, :path => 'dual', :format => format
18
+ response.body.should match("dual.#{format}, should be rendered")
19
+ end
20
+ end
21
+
22
+ context "with a matching file found in 'app'" do
23
+ it "renders that file" do
24
+ get :show, :path => 'solo', :format => format
25
+ response.body.should match("solo.#{format}.erb, should be rendered")
26
+ end
27
+ end
28
+
29
+ context "without a matching file" do
30
+ it "renders 404" do
31
+ get :show, :path => 'none', :format => format
32
+ response.response_code.should == 404
33
+ end
34
+ end
35
+ end
36
+ end
37
+ rescue ArgumentError
38
+ puts "WARNING: #{__FILE__}:#{__LINE__} trying to load this file twice, for some reason"
39
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec/spec_helper'
2
+
3
+ begin
4
+ shared_examples_for "A controller routed as an AssetsController" do
5
+ # describe "A controller routed as an AssetsController", :shared => true do
6
+ attr_reader :prefix, :format
7
+
8
+ describe "routing" do
9
+ attr_reader :path, :route
10
+
11
+ context "given a simple path" do
12
+ before do
13
+ @path = "/#{prefix}/asset.#{format}"
14
+ @route = { :controller => "engine_assets/#{prefix}", :action => 'show', :path => 'asset', :format => format }
15
+ end
16
+
17
+ it "recognizes the path" do
18
+ params_from(:get, path).should == route
19
+ end
20
+
21
+ it "generates the path from a URL helper" do
22
+ send("#{prefix}_path", :asset, :format => format).should == path
23
+ end
24
+ end
25
+
26
+ context "given a complex path of nested directories" do
27
+ before do
28
+ @path = "/#{prefix}/path/to/asset.#{format}"
29
+ @route = { :controller => "engine_assets/#{prefix}", :action => 'show', :path => 'path/to/asset', :format => format }
30
+ end
31
+
32
+ it "recognizes the path" do
33
+ params_from(:get, path).should == route
34
+ end
35
+
36
+ it "generates the path from a URL helper" do
37
+ CGI.unescape(send("#{prefix}_path", 'path/to/asset', :format => format)).should == CGI.unescape(path)
38
+ end
39
+ end
40
+
41
+ context "given a complex path of dotted components" do
42
+ before do
43
+ @path = "/#{prefix}/path.to/asset.one.#{format}"
44
+ @route = { :controller => "engine_assets/#{prefix}", :action => 'show', :path => 'path.to/asset.one', :format => format }
45
+ end
46
+
47
+ it "recognizes the path" do
48
+ params_from(:get, path).should == route
49
+ end
50
+
51
+ it "generates the path from a URL helper" do
52
+ CGI.unescape(send("#{prefix}_path", 'path.to/asset.one', :format => format)).should == CGI.unescape(path)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ rescue ArgumentError
58
+ puts "WARNING: #{__FILE__}:#{__LINE__} trying to load this file twice, for some reason"
59
+ end
data/spec/spec.opts CHANGED
@@ -1,4 +1,4 @@
1
1
  --colour
2
- --loadby
3
- mtime
2
+ --format progress
3
+ --loadby mtime
4
4
  --backtrace
data/spec/spec_helper.rb CHANGED
@@ -1,35 +1,74 @@
1
- unless defined?(RAILS_PATH)
2
- RAILS_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'vanilla'))
1
+ require 'rubygems'
3
2
 
4
- dir = File.dirname(__FILE__)
5
- $LOAD_PATH.unshift(dir)
3
+ unless defined?(PROJECT_ROOT)
4
+ PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')).freeze
5
+ SPEC_DIR = File.join(PROJECT_ROOT, 'spec').freeze
6
+ TEMP_DIR = File.join(PROJECT_ROOT, 'tmp').freeze
7
+ BUILT_GEM_ROOT = File.join(TEMP_DIR, 'built_gems').freeze
8
+ LOCAL_GEM_ROOT = File.join(TEMP_DIR, 'local_gems').freeze
9
+ WEBAPP_ROOT = File.join(TEMP_DIR, 'rails_root').freeze
10
+ end
6
11
 
7
- def require_files(*segments)
8
- Dir[File.expand_path(File.join(*segments))].each { |file| require file }
9
- end
12
+ Dir[File.join(SPEC_DIR, 'support', '**', '*.rb')].each { |f| require f }
10
13
 
11
- ENV["RAILS_ENV"] = "test"
14
+ unless @webapp
15
+ ENV["RAILS_ENV"] ||= 'test'
12
16
 
13
- require "#{File.join(RAILS_PATH, 'config', 'environment')}"
14
- require "#{File.join(File.dirname(__FILE__), '..', 'lib', 'engine-assets')}"
15
- require "#{File.join(File.dirname(__FILE__), '..', 'app', 'controllers', 'engine_assets', 'assets_controller.rb')}"
16
- require "#{File.join(File.dirname(__FILE__), '..', 'app', 'controllers', 'engine_assets', 'javascripts_controller.rb')}"
17
- require "#{File.join(File.dirname(__FILE__), '..', 'app', 'controllers', 'engine_assets', 'stylesheets_controller.rb')}"
18
- require 'spec/autorun'
19
- require 'spec/rails'
17
+ @webapp = Support::Rails.new(ENV['RAILS_VERSION'])
18
+ @webapp.build
19
+ @webapp.setup
20
+ end
21
+
22
+ require 'lib/engine-assets'
23
+ %w(app config).each do |dir|
24
+ Dir[File.join(PROJECT_ROOT, dir, '**', '*.rb')].each { |f| require f }
25
+ end
26
+
27
+ Dir[File.join(SPEC_DIR, 'shared', '**', '*.rb')].each { |f| require f }
20
28
 
21
- require_files(dir, 'support', '**', '*.rb')
29
+ begin
30
+ # RSpec 1.3 (Rails 2)
31
+ require 'spec/rails'
32
+ require 'spec/autorun'
33
+ require 'rr'
22
34
 
23
35
  Spec::Runner.configure do |config|
24
36
  include Support::Helpers
25
37
 
26
- config.fixture_path = "#{File.dirname(__FILE__)}/../spec/support/fixtures"
38
+ config.fixture_path = File.join(SPEC_DIR, 'support', 'fixtures')
27
39
  config.mock_with :rr
28
- config.use_transactional_fixtures = true
29
- config.use_instantiated_fixtures = false
40
+ end
41
+ rescue LoadError
42
+ # RSpec 2.0 (Rails 3)
43
+ require 'rspec'
44
+ require 'rspec/rails'
45
+ require 'rr'
46
+
47
+ RSpec.configure do |config|
48
+ include Support::Helpers
30
49
 
31
- def basedir
32
- @basedir ||= "#{File.expand_path(File.join(File.dirname(__FILE__), '..'))}"
33
- end
50
+ # config.fixture_path = File.join(SPEC_DIR, 'support', 'fixtures')
51
+ config.mock_framework = :rr
34
52
  end
35
53
  end
54
+
55
+
56
+
57
+ # begin
58
+ # # RSpec 1.3 (Rails 2)
59
+ # require 'spec/rails'
60
+ # require 'spec/autorun'
61
+ # rescue LoadError
62
+ # # RSpec 2.0 (Rails 3)
63
+ # require 'rspec'
64
+ # require 'rspec/rails'
65
+ # end
66
+ #
67
+ # Dir[File.join(SPEC_DIR, 'shared', '**', '*.rb')].each { |f| require f }
68
+ #
69
+ # Spec::Runner.configure do |config|
70
+ # include Support::Helpers
71
+ #
72
+ # config.fixture_path = File.join(SPEC_DIR, 'support', 'fixtures')
73
+ # config.mock_with :rr
74
+ # end