mj-suspenders 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.
@@ -0,0 +1,165 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/rails/app/app_generator'
3
+
4
+ module Suspenders
5
+ class AppGenerator < Rails::Generators::AppGenerator
6
+ class_option :database, :type => :string, :aliases => '-d', :default => 'mysql',
7
+ :desc => "Preconfigure for selected database (options: #{DATABASES.join('/')})"
8
+
9
+ class_option :skip_test_unit, :type => :boolean, :aliases => '-T', :default => true,
10
+ :desc => 'Skip Test::Unit files'
11
+
12
+ def finish_template
13
+ invoke :suspenders_customization
14
+ super
15
+ end
16
+
17
+ def suspenders_customization
18
+ invoke :customize_gemfile
19
+ invoke :setup_development_environment
20
+ invoke :setup_test_environment
21
+ invoke :setup_production_environment
22
+ invoke :setup_staging_environment
23
+ invoke :setup_secret_token
24
+ invoke :create_suspenders_views
25
+ invoke :setup_coffeescript
26
+ invoke :configure_app
27
+ invoke :setup_stylesheets
28
+ invoke :copy_miscellaneous_files
29
+ invoke :customize_error_pages
30
+ invoke :remove_routes_comment_lines
31
+ invoke :setup_git
32
+ invoke :setup_database
33
+ end
34
+
35
+ def customize_gemfile
36
+ build :replace_gemfile
37
+ build :set_ruby_to_version_being_used
38
+
39
+ bundle_command 'install'
40
+ end
41
+
42
+ def setup_database
43
+ say 'Setting up database'
44
+ build :create_database
45
+ end
46
+
47
+ def setup_development_environment
48
+ say 'Setting up the development environment'
49
+ build :raise_on_delivery_errors
50
+ build :raise_on_unpermitted_parameters
51
+ build :configure_generators
52
+ end
53
+
54
+ def setup_test_environment
55
+ say 'Setting up the test environment'
56
+ build :generate_rspec
57
+ build :configure_rspec
58
+ build :use_spring_binstubs
59
+ build :enable_database_cleaner
60
+ build :configure_spec_support_features
61
+ build :configure_travis
62
+ build :configure_i18n_in_specs
63
+ end
64
+
65
+ def setup_production_environment
66
+ say 'Setting up the production environment'
67
+ build :enable_rack_deflater
68
+ end
69
+
70
+ def setup_staging_environment
71
+ say 'Setting up the staging environment'
72
+ build :setup_staging_environment
73
+ end
74
+
75
+ def setup_secret_token
76
+ say 'Moving secret token out of version control'
77
+ build :setup_secret_token
78
+ end
79
+
80
+ def create_suspenders_views
81
+ say 'Creating suspenders views'
82
+ build :create_partials_directory
83
+ build :create_shared_flashes
84
+ build :create_shared_javascripts
85
+ build :create_application_layout
86
+ end
87
+
88
+ def setup_coffeescript
89
+ say 'Setting up CoffeeScript defaults'
90
+ build :remove_turbolinks
91
+ end
92
+
93
+ def configure_app
94
+ say 'Configuring app'
95
+ build :configure_action_mailer
96
+ build :configure_time_zone
97
+ build :configure_time_formats
98
+ build :disable_xml_params
99
+ build :fix_i18n_deprecation_warning
100
+ build :setup_default_rake_task
101
+ build :configure_unicorn
102
+ end
103
+
104
+ def setup_stylesheets
105
+ say 'Set up stylesheets'
106
+ build :setup_stylesheets
107
+ end
108
+
109
+ def setup_git
110
+ if !options[:skip_git]
111
+ say 'Initializing git'
112
+ invoke :setup_gitignore
113
+ invoke :init_git
114
+ end
115
+ end
116
+
117
+ def setup_gitignore
118
+ build :gitignore_files
119
+ end
120
+
121
+ def init_git
122
+ build :init_git
123
+ end
124
+
125
+ def copy_miscellaneous_files
126
+ say 'Copying miscellaneous support files'
127
+ build :copy_miscellaneous_files
128
+ end
129
+
130
+ def customize_error_pages
131
+ say 'Customizing the 500/404/422 pages'
132
+ build :customize_error_pages
133
+ end
134
+
135
+ def remove_routes_comment_lines
136
+ build :remove_routes_comment_lines
137
+ end
138
+
139
+ def run_bundle
140
+ # Let's not: We'll bundle manually at the right spot
141
+ end
142
+
143
+ def ruby_version_with_patch_level
144
+ "#{RUBY_VERSION}#{patch_level}"
145
+ end
146
+
147
+ protected
148
+
149
+ def get_builder_class
150
+ Suspenders::AppBuilder
151
+ end
152
+
153
+ def using_active_record?
154
+ !options[:skip_active_record]
155
+ end
156
+
157
+ def patch_level
158
+ if RUBY_PATCHLEVEL == 0 && RUBY_VERSION >= '2.1.0'
159
+ ''
160
+ else
161
+ "-p#{RUBY_PATCHLEVEL}"
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,3 @@
1
+ module Suspenders
2
+ VERSION = '0.0.1'
3
+ end
data/lib/suspenders.rb ADDED
@@ -0,0 +1,3 @@
1
+ require 'suspenders/generators/app_generator'
2
+ require 'suspenders/actions'
3
+ require 'suspenders/app_builder'
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'suspenders/version'
4
+ require 'date'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.required_ruby_version = '>= 1.9.2'
8
+ s.add_dependency 'bundler', '~> 1.3'
9
+ s.add_dependency 'rails', '4.0.3'
10
+ s.add_development_dependency 'aruba', '~> 0.5.2'
11
+ s.add_development_dependency 'cucumber', '~> 1.2'
12
+ s.authors = ['thoughtbot', 'Marcelo Jacobus']
13
+ s.date = Date.today.strftime('%Y-%m-%d')
14
+
15
+ s.description = <<-HERE
16
+ MJ-Suspenders is a base Rails project used by the author of this gem.
17
+ HERE
18
+
19
+ s.email = 'marcelo.jacobus@gmail.com'
20
+ s.executables = ['mj-suspenders']
21
+ s.extra_rdoc_files = %w[README.md LICENSE]
22
+ s.files = `git ls-files`.split("\n")
23
+ s.homepage = 'http://github.com/mjacobus/mg-suspenders'
24
+ s.license = 'MIT'
25
+ s.name = 'mj-suspenders'
26
+ s.rdoc_options = ['--charset=UTF-8']
27
+ s.require_paths = ['lib']
28
+ s.summary = "Generate a Rails app using thoughtbot's best practices. Plus Marcelo Jacobus favorites"
29
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
30
+ s.version = Suspenders::VERSION
31
+ s.add_development_dependency 'rspec'
32
+ s.add_development_dependency 'simplecov', '~> 0.7.1'
33
+ s.add_development_dependency 'capybara'
34
+ 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 "#{RUBY_VERSION}\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,27 @@
1
+ require 'capybara/rspec'
2
+ require 'bundler/setup'
3
+ require 'simplecov'
4
+
5
+ SimpleCov.start do
6
+ add_filter 'bin'
7
+ add_filter 'spec'
8
+ end
9
+
10
+ Bundler.require(:default, :test)
11
+
12
+ require (Pathname.new(__FILE__).dirname + '../lib/suspenders').expand_path
13
+
14
+ Dir['./spec/support/**/*.rb'].each { |file| require file }
15
+
16
+ RSpec.configure do |config|
17
+ config.include SuspendersTestHelpers
18
+
19
+ config.before(:all) do
20
+ create_tmp_directory
21
+ end
22
+
23
+ config.before(:each) do
24
+ drop_dummy_database
25
+ remove_project_directory
26
+ end
27
+ 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', 'mj-suspenders')
45
+ end
46
+
47
+ def root_path
48
+ File.expand_path('../../../', __FILE__)
49
+ end
50
+ end
@@ -0,0 +1,43 @@
1
+ source 'https://rubygems.org'
2
+
3
+ ruby '<%= RUBY_VERSION %>'
4
+
5
+ gem 'coffee-rails'
6
+ gem 'email_validator'
7
+ gem 'high_voltage'
8
+ gem 'jquery-rails'
9
+ gem 'mysql2'
10
+ gem 'rack-timeout'
11
+ gem 'rails', '>= 4.0.3'
12
+ gem 'recipient_interceptor'
13
+ gem 'sass-rails'
14
+ gem 'simple_form'
15
+ gem 'title'
16
+ gem 'uglifier'
17
+ gem 'unicorn'
18
+
19
+ group :development do
20
+ gem 'spring'
21
+ gem 'spring-commands-rspec'
22
+ end
23
+
24
+ group :development, :test do
25
+ gem 'awesome_print'
26
+ # gem 'dotenv-rails'
27
+ gem 'pry-rails'
28
+ gem 'rspec-rails', '>= 2.14'
29
+ end
30
+
31
+ group :test do
32
+ # gem 'capybara-webkit', '>= 1.0.0'
33
+ gem 'database_cleaner'
34
+ # gem 'launchy'
35
+ gem 'shoulda-matchers'
36
+ gem 'simplecov', require: false
37
+ gem 'timecop'
38
+ gem 'webmock'
39
+ end
40
+
41
+ group :staging, :production do
42
+ # gem 'newrelic_rpm', '>= 3.7.3'
43
+ end
@@ -0,0 +1,36 @@
1
+ <%= app_name.humanize %>
2
+ <%= '=' * app_name.humanize.length %>
3
+
4
+ [![Build Status](https://travis-ci.org/mjacobus/<%= app_name %>.png?branch=master)](https://travis-ci.org/mjacobus/<%= app_name %>)
5
+ [![Coverage Status](https://coveralls.io/repos/mjacobus/<%= app_name %>/badge.png)](https://coveralls.io/r/mjacobus/<%= app_name %>)
6
+ [![Code Climate](https://codeclimate.com/github/mjacobus/<%= app_name %>.png)](https://codeclimate.com/github/mjacobus/<%= app_name %>)
7
+
8
+ Getting Started
9
+ ---------------
10
+
11
+ TODO:
12
+
13
+ Guidelines
14
+ ----------
15
+
16
+ Use the following guides for getting things done, programming well, and
17
+ programming in style.
18
+
19
+ * [Protocol](http://github.com/thoughtbot/guides/blob/master/protocol)
20
+ * [Best Practices](http://github.com/thoughtbot/guides/blob/master/best-practices)
21
+ * [Style](http://github.com/thoughtbot/guides/blob/master/style)
22
+
23
+ Authors
24
+ -------
25
+
26
+ - [Marcelo Jacobus](https://github.com/mjacobus)
27
+
28
+ ## Contributing
29
+
30
+ 1. Fork it
31
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
32
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
33
+ 4. Push to the branch (`git push origin my-new-feature`)
34
+ 5. Create new Pull Request
35
+
36
+ ** Do not forget to write tests**
@@ -0,0 +1,5 @@
1
+ <div id="flash">
2
+ <% flash.each do |key, value| -%>
3
+ <div id="flash_<%= key %>"><%= value %></div>
4
+ <% end -%>
5
+ </div>
@@ -0,0 +1,10 @@
1
+ <%= javascript_include_tag :application %>
2
+
3
+ <%= yield :javascript %>
4
+
5
+ <% if Rails.env.test? %>
6
+ <%= javascript_tag do %>
7
+ $.fx.off = true;
8
+ $.ajaxSetup({ async: false });
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,4 @@
1
+ /**
2
+ *= require_self
3
+ *= require_tree .
4
+ */
@@ -0,0 +1,11 @@
1
+ en:
2
+ date:
3
+ formats:
4
+ default: '%m/%d/%Y'
5
+ with_weekday: '%a %m/%d/%y'
6
+
7
+ time:
8
+ formats:
9
+ default: '%a, %b %-d, %Y at %r'
10
+ date: '%b %-d, %Y'
11
+ short: '%B %d'
@@ -0,0 +1,21 @@
1
+ RSpec.configure do |config|
2
+ config.before(:suite) do
3
+ DatabaseCleaner.clean_with(:deletion)
4
+ end
5
+
6
+ config.before(:each) do
7
+ DatabaseCleaner.strategy = :transaction
8
+ end
9
+
10
+ config.before(:each, :js => true) do
11
+ DatabaseCleaner.strategy = :deletion
12
+ end
13
+
14
+ config.before(:each) do
15
+ DatabaseCleaner.start
16
+ end
17
+
18
+ config.after(:each) do
19
+ DatabaseCleaner.clean
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ # Protect against injection attacks
2
+ # http://www.kb.cert.org/vuls/id/380039
3
+ ActionDispatch::ParamsParser::DEFAULT_PARSERS.delete(Mime::XML)
@@ -0,0 +1,28 @@
1
+ require 'net/http'
2
+ require 'net/smtp'
3
+
4
+ # Example:
5
+ # begin
6
+ # some http call
7
+ # rescue *HTTP_ERRORS => error
8
+ # notify_hoptoad error
9
+ # end
10
+
11
+ HTTP_ERRORS = [Timeout::Error,
12
+ Errno::EINVAL,
13
+ Errno::ECONNRESET,
14
+ EOFError,
15
+ Net::HTTPBadResponse,
16
+ Net::HTTPHeaderSyntaxError,
17
+ Net::ProtocolError]
18
+
19
+ SMTP_SERVER_ERRORS = [TimeoutError,
20
+ IOError,
21
+ Net::SMTPUnknownError,
22
+ Net::SMTPServerBusy,
23
+ Net::SMTPAuthenticationError]
24
+
25
+ SMTP_CLIENT_ERRORS = [Net::SMTPFatalError,
26
+ Net::SMTPSyntaxError]
27
+
28
+ SMTP_ERRORS = SMTP_SERVER_ERRORS + SMTP_CLIENT_ERRORS
data/templates/i18n.rb ADDED
@@ -0,0 +1,3 @@
1
+ RSpec.configure do |config|
2
+ config.include AbstractController::Translation
3
+ end
@@ -0,0 +1 @@
1
+ <%= ruby_version_with_patch_level %>
@@ -0,0 +1,10 @@
1
+ # Your secret key is used for verifying the integrity of signed cookies.
2
+ # If you change this key, all old signed cookies will become invalid!
3
+
4
+ # Make sure the secret is at least 30 characters and all random,
5
+ # no regular words or you'll be exposed to dictionary attacks.
6
+ # You can use `rake secret` to generate a secure secret key.
7
+
8
+ # Make sure your secret_key_base is kept private
9
+ # if you're sharing your code publicly.
10
+ <%= app_const %>.config.secret_key_base = ENV['SECRET_KEY_BASE']
@@ -0,0 +1,29 @@
1
+ require 'simplecov'
2
+ SimpleCov.start 'rails'
3
+
4
+ ENV['RAILS_ENV'] = 'test'
5
+
6
+ require File.expand_path('../../config/environment', __FILE__)
7
+
8
+ require 'rspec/rails'
9
+ require 'webmock/rspec'
10
+
11
+ Dir[Rails.root.join('spec/support/**/*.rb')].each { |file| require file }
12
+
13
+ module Features
14
+ # Extend this module in spec/support/features/*.rb
15
+ end
16
+
17
+ RSpec.configure do |config|
18
+ config.expect_with :rspec do |c|
19
+ c.syntax = :expect
20
+ end
21
+
22
+ config.include Features, type: :feature
23
+ config.infer_base_class_for_anonymous_controllers = false
24
+ config.order = 'random'
25
+ config.use_transactional_fixtures = false
26
+ end
27
+
28
+ # Capybara.javascript_driver = :webkit
29
+ WebMock.disable_net_connect!(allow_localhost: true)
@@ -0,0 +1,6 @@
1
+ require_relative 'production'
2
+
3
+ Mail.register_interceptor RecipientInterceptor.new(
4
+ ENV['EMAIL_RECIPIENTS'] || ['marcelo.jacobus@gmail.com'],
5
+ subject_prefix: '[staging]'
6
+ )
@@ -0,0 +1,13 @@
1
+ !.keep
2
+ *.DS_Store
3
+ *.swo
4
+ *.swp
5
+ /.bundle
6
+ /.env
7
+ /.foreman
8
+ /coverage/*
9
+ /db/*.sqlite3
10
+ /log/*
11
+ /public/system
12
+ /tags
13
+ /tmp/*
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="ROBOTS" content="NOODP" />
6
+ <title><%%= title %></title>
7
+ <%%= stylesheet_link_tag :application, :media => 'all' %>
8
+ <%%= csrf_meta_tags %>
9
+ </head>
10
+ <body class="<%%= body_class %>">
11
+ <%%= render 'flashes' -%>
12
+ <%%= yield %>
13
+ <%%= render 'javascript' %>
14
+ </body>
15
+ </html>
@@ -0,0 +1,23 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
6
+ - 2.1.1
7
+ env:
8
+ - DB=sqlite
9
+ - DB=mysql
10
+ - DB=postgresql
11
+ script:
12
+ - RAILS_ENV=test bundle exec rake db:migrate --trace
13
+ - bundle exec rake db:test:prepare
14
+ - bundle exec rspec spec/
15
+ before_script:
16
+ - mysql -e 'create database <%= app_name %>_test'
17
+ - psql -c 'create database <%= app_name %>_test' -U postgres
18
+ branches:
19
+ only: master
20
+ notifications:
21
+ email:
22
+ on_failure: change
23
+ on_failure: always
@@ -0,0 +1,29 @@
1
+ # https://devcenter.heroku.com/articles/rails-unicorn
2
+
3
+ worker_processes (ENV['WEB_CONCURRENCY'] || 3).to_i
4
+ timeout (ENV['WEB_TIMEOUT'] || 5).to_i
5
+ preload_app true
6
+
7
+ before_fork do |server, worker|
8
+ Signal.trap 'TERM' do
9
+ puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
10
+ Process.kill 'QUIT', Process.pid
11
+ end
12
+
13
+ if defined? ActiveRecord::Base
14
+ ActiveRecord::Base.connection.disconnect!
15
+ end
16
+ end
17
+
18
+ after_fork do |server, worker|
19
+ Signal.trap 'TERM' do
20
+ puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
21
+ end
22
+
23
+ if defined? ActiveRecord::Base
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)
28
+ end
29
+ end