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
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.5.0
@@ -1,4 +1,4 @@
1
- class EngineAssets::AssetsController < ActionController::Base
1
+ class EngineAssets::AssetsController < ApplicationController
2
2
  layout nil
3
3
  before_filter :expire, :set_headers
4
4
  after_filter :cache
@@ -6,9 +6,15 @@ class EngineAssets::AssetsController < ActionController::Base
6
6
  def show
7
7
  flat_file = EngineAssets::PublicLocator.locate(File.join(controller_name, [params[:path], params[:format]].join('.')))
8
8
  if(flat_file)
9
+ # TODO: consider sending IO, rather than rendering
9
10
  render(:file => flat_file)
10
11
  else
11
12
  begin
13
+ # TODO:
14
+ # * consider removing the engine_assets dir to get:
15
+ # /javascripts/path/file.js.erb
16
+ # * consider (resourceful):
17
+ # /path/file.js.erb
12
18
  render(:template => File.join('engine_assets', controller_name, params[:path]), :layout => false)
13
19
  rescue ActionView::MissingTemplate
14
20
  head :not_found
data/config/routes.rb CHANGED
@@ -3,7 +3,18 @@ ActionController::Routing::Routes.draw do |map|
3
3
  map.send(type, "#{type}/:path.:format", {
4
4
  :controller => "engine_assets/#{type}",
5
5
  :action => :show,
6
- :path => /[A-Za-z0-9\/._-]+?/ # e.g., path/to/file.ext
6
+ :path => /[A-Za-z0-9\/._-]+?/ # e.g., javascripts/path/file.js
7
7
  })
8
8
  end
9
9
  end
10
+
11
+ # TODO: consider the following for Rails 3 (the abover works for now):
12
+ # Rails.application.routes.draw do |map|
13
+ # [:javascripts, :stylesheets].each do |type|
14
+ # match "#{type}/:path" => "engine_assets/#{type}#show",
15
+ # :as => type,
16
+ # :constraints => {
17
+ # :path => /[A-Za-z0-9\/._-]+\.(css|js)$/
18
+ # }
19
+ # end
20
+ # end
@@ -1,46 +1,62 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{engine-assets}
8
- s.version = "0.4.2"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Corey Innis"]
12
- s.date = %q{2010-08-11}
12
+ s.date = %q{2010-09-17}
13
13
  s.description = %q{A Rails Engine, which enables Rails Engines to provide assets (javascript, css and images)}
14
14
  s.email = %q{support@coolerator.net}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
- "README.rdoc"
17
+ "README.md"
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
21
  ".gitignore",
22
+ "Gemfile",
23
+ "Gemfile.lock",
22
24
  "LICENSE",
23
- "README.rdoc",
25
+ "RAILS_VERSIONS",
26
+ "README.md",
24
27
  "Rakefile",
25
- "TODO.md",
26
28
  "VERSION",
27
29
  "app/controllers/engine_assets/assets_controller.rb",
28
30
  "app/controllers/engine_assets/javascripts_controller.rb",
29
31
  "app/controllers/engine_assets/stylesheets_controller.rb",
30
32
  "config/routes.rb",
31
33
  "engine-assets.gemspec",
34
+ "features/rails.feature",
35
+ "features/step_definitions/rails_steps.rb",
36
+ "features/support/env.rb",
37
+ "features/support/rails.rb",
38
+ "features/support/terminal.rb",
39
+ "init.rb",
32
40
  "lib/engine-assets.rb",
41
+ "lib/engine_assets/engine.rb",
33
42
  "lib/engine_assets/extensions/rails/assets.rb",
34
43
  "lib/engine_assets/public_locator.rb",
35
- "rails/init.rb",
36
- "spec/controllers/javascripts_controller_spec.rb",
37
- "spec/controllers/stylesheets_controller_spec.rb",
44
+ "spec/app/controllers/engine_assets/javascripts_controller_spec.rb",
45
+ "spec/app/controllers/engine_assets/stylesheets_controller_spec.rb",
46
+ "spec/lib/engine-assets_spec.rb",
38
47
  "spec/lib/engine_assets/public_locator_spec.rb",
