wildland_dev_tools 0.8.2

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.
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: []