engine-assets 0.4.2 → 0.5.0

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