39
48
  "spec/routing/javascripts_routing_spec.rb",
40
49
  "spec/routing/stylesheets_routing_spec.rb",
50
+ "spec/shared/assets_controller_spec.rb",
51
+ "spec/shared/assets_routing_spec.rb",
41
52
  "spec/spec.opts",
42
53
  "spec/spec_helper.rb",
43
- "spec/spec_suite.rb",
54
+ "spec/support/Gemfile-2.3.5",
55
+ "spec/support/Gemfile-2.3.5.lock",
56
+ "spec/support/Gemfile-2.3.9",
57
+ "spec/support/Gemfile-2.3.9.lock",
58
+ "spec/support/Gemfile-3.0.0",
59
+ "spec/support/Gemfile-3.0.0.lock",
44
60
  "spec/support/fixtures/app/views/engine_assets/javascripts/dual.js.erb",
45
61
  "spec/support/fixtures/app/views/engine_assets/javascripts/solo.js.erb",
46
62
  "spec/support/fixtures/app/views/engine_assets/stylesheets/dual.css.erb",
@@ -49,8 +65,8 @@ Gem::Specification.new do |s|
49
65
  "spec/support/fixtures/public/stylesheets/dual.css",
50
66
  "spec/support/helpers/fixture_helper.rb",
51
67
  "spec/support/helpers/textmate_helper.rb",
52
- "spec/support/shared/assets_controller_spec.rb",
53
- "spec/support/shared/assets_routing_spec.rb"
68
+ "spec/support/rails.rb",
69
+ "spec/support/terminal.rb"
54
70
  ]
