maguro 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,10 @@
1
+ require 'thor'
2
+ require 'rails'
3
+
4
+ module Maguro
5
+ class Cli < Thor
6
+ include Thor::Actions
7
+
8
+ register Maguro::AppGenerator, 'new', 'new APP_NAME', 'Creates a new rails app'
9
+ end
10
+ end
@@ -0,0 +1,389 @@
1
+ module Maguro
2
+
3
+ class Features
4
+ attr_reader :builder, :gemfile, :app_name, :organization, :heroku
5
+
6
+ def initialize(builder)
7
+ @builder = builder
8
+ @app_name = builder.send(:app_name)
9
+ @organization = builder.options[:organization]
10
+ @gemfile = Maguro::Gemfile.new(builder)
11
+ @heroku = Maguro::Heroku.new(builder, app_name, builder.options[:organization])
12
+ end
13
+
14
+ def run_all_updates
15
+
16
+ # TODO: Doug: check return value of commands? What happens if commands fail?
17
+ # When git commands failed, the error is reported to the console, but the generator
18
+ # completes successfully
19
+ builder.git :init
20
+ update_gitignore
21
+ commit 'Initial commit with updated .gitignore'
22
+
23
+ create_rvm_files
24
+ clean_gemfile
25
+ use_pg
26
+ use_12_factor_gem
27
+ add_test_gems
28
+ add_ruby_version
29
+ commit 'add gems'
30
+
31
+ remove_turbo_links
32
+ commit 'remove turbolinks'
33
+
34
+ create_database_files
35
+ commit 'add database.sample.yml and database.yml files'
36
+ create_readme
37
+ commit 'add readme'
38
+ create_app_env_var_sample
39
+ commit 'add app environment variable sample file'
40
+
41
+ install_rspec
42
+ commit 'install rspec'
43
+
44
+ create_spec_folders
45
+ update_rails_helper_spec
46
+ commit 'customize rspec for basic usage'
47
+
48
+ add_homepage
49
+ commit 'add homepage'
50
+
51
+ springify
52
+ commit 'springify app'
53
+
54
+ setup_guard
55
+ commit 'add guard files'
56
+
57
+ create_local_database
58
+ commit 'add blank schema file'
59
+
60
+ checkout_develop_branch
61
+
62
+ # NOTE: Heroku setup has to come after initial init for it to create the proper
63
+ # Git remotes.
64
+ if builder.options[:heroku]
65
+ heroku.create
66
+ heroku.push
67
+ end
68
+
69
+ if builder.options[:bitbucket]
70
+ git_url = setup_bitbucket
71
+
72
+ if !git_url.nil?
73
+ builder.git remote: "add origin #{git_url}"
74
+ builder.git push: "-u origin --all"
75
+ end
76
+ end
77
+
78
+ if builder.options[:github]
79
+ setup_github
80
+ builder.git push: '-u origin --all'
81
+ end
82
+ end
83
+
84
+ private
85
+
86
+ def create_rvm_files
87
+ builder.create_file ".ruby-version" do
88
+ <<-END.strip_heredoc
89
+ #{Maguro::RUBY_VERSION}
90
+ END
91
+ end
92
+ end
93
+
94
+ def clean_gemfile
95
+ gemfile.remove(/# .*[\r\n]?/, "") #remove comments
96
+ gemfile.remove(/\n{2,}/, "\n") #remove excess whitespace
97
+ end
98
+
99
+ def add_ruby_version
100
+ #add ruby version
101
+ builder.insert_into_file "Gemfile", "ruby '#{Maguro::RUBY_VERSION}'\n", after: "source 'https://rubygems.org'\n"
102
+ end
103
+
104
+ def use_pg
105
+ builder.gsub_file "Gemfile", /gem 'sqlite3'[\r\n]/, "" # remove sqlite
106
+ builder.gem 'pg' # add new gems.
107
+ end
108
+
109
+ def use_12_factor_gem
110
+ # For heroku
111
+ builder.gem 'rails_12factor', group: :production
112
+ end
113
+
114
+ def remove_turbo_links
115
+ # remove turbolinks
116
+ builder.gsub_file "Gemfile", /gem 'turbolinks'[\r\n]/, ""
117
+
118
+ # remove other code related to turbolinks
119
+ builder.gsub_file "app/views/layouts/application.html.erb", /, ('|")data-turbolinks-track('|") => true/, ""
120
+ builder.gsub_file "app/assets/javascripts/application.js", /\/\/= require turbolinks[\r\n]/, ""
121
+ end
122
+
123
+ def add_test_gems
124
+ builder.gem_group :development, :test do
125
+ gem 'awesome_print'
126
+ gem 'capybara'
127
+ gem 'database_cleaner'
128
+ gem 'factory_girl_rails'
129
+ gem 'faker'
130
+ gem 'guard'
131
+ gem 'guard-bundler', require: false
132
+ gem 'guard-rspec', require: false
133
+ gem 'poltergeist'
134
+ gem 'pry'
135
+ gem 'rb-inotify', require: false
136
+ gem 'rb-fsevent', require: false
137
+ gem 'rb-fchange', require: false
138
+ gem 'rspec-rails'
139
+ gem 'rspec-collection_matchers'
140
+ gem 'shoulda-matchers'
141
+ end
142
+ end
143
+
144
+ def install_rspec
145
+ builder.run "bundle install"
146
+ builder.generate "rspec:install"
147
+ builder.remove_dir "test"
148
+ end
149
+
150
+
151
+ # Update gitignore file with common stuff that we use.
152
+ def update_gitignore
153
+ builder.append_file ".gitignore" do
154
+ <<-END.strip_heredoc
155
+
156
+ /config/database.yml
157
+ /config/app_environment_variables.rb
158
+ .DS_Store
159
+ .idea
160
+ END
161
+ end
162
+ end
163
+
164
+ # create a new database.yml that works with PG.
165
+ def create_database_files
166
+ username = builder.options['database-username']
167
+ password = builder.options['database-password']
168
+
169
+ builder.remove_file "config/database.yml"
170
+ create_database_yml_file("config/database.sample.yml", "username", "pass")
171
+ create_database_yml_file("config/database.yml", username, password)
172
+ end
173
+
174
+ def create_database_yml_file(file_name, username, password)
175
+ database_name = app_name.gsub('-','_')
176
+
177
+ builder.create_file file_name do
178
+ <<-END.strip_heredoc
179
+ default: &default
180
+ adapter: postgresql
181
+ encoding: utf8
182
+ host: localhost
183
+ username: #{username}
184
+ password: #{password}
185
+ pool: 5
186
+ timeout: 5000
187
+
188
+ development:
189
+ <<: *default
190
+ database: #{database_name}_dev
191
+
192
+ # Warning: The database defined as "test" will be erased and
193
+ # re-generated from your development database when you run "rake".
194
+ # Do not set this db to the same as development or production.
195
+ test:
196
+ <<: *default
197
+ database: #{database_name}_test
198
+
199
+ production:
200
+ <<: *default
201
+ database: #{database_name}_prod
202
+
203
+ END
204
+ end
205
+
206
+ end
207
+
208
+
209
+ #create a README.md file
210
+ def create_readme
211
+ builder.remove_file "README.rdoc"
212
+ builder.create_file "README.md" do
213
+ <<-END.strip_heredoc
214
+ # #{app_name}
215
+
216
+ ## Setup
217
+
218
+ ### Requirements
219
+
220
+ 1. [ruby](https://www.ruby-lang.org/en/)
221
+ 2. [postgres](http://www.postgresql.org/download/) (can be installed via homebrew)
222
+
223
+
224
+ ### Recommended (If using a mac these are required / HIGHLY recommended)
225
+
226
+ 1. [rvm](https://rvm.io/)
227
+ 2. [homebrew](http://brew.sh/)
228
+
229
+ ### Initialization Steps
230
+
231
+ 0. Make sure your computer is set up for Ruby on Rails development and you have pulled the code
232
+
233
+ 1. Make your own copy of database.yml `cp ./config/database.sample.yml ./config/database.yml`
234
+ 2. Configure your database.yml. If you have a default setup you shouldn't have to do anything.
235
+ 3. Make your own copy of app_environment_variables.rb `cp config/app_environment_variables.sample.rb config/app_environment_variables.rb`
236
+ 4. Install PostgreSQL `brew install postgresql`
237
+ 5. Make sure postgresql is running
238
+ 6. Use Rails #{Maguro::RUBY_VERSION} `rvm use #{Maguro::RUBY_VERSION}`
239
+ 7. `bundle install`
240
+ 8. `rake db:create db:migrate db:seed`
241
+ 9. Run tests to make sure they pass `rspec spec/`
242
+ 10. `rails s`
243
+
244
+ ### Updates
245
+
246
+ Occasionally you will have to update your app / database based off of someone else's changes.
247
+ Easiest is to do the following:
248
+
249
+ 1. `bundle install`
250
+ 2. `rake db:drop db:create db:migrate db:seed`
251
+
252
+ ## Testing
253
+
254
+ To run all the tests run: `rspec`
255
+
256
+ We have guard set up, so you can have guard automatically run your tests as you develop. To
257
+ start guard run: `guard`. To quit enter `quit` in the guard prompt.
258
+
259
+
260
+ END
261
+ end
262
+ end
263
+
264
+ def create_spec_folders
265
+ builder.inside('spec') do
266
+ %w{support models features factories}.each do |folder|
267
+ builder.run "mkdir #{folder}"
268
+ builder.run "touch ./#{folder}/.keep"
269
+ end
270
+ end
271
+ end
272
+
273
+ def update_rails_helper_spec
274
+ file = 'spec/rails_helper.rb'
275
+
276
+ #add rspec requires and poltergeist configuration
277
+ builder.insert_into_file file, after: "# Add additional requires below this line. Rails is not loaded until this point!\n" do
278
+ <<-END
279
+ require 'rspec/collection_matchers'
280
+ require 'capybara/rspec'
281
+ require 'capybara/poltergeist'
282
+ require 'database_cleaner'
283
+
284
+ Capybara.javascript_driver = :poltergeist
285
+ Capybara.default_wait_time = 5
286
+ END
287
+ end
288
+
289
+ #autoload all support files
290
+ builder.gsub_file file, "# Dir[Rails.root.join(\"spec/support/**/*.rb\")].each { |f| require f }", "Dir[Rails.root.join(\"spec/support/**/*.rb\")].each { |f| require f }"
291
+
292
+ #make transactional fixtures false
293
+ builder.gsub_file file, "config.use_transactional_fixtures = true", "config.use_transactional_fixtures = false"
294
+
295
+ #add database cleaner
296
+ builder.insert_into_file file, after: "config.infer_spec_type_from_file_location!\n" do
297
+ <<-END
298
+
299
+
300
+ # Configure standard database cleaner. Use truncation instead of transactions.
301
+ config.before(:suite) do
302
+ DatabaseCleaner.clean_with(:truncation)
303
+ end
304
+
305
+ config.before(:each) do |example|
306
+ DatabaseCleaner.strategy = :truncation
307
+ DatabaseCleaner.start
308
+ end
309
+
310
+ config.after(:each) do
311
+ DatabaseCleaner.clean
312
+ end
313
+ END
314
+ end
315
+ end
316
+
317
+ def create_app_env_var_sample
318
+ # create sample of app_environment_variables file
319
+ builder.create_file "config/app_environment_variables.sample.rb" do
320
+ <<-END
321
+ # Add secret app environment variables in this file.
322
+ # You will also have to add these environment variables to heroku
323
+ # Make a copy of the .sample file but DON'T check it in! Only the sample should be checked in.
324
+ # ENV['MY_SAMPLE_SECRET'] = 'MYSECRETKEY'
325
+ END
326
+ end
327
+
328
+ # make local copy of app_environment_variables file
329
+ builder.run "cp config/app_environment_variables.sample.rb config/app_environment_variables.rb"
330
+
331
+ # autoload environment variables into rails project
332
+ builder.insert_into_file "config/environment.rb", after: "require File.expand_path('../application', __FILE__)\n" do
333
+ <<-END
334
+
335
+ # Load the app's custom environment variables here, so that they are loaded before environments/*.rb
336
+ app_environment_variables = File.join(Rails.root, 'config', 'app_environment_variables.rb')
337
+ load(app_environment_variables) if File.exists?(app_environment_variables)
338
+ END
339
+ end
340
+ end
341
+
342
+ def add_homepage
343
+ builder.route "root to: 'home#index'"
344
+ builder.copy_file "home_controller.rb", "app/controllers/home_controller.rb"
345
+ builder.copy_file "home_index.html.erb", "app/views/home/index.html.erb"
346
+ end
347
+
348
+ def springify
349
+ builder.run "bundle install"
350
+ builder.run "bundle exec spring binstub --all"
351
+ end
352
+
353
+
354
+ def setup_guard
355
+ builder.run 'bundle exec guard init guard-bundler guard-rspec'
356
+ end
357
+
358
+ def checkout_develop_branch
359
+ builder.git checkout: '-b develop'
360
+ end
361
+
362
+ def create_local_database
363
+ #create a local database if a database-username was passed
364
+ if builder.options['database-username']
365
+ builder.run 'rake db:create db:migrate'
366
+ end
367
+ end
368
+
369
+
370
+ def commit(message)
371
+ builder.run "bundle install"
372
+ builder.git add: '--all .'
373
+ builder.git commit: "-m '#{message}'"
374
+ end
375
+
376
+ def setup_bitbucket
377
+ clean_app_name = app_name.gsub(/[- ]/, '_')
378
+ bitbucket = Maguro::Bitbucket.new(builder, clean_app_name, organization)
379
+ bitbucket.create_repo
380
+ bitbucket.git_url
381
+ end
382
+
383
+ def setup_github
384
+ clean_app_name = app_name.gsub(/[- ]/, '_')
385
+ github = Maguro::Github.new(builder, clean_app_name, organization)
386
+ github.create_repo
387
+ end
388
+ end
389
+ end
@@ -0,0 +1,14 @@
1
+ module Maguro
2
+ class Gemfile
3
+ attr_reader :builder, :file_name
4
+
5
+ def initialize(builder)
6
+ @builder = builder
7
+ @file_name = "Gemfile"
8
+ end
9
+
10
+ def remove(regex, replacement)
11
+ builder.gsub_file(file_name, regex, replacement)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ module Maguro
2
+ class Github
3
+
4
+ attr_reader :builder, :app_name, :organization
5
+
6
+ def initialize(builder, app_name, organization)
7
+ @builder = builder
8
+ @app_name = app_name
9
+ @organization = organization
10
+ end
11
+
12
+
13
+ def git_url
14
+ "git@github.com:#{organization}/#{app_name}.git"
15
+ end
16
+
17
+ # Will create a new repository on github and create a remote named origin.
18
+ #
19
+ def create_repo
20
+ builder.run "hub create #{organization}/#{app_name}"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ module Maguro
2
+ class Heroku
3
+
4
+ attr_reader :builder, :app_name, :organization, :production_name, :staging_name
5
+
6
+ def initialize(builder, app_name, organization)
7
+ @builder = builder
8
+ @app_name = app_name.gsub(/[_ ]/,'-')
9
+ @organization = organization
10
+ @production_name = "#{@organization}-#{@app_name}"
11
+ @staging_name = "#{@organization}-#{@app_name}-staging"
12
+ end
13
+
14
+ def create_app(app_name, remote_name)
15
+ builder.run "heroku apps:create #{app_name} --remote #{remote_name}"
16
+ end
17
+
18
+ # https://addons.heroku.com/heroku-postgresql
19
+ def add_database(app_name)
20
+ builder.run "heroku addons:add heroku-postgresql --app #{app_name}"
21
+ end
22
+
23
+ # https://addons.heroku.com/pgbackups
24
+ # length can be "week" or "month"
25
+ def add_pg_backup(app_name, length="month")
26
+ builder.run "heroku addons:add pgbackups:auto-#{length} --app #{app_name}"
27
+ end
28
+
29
+ def create
30
+ create_app(staging_name, "staging")
31
+ create_app(production_name, "production")
32
+
33
+ add_database(staging_name)
34
+ add_database(production_name)
35
+
36
+ add_pg_backup(staging_name, "week")
37
+ add_pg_backup(production_name)
38
+ end
39
+
40
+ def push
41
+ builder.git push: "production master:master"
42
+ builder.git push: "staging master:master"
43
+ end
44
+ end
45
+ end