suspenders 1.7.0 → 1.8.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -7
  3. data/.travis.yml +4 -0
  4. data/Gemfile.lock +25 -4
  5. data/NEWS.md +19 -0
  6. data/README.md +18 -5
  7. data/Rakefile +3 -3
  8. data/bin/rspec +16 -0
  9. data/bin/suspenders +5 -3
  10. data/lib/suspenders.rb +3 -0
  11. data/lib/suspenders/app_builder.rb +27 -24
  12. data/lib/suspenders/generators/app_generator.rb +6 -15
  13. data/lib/suspenders/version.rb +1 -1
  14. data/{features/support → spec/fakes}/bin/heroku +0 -0
  15. data/{features/support → spec/fakes}/bin/hub +0 -0
  16. data/spec/features/github_spec.rb +10 -0
  17. data/spec/features/heroku_spec.rb +13 -0
  18. data/spec/features/new_project_spec.rb +38 -0
  19. data/spec/spec_helper.rb +24 -0
  20. data/{features → spec}/support/fake_github.rb +1 -1
  21. data/spec/support/fake_heroku.rb +36 -0
  22. data/spec/support/suspenders.rb +50 -0
  23. data/suspenders.gemspec +2 -0
  24. data/templates/Gemfile_clean +5 -1
  25. data/templates/README.md.erb +1 -1
  26. data/templates/bin_setup +3 -0
  27. data/templates/factories_spec.rb +3 -3
  28. data/templates/factories_spec_rake_task.rb +7 -1
  29. data/templates/postgresql_database.yml.erb +1 -1
  30. data/templates/smtp.rb +4 -4
  31. data/templates/staging.rb +3 -0
  32. data/templates/suspenders_gitignore +9 -10
  33. data/templates/suspenders_layout.html.erb.erb +1 -1
  34. data/templates/unicorn.rb +4 -1
  35. metadata +64 -33
  36. data/features/github_repo.feature +0 -8
  37. data/features/heroku_true.feature +0 -11
  38. data/features/rake_clean.feature +0 -44
  39. data/features/step_definitions/suspenders_steps.rb +0 -89
  40. data/features/support/env.rb +0 -10
  41. data/features/support/fake_heroku.rb +0 -30
  42. data/templates/javascripts/prefilled_input.js +0 -59
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0f7d09cee5a10cf3cbe9b1aa85666f7d11085889
4
- data.tar.gz: 1dfe58a3f0553599f33821571a5551883feebafc
3
+ metadata.gz: 4cfc568f170e1beb62a4c80760440fabb9783a86
4
+ data.tar.gz: e80514b54e2488eb94ce9c816b3f768e6197b3af
5
5
  SHA512:
6
- metadata.gz: e9152f3b09f3c6b3613113faa1a78857b8dddd956af2e735fe3d953471bcca215fef056482cec2daacb8f0420047d25a18113ab6f8387aadeb447dbe84b1fb85
7
- data.tar.gz: cd4d52db35d9e70931108c9a21f75f1dc66f2b38bab38ddb9891f03916dca84329997824af7315b6f2b3bd5c051dd39654273e1e5c62bb5693bccb681672bc55
6
+ metadata.gz: e1fa608458423954863c997253b4a84cec76cfbb32eb77b69b1e2b3128882c25c1021042d676c6063041b16370da69f22a25f054b89da225e7835bd9d0a825d4
7
+ data.tar.gz: d4ae9049fcc8e6ba5c908fef1f9550f78a80f76869fe09c9cd37e3381c1578f2c748c3f33ef232c2864f82dd04373ecd9b2da9a52caa3d1c11ea6966a58eb897
data/.gitignore CHANGED
@@ -1,9 +1,4 @@
1
1
  *.gem
2
2
  *.swp
