pah 0.0.1
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.
- data/.gitignore +17 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +55 -0
- data/Rakefile +1 -0
- data/bin/pah +4 -0
- data/lib/pah/README.md +53 -0
- data/lib/pah/build +17 -0
- data/lib/pah/files/.gitignore +17 -0
- data/lib/pah/files/.rvmrc +48 -0
- data/lib/pah/files/Gemfile +52 -0
- data/lib/pah/files/Procfile +1 -0
- data/lib/pah/files/app/assets/stylesheets/reset.css +40 -0
- data/lib/pah/files/app/controllers/admin/contents_controller.rb +2 -0
- data/lib/pah/files/app/helpers/typus_helper.rb +32 -0
- data/lib/pah/files/app/models/content.rb +27 -0
- data/lib/pah/files/app/views/admin/dashboard/_sidebar.html.erb +0 -0
- data/lib/pah/files/app/views/layouts/application.html.haml +68 -0
- data/lib/pah/files/config/database.yml +22 -0
- data/lib/pah/files/config/initializers/omniauth.rb +4 -0
- data/lib/pah/files/config/initializers/requires.rb +1 -0
- data/lib/pah/files/config/locales/pt-BR.app.yml +16 -0
- data/lib/pah/files/config/locales/pt-BR.content.yml +12 -0
- data/lib/pah/files/config/locales/pt-BR.typus.yml +15 -0
- data/lib/pah/files/config/locales/pt-BR.yml +207 -0
- data/lib/pah/files/config/typus/content.yml +8 -0
- data/lib/pah/files/config/typus/content_roles.yml +4 -0
- data/lib/pah/files/config/unicorn.rb +27 -0
- data/lib/pah/files/db/migrate/20120605205337_create_contents.rb +11 -0
- data/lib/pah/files/db/seeds.rb +10 -0
- data/lib/pah/files/lib/tasks/integration.rake +14 -0
- data/lib/pah/files/public/index.html +1 -0
- data/lib/pah/files/spec/acceptance/dummy_spec.rb +9 -0
- data/lib/pah/files/spec/controllers/admin/contents_controller_spec.rb +5 -0
- data/lib/pah/files/spec/factories/content.rb +8 -0
- data/lib/pah/files/spec/helpers/typus_helper_spec.rb +71 -0
- data/lib/pah/files/spec/models/content_spec.rb +64 -0
- data/lib/pah/files/spec/spec_helper.rb +47 -0
- data/lib/pah/files/spec/support/README +1 -0
- data/lib/pah/files/spec/support/acceptance_helpers.rb +26 -0
- data/lib/pah/files/spec/support/acceptance_macros.rb +16 -0
- data/lib/pah/files/spec/support/capybara.rb +8 -0
- data/lib/pah/files/spec/support/deferred_garbage_collection.rb +35 -0
- data/lib/pah/files/spec/support/http_basic_auth.rb +26 -0
- data/lib/pah/files/spec/support/matchers.rb +5 -0
- data/lib/pah/files/spec/support/omniauth.rb +27 -0
- data/lib/pah/files/spec/support/paperclip.rb +4 -0
- data/lib/pah/files/spec/support/shared_connection.rb +12 -0
- data/lib/pah/files/spec/support/suppress_log.rb +5 -0
- data/lib/pah/files/spec/support/uploaded_file.rb +19 -0
- data/lib/pah/files/spec/support/vcr.rb +7 -0
- data/lib/pah/partials/_canonical_host.rb +14 -0
- data/lib/pah/partials/_capybara.rb +11 -0
- data/lib/pah/partials/_cleanup.rb +20 -0
- data/lib/pah/partials/_database.rb +6 -0
- data/lib/pah/partials/_default.rb +26 -0
- data/lib/pah/partials/_finish.rb +8 -0
- data/lib/pah/partials/_gems.rb +7 -0
- data/lib/pah/partials/_generators.rb +37 -0
- data/lib/pah/partials/_git.rb +7 -0
- data/lib/pah/partials/_heroku.rb +51 -0
- data/lib/pah/partials/_omniauth.rb +13 -0
- data/lib/pah/partials/_rspec.rb +13 -0
- data/lib/pah/partials/_rvm.rb +43 -0
- data/lib/pah/partials/_secure_headers.rb +12 -0
- data/lib/pah/setup.rb +17 -0
- data/lib/pah/template.rb +91 -0
- data/lib/pah/version.rb +3 -0
- data/pah.gemspec +27 -0
- metadata +205 -0
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Content do
|
4
|
+
it { should allow_mass_assignment_of(:text).as(:admin) }
|
5
|
+
[:name, :slug, :text].each do |attribute|
|
6
|
+
it { should validate_presence_of(attribute) }
|
7
|
+
end
|
8
|
+
describe ".markdown" do
|
9
|
+
context "content exists" do
|
10
|
+
before do
|
11
|
+
Factory.create(:content)
|
12
|
+
end
|
13
|
+
it "should return markdown of text of content with slug" do
|
14
|
+
Content.markdown(:tagline).should == "<p>Texto <strong>legal</strong> e <em>bacana</em></p>\n"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
context "content does not exists" do
|
18
|
+
it "should return nil" do
|
19
|
+
Content.markdown(:tagline).should be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
describe ".raw" do
|
24
|
+
context "content exists" do
|
25
|
+
before do
|
26
|
+
Factory.create(:content)
|
27
|
+
end
|
28
|
+
it "should return raw text of content with slug" do
|
29
|
+
Content.raw(:tagline).should == "Texto **legal** e <em>bacana</em>"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
context "content does not exists" do
|
33
|
+
it "should return nil" do
|
34
|
+
Content.raw(:tagline).should be_nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
describe ".ensure" do
|
39
|
+
context "content does not exists" do
|
40
|
+
it "should create content" do
|
41
|
+
expect {
|
42
|
+
Content.ensure(:tagline, 'Tagline', 'Texto legal')
|
43
|
+
}.to change(Content, :count).by(1)
|
44
|
+
end
|
45
|
+
describe "created content" do
|
46
|
+
before do
|
47
|
+
Content.ensure(:tagline, 'Tagline', 'Texto legal')
|
48
|
+
end
|
49
|
+
subject { Content.last }
|
50
|
+
its(:slug) { should == 'tagline' }
|
51
|
+
its(:name) { should == 'Tagline' }
|
52
|
+
its(:text) { should == 'Texto legal' }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
context "content already exists" do
|
56
|
+
let!(:content) { Factory.create(:content) }
|
57
|
+
it "should not create content" do
|
58
|
+
expect {
|
59
|
+
Content.ensure(:tagline, 'Tagline 1', 'Texto legal 1')
|
60
|
+
}.not_to change(Content, :count)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
|
+
|
3
|
+
if ENV['coverage'] == 'on'
|
4
|
+
require 'simplecov'
|
5
|
+
SimpleCov.start 'rails'
|
6
|
+
end
|
7
|
+
|
8
|
+
ENV["RAILS_ENV"] ||= 'test'
|
9
|
+
require File.expand_path("../../config/environment", __FILE__)
|
10
|
+
require 'rspec/rails'
|
11
|
+
require 'rspec/autorun'
|
12
|
+
require 'valid_attribute'
|
13
|
+
require "email_spec"
|
14
|
+
|
15
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
16
|
+
# in spec/support/ and its subdirectories.
|
17
|
+
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
18
|
+
|
19
|
+
RSpec.configure do |config|
|
20
|
+
# ## Mock Framework
|
21
|
+
#
|
22
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
23
|
+
#
|
24
|
+
# config.mock_with :mocha
|
25
|
+
# config.mock_with :flexmock
|
26
|
+
# config.mock_with :rr
|
27
|
+
|
28
|
+
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
29
|
+
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
30
|
+
|
31
|
+
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
32
|
+
# examples within a transaction, remove the following line or assign false
|
33
|
+
# instead of true.
|
34
|
+
config.use_transactional_fixtures = true
|
35
|
+
|
36
|
+
config.order = "random"
|
37
|
+
config.render_views
|
38
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
39
|
+
config.include FactoryGirl::Syntax::Methods
|
40
|
+
config.include EmailSpec::Helpers
|
41
|
+
config.include EmailSpec::Matchers
|
42
|
+
|
43
|
+
# If true, the base class of anonymous controllers will be inferred
|
44
|
+
# automatically. This will be the default behavior in future versions of
|
45
|
+
# rspec-rails.
|
46
|
+
config.infer_base_class_for_anonymous_controllers = false
|
47
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
ADD HERE SUPPORT FILES FOR OMNIAUTH, PAPERCLIP, CAPYBARA, ETC
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module AcceptanceHelpers
|
3
|
+
def saop
|
4
|
+
save_and_open_page
|
5
|
+
end
|
6
|
+
def handle_js_confirm(message = nil, accept = true)
|
7
|
+
page.execute_script("window.original_confirm_function = window.confirm")
|
8
|
+
page.execute_script("window.confirm = function(msg) { $.cookie('confirm_message', msg); return #{!!accept}; }")
|
9
|
+
yield
|
10
|
+
page.evaluate_script("$.cookie('confirm_message')").should == message unless message.nil?
|
11
|
+
ensure
|
12
|
+
page.evaluate_script "window.confirm = window.original_confirm_function"
|
13
|
+
end
|
14
|
+
def fill_in_autocomplete(capybara_selector, jquery_selector, value)
|
15
|
+
fill_in capybara_selector, :with => value
|
16
|
+
page.execute_script %Q{$('#{jquery_selector}').keydown()}
|
17
|
+
end
|
18
|
+
def choose_autocomplete(text)
|
19
|
+
find('ul.ui-autocomplete').should have_content(text)
|
20
|
+
page.execute_script("$('.ui-menu-item:contains(\"#{text}\")').find('a').trigger('mouseenter').click()")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
RSpec.configure do |config|
|
25
|
+
config.include AcceptanceHelpers, :type => :request
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module AcceptanceMacros
|
3
|
+
def login!
|
4
|
+
before(:each) do
|
5
|
+
@current_user = User.make(:email => 'x@example.com', :password => 'senha123', :password_confirmation => 'senha123')
|
6
|
+
visit new_user_session_path
|
7
|
+
fill_in 'Email', :with => 'x@example.com'
|
8
|
+
fill_in 'Senha', :with => 'senha123'
|
9
|
+
click_button 'Entrar'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.extend AcceptanceMacros, :type => :request
|
16
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'capybara/rspec'
|
3
|
+
require 'capybara/rails'
|
4
|
+
require 'capybara/poltergeist'
|
5
|
+
Capybara.javascript_driver = :poltergeist
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.include Capybara::DSL, :example_group => { :file_path => /\bspec\/acceptance\// }
|
8
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Joe Van Dyk discovered that running the Ruby garbage collector only every X seconds can speed up your tests.
|
2
|
+
# I found that deferring garbage collection would speed up my RSpec examples by about 15%,
|
3
|
+
# but it probably depends on the nature of your tests.
|
4
|
+
# https://makandracards.com/makandra/950-speed-up-rspec-by-deferring-garbage-collection
|
5
|
+
|
6
|
+
class DeferredGarbageCollection
|
7
|
+
RESERVED_IVARS = %w(@loaded_fixtures)
|
8
|
+
DEFERRED_GC_THRESHOLD = (ENV['DEFER_GC'] || 10.0).to_f
|
9
|
+
@@last_gc_run = Time.now
|
10
|
+
def self.start
|
11
|
+
GC.disable if DEFERRED_GC_THRESHOLD > 0
|
12
|
+
end
|
13
|
+
def self.reconsider
|
14
|
+
if DEFERRED_GC_THRESHOLD > 0 && Time.now - @@last_gc_run >= DEFERRED_GC_THRESHOLD
|
15
|
+
GC.enable
|
16
|
+
GC.start
|
17
|
+
GC.disable
|
18
|
+
@@last_gc_run = Time.now
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
RSpec.configure do |config|
|
24
|
+
config.before(:all) do
|
25
|
+
DeferredGarbageCollection.start
|
26
|
+
end
|
27
|
+
config.after(:each) do
|
28
|
+
(instance_variables - DeferredGarbageCollection::RESERVED_IVARS).each do |ivar|
|
29
|
+
instance_variable_set(ivar, nil)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
config.after(:all) do
|
33
|
+
DeferredGarbageCollection.reconsider
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module AuthSpec
|
2
|
+
def http_basic_login!
|
3
|
+
request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials('usuario','senha')
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
module CapybaraAuthSpec
|
8
|
+
def http_basic_login!
|
9
|
+
name = 'usuario'
|
10
|
+
password = 'senha'
|
11
|
+
if page.driver.respond_to?(:basic_auth)
|
12
|
+
page.driver.basic_auth(name, password)
|
13
|
+
elsif page.driver.respond_to?(:basic_authorize)
|
14
|
+
page.driver.basic_authorize(name, password)
|
15
|
+
elsif page.driver.respond_to?(:browser) && page.driver.browser.respond_to?(:basic_authorize)
|
16
|
+
page.driver.browser.basic_authorize(name, password)
|
17
|
+
else
|
18
|
+
raise "I don't know how to log in!"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
RSpec.configure do |config|
|
24
|
+
config.include AuthSpec, type: :controller
|
25
|
+
config.include CapybaraAuthSpec, type: :request
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module OmniauthLoginTestHelper
|
3
|
+
def current_user
|
4
|
+
@current_user ||= Factory.create(:user)
|
5
|
+
end
|
6
|
+
|
7
|
+
def login!
|
8
|
+
session[:user_id] = current_user.id
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.include OmniauthLoginTestHelper, :type => :controller
|
14
|
+
config.include OmniauthLoginTestHelper, :type => :helper
|
15
|
+
end
|
16
|
+
|
17
|
+
shared_examples_for "authentication_required_action" do
|
18
|
+
context "not logged in" do
|
19
|
+
before do
|
20
|
+
http_basic_login!
|
21
|
+
request.env["HTTP_REFERER"] = '/back'
|
22
|
+
do_action
|
23
|
+
end
|
24
|
+
it { should redirect_to("/back") }
|
25
|
+
it { flash[:notice].should == "Você precisa estar logado..." }
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class ActiveRecord::Base
|
2
|
+
mattr_accessor :shared_connection
|
3
|
+
@@shared_connection = nil
|
4
|
+
|
5
|
+
def self.connection
|
6
|
+
@@shared_connection || retrieve_connection
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# Forces all threads to share the same connection. This works on
|
11
|
+
# Capybara because it starts the web server in a thread.
|
12
|
+
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
|
@@ -0,0 +1,5 @@
|
|
1
|
+
# Rails by default logs everything that is happening in your test environment to “log/test.log”.
|
2
|
+
# By increasing the logger level, you will be able to reduce the IO during your tests.
|
3
|
+
# The only downside of this approach is that, if a test is failing, you won’t have anything logged.
|
4
|
+
# In such cases, just comment the configuration option above and run your tests again.
|
5
|
+
Rails.logger.level = 4 unless ENV['WITH_LOG']
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module UploadFileTestHelper
|
3
|
+
def uploaded_file(filename, content_type = "text/csv")
|
4
|
+
t = Tempfile.new([filename.split("/").last, filename.split(".").last])
|
5
|
+
t.binmode
|
6
|
+
path = File.join(Rails.root, "spec", "fixtures", filename)
|
7
|
+
FileUtils.copy_file(path, t.path)
|
8
|
+
ActionDispatch::Http::UploadedFile.new({
|
9
|
+
filename: filename,
|
10
|
+
head: "Content-Disposition: form-data; name=\"file\"; filename=\"#{filename}\"\r\nContent-Type: #{content_type}\r\n",
|
11
|
+
type: content_type,
|
12
|
+
tempfile: t
|
13
|
+
})
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
18
|
+
config.include UploadFileTestHelper
|
19
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
puts "Configuring canonical hosts... ".magenta
|
2
|
+
rack_canonical = <<CANONICAL
|
3
|
+
|
4
|
+
#Run heroku config:add CANONICAL_HOST=yourdomain.com
|
5
|
+
#For more information, see: https://github.com/tylerhunt/rack-canonical-host#usage
|
6
|
+
use Rack::CanonicalHost, ENV['CANONICAL_HOST'] if ENV['CANONICAL_HOST']
|
7
|
+
CANONICAL
|
8
|
+
in_root do
|
9
|
+
inject_into_file 'config.ru', rack_canonical, {after: "require ::File.expand_path('../config/environment', __FILE__)", verbose: false}
|
10
|
+
end
|
11
|
+
git :add => 'config.ru'
|
12
|
+
git :commit => "-qm 'Adding rack-canonical-host.'"
|
13
|
+
|
14
|
+
puts "\n"
|
@@ -0,0 +1,11 @@
|
|
1
|
+
puts "Adding capybara helpers...".magenta
|
2
|
+
|
3
|
+
copy_static_file 'spec/support/acceptance_helpers.rb'
|
4
|
+
copy_static_file 'spec/support/acceptance_macros.rb'
|
5
|
+
copy_static_file 'spec/support/capybara.rb'
|
6
|
+
copy_static_file 'spec/support/shared_connection.rb'
|
7
|
+
copy_static_file 'spec/acceptance/dummy_spec.rb'
|
8
|
+
|
9
|
+
git :add => '.'
|
10
|
+
git :commit => "-aqm 'Add capybara helpers.'"
|
11
|
+
puts "\n"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
puts "Commiting new rails app ... ".magenta
|
2
|
+
|
3
|
+
git :add => '.'
|
4
|
+
git :commit => "-aqm 'Commit new rails app.'"
|
5
|
+
|
6
|
+
puts "Removing unnecessary files ... ".magenta
|
7
|
+
|
8
|
+
remove_file "README"
|
9
|
+
remove_file "app/views/layouts/application.html.erb"
|
10
|
+
remove_file "app/assets/images/rails.png"
|
11
|
+
|
12
|
+
inside "public" do
|
13
|
+
remove_file "index.html"
|
14
|
+
remove_file "favicon.ico"
|
15
|
+
remove_file "robots.txt"
|
16
|
+
end
|
17
|
+
|
18
|
+
git :add => '.'
|
19
|
+
git :commit => "-aqm 'Removed unnecessary files left over from initial app generation.'"
|
20
|
+
puts "\n"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
puts "Adding default files ...".magenta
|
2
|
+
|
3
|
+
copy_static_file 'app/assets/stylesheets/reset.css'
|
4
|
+
copy_static_file 'app/views/layouts/application.html.haml'
|
5
|
+
copy_static_file 'config/unicorn.rb'
|
6
|
+
copy_static_file 'Procfile'
|
7
|
+
copy_static_file "config/initializers/requires.rb"
|
8
|
+
copy_static_file "lib/tasks/integration.rake"
|
9
|
+
|
10
|
+
copy_static_file 'config/locales/pt-BR.yml'
|
11
|
+
copy_static_file 'public/index.html' if ENV['RAILS_TEMPLATE_TEST'] == 'true'
|
12
|
+
|
13
|
+
gsub_file 'lib/tasks/integration.rake', /PROJECT/, @app_name
|
14
|
+
|
15
|
+
copy_static_file '.gitignore'
|
16
|
+
|
17
|
+
create_file ".env" do
|
18
|
+
<<-EOF
|
19
|
+
export PRODUCTION_APP=#{@app_name}
|
20
|
+
export STAGING_APP=#{@app_name}-staging
|
21
|
+
EOF
|
22
|
+
end
|
23
|
+
|
24
|
+
git :add => '.'
|
25
|
+
git :commit => "-aqm 'Add default stuff.'"
|
26
|
+
puts "\n"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
puts "Adding generators... ".magenta
|
2
|
+
|
3
|
+
generators = <<GENERATORS
|
4
|
+
|
5
|
+
# Do not generate specs for views and requests. Also, do not generate assets.
|
6
|
+
config.generators do |g|
|
7
|
+
g.helper false
|
8
|
+
g.view_specs false
|
9
|
+
g.assets false
|
10
|
+
g.integration_tool false
|
11
|
+
end
|
12
|
+
config.app_generators do |g|
|
13
|
+
g.test_framework :rspec
|
14
|
+
end
|
15
|
+
|
16
|
+
# Prevent initializing your application and connect to the database on assets precompile.
|
17
|
+
config.assets.initialize_on_precompile = false
|
18
|
+
GENERATORS
|
19
|
+
|
20
|
+
in_root do
|
21
|
+
inject_into_file 'config/application.rb', generators, {after: "Rails::Application", verbose: false}
|
22
|
+
end
|
23
|
+
|
24
|
+
git :add => 'config/application.rb'
|
25
|
+
git :commit => "-qm 'Adding generators.'"
|
26
|
+
|
27
|
+
letter_opener_config = <<LETTER_OPENER
|
28
|
+
config.action_mailer.delivery_method = :letter_opener
|
29
|
+
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
|
30
|
+
LETTER_OPENER
|
31
|
+
|
32
|
+
in_root do
|
33
|
+
inject_into_file 'config/environments/development.rb', letter_opener_config, { before: "end", verbose: false }
|
34
|
+
end
|
35
|
+
|
36
|
+
git :add => 'config/environments/development.rb'
|
37
|
+
git :commit => "-qm 'Adding letter_opener config.'"
|