armadura 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +11 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +19 -0
  7. data/README.md +218 -0
  8. data/Rakefile +8 -0
  9. data/USAGE +9 -0
  10. data/armadura.gemspec +29 -0
  11. data/bin/armadura +23 -0
  12. data/bin/rake +16 -0
  13. data/bin/rspec +16 -0
  14. data/bin/setup +13 -0
  15. data/lib/armadura.rb +7 -0
  16. data/lib/armadura/actions.rb +33 -0
  17. data/lib/armadura/adapters/heroku.rb +118 -0
  18. data/lib/armadura/app_builder.rb +484 -0
  19. data/lib/armadura/generators/app_generator.rb +245 -0
  20. data/lib/armadura/generators/static_generator.rb +10 -0
  21. data/lib/armadura/generators/stylesheet_base_generator.rb +37 -0
  22. data/lib/armadura/version.rb +8 -0
  23. data/spec/adapters/heroku_spec.rb +57 -0
  24. data/spec/fakes/bin/heroku +5 -0
  25. data/spec/fakes/bin/hub +5 -0
  26. data/spec/features/cli_help_spec.rb +36 -0
  27. data/spec/features/github_spec.rb +16 -0
  28. data/spec/features/heroku_spec.rb +75 -0
  29. data/spec/features/new_project_spec.rb +295 -0
  30. data/spec/features/sidekiq_spec.rb +30 -0
  31. data/spec/spec_helper.rb +20 -0
  32. data/spec/support/armadura.rb +83 -0
  33. data/spec/support/fake_github.rb +21 -0
  34. data/spec/support/fake_heroku.rb +53 -0
  35. data/templates/Gemfile.erb +60 -0
  36. data/templates/Procfile +2 -0
  37. data/templates/README.md.erb +28 -0
  38. data/templates/_analytics.html.erb +7 -0
  39. data/templates/_css_overrides.html.erb +7 -0
  40. data/templates/_flashes.html.erb +7 -0
  41. data/templates/_javascript.html.erb +12 -0
  42. data/templates/action_mailer.rb +5 -0
  43. data/templates/app.json.erb +39 -0
  44. data/templates/application.scss +9 -0
  45. data/templates/armadura_gitignore +14 -0
  46. data/templates/armadura_layout.html.erb.erb +22 -0
  47. data/templates/bin_deploy +12 -0
  48. data/templates/bin_setup +22 -0
  49. data/templates/bin_setup_review_app.erb +19 -0
  50. data/templates/browserslist +3 -0
  51. data/templates/bundler_audit.rake +12 -0
  52. data/templates/capybara_webkit.rb +5 -0
  53. data/templates/circle.yml.erb +6 -0
  54. data/templates/config_locales_en.yml.erb +19 -0
  55. data/templates/database_cleaner_rspec.rb +21 -0
  56. data/templates/dev.rake +12 -0
  57. data/templates/dotfiles/.ctags +2 -0
  58. data/templates/dotfiles/.env +14 -0
  59. data/templates/errors.rb +34 -0
  60. data/templates/factories.rb +2 -0
  61. data/templates/factory_girl_rspec.rb +3 -0
  62. data/templates/flashes_helper.rb +5 -0
  63. data/templates/hound.yml +14 -0
  64. data/templates/i18n.rb +3 -0
  65. data/templates/json_encoding.rb +1 -0
  66. data/templates/postgresql_database.yml.erb +21 -0
  67. data/templates/puma.rb +28 -0
  68. data/templates/rack_mini_profiler.rb +5 -0
  69. data/templates/rails_helper.rb +22 -0
  70. data/templates/secrets.yml +14 -0
  71. data/templates/shoulda_matchers_config_rspec.rb +6 -0
  72. data/templates/sidekiq.yml +6 -0
  73. data/templates/smtp.rb +13 -0
  74. data/templates/spec_helper.rb +29 -0
  75. metadata +188 -0
