engine_cart 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 96c695e53c52d0eb9f6425fa2fcd099c1a6167aa
4
- data.tar.gz: f9959acabcbd5ca9c548cf4b59cb420339953952
3
+ metadata.gz: cfba3a7001960007e707eeb273a884ea0660d53e
4
+ data.tar.gz: 85c1f0df4dd3264fd0aecf3927b5c61cace587f5
5
5
  SHA512:
6
- metadata.gz: d960a6dc51b4bc4fb8a8b488b5d73f53c852cab6aa0c9b7341570739ebb5cc21626463e38401d18f26ff84d55d16c8db795ea3e58f83ddf7d2812f4a361b6ca0
7
- data.tar.gz: d62b6950005fe35a516a987547e2e6dbca1d571c1867bf1d12aa83584ed4b4f2261dfe18bf50b55ce0ead81464c001fbdcf585cfbc4d68c502abb82cad604a6d
6
+ metadata.gz: b245365eed9f9bb511641d9f543e48281e6e406b3a6394be326892294933fe7515b699d83fefaead2c8e9dd57d8073bf1205ef4319e8840dca0bc2eff6f8fef4
7
+ data.tar.gz: e28e5f5c22d33c4805fb01b0d9ef378d8c9255da47f25f4b772de4786937268df63ba426924ef58a3e16dea76fad26d897499602001d9f5558e33a6978d7e08b
data/README.md CHANGED
@@ -1,6 +1,17 @@
1
1
  # EngineCart
2
2
 
3
- TODO: Write a gem description
3
+ Rake tasks to generate a test application for a Rails Engine gem.
4
+
5
+ If you have a Rails Engine and want to test it, the suggested approach is a small dummy application that loads up a Rails application with your engine loaded. This dummy application is usually checked into source control and maintained with the application. This works great, until you want to test:
6
+
7
+ - different versions of Ruby (e.g. MRI and JRuby)
8
+ - different versions of Rails (Rails 3.x, 4.0 and 4.1)
9
+ - different deployment environments (with and without devise, etc)
10
+
11
+ where each scenario may involve different configurations, Gemfiles, etc.
12
+
13
+ EngineCart helps by adding Rake tasks to your Engine that builds a test application for you using Rails generators (and/or application templates).
14
+
4
15
 
5
16
  ## Installation
6
17
 
@@ -16,17 +27,22 @@ Or install it yourself as:
16
27
 
17
28
  $ gem install engine_cart
18
29
 
19
-
20
30
  ## Usage
21
31
 
32
+ Engine Cart comes with a generator to set up your engine to use Engine Cart. It is also packaged as a rake task:
33
+
34
+ ```
35
+ $ rake engine_cart:prepare
36
+ ```
37
+
22
38
  In your Rakefile you can generate the Rails application using, e.g.:
23
39
 
24
40
  ```ruby
25
- require 'engine_cart/rake_task'
41
+ require 'engine_cart/rake_task'
26
42
 
27
- task :ci => ['engine_cart:generate'] do
28
- # run the tests
29
- end
43
+ task :ci => ['engine_cart:generate'] do
44
+ # run the tests
45
+ end
30
46
  ```
31
47
 
32
48
  And in your e.g. spec_helper.rb, initialize EngineCart:
@@ -37,19 +53,14 @@ And in your e.g. spec_helper.rb, initialize EngineCart:
37
53
 
38
54
  ## Configuration
39
55
 
40
- You can configure where the test app is created by setting the `TEST_APP` constant, e.g.:
56
+ You can configure where the test app is created by setting the `ENGINE_CART_DESTINATION` env variable, e.g.:
41
57
 
42
58
  ```ruby
43
- TEST_APP = "/tmp/generate-the-test-app-into-tmp-instead-of-your-app
59
+ ENGINE_CART_DESTINATION="/tmp/generate-the-test-app-into-tmp-instead-of-your-app" rake ci
44
60
  ```
45
61
 
46
- You can also inject additional gems, or run other Rails generators by adding files to the `TEST_APP_TEMPLATES` directory.
47
-
48
- Gemfile.extra
49
-
50
- test_app generator
62
+ After creating the test application, Engine Cart will run the test app generator (located in ./spec/test_app_templates/lib/generators). By default, it will attempt to run the `install` generator for your engine. If you do not have an `install` generator, or want to add additional steps (e.g. to install additional gems), you can add them to the `TestAppGenerator`.
51
63
 