55
71
  s.homepage = %q{http://github.com/coreyti/engine-assets}
56
72
  s.rdoc_options = ["--charset=UTF-8"]
@@ -58,17 +74,19 @@ Gem::Specification.new do |s|
58
74
  s.rubygems_version = %q{1.3.7}
59
75
  s.summary = %q{Rails Engines with assets.}
60
76
  s.test_files = [
61
- "spec/controllers/javascripts_controller_spec.rb",
62
- "spec/controllers/stylesheets_controller_spec.rb",
77
+ "spec/app/controllers/engine_assets/javascripts_controller_spec.rb",
78
+ "spec/app/controllers/engine_assets/stylesheets_controller_spec.rb",
79
+ "spec/lib/engine-assets_spec.rb",
63
80
  "spec/lib/engine_assets/public_locator_spec.rb",
64
81
  "spec/routing/javascripts_routing_spec.rb",
65
82
  "spec/routing/stylesheets_routing_spec.rb",
83
+ "spec/shared/assets_controller_spec.rb",
84
+ "spec/shared/assets_routing_spec.rb",
66
85
  "spec/spec_helper.rb",
67
- "spec/spec_suite.rb",
68
86
  "spec/support/helpers/fixture_helper.rb",
69
87
  "spec/support/helpers/textmate_helper.rb",
70
- "spec/support/shared/assets_controller_spec.rb",
71
- "spec/support/shared/assets_routing_spec.rb"
88
+ "spec/support/rails.rb",
89
+ "spec/support/terminal.rb"
72
90
  ]
73
91
 
74
92
  if s.respond_to? :specification_version then
@@ -76,12 +94,27 @@ Gem::Specification.new do |s|
76
94
  s.specification_version = 3
77
95
 
78
96
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
79
- s.add_development_dependency(%q<rspec>, [">= 1.2.8"])
97
+ s.add_development_dependency(%q<cucumber>, ["~> 0.8.5"])
98
+ s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
99
+ s.add_development_dependency(%q<rr>, ["~> 1.0.0"])
100
+ s.add_development_dependency(%q<rspec>, ["~> 1.3.0"])
101
+ s.add_development_dependency(%q<jeweler>, ["~> 1.4.0"])
102
+ s.add_development_dependency(%q<term-ansicolor>, ["~> 1.0.5"])
80
103
  else
81
- s.add_dependency(%q<rspec>, [">= 1.2.8"])
104
+ s.add_dependency(%q<cucumber>, ["~> 0.8.5"])
105
+ s.add_dependency(%q<rake>, ["~> 0.8.7"])
106
+ s.add_dependency(%q<rr>, ["~> 1.0.0"])
107
+ s.add_dependency(%q<rspec>, ["~> 1.3.0"])
108
+ s.add_dependency(%q<jeweler>, ["~> 1.4.0"])
109
+ s.add_dependency(%q<term-ansicolor>, ["~> 1.0.5"])
82
110
  end
83
111
  else
84
- s.add_dependency(%q<rspec>, [">= 1.2.8"])
112
+ s.add_dependency(%q<cucumber>, ["~> 0.8.5"])
113
+ s.add_dependency(%q<rake>, ["~> 0.8.7"])
114
+ s.add_dependency(%q<rr>, ["~> 1.0.0"])
115
+ s.add_dependency(%q<rspec>, ["~> 1.3.0"])
116
+ s.add_dependency(%q<jeweler>, ["~> 1.4.0"])
117
+ s.add_dependency(%q<term-ansicolor>, ["~> 1.0.5"])
85
118
  end
86
119
  end
87
120
 
@@ -0,0 +1,127 @@
1
+ Feature: Install this Gem in a Rails application
2
+
3
+ Background:
4
+ Given I have built and installed the "engine-assets" gem
5
+
6
+ Scenario: Use the gem un-vendored in a Rails application
7
+ When I generate a new Rails application
8
+ And I configure my application to require the "engine-assets" gem
9
+ And I check the configured gem version
10
+ Then I should see "Current version: 0.5.0"
11
+
12
+ Scenario: Send a request for an application-host dynamic asset
13
+ When I generate a new Rails application
14
+ And I configure my application to require the "engine-assets" gem
15
+ And I save the following as "app/views/engine_assets/javascripts/example.js.erb"
16
+ """
17
+ // example.js (application - <%= "dynamic" -%>)
18
+ """
19
+ And I perform a request to "http://example.com:1234/javascripts/example.js"
20
+ Then I should receive a response matching the following:
21
+ | 200 | // example.js (application - dynamic) |
22
+
23
+ Scenario: Send a request for an engine-hosted static asset
24
+ When I generate a new Rails application
25
+ And I configure my application to require the "engine-assets" gem
26
+ And I generate a new "example_plugin" plugin
27
+ And I save the following as "vendor/plugins/example_plugin/init.rb"
28
+ """
29
+ require 'engine-assets'
30
+ EngineAssets::PublicLocator.register(File.join(File.dirname(__FILE__)))
31
+ """
32
+ And I save the following as "vendor/plugins/example_plugin/public/javascripts/example.js"
33
+ """
34
+ // example.js (plugin - static)
35
+ """
36
+ And I perform a request to "http://example.com:1234/javascripts/example.js"
37
+ Then I should receive a response matching the following:
38
+ | 200 | // example.js (plugin - static) |
39
+
40
+ Scenario: Send a request for an engine-hosted dynamic asset
41
+ When I generate a new Rails application
42
+ And I configure my application to require the "engine-assets" gem
43
+ And I generate a new "example_plugin" plugin
44
+ And I save the following as "vendor/plugins/example_plugin/init.rb"
45
+ """
46
+ require 'engine-assets'
47
+ EngineAssets::PublicLocator.register(File.join(File.dirname(__FILE__)))
48
+ """
49
+ And I save the following as "vendor/plugins/example_plugin/app/views/engine_assets/javascripts/example.js.erb"
50
+ """
51
+ // example.js (plugin - dynamic)
52
+ """
53
+ And I perform a request to "http://example.com:1234/javascripts/example.js"
54
+ Then I should receive a response matching the following:
55
+ | 200 | // example.js (plugin - dynamic) |
56
+
57
+ Scenario: Send a development request for an application webpage which references an engine-hosted asset
58
+ When I generate a new Rails application
59
+ And I configure my application to require the "engine-assets" gem
60
+ And I configure my application to run in the "development" environment
61
+ And I save the following as "config/initializers/assets.rb"
62
+ """
63
+ ActionView::Helpers::AssetTagHelper.register_javascript_expansion :defaults => [
64
+ 'example.js'
65
+ ]
66
+ """
67
+ And I generate a new "example" scaffold
68
+ And I save the following as "app/views/layouts/examples.html.erb"
69
+ """
70
+ <html>
71
+ <head>
72
+ <%= javascript_include_tag :all, :cache => true, :recursive => true -%>
73
+ </head>
74
+ <body></body>
75
+ </html>
76
+ """
77
+ And I generate a new "example_plugin" plugin
78
+ And I save the following as "vendor/plugins/example_plugin/init.rb"
79
+ """
80
+ require 'engine-assets'
81
+ EngineAssets::PublicLocator.register(File.join(File.dirname(__FILE__)))
82
+ """
83
+ And I save the following as "vendor/plugins/example_plugin/public/javascripts/example.js"
84
+ """
85
+ // example.js content
86
+ """
87
+ And I perform a request to "http://example.com:1234/examples"
88
+ Then I should receive a response matching the following:
89
+ | 200 | /javascripts/example.js |
90
+
91
+ Scenario: Send a production request for an application webpage which references an engine-hosted asset
92
+ When I generate a new Rails application
93
+ And I configure my application to require the "engine-assets" gem
94
+ And I configure my application to run in the "production" environment
95
+ And I save the following as "config/initializers/assets.rb"
96
+ """
97
+ ActionView::Helpers::AssetTagHelper.register_javascript_expansion :defaults => [
98
+ 'example.js'
99
+ ]
100
+ """
101
+ And I generate a new "example" scaffold
102
+ And I save the following as "app/views/layouts/examples.html.erb"
103
+ """
104
+ <html>
105
+ <head>
106
+ <%= javascript_include_tag :all, :cache => true, :recursive => true -%>
107
+ </head>
108
+ <body></body>
109
+ </html>
110
+ """
111
+ And I generate a new "example_plugin" plugin
112
+ And I save the following as "vendor/plugins/example_plugin/init.rb"
113
+ """
114
+ require 'engine-assets'
115
+ EngineAssets::PublicLocator.register(File.join(File.dirname(__FILE__)))
116
+ """
117
+ And I save the following as "vendor/plugins/example_plugin/public/javascripts/example.js"
118
+ """
119
+ // example.js content
120
+ """
121
+ And I perform a request to "http://example.com:1234/examples"
122
+ Then I should receive a response matching the following:
123
+ | 200 | /javascripts/all.js |
124
+ And The first line of the "public/javascripts/all.js" file should be
125
+ """
126
+ // example.js content
127
+ """
@@ -0,0 +1,112 @@
1
+ Given /^I have built and installed the "([^"]*)" gem$/ do |gem_name|
2
+ @terminal.build_and_install(File.join(PROJECT_ROOT, "#{gem_name}.gemspec"))
3
+ end
4
+
5
+ When /^I generate a new Rails application$/ do
6
+ @terminal.cd(TEMP_DIR)
7
+
8
+ version = ENV['RAILS_VERSION']
9
+ rails3 = version =~ /^3/
10
+
11
+ if rails3
12
+ rails_create_command = 'new'
13
+ else
14
+ rails_create_command = ''
15
+ end
16
+
17
+ load_rails = <<-RUBY
18
+ gem 'rails', '#{version}'; \
19
+ load Gem.bin_path('rails', 'rails', '#{version}')
20
+ RUBY
21
+
22
+ @terminal.run(%{ruby -rubygems -e "#{load_rails.strip!}" #{rails_create_command} rails_root})
23
+
24
+ if rails_root_exists?
25
+ @terminal.echo("Generated a Rails #{version} application")
26
+ else
27
+ raise "Unable to generate a Rails application:\n#{@terminal.output}"
28
+ end
29
+ end
30
+
31
+ When /^I configure my application to require the "([^"]*)" gem$/ do |gem_name|
32
+ if rails_manages_gems?
33
+ config_gem(gem_name)
34
+ elsif bundler_manages_gems?
35
+ bundle_gem(gem_name)
36
+ else
37
+ File.open(environment_path, 'a') do |file|
38
+ file.puts
39
+ file.puts("require 'example-engine'")
40
+ file.puts("require 'example-engine/rails'") # ???
41
+ end
42
+
43
+ # unless rails_finds_generators_in_gems?
44
+ # FileUtils.cp_r(File.join(PROJECT_ROOT, 'generators'), File.join(RAILS_ROOT, 'lib'))
45
+ # end
46
+ end
47
+ end
48
+
49
+ When /^I configure my application to run in the "([^"]*)" environment$/ do |environment|
50
+ @rails_environment = environment
51
+ end
52
+
53
+ When /^I check the configured gem version$/ do
54
+ version = ENV['RAILS_VERSION']
55
+ rails3 = version =~ /^3/
56
+
57
+ if rails3
58
+ command = 'rails runner'
59
+ else
60
+ command = 'script/runner'
61
+ end
62
+
63
+ @terminal.cd(RAILS_ROOT)
64
+ @terminal.run(%Q{#{command} 'puts "Current version: #\{EngineAssets.version\}"'})
65
+ end
66
+
67
+ When /^I generate a new "([^"]*)" ([^\s]*)$/ do |name, generator|
68
+ rails_generate("#{generator} #{name}")
69
+ end
70
+
71
+ When /^I save the following as "([^\"]*)"$/ do |path, string|
72
+ FileUtils.mkdir_p(File.join(RAILS_ROOT, File.dirname(path)))
73
+ File.open(File.join(RAILS_ROOT, path), 'w') { |file| file.write(string) }
74
+ end
75
+
76
+ When /^I perform a request to "([^\"]*)"$/ do |uri|
77
+ perform_request(uri)
78
+ end
79
+
80
+ Then /^I should receive a response matching the following:$/ do |table|
81
+ hash = table.transpose.hashes.first
82
+ result = JSON.parse(@terminal.result)
83
+
84
+ if hash['200']
85
+ result['status'].should == 200
86
+
87
+ if (header = result['headers']['X-Sendfile'])
88
+ # Rack middleware (likely Rails 3)
89
+ content = File.readlines(header).join
90
+ content.should include(hash['200'])
91
+ else
92
+ result['body'].should include(hash['200'])
93
+ end
94
+ else
95
+ raise "Don't know how to handle #{hash.inspect}"
96
+ end
97
+ end
98
+
99
+ Then /^The first line of the "([^"]*)" file should be$/ do |path, string|
100
+ lines = File.readlines(File.join(RAILS_ROOT, path))
101
+ lines[0].strip.should == string
102
+ end
103
+
104
+ Then /^I should see "([^\"]*)"$/ do |expected_text|
105
+ unless @terminal.output.include?(expected_text)
106
+ raise("Got terminal output:\n#{@terminal.output}\n\nExpected output:\n#{expected_text}")
107
+ end
108
+ end
109
+
110
+ Then /^the command should have run successfully$/ do
111
+ @terminal.status.exitstatus.should == 0
112
+ end
@@ -0,0 +1,15 @@
1
+ require 'json'
2
+ require 'spec'
3
+
4
+ PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..')).freeze
5
+ TEMP_DIR = File.join(PROJECT_ROOT, 'tmp').freeze
6
+ RAILS_ROOT = File.join(TEMP_DIR, 'rails_root').freeze
7
+ BUILT_GEM_ROOT = File.join(TEMP_DIR, 'built_gems').freeze
8
+ LOCAL_GEM_ROOT = File.join(TEMP_DIR, 'local_gems').freeze
9
+
10
+ Before do
11
+ FileUtils.mkdir_p TEMP_DIR
12
+ FileUtils.rm_rf BUILT_GEM_ROOT
13
+ FileUtils.rm_rf RAILS_ROOT
14
+ FileUtils.mkdir_p BUILT_GEM_ROOT
15
+ end
@@ -0,0 +1,125 @@
1
+ require 'uri'
2
+
3
+ module RailsHelpers
4
+ def rails_root_exists?
5
+ File.exists?(environment_path)
6
+ end
7
+
8
+ def rails3?
9
+ rails_version =~ /^3/
10
+ end
11
+
12
+ def rails_uses_rack?
13
+ rails3? || rails_version =~ /^2\.3/
14
+ end
15
+
16
+ def rails_version
17
+ @rails_version ||= begin
18
+ if bundler_manages_gems?
19
+ rails_version = open(gemfile_path).read.match(/gem.*rails["'].*["'](.+)["']/)[1]
20
+ else
21
+ environment_file = File.join(RAILS_ROOT, 'config', 'environment.rb')
22
+ rails_version = `grep RAILS_GEM_VERSION #{environment_file}`.match(/[\d.]+/)[0]
23
+ end
24
+ end
25
+ end
26
+
27
+ def rails_environment
28
+ @rails_environment ||= 'production'
29
+ end
30
+
31
+ def bundler_manages_gems?
32
+ File.exists?(gemfile_path)
33
+ end
34
+
35
+ def gemfile_path
36
+ gemfile = File.join(RAILS_ROOT, 'Gemfile')
37
+ end
38
+
39
+ def rails_manages_gems?
40
+ rails_version =~ /^2\.[123]/
41
+ end
42
+
43
+ def environment_path
44
+ File.join(RAILS_ROOT, 'config', 'environment.rb')
45
+ end
46
+
47
+ def rails_generate(arguments)
48
+ command = rails3? ? 'rails generate' : 'script/generate'
49
+
50
+ @terminal.cd(RAILS_ROOT)
51
+ @terminal.run("#{command} #{arguments}")
52
+ @terminal.run("RAILS_ENV=#{rails_environment} rake db:migrate")
53
+ end
54
+
55
+ def bundle_gem(gem_name)
56
+ File.open(gemfile_path, 'a') do |file|
57
+ file.puts("gem '#{gem_name}'")
58
+ end
59
+ end
60
+
61
+ def config_gem(gem_name)
62
+ run = "Rails::Initializer.run do |config|"
63
+ insert = " config.gem '#{gem_name}'"
64
+ content = File.read(environment_path)
65
+ if content.sub!(run, "#{run}\n#{insert}")
66
+ File.open(environment_path, 'wb') { |file| file.write(content) }
67
+ else
68
+ raise "Couldn't find #{run.inspect} in #{environment_path}"
69
+ end
70
+ end
71
+
72
+ def perform_request(uri)
73
+ # NOTE (CTI):
74
+ # modified from thoughtbot's original to return headers and status.
75
+ if rails3?
76
+ request_script = <<-SCRIPT
77
+ require 'config/environment'
78
+
79
+ env = Rack::MockRequest.env_for(#{uri.inspect})
80
+ status, headers, body = RailsRoot::Application.call(env)
81
+
82
+ response = {
83
+ :body => body.is_a?(Array) ? body.join : body.body,
84
+ :headers => headers,
85
+ :status => status
86
+ }
87
+
88
+ puts response.to_json
89
+ SCRIPT
90
+ File.open(File.join(RAILS_ROOT, 'request.rb'), 'w') { |file| file.write(request_script) }
91
+ @terminal.cd(RAILS_ROOT)
92
+ @terminal.run("./script/rails runner -e #{rails_environment} request.rb")
93
+ elsif rails_uses_rack?
94
+ request_script = <<-SCRIPT
95
+ require 'config/environment'
96
+
97
+ env = Rack::MockRequest.env_for(#{uri.inspect})
98
+ app = Rack::Lint.new(ActionController::Dispatcher.new)
99
+
100
+ status, headers, body = app.call(env)
101
+
102
+ response = {
103
+ :body => "",
104
+ :headers => headers,
105
+ :status => status
106
+ }
107
+
108
+ if body.respond_to?(:to_str)
109
+ response[:body] << body
110
+ else
111
+ body.each { |part| response[:body] << part }
112
+ end
113
+
114
+ puts response.to_json
115
+ SCRIPT
116
+ File.open(File.join(RAILS_ROOT, 'request.rb'), 'w') { |file| file.write(request_script) }
117
+ @terminal.cd(RAILS_ROOT)
118
+ @terminal.run("./script/runner -e #{rails_environment} request.rb")
119
+ else
120
+ raise "Rails versions earlier than 2.3 are not supported"
121
+ end
122
+ end
123
+ end
124
+
125
+ World(RailsHelpers)