@@ -0,0 +1,245 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/rails/app/app_generator'
3
+
4
+ module Armadura
5
+ class AppGenerator < Rails::Generators::AppGenerator
6
+ hide!
7
+
8
+ class_option :database, type: :string, aliases: "-d", default: "postgresql",
9
+ desc: "Configure for selected database (options: #{DATABASES.join("/")})"
10
+
11
+ class_option :heroku, type: :boolean, aliases: "-H", default: false,
12
+ desc: "Create staging and production Heroku apps"
13
+
14
+ class_option :heroku_flags, type: :string, default: "",
15
+ desc: "Set extra Heroku flags"
16
+
17
+ class_option :github, type: :string, default: nil,
18
+ desc: "Create Github repository and add remote origin pointed to repo"
19
+
20
+ class_option :version, type: :boolean, aliases: "-v", group: :armadura,
21
+ desc: "Show Armadura version number and quit"
22
+
23
+ class_option :help, type: :boolean, aliases: '-h', group: :armadura,
24
+ desc: "Show this help message and quit"
25
+
26
+ class_option :path, type: :string, default: nil,
27
+ desc: "Path to the gem"
28
+
29
+ def finish_template
30
+ invoke :armadura_customization
31
+ super
32
+ end
33
+
34
+ def armadura_customization
35
+ invoke :customize_gemfile
36
+ invoke :setup_development_environment
37
+ invoke :setup_test_environment
38
+ invoke :setup_production_environment
39
+ invoke :setup_secret_token
40
+ invoke :create_armadura_views
41
+ invoke :configure_app
42
+ invoke :copy_miscellaneous_files
43
+ invoke :customize_error_pages
44
+ invoke :remove_config_comment_lines
45
+ invoke :remove_routes_comment_lines
46
+ invoke :setup_dotfiles
47
+ invoke :setup_git
48
+ invoke :setup_database
49
+ invoke :create_local_heroku_setup
50
+ invoke :create_heroku_apps
51
+ invoke :create_github_repo
52
+ invoke :setup_segment
53
+ invoke :setup_bundler_audit
54
+ invoke :setup_spring
55
+ invoke :generate_default
56
+ invoke :outro
57
+ end
58
+
59
+ def customize_gemfile
60
+ build :replace_gemfile, options[:path]
61
+ build :set_ruby_to_version_being_used
62
+ bundle_command 'install'
63
+ build :configure_simple_form
64
+ end
65
+
66
+ def setup_database
67
+ say 'Setting up database'
68
+
69
+ if 'postgresql' == options[:database]
70
+ build :use_postgres_config_template
71
+ end
72
+
73
+ build :create_database
74
+ end
75
+
76
+ def setup_development_environment
77
+ say 'Setting up the development environment'
78
+ build :raise_on_missing_assets_in_test
79
+ build :raise_on_delivery_errors
80
+ build :remove_turbolinks
81
+ build :set_test_delivery_method
82
+ build :add_bullet_gem_configuration
83
+ build :raise_on_unpermitted_parameters
84
+ build :provide_setup_script
85
+ build :provide_dev_prime_task
86
+ build :configure_generators
87
+ build :configure_i18n_for_missing_translations
88
+ build :configure_quiet_assets
89
+ end
90
+
91
+ def setup_test_environment
92
+ say 'Setting up the test environment'
93
+ build :set_up_factory_girl_for_rspec
94
+ build :generate_factories_file
95
+ build :set_up_hound
96
+ build :generate_rspec
97
+ build :configure_rspec
98
+ build :enable_database_cleaner
99
+ build :provide_shoulda_matchers_config
100
+ build :configure_spec_support_features
101
+ build :configure_ci
102
+ build :configure_i18n_for_test_environment
103
+ build :configure_action_mailer_in_specs
104
+ build :configure_capybara_webkit
105
+ end
106
+
107
+ def setup_production_environment
108
+ say 'Setting up the production environment'
109
+ build :configure_smtp
110
+ build :configure_rack_timeout
111
+ build :enable_rack_canonical_host
112
+ build :enable_rack_deflater
113
+ build :setup_asset_host
114
+ end
115
+
116
+ def setup_secret_token
117
+ say 'Moving secret token out of version control'
118
+ build :setup_secret_token
119
+ end
120
+
121
+ def create_armadura_views
122
+ say 'Creating armadura views'
123
+ build :create_partials_directory
124
+ build :create_shared_flashes
125
+ build :create_shared_javascripts
126
+ build :create_shared_css_overrides
127
+ build :create_application_layout
128
+ end
129
+
130
+ def configure_app
131
+ say 'Configuring app'
132
+ build :configure_action_mailer
133
+ build :configure_active_job
134
+ build :configure_sidekiq
135
+ build :configure_time_formats
136
+ build :setup_default_rake_task
137
+ build :replace_default_puma_configuration
138
+ build :set_up_forego
139
+ build :setup_rack_mini_profiler
140
+ end
141
+
142
+ def setup_git
143
+ if !options[:skip_git]
144
+ say "Initializing git"
145
+ invoke :setup_default_directories
146
+ invoke :init_git
147
+ end
148
+ end
149
+
150
+ def create_local_heroku_setup
151
+ say "Creating local Heroku setup"
152
+ build :create_review_apps_setup_script
153
+ build :create_deploy_script
154
+ build :create_heroku_application_manifest_file
155
+ end
156
+
157
+ def create_heroku_apps
158
+ if options[:heroku]
159
+ say "Creating Heroku apps"
160
+ build :create_heroku_apps, options[:heroku_flags]
161
+ build :set_heroku_remotes
162
+ build :set_heroku_rails_secrets
163
+ build :set_heroku_application_host
164
+ build :create_heroku_pipeline
165
+ build :configure_automatic_deployment
166
+ end
167
+ end
168
+
169
+ def create_github_repo
170
+ if !options[:skip_git] && options[:github]
171
+ say 'Creating Github repo'
172
+ build :create_github_repo, options[:github]
173
+ end
174
+ end
175
+
176
+ def setup_segment
177
+ say 'Setting up Segment'
178
+ build :setup_segment
179
+ end
180
+
181
+ def setup_dotfiles
182
+ build :copy_dotfiles
183
+ end
184
+
185
+ def setup_default_directories
186
+ build :setup_default_directories
187
+ end
188
+
189
+ def setup_bundler_audit
190
+ say "Setting up bundler-audit"
191
+ build :setup_bundler_audit
192
+ end
193
+
194
+ def setup_spring
195
+ say "Springifying binstubs"
196
+ build :setup_spring
197
+ end
198
+
199
+ def init_git
200
+ build :init_git
201
+ end
202
+
203
+ def copy_miscellaneous_files
204
+ say 'Copying miscellaneous support files'
205
+ build :copy_miscellaneous_files
206
+ end
207
+
208
+ def customize_error_pages
209
+ say 'Customizing the 500/404/422 pages'
210
+ build :customize_error_pages
211
+ end
212
+
213
+ def remove_config_comment_lines
214
+ build :remove_config_comment_lines
215
+ end
216
+
217
+ def remove_routes_comment_lines
218
+ build :remove_routes_comment_lines
219
+ end
220
+
221
+ def generate_default
222
+ run("spring stop")
223
+ generate("armadura:static")
224
+ generate("armadura:stylesheet_base")
225
+ end
226
+
227
+ def outro
228
+ say 'The Rails application is now created!'
229
+ end
230
+
231
+ def self.banner
232
+ "armadura #{arguments.map(&:usage).join(' ')} [options]"
233
+ end
234
+
235
+ protected
236
+
237
+ def get_builder_class
238
+ Armadura::AppBuilder
239
+ end
240
+
241
+ def using_active_record?
242
+ !options[:skip_active_record]
243
+ end
244
+ end
245
+ end
@@ -0,0 +1,10 @@
1
+ require "rails/generators"
2
+
3
+ module Armadura
4
+ class StaticGenerator < Rails::Generators::Base
5
+ def add_high_voltage
6
+ gem "high_voltage"
7
+ Bundler.with_clean_env { run "bundle install" }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,37 @@
1
+ require "rails/generators"
2
+
3
+ module Armadura
4
+ class StylesheetBaseGenerator < Rails::Generators::Base
5
+ source_root File.expand_path(
6
+ File.join("..", "..", "..", "templates"),
7
+ File.dirname(__FILE__))
8
+
9
+ def add_stylesheet_gems
10
+ gem "bourbon", "5.0.0.beta.6"
11
+ gem "neat", "~> 1.8.0"
12
+ gem "refills", group: [:development, :test]
13
+ Bundler.with_clean_env { run "bundle install" }
14
+ end
15
+
16
+ def add_css_config
17
+ copy_file(
18
+ "application.scss",
19
+ "app/assets/stylesheets/application.scss",
20
+ force: true,
21
+ )
22
+ end
23
+
24
+ def remove_prior_config
25
+ remove_file "app/assets/stylesheets/application.css"
26
+ end
27
+
28
+ def install_refills
29
+ generate "refills:import", "flashes"
30
+ remove_dir "app/views/refills"
31
+ end
32
+
33
+ def install_bitters
34
+ run "bitters install --path app/assets/stylesheets"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,8 @@
1
+ module Armadura
2
+ RAILS_VERSION = "~> 5.0.0.1".freeze
3
+ RUBY_VERSION = IO.
4
+ read("#{File.dirname(__FILE__)}/../../.ruby-version").
5
+ strip.
6
+ freeze
7
+ VERSION = "0.1.0".freeze
8
+ end
@@ -0,0 +1,57 @@
1
+ require "spec_helper"
2
+
3
+ module Armadura
4
+ module Adapters
5
+ RSpec.describe Heroku do
6
+ it "sets the heroku remotes" do
7
+ setup_file = "bin/setup"
8
+ app_builder = double(app_name: app_name)
9
+ allow(app_builder).to receive(:append_file)
10
+
11
+ Heroku.new(app_builder).set_heroku_remotes
12
+
13
+ expect(app_builder).to have_received(:append_file).
14
+ with(setup_file, /heroku join --app #{app_name.dasherize}-production/)
15
+ expect(app_builder).to have_received(:append_file).
16
+ with(setup_file, /heroku join --app #{app_name.dasherize}-staging/)
17
+ end
18
+
19
+ it "sets the heroku rails secrets" do
20
+ app_builder = double(app_name: app_name)
21
+ allow(app_builder).to receive(:run)
22
+
23
+ Heroku.new(app_builder).set_heroku_rails_secrets
24
+
25
+ expect(app_builder).to(
26
+ have_configured_var("staging", "SECRET_KEY_BASE"),
27
+ )
28
+ expect(app_builder).to(
29
+ have_configured_var("production", "SECRET_KEY_BASE"),
30
+ )
31
+ end
32
+
33
+ it "sets the application host" do
34
+ app_builder = double(app_name: app_name)
35
+ allow(app_builder).to receive(:run)
36
+
37
+ Heroku.new(app_builder).set_heroku_application_host
38
+
39
+ expect(app_builder).to(
40
+ have_configured_var("staging", "APPLICATION_HOST"),
41
+ )
42
+
43
+ expect(app_builder).to(
44
+ have_configured_var("production", "APPLICATION_HOST"),
45
+ )
46
+ end
47
+
48
+ def app_name
49
+ ArmaduraTestHelpers::APP_NAME
50
+ end
51
+
52
+ def have_configured_var(remote_name, var)
53
+ have_received(:run).with(/config:add #{var}=.+ --remote #{remote_name}/)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.join('..', '..', 'support', 'fake_heroku'), File.dirname(__FILE__))
4
+
5
+ FakeHeroku.new(ARGV).run!
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.join('..', '..', 'support', 'fake_github'), File.dirname(__FILE__))
4
+
5
+ FakeGithub.new(ARGV).run!
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "Command line help output" do
4
+ let(:help_text) { armadura_help_command }
5
+
6
+ it "does not contain the default rails usage statement" do
7
+ expect(help_text).not_to include("rails new APP_PATH [options]")
8
+ end
9
+
10
+ it "provides the correct usage statement for armadura" do
11
+ expect(help_text).to include <<~EOH
12
+ Usage:
13
+ armadura APP_PATH [options]
14
+ EOH
15
+ end
16
+
17
+ it "does not contain the default rails group" do
18
+ expect(help_text).not_to include("Rails options:")
19
+ end
20
+
21
+ it "provides help and version usage within the armadura group" do
22
+ expect(help_text).to include <<~EOH
23
+ Armadura options:
24
+ -h, [--help], [--no-help] # Show this help message and quit
25
+ -v, [--version], [--no-version] # Show Armadura version number and quit
26
+ EOH
27
+ end
28
+
29
+ it "does not show the default extended rails help section" do
30
+ expect(help_text).not_to include("Create armadura files for app generator.")
31
+ end
32
+
33
+ it "contains the usage statement from the armadura gem" do
34
+ expect(help_text).to include IO.read(usage_file)
35
+ end
36
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "GitHub" do
4
+ before do
5
+ drop_dummy_database
6
+ remove_project_directory
7
+ end
8
+
9
+ it "suspends a project with --github option" do
10
+ repo_name = "test"
11
+ run_armadura("--github=#{repo_name}")
12
+ setup_app_dependencies
13
+
14
+ expect(FakeGithub).to have_created_repo(repo_name)
15
+ end
16
+ end
@@ -0,0 +1,75 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "Heroku" do
4
+ context "--heroku" do
5
+ before(:all) do
6
+ clean_up
7
+ run_armadura("--heroku=true")
8
+ setup_app_dependencies
9
+ end
10
+
11
+ it "suspends a project for Heroku" do
12
+ app_name = ArmaduraTestHelpers::APP_NAME.dasherize
13
+
14
+ expect(FakeHeroku).to have_created_app_for("staging")
15
+ expect(FakeHeroku).to have_created_app_for("production")
16
+ expect(FakeHeroku).to have_configured_vars("staging", "SECRET_KEY_BASE")
17
+ expect(FakeHeroku).to have_configured_vars(
18
+ "production",
19
+ "SECRET_KEY_BASE",
20
+ )
21
+ expect(FakeHeroku).to have_configured_vars(
22
+ "staging",
23
+ "APPLICATION_HOST",
24
+ )
25
+ expect(FakeHeroku).to have_configured_vars(
26
+ "production",
27
+ "APPLICATION_HOST",
28
+ )
29
+ expect(FakeHeroku).to have_setup_pipeline_for(app_name)
30
+
31
+ bin_setup_path = "#{project_path}/bin/setup"
32
+ bin_setup = IO.read(bin_setup_path)
33
+
34
+ expect(bin_setup).to include("heroku join --app #{app_name}-production")
35
+ expect(bin_setup).to include("heroku join --app #{app_name}-staging")
36
+ expect(bin_setup).to include("git config heroku.remote staging")
37
+ expect(File.stat(bin_setup_path)).to be_executable
38
+
39
+ readme = IO.read("#{project_path}/README.md")
40
+
41
+ expect(readme).to include("./bin/deploy staging")
42
+ expect(readme).to include("./bin/deploy production")
43
+
44
+ circle_yml_path = "#{project_path}/circle.yml"
45
+ circle_yml = IO.read(circle_yml_path)
46
+
47
+ expect(circle_yml).to include <<-YML.strip_heredoc
48
+ deployment:
49
+ staging:
50
+ branch: master
51
+ commands:
52
+ - bin/deploy staging
53
+ YML
54
+ end
55
+ end
56
+
57
+ context "--heroku with region flag" do
58
+ before(:all) do
59
+ clean_up
60
+ run_armadura(%{--heroku=true --heroku-flags="--region eu"})
61
+ setup_app_dependencies
62
+ end
63
+
64
+ it "suspends a project with extra Heroku flags" do
65
+ expect(FakeHeroku).to have_created_app_for("staging", "--region eu")
66
+ expect(FakeHeroku).to have_created_app_for("production", "--region eu")
67
+ end
68
+ end
69
+
70
+ def clean_up
71
+ drop_dummy_database
72
+ remove_project_directory
73
+ FakeHeroku.clear!
74
+ end
75
+ end