52
- within_test_app
53
64
 
54
65
  ## Contributing
55
66
 
data/Rakefile CHANGED
@@ -13,15 +13,31 @@ task :generate_test_gem => ['engine_cart:setup'] do
13
13
  system("rails plugin new spec/internal_gem")
14
14
  system("mv spec/internal_gem spec/internal")
15
15
  Rake::Task['engine_cart:inject_gemfile_extras'].invoke
16
- within_test_app do
16
+ EngineCart.within_test_app do
17
17
  system "git init"
18
18
  FileUtils.touch('.gitignore')
19
19
  Dir.mkdir('spec')
20
+ File.open('spec/spec_helper.rb', 'w') do |f|
21
+ f.puts <<-EOF
22
+ require 'engine_cart'
23
+ EngineCart.load_application!
24
+
25
+ require 'rspec/rails'
26
+ require 'rspec/autorun'
27
+
28
+ require 'internal_gem'
29
+ RSpec.configure do |config|
30
+
31
+ end
32
+ EOF
33
+ end
34
+
20
35
  system "bundle install"
21
36
  system "echo 'require \"engine_cart/rake_task\"\n' >> Rakefile"
22
37
 
23
38
  system("rake engine_cart:prepare")
24
- system("rake engine_cart:generate")
39
+ system "echo '\ngem \"rspec-rails\"\n' >> Gemfile"
40
+ system "bundle install"
25
41
  end
26
42
  end
27
43
 
@@ -1,8 +1,53 @@
1
1
  require "engine_cart/version"
2
+
2
3
  module EngineCart
3
4
  require "engine_cart/engine" if defined? Rails
4
-
5
+
6
+ class << self
7
+
8
+ ##
9
+ # Name of the engine we're testing
10
+ attr_accessor :engine_name
11
+
12
+ ##
13
+ # Destination to generate the test app into
14
+ attr_accessor :destination
15
+
16
+ ##
17
+ # Path to a Rails application template
18
+ attr_accessor :template
19
+
20
+ ##
21
+ # Path to test app templates to make available to
22
+ # the test app generator
23
+ attr_accessor :templates_path
24
+
25
+
26
+ ##
27
+ # Additional options when generating a test rails application
28
+ attr_accessor :rails_options
29
+
30
+ end
31
+
32
+ self.engine_name = ENV["CURRENT_ENGINE_NAME"]
33
+ self.destination = ENV['ENGINE_CART_DESTINATION'] || ENV['RAILS_ROOT'] || "./spec/internal"
34
+ self.template = ENV["ENGINE_CART_TEMPLATE"] || (File.expand_path('template.rb') if File.exists? 'template.rb')
35
+ self.templates_path = ENV['ENGINE_CART_TEMPLATES_PATH'] || "./spec/test_app_templates"
36
+ self.rails_options = ENV['ENGINE_CART_RAILS_OPTIONS']
37
+
38
+ def self.current_engine_name
39
+ engine_name || File.basename(Dir.glob("*.gemspec").first, '.gemspec')
40
+ end
41
+
5
42
  def self.load_application! path = nil
6
- require File.expand_path("config/environment", path || ENV['RAILS_ROOT'] || "./spec/internal")
43
+ require File.expand_path("config/environment", path || EngineCart.destination)
44
+ end
45
+
46
+ def self.within_test_app
47
+ Dir.chdir(EngineCart.destination) do
48
+ Bundler.with_clean_env do
49
+ yield
50
+ end
51
+ end
7
52
  end
8
53
  end
@@ -1,22 +1,23 @@
1
+ require 'engine_cart'
2
+ require 'generators/engine_cart/install_generator'
3
+
1
4
  namespace :engine_cart do
2
5
 
3
6
  desc "Prepare a gem for using engine_cart"
4
7
  task :prepare do
5
- require 'generators/engine_cart/engine_cart_generator'
6
- generator = EngineCartGenerator.new
8
+ generator = EngineCart::InstallGenerator.new
7
9
  generator.create_test_app_templates