3
- .bundle
4
- .rake_tasks
5
- /bin/*
6
- !bin/suspenders
7
- pkg
8
- test_project
9
- tmp/aruba
3
+ /.bundle
4
+ /tmp/dummy
@@ -2,6 +2,10 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
+ - 2.1.0
6
+ before_install:
7
+ - git config --global user.name 'Travis CI'
8
+ - git config --global user.email 'travis-ci@example.com'
5
9
  install:
6
10
  - bundle install
7
11
  notifications:
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- suspenders (1.7.0)
4
+ suspenders (1.8.0)
5
5
  bundler (~> 1.3)
6
6
  rails (= 4.0.0)
7
7
 
@@ -32,13 +32,19 @@ GEM
32
32
  multi_json (~> 1.3)
33
33
  thread_safe (~> 0.1)
34
34
  tzinfo (~> 0.3.37)
35
- arel (4.0.1)
35
+ arel (4.0.2)
36
36
  aruba (0.5.3)
37
37
  childprocess (>= 0.3.6)
38
38
  cucumber (>= 1.1.1)
39
39
  rspec-expectations (>= 2.7.0)
40
40
  atomic (1.1.14)
41
41
  builder (3.1.4)
42
+ capybara (2.2.0)
43
+ mime-types (>= 1.16)
44
+ nokogiri (>= 1.3.3)
45
+ rack (>= 1.0.0)
46
+ rack-test (>= 0.5.4)
47
+ xpath (~> 2.0)
42
48
  childprocess (0.3.9)
43
49
  ffi (~> 1.0, >= 1.0.11)
44
50
  cucumber (1.3.3)
@@ -61,10 +67,15 @@ GEM
61
67
  mime-types (~> 1.16)
62
68
  treetop (~> 1.4.8)
63
69
  mime-types (1.25.1)
70
+ mini_portile (0.5.2)
64
71
  minitest (4.7.5)
65
72
  multi_json (1.7.7)
66
73
  multi_test (0.0.1)
67
- polyglot (0.3.3)
74
+ nokogiri (1.6.1)
75
+ mini_portile (~> 0.5.0)
76
+ nokogiri (1.6.1-x86-mingw32)
77
+ mini_portile (~> 0.5.0)
78
+ polyglot (0.3.4)
68
79
  rack (1.5.2)
69
80
  rack-test (0.6.2)
70
81
  rack (>= 1.0)
@@ -81,9 +92,15 @@ GEM
81
92
  activesupport (= 4.0.0)
82
93
  rake (>= 0.8.7)
83
94
  thor (>= 0.18.1, < 2.0)
84
- rake (10.1.0)
95
+ rake (10.1.1)
96
+ rspec (2.14.1)
97
+ rspec-core (~> 2.14.0)
98
+ rspec-expectations (~> 2.14.0)
99
+ rspec-mocks (~> 2.14.0)
100
+ rspec-core (2.14.7)
85
101
  rspec-expectations (2.14.0)
86
102
  diff-lcs (>= 1.1.3, < 2.0)
103
+ rspec-mocks (2.14.4)
87
104
  sprockets (2.10.1)
88
105
  hike (~> 1.2)
89
106
  multi_json (~> 1.0)
@@ -101,6 +118,8 @@ GEM
101
118
  polyglot
102
119
  polyglot (>= 0.3.1)
103
120
  tzinfo (0.3.38)
121
+ xpath (2.0.0)
122
+ nokogiri (~> 1.3)
104
123
 
105
124
  PLATFORMS
106
125
  ruby
@@ -108,5 +127,7 @@ PLATFORMS
108
127
 
109
128
  DEPENDENCIES
110
129
  aruba (~> 0.5.2)
130
+ capybara
111
131
  cucumber (~> 1.2)
132
+ rspec
112
133
  suspenders!
data/NEWS.md CHANGED
@@ -1,3 +1,22 @@
1
+ 1.8.0 (February 18, 2014)
2
+
3
+ * Make the .git/safe directory in bin/setup.
4
+ * Require `rails_12factor` gem only on Heroku.
5
+ * Require mailer config on staging and production.
6
+ * Add rspec binstub.
7
+ * Fix .ruby-version on Ruby 2.1.0.
8
+ * Replace Flutie's `page_title` with `title` gem.
9
+ * Don't run factory specs twice.
10
+ * Inherit staging config from production.
11
+ * Internal: convert tests from Cucumber to RSpec.
12
+ * Don't include `prefilled_input.js`.
13
+ * Fix Rack class name - Deflater instead of Timeout.
14
+ * Add Pry Rails.
15
+ * Add Spring.
16
+ * Add Dotenv to development and test environments to load environment variables
17
+ from the `.env` file.
18
+ * Reduce ActiveRecord connection pool from 5 to 2.
19
+
1
20
  1.7.0 (December 6, 2013)
2
21
 
3
22
  * Keep `db/schema.rb` under version control.
data/README.md CHANGED
@@ -35,8 +35,8 @@ It includes application gems like:
35
35
  processing
36
36
  * [Email Validator](https://github.com/balexand/email_validator) for email
37
37
  validation
38
- * [Flutie](https://github.com/thoughtbot/flutie) for `page_title` and
39
- `body_class` view helpers
38
+ * [Flutie](https://github.com/thoughtbot/flutie) for and `body_class` view
39
+ helper
40
40
  * [High Voltage](https://github.com/thoughtbot/high_voltage) for static pages
41
41
  * [jQuery Rails](https://github.com/rails/jquery-rails) for jQuery
42
42
  * [Neat](https://github.com/thoughtbot/neat) for semantic grids
@@ -48,13 +48,22 @@ It includes application gems like:
48
48
  * [Simple Form](https://github.com/plataformatec/simple_form) for form markup
49
49
  and style
50
50
  * [Unicorn](https://github.com/defunkt/unicorn) to serve HTTP requests
51
+ * [Title](https://github.com/calebthompson/title) for storing titles in
52
+ translations
51
53
 
52
54
  And gems only for staging and production like:
53
55
 
54
56
  * [New Relic RPM](https://github.com/newrelic/rpm) for monitoring performance
55
- * [Rails 12 Factor](https://github.com/heroku/rails_12factor) to making running
57
+ * [Rails 12 Factor](https://github.com/heroku/rails_12factor) to make running
56
58
  Rails 4 apps easier on Heroku
57
59
 
60
+ And development gems like:
61
+
62
+ * [Dotenv](https://github.com/bkeepers/dotenv) for loading environment variables
63
+ * [Pry Rails](https://github.com/rweng/pry-rails) for debugging
64
+ * [Spring](https://github.com/rails/spring) for fast Rails actions via
65
+ pre-loading
66
+
58
67
  And testing gems like:
59
68
 
60
69
  * [Capybara](https://github.com/jnicklas/capybara) and
@@ -75,12 +84,16 @@ Suspenders also comes with:
75
84
  * The [`./bin/setup`][bin] convention for new developer setup
76
85
  * Rails' flashes set up and in application layout
77
86
  * A few nice time formats set up for localization
78
- * `Rack::Timeout` to [compress responses with Gzip][compress]
87
+ * `Rack::Deflater` to [compress responses with Gzip][compress]
79
88
  * [Fast-failing factories][fast]
89
+ * A [low database connection pool limit][pool]
90
+ * [Safe binstubs][binstub]
80
91
 
81
92
  [bin]: http://robots.thoughtbot.com/bin-setup
82
93
  [compress]: http://robots.thoughtbot.com/content-compression-with-rack-deflater/
83
94
  [fast]: http://robots.thoughtbot.com/testing-your-factories-first
95
+ [pool]: https://devcenter.heroku.com/articles/concurrency-and-database-connections
96
+ [binstub]: https://github.com/thoughtbot/suspenders/pull/282
84
97
 
85
98
  Suspenders fixes several of Rails' [insecure defaults]:
86
99
 
@@ -172,5 +185,5 @@ The names and logos for thoughtbot are trademarks of thoughtbot, inc.
172
185
  License
173
186
  -------
174
187
 
175
- Suspenders is Copyright © 2008-2013 thoughtbot. It is free software, and may be
188
+ Suspenders is Copyright © 2008-2014 thoughtbot. It is free software, and may be
176
189
  redistributed under the terms specified in the LICENSE file.
data/Rakefile CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'bundler/setup'
2
2
  require 'bundler/gem_tasks'
3
- require 'cucumber/rake/task'
3
+ require 'rspec/core/rake_task'
4
4
 
5
- Cucumber::Rake::Task.new
5
+ RSpec::Core::RakeTask.new(:rspec)
6
6
 
7
7
  desc 'Run the test suite'
8
- task :default => ['cucumber']
8
+ task :default => :rspec
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # This file was generated by Bundler.
4
+ #
5
+ # The application 'rspec' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'pathname'
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
11
+ Pathname.new(__FILE__).realpath)
12
+
13
+ require 'rubygems'
14
+ require 'bundler/setup'
15
+
16
+ load Gem.bin_path('rspec-core', 'rspec')
@@ -1,8 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'pathname'
2
3
 
3
- require File.expand_path(File.join('..', 'lib', 'suspenders', 'generators', 'app_generator'), File.dirname(__FILE__))
4
- require File.expand_path(File.join('..', 'lib', 'suspenders', 'actions'), File.dirname(__FILE__))
5
- require File.expand_path(File.join('..', 'lib', 'suspenders', 'app_builder'), File.dirname(__FILE__))
4
+ source_path = (Pathname.new(__FILE__).dirname + '../lib').expand_path
5
+ $LOAD_PATH << source_path
6
+
7
+ require 'suspenders'
6
8
 
7
9
  if ['create', '--create'].include? ARGV[0]
8
10
  ARGV.shift
@@ -0,0 +1,3 @@
1
+ require 'suspenders/generators/app_generator'
2
+ require 'suspenders/actions'
3
+ require 'suspenders/app_builder'
@@ -6,14 +6,6 @@ module Suspenders
6
6
  template 'README.md.erb', 'README.md'
7
7
  end
8
8
 
9
- def remove_public_index
10
- remove_file 'public/index.html'
11
- end
12
-
13
- def remove_rails_logo_image
14
- remove_file 'app/assets/images/rails.png'
15
- end
16
-
17
9
  def raise_on_delivery_errors
18
10
  replace_in_file 'config/environments/development.rb',
19
11
  'raise_delivery_errors = false', 'raise_delivery_errors = true'
@@ -92,10 +84,17 @@ module Suspenders
92
84
  end
93
85
 
94
86
  def setup_staging_environment
95
- run 'cp config/environments/production.rb config/environments/staging.rb'
87
+ staging_file = 'config/environments/staging.rb'
88
+ copy_file 'staging.rb', staging_file
89
+
90
+ config = <<-RUBY
96
91
 
97
- prepend_file 'config/environments/staging.rb',
98
- "Mail.register_interceptor RecipientInterceptor.new(ENV['EMAIL_RECIPIENTS'])\n"
92
+ #{app_name.classify}::Application.configure do
93
+ # ...
94
+ end
95
+ RUBY
96
+
97
+ append_file staging_file, config
99
98
  end
100
99
 
101
100
  def setup_secret_token
@@ -128,10 +127,6 @@ module Suspenders
128
127
  ''
129
128
  end
130
129
 
131
- def create_common_javascripts
132
- directory 'javascripts', 'app/assets/javascripts'
133
- end
134
-
135
130
  def use_postgres_config_template
136
131
  template 'postgresql_database.yml.erb', 'config/database.yml',
137
132
  :force => true
@@ -149,7 +144,12 @@ module Suspenders
149
144
  def set_ruby_to_version_being_used
150
145
  inject_into_file 'Gemfile', "\n\nruby '#{RUBY_VERSION}'",
151
146
  after: /source 'https:\/\/rubygems.org'/
152
- create_file '.ruby-version', "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}\n"
147
+ create_file '.ruby-version', "#{RUBY_VERSION}#{patchlevel}\n"
148
+ end
149
+
150
+ def setup_heroku_specific_gems
151
+ inject_into_file 'Gemfile', "\n\s\sgem 'rails_12factor'",
152
+ after: /group :staging, :production do/
153
153
  end
154
154
 
155
155
  def enable_database_cleaner
@@ -166,9 +166,8 @@ module Suspenders
166
166
  copy_file 'spec_helper.rb', 'spec/spec_helper.rb'
167
167
  end
168
168
 
169
- def use_rspec_binstub
170
- run 'bundle binstub rspec-core'
171
- run 'rm bin/autospec'
169
+ def use_spring_binstubs
170
+ run 'bundle exec spring binstub --all'
172
171
  end
173
172
 
174
173
  def configure_background_jobs_for_rspec
@@ -204,10 +203,6 @@ module Suspenders
204
203
  generate 'rspec:install'
205
204
  end
206
205
 
207
- def generate_clearance
208
- generate 'clearance:install'
209
- end
210
-
211
206
  def configure_unicorn
212
207
  copy_file 'unicorn.rb', 'config/unicorn.rb'
213
208
  end
@@ -309,7 +304,7 @@ git remote add production git@heroku.com:#{app_name}-production.git
309
304
 
310
305
  def override_path_for_tests
311
306
  if ENV['TESTING']
312
- support_bin = File.expand_path(File.join('..', '..', '..', 'features', 'support', 'bin'))
307
+ support_bin = File.expand_path(File.join('..', '..', 'spec', 'fakes', 'bin'))
313
308
  "PATH=#{support_bin}:$PATH"
314
309
  end
315
310
  end
@@ -321,5 +316,13 @@ git remote add production git@heroku.com:#{app_name}-production.git
321
316
  def generate_secret
322
317
  SecureRandom.hex(64)
323
318
  end
319
+
320
+ def patchlevel
321
+ if RUBY_PATCHLEVEL == 0 && RUBY_VERSION >= '2.1.0'
322
+ ''
323
+ else
324
+ "-p#{RUBY_PATCHLEVEL}"
325
+ end
326
+ end
324
327
  end
325
328
  end
@@ -21,7 +21,6 @@ module Suspenders
21
21
  end
22
22
 
23
23
  def suspenders_customization
24
- invoke :remove_files_we_dont_need
25
24
  invoke :customize_gemfile
26
25
  invoke :setup_development_environment
27
26
  invoke :setup_test_environment
@@ -42,14 +41,14 @@ module Suspenders
42
41
  invoke :outro
43
42
  end
44
43
 
45
- def remove_files_we_dont_need
46
- build :remove_public_index
47
- build :remove_rails_logo_image
48
- end
49
-
50
44
  def customize_gemfile
51
45
  build :replace_gemfile
52
46
  build :set_ruby_to_version_being_used
47
+
48
+ if options[:heroku]
49
+ build :setup_heroku_specific_gems
50
+ end
51
+
53
52
  bundle_command 'install'
54
53
  end
55
54
 
@@ -77,7 +76,7 @@ module Suspenders
77
76
  build :test_factories_first
78
77
  build :generate_rspec
79
78
  build :configure_rspec
80
- build :use_rspec_binstub
79
+ build :use_spring_binstubs
81
80
  build :configure_background_jobs_for_rspec
82
81
  build :enable_database_cleaner
83
82
  build :configure_spec_support_features
@@ -110,14 +109,11 @@ module Suspenders
110
109
  def setup_coffeescript
111
110
  say 'Setting up CoffeeScript defaults'
112
111
  build :remove_turbolinks
113
- build :create_common_javascripts
114
112
  end
115
113
 
116
114
  def configure_app
117
115
  say 'Configuring app'
118
116
  build :configure_action_mailer
119
- build :blacklist_active_record_attributes
120
- build :configure_strong_parameters
121
117
  build :configure_time_zone
122
118
  build :configure_time_formats
123
119
  build :configure_rack_timeout
@@ -164,11 +160,6 @@ module Suspenders
164
160
  build :init_git
165
161
  end
166
162
 
167
- def copy_libraries
168
- say 'Copying libraries'
169
- build :copy_libraries
170
- end
171
-
172
163
  def copy_miscellaneous_files
173
164
  say 'Copying miscellaneous support files'
174
165
  build :copy_miscellaneous_files
@@ -1,3 +1,3 @@
1
1
  module Suspenders
2
- VERSION = '1.7.0'
2
+ VERSION = '1.8.0'
3
3
  end
File without changes
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'GitHub' do
4
+ scenario 'Suspend a project with --github option' do
5
+ repo_name = 'test'
6
+ run_suspenders("--github=#{repo_name}")
7
+
8
+ expect(FakeGithub).to have_created_repo(repo_name)
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'Heroku' do
4
+ scenario 'Suspend a project with --heroku=true' do
5
+ run_suspenders('--heroku=true')
6
+
7
+ expect(FakeHeroku).to have_gem_included(project_path, 'rails_12factor')
8
+ expect(FakeHeroku).to have_created_app_for('staging')
9
+ expect(FakeHeroku).to have_created_app_for('production')
10
+ expect(FakeHeroku).to have_configured_vars('staging', 'SECRET_KEY_BASE')
11
+ expect(FakeHeroku).to have_configured_vars('production', 'SECRET_KEY_BASE')
12
+ end
13
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'Suspend a new project with default configuration' do
4
+ scenario 'specs pass' do
5
+ run_suspenders
6
+
7
+ Dir.chdir(project_path) do
8
+ Bundler.with_clean_env do
9
+ expect(`rake`).to include('0 failures')
10
+ end
11
+ end
12
+ end
13
+
14
+ scenario 'staging config is inherited from production' do
15
+ run_suspenders
16
+
17
+ staging_file = IO.read("#{project_path}/config/environments/staging.rb")
18
+ config_stub = "Dummy::Application.configure do"
19
+ expect(staging_file).to match(/^require_relative 'production'/)
20
+ expect(staging_file).to match(/#{config_stub}/), staging_file
21
+ end
22
+
23
+ if RUBY_PATCHLEVEL == 0 && RUBY_VERSION >= '2.1.0'
24
+ scenario '.ruby-version does not include patchlevel for Ruby 2.1.0' do
25
+ run_suspenders
26
+
27
+ ruby_version_file = IO.read("#{project_path}/.ruby-version")
28
+ expect(ruby_version_file).to eq "2.1.0\n"
29
+ end
30
+ else
31
+ scenario '.ruby-version includes patchlevel for all pre-Ruby 2.1.0 versions' do
32
+ run_suspenders
33
+
34
+ ruby_version_file = IO.read("#{project_path}/.ruby-version")
35
+ expect(ruby_version_file).to eq "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}\n"
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ require 'capybara/rspec'
2
+ require 'bundler/setup'
3
+
4
+ Bundler.require(:default, :test)
5
+
6
+ require (Pathname.new(__FILE__).dirname + '../lib/suspenders').expand_path
7
+
8
+ Dir['./spec/support/**/*.rb'].each { |file| require file }
9
+
10
+ RSpec.configure do |config|
11
+ config.include SuspendersTestHelpers
12
+
13
+ config.before(:all) do
14
+ create_tmp_directory
15
+ end
16
+
17
+ config.before(:each) do
18
+ drop_dummy_database
19
+ remove_project_directory
20
+
21
+ FakeHeroku.clear!
22
+ FakeGithub.clear!
23
+ end
24
+ end
@@ -16,6 +16,6 @@ class FakeGithub
16
16
  end
