wildland_dev_tools 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7b433a7be6f2d7f72a20ca3fc146235b2b8f175a
4
+ data.tar.gz: 55423134402dc24c52c13af9e255b95dd66ce843
5
+ SHA512:
6
+ metadata.gz: 898bc400966c8fbf623656a25778a90f0e74345a88648116556004c03bbe9bc08db1b5667360967d0e6f3883fd8dfc37cdae37d7819e7bfd2169e0af965a28e7
7
+ data.tar.gz: 7620f5d507ce2fcaa86b7d33dc7aee650b5c1058638a9ae5b4eefe9a16e219bb9a83db29b3270eb52449895f859a74bca6e9fb103b5a411151de8ee4ff2df1e2
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.1
4
+ before_install: gem install bundler -v 1.10.4
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in wildland_dev_tools.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Joe Weakley
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,60 @@
1
+ # Wildland DevTools
2
+ This is a gem that contains all of our dev rake tasks.
3
+ These are most useful for projects created by [trailhead](https://github.com/wildland/trailhead) and are deployed on [heroku](https://www.heroku.com/home) using the [pipeline](https://devcenter.heroku.com/articles/pipelines) feature. This allows for separate `staging` and `production` enviroments as well as review apps.
4
+
5
+ ## Installation
6
+
7
+ Add the following to your `Gemfile`:
8
+
9
+ `gem 'wildland_dev_tools', '~>0.8.1', github: 'wildland/wildland_dev_tools'`
10
+
11
+ Typically for wildland projects you will want to put this inside the dev/test block:
12
+ ```
13
+ group :development, :test do
14
+ ...
15
+ gem 'wildland_dev_tools', '~>0.8.1', github: 'wildland/wildland_dev_tools'`
16
+ ...
17
+ end
18
+ ```
19
+
20
+ ### *[heroku tools](https://github.com/wildland/wildland_dev_tools#heroku-tools) require the following steps*
21
+
22
+ Install the heroku-toolbelt using brew. You can do this by running `brew install heroku`.
23
+
24
+ Have your `production` and `staging` git remotes set.
25
+ - `heroku git:remote -a <staging-app> -r staging` where `<staging-app>` is your heroku staging app name.
26
+ - `heroku git:remote -a <production-app> -r production` where `<production-app>` is your heroku production app name.
27
+
28
+
29
+ ## Usage
30
+ You will get a new batch of new rake tasks under the wildland namespace. For a full list run `rake -T`.
31
+
32
+ ### Local Development Tools
33
+ *Note that you will need to run `bundle install` before being able to use these.*
34
+
35
+ *Double Note: if `bundle install` borks on `pg_config` then set the `Pg_config path` with `bundle config build.pg --with-pg-config=/Applications/Postgres.app/Contents/Versions/{YOUR VERSION}/bin/pg_config`
36
+
37
+ - `rake wildland:setup` This will run all of the setup tasks to get your local enviroment ready to go.
38
+ - `rake wildland:db` This will resetup and seed the local database.
39
+ - `rake wildland:cache_clear` This will clear the local app-ember package cache.
40
+ - `rake wildland:pre_deploy` This will run all of the pre-deploy tasks to get the project ready to deploy.
41
+ - `rake wildland:pre_pr` Convenience alias to `rake wildland:pre_pull_request`.
42
+ - `rake wildland:pre_pull_request` This will run all of the pre pull request tasks to get the project ready for a pull request.
43
+
44
+ ### Heroku Tools
45
+ - `rake wildland:heroku:deploy_to_staging` This will deploy `master` to `staging`. This will automatically create a release candidate git tag.
46
+ - `rake wildland:heroku:deploy_to_staging[verbose]` This perform the deploy as above, but in verbose mode.
47
+ - - `rake wildland:heroku:deploy_to_staging[verbose,force]` This perform the deploy as above, but this will `--force` deploy `master` to `staging`.
48
+ - - `rake wildland:heroku:deploy_current_branch_to_staging` This will promote your current branch to `staging` as `master`. This will **NOT** automatically create a release candidate git tag.
49
+ - - `rake wildland:heroku:deploy_current_branch_to_staging[verbose]` This perform the deploy as above, but in verbose mode.
50
+ - - `rake wildland:heroku:deploy_current_branch_to_staging[verbose,force]` This perform the deploy as above, but this will `--force` deploy your current branch to `staging`.
51
+ - `rake wildland:heroku:promote_to_production` This will promote `staging` to `production`. This will automatically create a production git tag.
52
+ - `rake wildland:heroku:promote_to_production[verbose]` This perform the deploy as above, but in verbose mode.
53
+ - `rake wildland:heroku:maintenance_mode_on` This turns on maintenance mode for `staging` and `production`.
54
+ - `rake wildland:heroku:maintenance_mode_off` This turns off maintenance mode for `staging` and `production`.
55
+ - `rake wildland:heroku:backup_production_database[verbose]` This will create a backup of the `production` database.
56
+ - `rake wildland:heroku:import_latest_production_database_backup[verbose]` This will import the latest `production` database backup to your local database.
57
+
58
+
59
+ ## Code Of Conduct
60
+ Wildland Open Source [Code Of Conduct](https://github.com/wildland/code-of-conduct)
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,99 @@
1
+ require 'wildland_dev_tools/heroku'
2
+
3
+ namespace :wildland do
4
+ namespace :heroku do
5
+ desc 'Imports the latest production database backup to local database.'
6
+ task :import_latest_production_database_backup, [:verbose] => [:check_remotes, :check_heroku] do |_t, args| # rubocop:disable Metrics/LineLength
7
+ WildlandDevTools::Heroku.import_production_database(args[:verbose])
8
+ Rake::Task['db:migrate'].invoke
9
+ end
10
+
11
+ desc 'Backups production database'
12
+ task :backup_production_database, [:verbose] => [:check_remotes, :check_heroku] do |_t, args| # rubocop:disable Metrics/LineLength
13
+ WildlandDevTools::Heroku.backup_production_database(args[:verbose])
14
+ end
15
+
16
+ desc 'Promotes staging to production. This automatically creates a production release tag.'
17
+ task :promote_to_production, [:verbose] => [:check_remotes, :check_heroku] do |_t, args| # rubocop:disable Metrics/LineLength
18
+ begin
19
+ Rake::Task['wildland:heroku:maintenance_mode_on'].execute
20
+ Rake::Task['wildland:releases:create_release_tag'].execute
21
+ WildlandDevTools::Heroku.promote_staging_to_production(args[:verbose])
22
+ WildlandDevTools::Heroku.migrate_production_database(args[:verbose])
23
+ Rake::Task['wildland:heroku:maintenance_mode_off'].execute
24
+ rescue RuntimeError => e
25
+ puts e
26
+ WildlandDevTools::Heroku.rollback_production_deploy(true)
27
+ raise
28
+ end
29
+ end
30
+
31
+ desc 'Deploy master to staging. This automatically creates a release candidate tag.'
32
+ task :deploy_to_staging, [:verbose, :force] => [:check_remotes, :check_heroku] do |_t, args| # rubocop:disable Metrics/LineLength
33
+ begin
34
+ WildlandDevTools::Heroku.turn_on_staging_maintenance_mode(args[:verbose])
35
+ Rake::Task['wildland:releases:create_release_candidate_tag'].execute
36
+ WildlandDevTools::Heroku.deploy_master_to_staging(args[:verbose], args[:force])
37
+ WildlandDevTools::Heroku.copy_production_data_to_staging(args[:verbose])
38
+ WildlandDevTools::Heroku.migrate_staging_database(args[:verbose])
39
+ rescue WildlandDevTools::GitSyncException => e
40
+ puts e
41
+ rescue RuntimeError => e
42
+ puts e
43
+ WildlandDevTools::Heroku.rollback_staging_deploy(true)
44
+ raise
45
+ ensure
46
+ WildlandDevTools::Heroku.turn_off_staging_maintenance_mode(args[:verbose])
47
+ end
48
+ end
49
+
50
+ desc 'Deploy current branch to staging as master. This does not create a release canidate tag.'
51
+ task :deploy_current_branch_to_staging, [:verbose, :force] => [:check_remotes, :check_heroku] do |_t, args| # rubocop:disable Metrics/LineLength
52
+ begin
53
+ WildlandDevTools::Heroku.turn_on_staging_maintenance_mode(args[:verbose])
54
+ WildlandDevTools::Heroku.deploy_current_branch_to_staging(args[:verbose], args[:force])
55
+ WildlandDevTools::Heroku.copy_production_data_to_staging(args[:verbose])
56
+ WildlandDevTools::Heroku.migrate_staging_database(args[:verbose])
57
+ rescue WildlandDevTools::GitSyncException => e
58
+ puts e
59
+ rescue RuntimeError => e
60
+ puts e
61
+ WildlandDevTools::Heroku.rollback_staging_deploy(true)
62
+ raise
63
+ ensure
64
+ WildlandDevTools::Heroku.turn_off_staging_maintenance_mode(args[:verbose])
65
+ end
66
+ end
67
+
68
+ desc 'Turns on maintenance mode for both heroku remotes.'
69
+ task :maintenance_mode_on do
70
+ WildlandDevTools::Heroku.turn_on_heroku_maintenance_mode(true)
71
+ end
72
+
73
+ desc 'Turns off maintenance mode for both heroku remotes.'
74
+ task :maintenance_mode_off do
75
+ WildlandDevTools::Heroku.turn_off_heroku_maintenance_mode(true)
76
+ end
77
+
78
+ task :check_heroku do
79
+ unless WildlandDevTools::Heroku.heroku_toolbelt_available?
80
+ Kernel.abort(
81
+ 'Missing heroku toolbelt. Run \'brew install heroku-toolbelt\'.'
82
+ )
83
+ end
84
+ end
85
+
86
+ task :check_remotes do
87
+ unless WildlandDevTools::Heroku.staging_remote_available?
88
+ Kernel.abort(
89
+ 'Missing staging git remote. Run \'heroku git:remote -a <app-name> -r staging\'' # rubocop:disable Metrics/LineLength
90
+ )
91
+ end
92
+ unless WildlandDevTools::Heroku.production_remote_available?
93
+ Kernel.abort(
94
+ 'Missing production git remote. Run \'heroku git:remote -a <app-name> -r production\'' # rubocop:disable Metrics/LineLength
95
+ )
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,15 @@
1
+ require 'wildland_dev_tools/releases'
2
+
3
+ namespace :wildland do
4
+ namespace :releases do
5
+ desc 'Creates a git tag for the release.'
6
+ task :create_release_tag, [:verbose] do |_t, args|
7
+ WildlandDevTools::Releases.create_release(args[:verbose])
8
+ end
9
+
10
+ desc 'Creates a git tag for the release candidate.'
11
+ task :create_release_candidate_tag, [:verbose] do |_t, args|
12
+ WildlandDevTools::Releases.create_release_candidate(args[:verbose])
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,103 @@
1
+ namespace :wildland do
2
+ desc 'Runs all the pre pull request tasks.'
3
+ task :pre_pull_request do
4
+ Rake::Task['wildland:pre_pull_request:all'].invoke
5
+ end
6
+ desc 'Alias to pre pull request.'
7
+ task :pre_pr do
8
+ Rake::Task['wildland:pre_pull_request'].invoke
9
+ end
10
+ namespace :pre_pull_request do
11
+ task all: [
12
+ :notes,
13
+ :fixme_notes,
14
+ :ruby_debugger,
15
+ :js_debugger,
16
+ :rubocop_recent
17
+ ] do
18
+ puts 'PR Check completed.'
19
+ end
20
+
21
+ desc 'Run brakeman & rubocop with html formats and save them to /reports'
22
+ task :html do
23
+ system 'bundle exec rubocop -RDf progress -f html -o reports/rubocop.html'
24
+ system 'bundle exec brakeman -o reports/brakeman.html'
25
+ end
26
+
27
+ desc 'Create a report on all notes'
28
+ task :notes do
29
+ puts "\nCollecting all of the standard code notes..."
30
+ system 'bin/rake notes'
31
+ puts "\nCollecting all HACK code notes..."
32
+ system 'bin/rake notes:custom ANNOTATION=HACK'
33
+ puts "\nCollecting all spec code notes..."
34
+ system "grep -rnE 'OPTIMIZE:|OPTIMIZE|FIXME:|FIXME|TODO:|TODO|HACK:|HACK'"\
35
+ ' spec'
36
+ end
37
+
38
+ desc 'Print only FIXME notes'
39
+ task :fixme_notes do
40
+ puts "\nFIXME Notes:"
41
+ system 'bin/rake notes:fixme'
42
+ system "grep -rnE 'FIXME:|FIXME'"\
43
+ ' spec'
44
+ system "grep -rnE 'FIXME:|FIXME'"\
45
+ ' app/views'
46
+ end
47
+
48
+ desc 'Find ruby debugger statements.'
49
+ task :ruby_debugger do
50
+ puts "\nRuby debuggers:"
51
+ %w(binding.pry puts).each do |debugger|
52
+ %w(app/).each do |dir|
53
+ system "grep -rnE '#{debugger}' #{dir}"
54
+ end
55
+ end
56
+ end
57
+
58
+ desc 'Find js debugger statements.'
59
+ task :js_debugger do
60
+ puts "\nJS debuggers:"
61
+ %w(debugger).each do |debugger|
62
+ %w(app-ember/app).each do |dir|
63
+ system "grep -rnE '#{debugger}' #{dir}"
64
+ end
65
+ end
66
+ end
67
+
68
+ desc 'Run rubocop against all created/changed ruby files'
69
+ task :rubocop_recent, [:autocorrect] do |_t, args|
70
+ puts 'Running rubocop...'
71
+ require 'rubocop'
72
+
73
+ module RuboCop
74
+ # :nodoc:
75
+ class TargetFinder
76
+ def find(_args)
77
+ changed_git_files = `git diff --name-only --cached`.split(/\n/)
78
+
79
+ rubocop_target_finder = RuboCop::TargetFinder.new(
80
+ RuboCop::ConfigStore.new
81
+ )
82
+ rubocop_config_store = RuboCop::ConfigStore.new
83
+ rubocop_base_config = rubocop_config_store.for(
84
+ File.expand_path(__dir__)
85
+ )
86
+
87
+ files_to_check = changed_git_files.select do |file|
88
+ rubocop_target_finder.to_inspect?(file, [], rubocop_base_config)
89
+ end
90
+
91
+ files_to_check
92
+ end
93
+ end
94
+ end
95
+
96
+ if args[:autocorrect]
97
+ exit RuboCop::CLI.new.run(['-aD'])
98
+ else
99
+ exit RuboCop::CLI.new.run(['-D'])
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,66 @@
1
+ require 'wildland_dev_tools/updater'
2
+
3
+ namespace :wildland do
4
+ desc 'Updates local dependencies and database.'
5
+ task setup: [:update_ruby, :update_node, :update_ember_dependencies, :database_online, :db] do
6
+ puts 'Ready to go!'
7
+ end
8
+
9
+ task :update_ruby do
10
+ needed_ruby_version = File.read('.ruby-version')
11
+ if WildlandDevTools::Updater.ruby_version_up_to_date?(needed_ruby_version)
12
+ puts 'up to date.'
13
+ else
14
+ puts 'out of date. Updating.'
15
+ WildlandDevTools::Updater.update_ruby(needed_ruby_version)
16
+ end
17
+ end
18
+
19
+ task :update_node do
20
+ puts 'Node updater needs written'
21
+ end
22
+
23
+ task :update_ember_dependencies do
24
+ if WildlandDevTools::Updater.ember_cli_rails_installed?
25
+ puts 'ember-cli-rails installed'
26
+ system('npm install')
27
+ else
28
+ puts 'install ember dependencies'
29
+ WildlandDevTools::Updater.old_ember_setup
30
+ end
31
+ end
32
+
33
+ desc 'Clears local cache.'
34
+ task :cache_clear do
35
+ WildlandDevTools::Updater.clear_ember_cache
36
+ end
37
+
38
+ task :database_online do
39
+ unless `ps aux | grep postgres[l]` != ''
40
+ `open -a postgres`
41
+ end
42
+ end
43
+
44
+ namespace :db do
45
+ desc 'Resets the database.'
46
+ task :reset do
47
+ WildlandDevTools::Updater.reset_database
48
+ end
49
+
50
+ desc 'Reseeds the database.'
51
+ task :reseed do
52
+ WildlandDevTools::Updater.reseed_database
53
+ end
54
+ end
55
+
56
+ desc 'Resets and reseeds the database.'
57
+ task :db do
58
+ Rake::Task['wildland:db:reset'].execute
59
+ Rake::Task['wildland:db:reseed'].execute
60
+ end
61
+ end
62
+
63
+ desc 'Gets development environment setup.'
64
+ task :wildland do
65
+ Rake::Task['wildland:setup'].invoke
66
+ end
@@ -0,0 +1,200 @@
1
+ require 'git'
2
+ module WildlandDevTools
3
+ # :nodoc:
4
+ module Heroku
5
+ VALID_REMOTES = %w(production staging)
6
+
7
+ class << self
8
+ def rollback_production_deploy(verbose = false)
9
+ rollback_production_codebase(verbose)
10
+ rollback_production_database(verbose)
11
+ end
12
+
13
+ def turn_on_staging_maintenance_mode(verbose = false)
14
+ remote = 'staging'
15
+ puts "Turning on maintenance mode for #{remote}" if verbose
16
+ system("heroku maintenance:on -r #{remote}")
17
+ end
18
+
19
+ def turn_off_staging_maintenance_mode(verbose = false)
20
+ remote = 'staging'
21
+ puts "Turning off maintenance mode for #{remote}" if verbose
22
+ system("heroku maintenance:off -r #{remote}")
23
+ end
24
+
25
+ def turn_on_heroku_maintenance_mode(verbose = false)
26
+ %w(staging production).each do |remote|
27
+ puts "Turning on maintenance mode for #{remote}" if verbose
28
+ system("heroku maintenance:on -r #{remote}")
29
+ end
30
+ end
31
+
32
+ def turn_off_heroku_maintenance_mode(verbose = false)
33
+ %w(staging production).each do |remote|
34
+ puts "Turning off maintenance mode for #{remote}" if verbose
35
+ system("heroku maintenance:off -r #{remote}")
36
+ end
37
+ end
38
+
39
+ def deploy_master_to_staging(verbose = false, force = false)
40
+ puts 'Detecting current branch name.' if verbose
41
+ branch = get_current_branch_name
42
+ raise GitSyncException, 'Please checkout master branch' unless branch == 'master'
43
+ deploy_to_staging(branch, verbose, force)
44
+ end
45
+
46
+
47
+ def deploy_current_branch_to_staging(verbose = false, force = false)
48
+ puts 'Detecting current branch name.' if verbose
49
+ branch = get_current_branch_name
50
+ deploy_to_staging(branch, verbose, force)
51
+ end
52
+
53
+ def deploy_to_staging(branch, verbose = false, force = false)
54
+ case status_of_current_branch
55
+ when 'Up-to-date'
56
+ if force
57
+ puts "Force deploying #{branch} to staging." if verbose
58
+ system("OVERCOMMIT_DISABLE=1 git push -f staging #{branch}:master")
59
+ else
60
+ puts "Deploying #{branch} to staging." if verbose
61
+ system("OVERCOMMIT_DISABLE=1 git push staging #{branch}:master")
62
+ end
63
+ when 'Need to pull'
64
+ raise GitSyncException, "Need to pull #{branch} from origin."
65
+ when 'Need to push'
66
+ raise GitSyncException, "Need to push #{branch} to origin."
67
+ else
68
+ raise GitSyncException, "Your local #{branch} has diverged from origin."
69
+ end
70
+ end
71
+
72
+ def promote_staging_to_production(verbose = false)
73
+ puts 'Promoting staging to production' if verbose
74
+ system('heroku pipelines:promote -r staging')
75
+ end
76
+
77
+ def import_production_database(verbose = false)
78
+ puts 'Determining heroku app names.' if verbose
79
+ production_app_name = get_app_name('production', verbose)
80
+ scratch_file_name = 'latest.dump'
81
+ database_name = Rails.configuration.database_configuration['development']['database']
82
+ download_database(production_app_name, scratch_file_name, verbose)
83
+ import_database(database_name, scratch_file_name, verbose)
84
+ File.delete(scratch_file_name)
85
+ end
86
+
87
+ def copy_production_data_to_staging(verbose = false)
88
+ puts 'Determining heroku app names.' if verbose
89
+ staging_app_name = get_app_name('staging', verbose)
90
+ production_app_name = get_app_name('production', verbose)
91
+ puts "Copying #{production_app_name} database to #{staging_app_name}." if verbose
92
+ system(
93
+ "heroku pg:copy #{production_app_name}::DATABASE_URL DATABASE_URL -a #{staging_app_name} --confirm #{staging_app_name}"
94
+ )
95
+ end
96
+
97
+ def backup_production_database(verbose = false)
98
+ remote = 'production'
99
+ puts "Backing up the database for #{remote}" if verbose
100
+ system("heroku pg:backups capture DATABASE -r #{remote}")
101
+ end
102
+
103
+ def migrate_production_database(verbose = false)
104
+ migrate_database('production', verbose)
105
+ end
106
+
107
+ def migrate_staging_database(verbose = false)
108
+ migrate_database('staging', verbose)
109
+ end
110
+
111
+ def rollback_production_database(verbose = false)
112
+ rollback_codebase('production', verbose)
113
+ end
114
+
115
+ def rollback_staging_database(verbose = false)
116
+ rollback_database('staging', verbose)
117
+ end
118
+
119
+ def staging_remote_available?
120
+ Git.open('.').remotes.map(&:to_s).include?('staging')
121
+ end
122
+
123
+ def production_remote_available?
124
+ Git.open('.').remotes.map(&:to_s).include?('production')
125
+ end
126
+
127
+ def heroku_toolbelt_available?
128
+ system('which heroku > /dev/null 2>&1')
129
+ end
130
+
131
+ protected
132
+
133
+ def download_database(app_name, filename, verbose = false)
134
+ puts "Downloading #{app_name} database to tmp file #{filename}" if verbose
135
+ system(
136
+ "curl -o #{filename} `heroku pg:backups:public-url --app #{app_name}`"
137
+ )
138
+ end
139
+
140
+ def import_database(database_name, filename, verbose = false)
141
+ puts "Importing #{filename} to #{database_name}" if verbose
142
+ system(
143
+ "pg_restore --clean --no-owner --no-acl --dbname=#{database_name} #{filename}"
144
+ )
145
+ end
146
+
147
+ def rollback_codebase(remote, verbose = false)
148
+ ensure_valid_remote(remote)
149
+ puts "Rolling back #{remote}" if verbose
150
+ system("heroku rollback #{remote}")
151
+ end
152
+
153
+ def rollback_database(remote, verbose = false)
154
+ ensure_valid_remote(remote)
155
+ if verbose
156
+ puts "Manually restore database for #{remote}"
157
+ puts 'Then run \"rake wildland:heroku:maintenance_mode_off\"'
158
+ end
159
+ end
160
+
161
+ def migrate_database(remote, verbose = false)
162
+ ensure_valid_remote(remote)
163
+ puts "Migrating the database for #{remote}" if verbose
164
+ system("heroku run rake db:migrate -r #{remote}")
165
+ end
166
+
167
+ def status_of_current_branch
168
+ local = `OVERCOMMIT_DISABLE=1 git rev-parse @`
169
+ remote = `OVERCOMMIT_DISABLE=1 git rev-parse @{u}`
170
+ base = `OVERCOMMIT_DISABLE=1 git merge-base @ @{u}`
171
+ case
172
+ when local == remote
173
+ 'Up-to-date'
174
+ when local == base
175
+ 'Need to pull'
176
+ when remote == base
177
+ 'Need to push'
178
+ else
179
+ 'Diverged'
180
+ end
181
+ end
182
+
183
+ def get_current_branch_name
184
+ `git rev-parse --abbrev-ref HEAD`.strip
185
+ end
186
+
187
+ def get_app_name(remote, verbose = false)
188
+ ensure_valid_remote(remote)
189
+ response = `heroku apps:info -r #{remote}`
190
+ response.split(/\r?\n/).first[4..-1] # This is brittle
191
+ end
192
+
193
+ def ensure_valid_remote(remote)
194
+ unless VALID_REMOTES.include?(remote)
195
+ raise ArgumentError, "remote argument is required and must be %{VALID_REMOTES}"
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,15 @@
1
+ require 'wildland_dev_tools'
2
+ require 'rails'
3
+ module MyPlugin
4
+ # :nodoc:
5
+ class Railtie < Rails::Railtie
6
+ railtie_name :wildland_dev_tools
7
+
8
+ rake_tasks do
9
+ load 'tasks/heroku.rake'
10
+ load 'tasks/reports.rake'
11
+ load 'tasks/setup.rake'
12
+ load 'tasks/releases.rake'
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,50 @@
1
+ require 'json'
2
+
3
+ module WildlandDevTools
4
+ # :nodoc:
5
+ module Releases
6
+ VALID_REMOTES = %w(production staging)
7
+
8
+ class << self
9
+ def create_release(verbose = false)
10
+ return false unless git_up_to_date!
11
+ tag_name = "PRODUCTION-#{base_tag_name}"
12
+ create_and_push_tag(tag_name, verbose)
13
+ end
14
+
15
+ def create_release_candidate(verbose = false)
16
+ return false unless git_up_to_date!
17
+ tag_name = "RC-#{base_tag_name}"
18
+ create_and_push_tag(tag_name, verbose)
19
+ end
20
+
21
+ protected
22
+
23
+ def create_and_push_tag(tag_name, verbose = false)
24
+ puts "Creating tag #{tag_name}" if verbose
25
+ system("OVERCOMMIT_DISABLE=1 git tag #{tag_name}")
26
+ system("OVERCOMMIT_DISABLE=1 git push origin #{tag_name}")
27
+ end
28
+
29
+ def base_tag_name
30
+ DateTime.now.strftime("%y-%m-%d-%H-%M")
31
+ end
32
+
33
+ def git_up_to_date!
34
+ local = `OVERCOMMIT_DISABLE=1 git rev-parse @`
35
+ remote = `OVERCOMMIT_DISABLE=1 git rev-parse @{u}`
36
+ base = `OVERCOMMIT_DISABLE=1 git merge-base @ @{u}`
37
+ case
38
+ when local == remote
39
+ return true
40
+ when local == base
41
+ raise GitSyncException, 'Need to pull master from origin.'
42
+ when remote == base
43
+ raise GitSyncException, 'Need to push master to origin.'
44
+ else
45
+ raise GitSyncException, 'Your local master has diverged from origin.'
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,66 @@
1
+ module WildlandDevTools
2
+ # :nodoc:
3
+ module Updater
4
+ class << self
5
+ def reset_database
6
+ system('rake db:drop')
7
+ system('rake db:create')
8
+ system('rake db:migrate')
9
+ system('annotate') if system('which annotate > /dev/null 2>&1')
10
+ end
11
+
12
+ def reseed_database
13
+ system('rake db:seed')
14
+ system('rake demo:seed')
15
+ end
16
+
17
+ def ruby_version_up_to_date?(needed_ruby_version)
18
+ ruby_version = `ruby -v`
19
+ ruby_version.include?(needed_ruby_version.strip)
20
+ end
21
+
22
+ def update_ruby(version)
23
+ case
24
+ when system('which rvm > /dev/null 2>&1')
25
+ update_ruby_with_rvm(version)
26
+ when system('which rbenv > /dev/null 2>&1')
27
+ update_ruby_with_rbenv(version)
28
+ else
29
+ puts "Please manually update to Ruby #{version}"
30
+ end
31
+ end
32
+
33
+ def update_ruby_with_rvm(version)
34
+ # Try to use the version or install and use
35
+ system("rvm use #{version}")
36
+ unless ruby_version_up_to_date?(version)
37
+ system("rvm install #{version}")
38
+ system("rvm use #{version}")
39
+ end
40
+ end
41
+
42
+ def update_ruby_with_rbenv(version)
43
+ system("rbenv install #{version}")
44
+ end
45
+
46
+ def ember_cli_rails_installed?
47
+ File.exist?('bin/heroku_install') && File.exist?('package.json')
48
+ end
49
+
50
+ def old_ember_setup
51
+ Dir.chdir('app-ember') do
52
+ system('npm install')
53
+ system('bower install')
54
+ end
55
+ end
56
+
57
+ def clear_ember_cache
58
+ Dir.chdir('app-ember') do
59
+ system('npm cache clean && bower cache clean')
60
+ system('rm -rf node_modules && rm -rf bower_components')
61
+ system('npm install && bower install')
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,3 @@
1
+ module WildlandDevTools
2
+ VERSION = '0.8.2'.freeze
3
+ end
@@ -0,0 +1,11 @@
1
+ require 'wildland_dev_tools/version'
2
+
3
+ # :nodoc:
4
+ module WildlandDevTools
5
+ require 'wildland_dev_tools/railtie' if defined?(Rails)
6
+ require 'wildland_dev_tools/updater'
7
+ require 'wildland_dev_tools/heroku'
8
+ require 'wildland_dev_tools/releases'
9
+
10
+ class GitSyncException < StandardError; end
11
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'wildland_dev_tools/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "wildland_dev_tools"
8
+ spec.version = WildlandDevTools::VERSION
9
+ spec.authors = ["Joe Weakley"]
10
+ spec.email = ["joew@samjoe.com"]
11
+
12
+ spec.summary = 'Wildland Dev Tools'
13
+ spec.description = 'Wildland Dev Tools'
14
+ spec.homepage = 'http://wild.land'
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "exe"
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+ spec.add_dependency 'rails', ['>= 4.1', '< 5']
22
+ spec.add_runtime_dependency 'rubocop', '>= 0.33'
23
+ spec.add_runtime_dependency 'git', '>= 1.3.0'
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.10"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "rspec"
28
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wildland_dev_tools
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.2
5
+ platform: ruby
6
+ authors:
7
+ - Joe Weakley
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-06-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.1'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '4.1'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rubocop
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0.33'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0.33'
47
+ - !ruby/object:Gem::Dependency
48
+ name: git
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.3.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.3.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: bundler
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.10'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.10'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rake
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '10.0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '10.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: Wildland Dev Tools
104
+ email:
105
+ - joew@samjoe.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - ".gitignore"
111
+ - ".rspec"
112
+ - ".travis.yml"
113
+ - Gemfile
114
+ - LICENSE.txt
115
+ - README.md
116
+ - Rakefile
117
+ - lib/tasks/heroku.rake
118
+ - lib/tasks/releases.rake
119
+ - lib/tasks/reports.rake
120
+ - lib/tasks/setup.rake
121
+ - lib/wildland_dev_tools.rb
122
+ - lib/wildland_dev_tools/heroku.rb
123
+ - lib/wildland_dev_tools/railtie.rb
124
+ - lib/wildland_dev_tools/releases.rb
125
+ - lib/wildland_dev_tools/updater.rb
126
+ - lib/wildland_dev_tools/version.rb
127
+ - wildland_dev_tools.gemspec
128
+ homepage: http://wild.land
129
+ licenses:
130
+ - MIT
131
+ metadata: {}
132
+ post_install_message:
133
+ rdoc_options: []
134
+ require_paths:
135
+ - lib
136
+ required_ruby_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ requirements: []
147
+ rubyforge_project:
148
+ rubygems_version: 2.5.1
149
+ signing_key:
150
+ specification_version: 4
151
+ summary: Wildland Dev Tools
152
+ test_files: []