8
10
  generator.ignore_test_app
11
+ generator.add_gemfile_include
9
12
  end
10
13
 
11
14
  task :setup do
12
- TEST_APP_TEMPLATES = 'spec/test_app_templates' unless defined? TEST_APP_TEMPLATES
13
- TEST_APP = 'spec/internal' unless defined? TEST_APP
14
15
  end
15
16
 
16
17
  desc "Clean out the test rails app"
17
18
  task :clean => [:setup] do
18
19
  puts "Removing sample rails app"
19
- `rm -rf #{TEST_APP}`
20
+ `rm -rf #{EngineCart.destination}`
20
21
  end
21
22
 
22
23
  task :create_test_rails_app => [:setup] do
@@ -28,59 +29,60 @@ namespace :engine_cart do
28
29
  end
29
30
 
30
31
  Bundler.with_clean_env do
31
- `rails #{version} new internal`
32
+ `rails #{version} new internal #{EngineCart.rails_options} #{"-m #{EngineCart.template}" if EngineCart.template}`
32
33
  end
34
+
33
35
  unless $?
34
36
  raise "Error generating new rails app. Aborting."
35
37
  end
36
38
  end
37
39
 
38
- FileUtils.move "#{dir}/internal", "#{TEST_APP}"
40
+ FileUtils.move "#{dir}/internal", "#{EngineCart.destination}"
39
41
 
40
42
  end
41
43
  end
42
44
 
43
45
  task :inject_gemfile_extras => [:setup] do
44
46
  # Add our gem and extras to the generated Rails app
45
- open(File.expand_path('Gemfile', TEST_APP), 'a') do |f|
46
- gemfile_extras_path = File.expand_path("Gemfile.extra", TEST_APP_TEMPLATES)
47
+ open(File.expand_path('Gemfile', EngineCart.destination), 'a') do |f|
48
+ gemfile_extras_path = File.expand_path("Gemfile.extra", EngineCart.templates_path)
47
49
 
48
50
  f.write <<-EOF
49
- gem '#{current_engine_name}', :path => '#{File.expand_path('.')}'
50
-
51
- if File.exists?("#{gemfile_extras_path}")
52
- eval File.read("#{gemfile_extras_path}"), nil, "#{gemfile_extras_path}"
53
- end
51
+ gem '#{EngineCart.current_engine_name}', :path => '#{File.expand_path('.')}'
54
52
  EOF
55
53
  end
56
54
  end
57
55
 
58
56
  desc "Create the test rails app"
59
57
  task :generate => [:setup] do
58
+ return if File.exists? File.expand_path('.generated_engine_cart', EngineCart.destination)
60
59
 
61
- unless File.exists? File.expand_path('Rakefile', TEST_APP)
62
- # Create a new test rails app
63
- Rake::Task['engine_cart:create_test_rails_app'].invoke
64
- Rake::Task['engine_cart:inject_gemfile_extras'].invoke
65
-
66
- # Copy our test app generators into the app and prepare it
67
- system "cp -r #{TEST_APP_TEMPLATES}/lib/generators #{TEST_APP}/lib"
68
- within_test_app do
69
- system "bundle install"
70
- system "rails generate test_app"
71
- system "rake db:migrate db:test:prepare"
72
- end
73
- puts "Done generating test app"
60
+ # Create a new test rails app
61
+ Rake::Task['engine_cart:create_test_rails_app'].invoke
62
+
63
+ system "bundle install"
64
+
65
+ Rake::Task['engine_cart:inject_gemfile_extras'].invoke
66
+
67
+ # Copy our test app generators into the app and prepare it
68
+ if File.exists? "#{EngineCart.templates_path}/lib/generators"
69
+ system "cp -r #{EngineCart.templates_path}/lib/generators #{EngineCart.destination}/lib"
74
70
  end
75
- end
76
- end
77
71
 
78
- def current_engine_name
79
- ENV["CURRENT_ENGINE_NAME"] || File.basename(Dir.glob("*.gemspec").first, '.gemspec')
72
+ within_test_app do
73
+ system "bundle install"
74
+ system "(rails g | grep test_app) && rails generate test_app"
75
+ system "rake db:migrate db:test:prepare"
76
+ end
77
+
78
+ File.open(File.expand_path('.generated_engine_cart', EngineCart.destination), 'w') { |f| f.puts true }
79
+
80
+ puts "Done generating test app"
81
+ end
80
82
  end