17
17
 
18
18
  def self.has_created_repo?(repo_name)
19
- File.open(RECORDER, 'r').read.include?("create #{repo_name}")
19
+ File.read(RECORDER) == "create #{repo_name}"
20
20
  end
21
21
  end
@@ -0,0 +1,36 @@
1
+ class FakeHeroku
2
+ RECORDER = File.expand_path(File.join('..', '..', 'tmp', 'heroku_commands'), File.dirname(__FILE__))
3
+
4
+ def initialize(args)
5
+ @args = args
6
+ end
7
+
8
+ def run!
9
+ File.open(RECORDER, 'a') do |file|
10
+ file.puts @args.join(' ')
11
+ end
12
+ end
13
+
14
+ def self.clear!
15
+ FileUtils.rm_rf RECORDER
16
+ end
17
+
18
+ def self.has_gem_included?(project_path, gem_name)
19
+ gemfile = File.open(File.join(project_path, 'Gemfile'), 'a')
20
+
21
+ File.foreach(gemfile).any?{ |line| line.match(/rails_12factor/) }
22
+ end
23
+
24
+ def self.has_created_app_for?(remote_name)
25
+ app_name = "#{SuspendersTestHelpers::APP_NAME}-#{remote_name}"
26
+ expected_line = "create #{app_name} --remote=#{remote_name}\n"
27
+
28
+ File.foreach(RECORDER).any? { |line| line == expected_line }
29
+ end
30
+
31
+ def self.has_configured_vars?(remote_name, var)
32
+ File.foreach(RECORDER).any? do |line|
33
+ line =~ /^config:add #{var}=.+ --remote=#{remote_name}\n$/
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,50 @@
1
+ module SuspendersTestHelpers
2
+ APP_NAME = 'dummy'
3
+
4
+ def remove_project_directory
5
+ FileUtils.rm_rf(project_path)
6
+ end
7
+
8
+ def create_tmp_directory
9
+ FileUtils.mkdir_p(tmp_path)
10
+ end
11
+
12
+ def run_suspenders(arguments = nil)
13
+ Dir.chdir(tmp_path) do
14
+ Bundler.with_clean_env do
15
+ ENV['TESTING'] = '1'
16
+ ENV['DISABLE_SPRING'] = '1'
17
+
18
+ %x(#{suspenders_bin} #{APP_NAME} #{arguments})
19
+ end
20
+ end
21
+ end
22
+
23
+ def drop_dummy_database
24
+ if File.exists?(project_path)
25
+ Dir.chdir(project_path) do
26
+ Bundler.with_clean_env do
27
+ `rake db:drop`
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ def project_path
34
+ @project_path ||= Pathname.new("#{tmp_path}/#{APP_NAME}")
35
+ end
36
+
37
+ private
38
+
39
+ def tmp_path
40
+ @tmp_path ||= Pathname.new("#{root_path}/tmp")
41
+ end
42
+
43
+ def suspenders_bin
44
+ File.join(root_path, 'bin', 'suspenders')
45
+ end
46
+
47
+ def root_path
48
+ File.expand_path('../../../', __FILE__)
49
+ end
50
+ end
@@ -30,4 +30,6 @@ rush to build something amazing; don't use it if you like missing deadlines.
30
30
  s.summary = "Generate a Rails app using thoughtbot's best practices."
31
31
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
32
32
  s.version = Suspenders::VERSION
33
+ s.add_development_dependency 'rspec'
34
+ s.add_development_dependency 'capybara'
33
35
  end
@@ -15,6 +15,7 @@ gem 'rails', '>= 4.0.0'
15
15
  gem 'recipient_interceptor'
16
16
  gem 'sass-rails'
17
17
  gem 'simple_form'
18
+ gem 'title'
18
19
  gem 'uglifier'
19
20
  gem 'unicorn'
20
21
 
@@ -22,10 +23,14 @@ group :development do
22
23
  gem 'better_errors'
23
24
  gem 'binding_of_caller'
24
25
  gem 'foreman'
26
+ gem 'spring'
27
+ gem 'spring-commands-rspec'
25
28
  end
26
29
 
27
30
  group :development, :test do
31
+ gem 'dotenv-rails'
28
32
  gem 'factory_girl_rails'
33
+ gem 'pry-rails'
29
34
  gem 'rspec-rails', '>= 2.14'
30
35
  end
31
36
 
@@ -41,5 +46,4 @@ end
41
46
 
42
47
  group :staging, :production do
43
48
  gem 'newrelic_rpm', '>= 3.6.7'
44
- gem 'rails_12factor'
45
49
  end
@@ -4,7 +4,7 @@
4
4
  Getting Started
5
5
  ---------------
6
6
 
7
- This repository comes equipped with a self-setup script!
7
+ This repository comes equipped with a self-setup script:
8
8
 
9
9
  % ./bin/setup
10
10
 
@@ -12,6 +12,9 @@ bundle install
12
12
  # Set up the database
13
13
  bundle exec rake db:setup
14
14
 
15
+ # Add binstubs to PATH via export PATH=".git/safe/../../bin:$PATH" in ~/.zshenv
16
+ mkdir -p .git/safe
17
+
15
18
  # Set up configurable environment variables
16
19
  if [ ! -f .env ]; then
17
20
  cp .sample.env .env
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
- FactoryGirl.factories.map(&:name).each do |factory_name|
4
- describe "factory #{factory_name}" do
5
- it 'is valid' do
3
+ describe 'factories' do
4
+ FactoryGirl.factories.map(&:name).each do |factory_name|
5
+ specify "#{factory_name} factory is valid", :factory do
6
6
  factory = build(factory_name)
7
7
 
8
8
  if factory.respond_to?(:valid?)
@@ -1,6 +1,12 @@
1
1
  if defined?(RSpec)
2
- desc 'Run factory specs.'
2
+ task(:spec).clear
3
+
4
+ desc 'Run all specs'
5
+ RSpec::Core::RakeTask.new(:spec) do |t|
6
+ t.rspec_opts = '--tag ~factory'
7
+ end
3
8
 
9
+ desc 'Run factory specs.'
4
10
  RSpec::Core::RakeTask.new(:factory_specs) do |t|
5
11
  t.pattern = './spec/models/factories_spec.rb'
6
12
  end
@@ -3,7 +3,7 @@ development: &default
3
3
  database: <%= app_name %>_development
4
4
  encoding: utf8
5
5
  min_messages: warning
6
- pool: 5
6
+ pool: 2
7
7
  timeout: 5000
8
8
 
9
9
  test:
@@ -1,10 +1,10 @@
1
1
  if Rails.env.staging? || Rails.env.production?
2
2
  SMTP_SETTINGS = {
3
- address: ENV['SMTP_ADDRESS'], # example: 'smtp.sendgrid.net'
3
+ address: ENV.fetch('SMTP_ADDRESS'), # example: 'smtp.sendgrid.net'
4
4
  authentication: :plain,
5
- domain: ENV['SMTP_DOMAIN'], # example: 'this-app.com'
6
- password: ENV['SMTP_PASSWORD'],
5
+ domain: ENV.fetch('SMTP_DOMAIN'), # example: 'this-app.com'
6
+ password: ENV.fetch('SMTP_PASSWORD'),
7
7
  port: '587',
8
- user_name: ENV['SMTP_USERNAME']
8
+ user_name: ENV.fetch('SMTP_USERNAME')
9
9
  }
10
10
  end
@@ -0,0 +1,3 @@
1
+ require_relative 'production'
2
+
3
+ Mail.register_interceptor RecipientInterceptor.new(ENV['EMAIL_RECIPIENTS'])
@@ -2,13 +2,12 @@
2
2
  *.DS_Store
3
3
  *.swo
4
4
  *.swp
5
- .bundle
6
- .sass-cache/
7
- coverage/*
8
- db/*.sqlite3
9
- log/*
10
- public/system
11
- rerun.txt
12
- tags
13
- tmp/*
14
- tmp/**/*
5
+ /.bundle
6
+ /.env
7
+ /.foreman
8
+ /coverage/*
9
+ /db/*.sqlite3
10
+ /log/*
11
+ /public/system
12
+ /tags
13
+ /tmp/*
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="ROBOTS" content="NOODP" />
6
- <title><%%= page_title %></title>
6
+ <title><%%= title %></title>
7
7
  <%%= stylesheet_link_tag :application, :media => 'all' %>
8
8
  <%%= csrf_meta_tags %>
9
9
  </head>
@@ -21,6 +21,9 @@ after_fork do |server, worker|
21
21
  end
22
22
 
23
23
  if defined? ActiveRecord::Base
24
- ActiveRecord::Base.establish_connection
24
+ config = Rails.application.config.database_configuration[Rails.env]
25
+ config['reaping_frequency'] = (ENV['DB_REAPING_FREQUENCY'] || 10).to_i
26
+ config['pool'] = (ENV['DB_POOL'] || 2).to_i
27
+ ActiveRecord::Base.establish_connection(config)
25
28
  end
26
29
  end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: suspenders
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.0
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - thoughtbot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-05 00:00:00.000000000 Z
11
+ date: 2014-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
@@ -42,44 +42,73 @@ dependencies:
42
42
  name: aruba
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 0.5.2
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.5.2
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: cucumber
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.2'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: capybara
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  description: |
70
98
  Suspenders is a base Rails project that you can upgrade. It is used by
71
99
  thoughtbot to get a jump start on a working app. Use Suspenders if you're in a
72
100
  rush to build something amazing; don't use it if you like missing deadlines.
73
101
  email: support@thoughtbot.com
74
102
  executables:
103
+ - rspec
75
104
  - suspenders
76
105
  extensions: []
77
106
  extra_rdoc_files:
78
107
  - README.md
79
108
  - LICENSE
80
109
  files:
81
- - .gitignore
82
- - .travis.yml
110
+ - ".gitignore"
111
+ - ".travis.yml"
83
112
  - CONTRIBUTING.md
84
113
  - Gemfile
85
114
  - Gemfile.lock
@@ -87,20 +116,22 @@ files:
87
116
  - NEWS.md
88
117
  - README.md
89
118
  - Rakefile
119
+ - bin/rspec
90
120
  - bin/suspenders
91
- - features/github_repo.feature
92
- - features/heroku_true.feature
93
- - features/rake_clean.feature
94
- - features/step_definitions/suspenders_steps.rb
95
- - features/support/bin/heroku
96
- - features/support/bin/hub
97
- - features/support/env.rb
98
- - features/support/fake_github.rb
99
- - features/support/fake_heroku.rb
121
+ - lib/suspenders.rb
100
122
  - lib/suspenders/actions.rb
101
123
  - lib/suspenders/app_builder.rb
102
124
  - lib/suspenders/generators/app_generator.rb
103
125
  - lib/suspenders/version.rb
126
+ - spec/fakes/bin/heroku
127
+ - spec/fakes/bin/hub
128
+ - spec/features/github_spec.rb
129
+ - spec/features/heroku_spec.rb
130
+ - spec/features/new_project_spec.rb
131
+ - spec/spec_helper.rb
132
+ - spec/support/fake_github.rb
133
+ - spec/support/fake_heroku.rb
134
+ - spec/support/suspenders.rb
104
135
  - suspenders.gemspec
105
136
  - templates/Gemfile_clean
106
137
  - templates/Procfile
@@ -117,13 +148,13 @@ files:
117
148
  - templates/factories_spec.rb
118
149
  - templates/factories_spec_rake_task.rb
119
150
  - templates/factory_girl_syntax_rspec.rb
120
- - templates/javascripts/prefilled_input.js
121
151
  - templates/postgresql_database.yml.erb
122
152
  - templates/rack_timeout.rb
123
153
  - templates/sample.env
124
154
  - templates/secret_token.rb
125
155
  - templates/smtp.rb
126
156
  - templates/spec_helper.rb
157
+ - templates/staging.rb
127
158
  - templates/suspenders_gitignore
128
159
  - templates/suspenders_layout.html.erb.erb
129
160
  - templates/unicorn.rb
@@ -133,32 +164,32 @@ licenses:
133
164
  metadata: {}
134
165
  post_install_message:
135
166
  rdoc_options:
136
- - --charset=UTF-8
167
+ - "--charset=UTF-8"
137
168
  require_paths:
138
169
  - lib
139
170
  required_ruby_version: !ruby/object:Gem::Requirement
140
171
  requirements:
141
- - - '>='
172
+ - - ">="
142
173
  - !ruby/object:Gem::Version
143
174
  version: 1.9.2
144
175
  required_rubygems_version: !ruby/object:Gem::Requirement
145
176
  requirements:
146
- - - '>='
177
+ - - ">="
147
178
  - !ruby/object:Gem::Version
148
179
  version: '0'
149
180
  requirements: []
150
181
  rubyforge_project:
151
- rubygems_version: 2.1.10
182
+ rubygems_version: 2.2.0
152
183
  signing_key:
153
184
  specification_version: 4
154
185
  summary: Generate a Rails app using thoughtbot's best practices.
155
186
  test_files:
156
- - features/github_repo.feature
157
- - features/heroku_true.feature
158
- - features/rake_clean.feature
159
- - features/step_definitions/suspenders_steps.rb
160
- - features/support/bin/heroku
161
- - features/support/bin/hub
162
- - features/support/env.rb
163
- - features/support/fake_github.rb
164
- - features/support/fake_heroku.rb
187
+ - spec/fakes/bin/heroku
188
+ - spec/fakes/bin/hub
189
+ - spec/features/github_spec.rb
190
+ - spec/features/heroku_spec.rb
191
+ - spec/features/new_project_spec.rb
192
+ - spec/spec_helper.rb
193
+ - spec/support/fake_github.rb
194
+ - spec/support/fake_heroku.rb
195
+ - spec/support/suspenders.rb
@@ -1,8 +0,0 @@
1
- @disable-bundler
2
- Feature: Creating a Github repo
3
-
4
- Scenario: --github=organization/project
5
- When I suspend a project called "test_project" with:
6
- | argument | value |
7
- | --github | organization/project |
8
- Then the "organization/project" Github repo should exist
@@ -1,11 +0,0 @@
1
- @disable-bundler
2
- Feature: Creating a Heroku app
3
-
4
- Scenario: --heroku=true
5
- When I suspend a project called "test_project" with:
6
- | argument | value |
7
- | --heroku | true |
8
- Then the "test_project-staging" Heroku app should exist
9
- And the "test_project-production" Heroku app should exist
10
- And the "staging" Heroku remote should have "SECRET_KEY_BASE" configured
11
- And the "production" Heroku remote should have "SECRET_KEY_BASE" configured
@@ -1,44 +0,0 @@
1
- @disable-bundler
2
- Feature: Rake works in the suspended project
3
- Background:
4
- Given I ensure no databases exist for "test_project"
5
-
6
- Scenario: Running rake in the suspended project
7
- When I suspend a project called "test_project"
8
- And I cd to the "test_project" root
9
- And I obtain a fresh checkout
10
- And I setup the project
11
- Then I can cleanly rake the project
12
-
13
- Scenario: Making a model spec then running rake
14
- When I suspend a project called "test_project"
15
- And I cd to the "test_project" root
16
- And I obtain a fresh checkout
17
- And I setup the project
18
- And I generate "model post title:string"
19
- And I run migrations
20
- Then I can cleanly rake the project
21
-
22
- Scenario: Making a feature spec then running rake
23
- When I suspend a project called "test_project"
24
- And I cd to the "test_project" root
25
- And I obtain a fresh checkout
26
- And I setup the project
27
- And I write to "spec/features/example_spec.rb" with:
28
- """
29
- require 'spec_helper'
30
-
31
- feature 'Example feature spec' do
32
- scenario 'using a method from the Features module' do
33
- expect(example_method).to eq('Expected Value')
34
- end
35
- end
36
- """
37
- And I write to "spec/support/features/example.rb" with:
38
- """
39
- module Features
40
- def example_method
41
- 'Expected Value'
42
- end
43
- end
44
- """
@@ -1,89 +0,0 @@
1
- require 'aruba/cucumber'
2
-
3
- When 'I run rake' do
4
- in_current_dir do
5
- run_simple 'bundle exec rake'
6
- end
7
- end
8
-
9
- When 'I run migrations' do
10
- in_current_dir do
11
- run_simple 'bundle exec rake db:migrate'
12
- end
13
- end
14
-
15
- When 'I obtain a fresh checkout' do
16
- in_current_dir do
17
- run_simple 'git clean --force -x -d'
18
- end
19
- end
20
-
21
- When 'I run the rake task "$task_name"' do |task_name|
22
- in_current_dir do
23
- run_simple "bundle exec rake #{task_name}"
24
- end
25
- end
26
-
27
- When 'I generate "$generator_with_args"' do |generator_with_args|
28
- in_current_dir do
29
- run_simple "bundle exec rails generate #{generator_with_args}"
30
- end
31
- end
32
-
33
- When 'I ensure no databases exist for "$project_name"' do |project_name|
34
- run "dropdb #{project_name}_development"
35
- run "dropdb #{project_name}_test"
36
- end
37
-
38
- When 'I suspend a project called "$project_name"' do |project_name|
39
- suspenders_bin = File.expand_path(File.join('..', '..', 'bin', 'suspenders'), File.dirname(__FILE__))
40
- run_simple "#{suspenders_bin} #{project_name}"
41
- cd project_name
42
- run_simple 'git add -A'
43
- run_simple 'git commit -m "Initial commit"'
44
- cd '..'
45
- end
46
-
47
- When %r{I suspend a project called "([^"]*)" with:} do |project_name, arguments_table|
48
- suspenders_bin = File.expand_path(File.join('..', '..', 'bin', 'suspenders'), File.dirname(__FILE__))
49
- arguments = arguments_table.hashes.inject([]) do |accum, argument|
50
- accum << "#{argument['argument']}=#{argument['value']}"
51
- end.join
52
- run_simple "#{suspenders_bin} #{project_name} #{arguments}"
53
- end
54
-
55
- When 'I cd to the "$test_project" root' do |dirname|
56
- cd dirname
57
- end
58
-
59
- When 'I setup the project' do
60
- run_simple 'bin/setup'
61
- end
62
-
63
- Then 'I can cleanly rake the project' do
64
- steps %{
65
- When I run rake
66
- }
67
- end
68
-
69
- Then %r{"(.*)" should not be installed} do |gem_name|
70
- in_current_dir do
71
- system("bundle show #{gem_name} 2>&1 > /dev/null").should be_false
72
- end
73
- end
74
-
75
- Then %r{"(.*)" should not be included in "(.*)"} do |content, file_path|
76
- check_file_content file_path, content, false
77
- end
78
-
79
- Then %r{the "([^"]*)" Heroku app should exist} do |app_name|
80
- FakeHeroku.should have_created_app(app_name)
81
- end
82
-
83
- Then %r{the "([^"]+)" Heroku remote should have "([^"]+)" configured} do |remote_name, config_name|
84
- FakeHeroku.configured_vars_for(remote_name).should include(config_name)
85
- end
86
-
87
- Then %r{the "([^"]*)" Github repo should exist} do |repo_name|
88
- FakeGithub.should have_created_repo(repo_name)
89
- end
@@ -1,10 +0,0 @@
1
- Before do
2
- ENV['TESTING'] = 'true'
3
- @aruba_timeout_seconds = 560
4
- end
5
-
6
- After do
7
- FakeHeroku.clear!
8
- FakeGithub.clear!
9
- FileUtils.rm_rf 'test_project'
10
- end
@@ -1,30 +0,0 @@
1
- class FakeHeroku
2
- RECORDER = File.expand_path(File.join('..', '..', 'tmp', 'heroku_commands'), File.dirname(__FILE__))
3
-
4
- def initialize(args)
5
- @args = args
6
- end
7
-
8
- def run!
9
- File.open(RECORDER, 'a') do |file|
10
- file.puts @args.join(' ')
11
- end
12
- end
13
-
14
- def self.clear!
15
- FileUtils.rm_rf RECORDER
16
- end
17
-
18
- def self.has_created_app?(app_name)
19
- File.open(RECORDER, 'r').read.include?("create #{app_name}")
20
- end
21
-
22
- def self.configured_vars_for(remote_name)
23
- File.open(RECORDER, 'r').
24
- each_line.
25
- grep(/^config:add .* --remote=#{remote_name}/) { |line|
26
- line.scan(/([A-Z_]+)=[^ ]*/)
27
- }.
28
- flatten
29
- end
30
- end
@@ -1,59 +0,0 @@
1
- // clear inputs with starter values
2
- new function($) {
3
- $.fn.prefilledInput = function() {
4
-
5
- var focus = function () {
6
- $(this).removeClass('prefilled');
7
- if (this.value == this.prefilledValue) {
8
- this.value = '';
9
- }
10
- };
11
-
12
- var blur = function () {
13
- if (this.value == '') {
14
- $(this).addClass('prefilled').val(this.prefilledValue);
15
- } else if (this.value != this.prefilledValue) {
16
- $(this).removeClass('prefilled');
17
- }
18
- };
19
-
20
- var extractPrefilledValue = function () {
21
- if (this.title) {
22
- this.prefilledValue = this.title;
23
- this.title = '';
24
- } else if (this.id) {
25
- this.prefilledValue = $('label[for=' + this.id + ']').hide().text();
26
- }
27
- if (this.prefilledValue) {
28
- this.prefilledValue = this.prefilledValue.replace(/\*$/, '');
29
- }
30
- };
31
-
32
- var initialize = function (index) {
33
- if (!this.prefilledValue) {
34
- this.extractPrefilledValue = extractPrefilledValue;
35
- this.extractPrefilledValue();
36
- $(this).trigger('blur');
37
- }
38
- };
39
-
40
- return this.filter(":input").
41
- focus(focus).
42
- blur(blur).
43
- each(initialize);
44
- };
45
-
46
- var clearPrefilledInputs = function () {
47
- var form = this.form || this;
48
- $(form).find("input.prefilled, textarea.prefilled").val("");
49
- };
50
-
51
- var prefilledSetup = function () {
52
- $('input.prefilled, textarea.prefilled').prefilledInput();
53
- $('form').submit(clearPrefilledInputs);
54
- $('input:submit, button:submit').click(clearPrefilledInputs);
55
- };
56
-
57
- $(document).ready(prefilledSetup);
58
- $(document).ajaxComplete(prefilledSetup);
59
- }(jQuery);