engine_cart 0.2.2 → 0.3.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.
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
-