81
83
 
82
84
  def within_test_app
83
- Dir.chdir(TEST_APP) do
85
+ Dir.chdir(EngineCart.destination) do
84
86
  Bundler.with_clean_env do
85
87
  yield
86
88
  end
@@ -1,3 +1,3 @@
1
1
  module EngineCart
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -0,0 +1,60 @@
1
+ require 'rails/generators'
2
+
3
+ ##
4
+ # EngineCartGenerator sets up an engine to
5
+ # use engine_cart-generated test apps
6
+ module EngineCart
7
+ class InstallGenerator < Rails::Generators::Base
8
+ def create_test_app_templates
9
+ empty_directory EngineCart.templates_path
10
+
11
+ empty_directory File.expand_path("lib/generators", EngineCart.templates_path)
12
+
13
+ create_file File.expand_path("lib/generators/test_app_generator.rb", EngineCart.templates_path), :skip => true do
14
+ <<-EOF
15
+ require 'rails/generators'
16
+
17
+ class TestAppGenerator < Rails::Generators::Base
18
+ source_root "#{EngineCart.templates_path}"
19
+
20
+ # if you need to generate any additional configuration
21
+ # into the test app, this generator will be run immediately
22
+ # after setting up the application
23
+
24
+ def install_engine
25
+ generate '#{EngineCart.current_engine_name}:install'
26
+ end
27
+ end
28
+
29
+ EOF
30
+ end
31
+ end
32
+
33
+ def ignore_test_app
34
+ # Ignore the generated test app in the gem's .gitignore file
35
+ git_root = (`git rev-parse --show-toplevel` rescue '.').strip
36
+
37
+ # If we don't have a .gitignore file already, don't worry about it
38
+ return unless File.exists? File.expand_path('.gitignore', git_root)
39
+
40
+ # If the directory is already ignored (somehow) don't worry about it
41
+ return if (system('git', 'check-ignore', TEST_APP, '-q') rescue false)
42
+
43
+ append_file File.expand_path('.gitignore', git_root) do
44
+ "#{EngineCart.destination}\n"
45
+ end
46
+ end
47
+
48
+ def add_gemfile_include
49
+ append_file "Gemfile" do
50
+ <<-EOF
51
+ file = File.expand_path("Gemfile", ENV['ENGINE_CART_DESTINATION'] || ENV['RAILS_ROOT'] || File.expand_path("../spec/internal", __FILE__))
52
+ if File.exists?(file)
53
+ puts "Loading \#{file} ..." if $DEBUG # `ruby -d` or `bundle -v`
54
+ instance_eval File.read(file)
55
+ end
56
+ EOF
57
+ end
58
+ end
59
+ end
60
+ end
@@ -12,10 +12,57 @@ describe "EngineCart powered application" do
12
12
  end
13
13
 
14
14
  it "should have a engine_cart:generate rake task available" do
15
-
15
+ EngineCart.within_test_app do
16
+ `rake -T | grep "engine_cart:generate"`
17
+ expect($?).to eq 0
18
+ end
16
19
  end
17
20
 
18
21
  it "should create a rails app when the engine_cart:generate is invoked" do
22
+ EngineCart.within_test_app do
23
+ `rake engine_cart:generate`
24
+ expect(File).to exist(File.expand_path("spec/internal"))
25
+ end
26
+ end
27
+
28
+ it "should be able to test the application controller from the internal app" do
29
+ EngineCart.within_test_app do
30
+ File.open('spec/some_spec.rb', 'w') do |f|
31
+ f.puts <<-EOF
32
+ require 'spec_helper'
33
+
34
+ describe ApplicationController do
35
+ it "should be able to test the application controller from the internal app" do
36
+ expect(subject).to be_a_kind_of(ActionController::Base)
37
+ end
38
+ end
39
+
40
+ EOF
41
+ end
42
+
43
+ `bundle exec rspec spec/some_spec.rb`
44
+ expect($?).to eq 0
45
+ end
46
+ end
47
+
48
+ it "should be able to run specs that reference gems provided by the test app" do
49
+ EngineCart.within_test_app do
50
+ File.open('spec/require_spec.rb', 'w') do |f|
51
+ f.puts <<-EOF
52
+ require 'spec_helper'
53
+ require 'coffee-rails'
54
+
55
+ describe ApplicationController do
56
+ it "should be able to run specs that reference gems provided by the test app" do
57
+ expect(true).to be_true
58
+ end
59
+ end
60
+
61
+ EOF
62
+ end
19
63
 
64
+ `bundle exec rspec spec/require_spec.rb`
65
+ expect($?).to eq 0
66
+ end
20
67
  end
21
68
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: engine_cart
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Beer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-25 00:00:00.000000000 Z
11
+ date: 2014-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -84,11 +84,9 @@ files:
84
84
  - lib/engine_cart/rake_task.rb
85
85
  - lib/engine_cart/tasks/engine_cart.rake
86
86
  - lib/engine_cart/version.rb
87
- - lib/generators/engine_cart/engine_cart_generator.rb
87
+ - lib/generators/engine_cart/install_generator.rb
88
88
  - spec/integration/engine_cart_spec.rb
89
89
  - spec/spec_helper.rb
90
- - spec/test_app_templates/Gemfile.extra
91
- - spec/test_app_templates/lib/generators/test_app_generator.rb
92
90
  homepage: https://github.com/cbeer/engine_cart
93
91
  licenses:
94
92
  - MIT
@@ -109,13 +107,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
107
  version: '0'
110
108
  requirements: []
111
109
  rubyforge_project:
112
- rubygems_version: 2.2.1
110
+ rubygems_version: 2.2.2
113
111
  signing_key:
114
112
  specification_version: 4
115
113
  summary: Helper for testing Rails Engines sanely
116
114
  test_files:
117
115
  - spec/integration/engine_cart_spec.rb
118
116
  - spec/spec_helper.rb
119
- - spec/test_app_templates/Gemfile.extra
120
- - spec/test_app_templates/lib/generators/test_app_generator.rb
121
- has_rdoc:
@@ -1,42 +0,0 @@
1
- require 'rails/generators'
2
-
3
- class EngineCartGenerator < Rails::Generators::Base
4
- TEST_APP_TEMPLATES = 'spec/test_app_templates' unless defined? TEST_APP_TEMPLATES
5
- TEST_APP = 'spec/internal' unless defined? TEST_APP
6
-
7
- def create_test_app_templates
8
- empty_directory TEST_APP_TEMPLATES
9
- create_file File.expand_path("Gemfile.extra", TEST_APP_TEMPLATES), :skip => true do
10
- "# extra gems to load into the test app go here"
11
- end
12
-
13
- empty_directory File.expand_path("lib/generators", TEST_APP_TEMPLATES)
14
-
15
- create_file File.expand_path("lib/generators/test_app_generator.rb", TEST_APP_TEMPLATES), :skip => true do
16
- <<-EOF
17
- require 'rails/generators'
18
-
19
- class TestAppGenerator < Rails::Generators::Base
20
- source_root "#{TEST_APP_TEMPLATES}"
21
-
22
- end
23
-
24
- EOF
25
- end
26
- end
27
-
28
- def ignore_test_app
29
- # Ignore the generated test app in the gem's .gitignore file
30
- git_root = (`git rev-parse --show-toplevel` rescue '.').strip
31
-
32
- # If we don't have a .gitignore file already, don't worry about it
33
- return unless File.exists? File.expand_path('.gitignore', git_root)
34
-
35
- # If the directory is already ignored (somehow) don't worry about it
36
- return if (system('git', 'check-ignore', TEST_APP, '-q') rescue false)
37
-
38
- append_file File.expand_path('.gitignore', git_root) do
39
- "#{TEST_APP}\n"
40
- end
41
- end
42
- end
File without changes
@@ -1,7 +0,0 @@
1
- require 'rails/generators'
2
-
3
- class TestAppGenerator < Rails::Generators::Base
4
- source_root "spec/test_app_templates"
5
-
6
- end
7
-