abtion-scripts 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.pairs +11 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +116 -0
- data/LICENSE.txt +20 -0
- data/README.md +113 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/abtion.yml +5 -0
- data/bin/abtion +26 -0
- data/lib/abtion_scripts.rb +7 -0
- data/lib/abtion_scripts/base.rb +135 -0
- data/lib/abtion_scripts/begin.rb +195 -0
- data/lib/abtion_scripts/colorize.rb +39 -0
- data/lib/abtion_scripts/diff.rb +29 -0
- data/lib/abtion_scripts/doctor.rb +200 -0
- data/lib/abtion_scripts/help.rb +53 -0
- data/lib/abtion_scripts/heroku_doctor.rb +71 -0
- data/lib/abtion_scripts/kill_db_sessions.rb +22 -0
- data/lib/abtion_scripts/levenstein.rb +40 -0
- data/lib/abtion_scripts/promote.rb +15 -0
- data/lib/abtion_scripts/pushit.rb +23 -0
- data/lib/abtion_scripts/rspec.rb +19 -0
- data/lib/abtion_scripts/test.rb +17 -0
- data/lib/abtion_scripts/todayi.rb +29 -0
- data/lib/abtion_scripts/update.rb +77 -0
- data/spec/passing_spec.rb +5 -0
- data/spec/spec_helper.rb +62 -0
- metadata +173 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
class AbtionScripts::Help < AbtionScripts::Base
|
2
|
+
def self.help
|
3
|
+
"Inception was a lame movie"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.help_subcommands
|
7
|
+
{}
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.description
|
11
|
+
"Prints this message out"
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
specific_script = argv[0]
|
16
|
+
|
17
|
+
if AbtionScripts::Base.script_names.include?(specific_script)
|
18
|
+
script = AbtionScripts::Base.scripts[specific_script]
|
19
|
+
puts full_help(script)
|
20
|
+
elsif specific_script
|
21
|
+
puts colorize(:red, "\"#{specific_script}\" does not exist, cannot display help")
|
22
|
+
else
|
23
|
+
basic_usage
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def full_help(script)
|
30
|
+
(script.help || "") + script.help_subcommands.map do |cmd, description|
|
31
|
+
" - #{colorize(:light_blue, cmd)} - #{description}"
|
32
|
+
end.join("\n")
|
33
|
+
end
|
34
|
+
|
35
|
+
def basic_usage
|
36
|
+
puts "Usage: abtion #{colorize(:light_blue, '[script name]')}"
|
37
|
+
puts
|
38
|
+
puts "Specify a specific script to run, options are: "
|
39
|
+
puts
|
40
|
+
|
41
|
+
names_and_descriptions = AbtionScripts::Base.scripts.map do |name, script|
|
42
|
+
[colorize(:light_green, name), colorize(:light_blue, script.description)]
|
43
|
+
end
|
44
|
+
|
45
|
+
padding = names_and_descriptions.map { |name, _| name.length }.max
|
46
|
+
|
47
|
+
names_and_descriptions.each do |name, description|
|
48
|
+
puts " %-#{padding}s %s" % [name, description]
|
49
|
+
end
|
50
|
+
|
51
|
+
puts
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative './doctor'
|
2
|
+
|
3
|
+
class HerokuDoctor < AbtionScripts::Doctor
|
4
|
+
def self.description
|
5
|
+
"Checks the health of your Heroku config"
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.help
|
9
|
+
<<~TEXT
|
10
|
+
abtion heroku-doctor #{colorize(:light_blue, "environment")} = #{colorize(:yellow, "staging")}
|
11
|
+
TEXT
|
12
|
+
end
|
13
|
+
|
14
|
+
def run_checks
|
15
|
+
@env = argv[0] || "staging"
|
16
|
+
@heroku_app_name = app_names[@env.to_s]
|
17
|
+
|
18
|
+
puts "Environment: #{@env}"
|
19
|
+
puts "Heroku app: #{@heroku_app_name}"
|
20
|
+
puts
|
21
|
+
|
22
|
+
# this one should always be first - it will NEVER pass for the abtion-rails project which is OKAY!
|
23
|
+
check(
|
24
|
+
name: "The abtion.yml file has been configured properly",
|
25
|
+
command: "! grep 'PROJECT-NAME-staging' abtion.yml",
|
26
|
+
remedy: "configure your abtion.yml file to have the correct app names set for all your Heroku environments"
|
27
|
+
)
|
28
|
+
|
29
|
+
check(
|
30
|
+
name: "app #{@heroku_app_name} exists",
|
31
|
+
command: "cat .git/config | egrep -e git@heroku.com:#{@heroku_app_name}.git -e https://git.heroku.com/#{@heroku_app_name}.git",
|
32
|
+
remedy: [command("heroku apps:create #{@heroku_app_name}"), "and/or", command("git remote add staging git@heroku.com:#{@heroku_app_name}.git")]
|
33
|
+
)
|
34
|
+
|
35
|
+
check_remote("production")
|
36
|
+
check_remote("staging")
|
37
|
+
|
38
|
+
check_env("DEPLOY_TASKS", "db:migrate")
|
39
|
+
check_env("RAILS_ENV", "production")
|
40
|
+
check_env("DATABASE_URL", "postgres://", "go to https://dashboard.heroku.com/apps/#{@heroku_app_name}/resources and add the Heroku Postgress add-on")
|
41
|
+
|
42
|
+
check_buildpack("https://github.com/heroku/heroku-buildpack-ruby")
|
43
|
+
check_buildpack("https://github.com/gunpowderlabs/buildpack-ruby-rake-deploy-tasks")
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def check_remote(remote)
|
49
|
+
check(
|
50
|
+
name: %|Remote "#{remote}" exists|,
|
51
|
+
command: "git remote | grep #{remote}",
|
52
|
+
remedy: "heroku git:remote -a #{@heroku_app_name} -r #{remote}"
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
def check_env(env_var, value, remedy=nil)
|
57
|
+
check(
|
58
|
+
name: env_var,
|
59
|
+
command: "heroku config:get #{env_var} -a #{@heroku_app_name} | grep '#{value}'",
|
60
|
+
remedy: remedy || command("heroku config:set #{env_var}=#{value} -a #{@heroku_app_name}")
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
def check_buildpack(url)
|
65
|
+
check(
|
66
|
+
name: url.split("/").last,
|
67
|
+
command: "heroku buildpacks -a #{@heroku_app_name} | grep '#{url}'",
|
68
|
+
remedy: command("heroku buildpacks:add #{url} -a #{@heroku_app_name}")
|
69
|
+
)
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class AbtionScripts::KillDbSessions < AbtionScripts::Base
|
2
|
+
def self.description
|
3
|
+
"Kills active Postgres sessions"
|
4
|
+
end
|
5
|
+
|
6
|
+
def run
|
7
|
+
print "Loading Rails... "
|
8
|
+
require app_root.join("./config/environment")
|
9
|
+
|
10
|
+
puts "done"
|
11
|
+
|
12
|
+
print "Killing DB sessions... "
|
13
|
+
ActiveRecord::Base.connection.execute(<<-SQL)
|
14
|
+
SELECT pg_terminate_backend(pg_stat_activity.pid)
|
15
|
+
FROM pg_stat_activity
|
16
|
+
WHERE datname = current_database()
|
17
|
+
AND pid <> pg_backend_pid()
|
18
|
+
SQL
|
19
|
+
|
20
|
+
puts "done"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class Levenstein
|
2
|
+
def self.edit_distance(s, t)
|
3
|
+
m = s.length
|
4
|
+
n = t.length
|
5
|
+
return m if n == 0
|
6
|
+
return n if m == 0
|
7
|
+
d = Array.new(m+1) { Array.new(n+1) }
|
8
|
+
|
9
|
+
(0..m).each { |i| d[i][0] = i }
|
10
|
+
(0..n).each { |j| d[0][j] = j }
|
11
|
+
(1..n).each do |j|
|
12
|
+
(1..m).each do |i|
|
13
|
+
d[i][j] = if s[i-1] == t[j-1] # adjust index into string
|
14
|
+
d[i-1][j-1] # no operation required
|
15
|
+
else
|
16
|
+
[d[i-1][j]+1, # deletion
|
17
|
+
d[i][j-1]+1, # insertion
|
18
|
+
d[i-1][j-1]+1, # substitution
|
19
|
+
].min
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
d[m][n]
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.closest_match(needle, haystack)
|
27
|
+
min_distance = haystack.map(&:size).max
|
28
|
+
results = nil
|
29
|
+
haystack.each do |value|
|
30
|
+
distance = edit_distance(needle, value)
|
31
|
+
if distance < min_distance
|
32
|
+
min_distance = distance
|
33
|
+
results = [value]
|
34
|
+
elsif distance == min_distance
|
35
|
+
results << value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
results
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class AbtionScripts::Promote < AbtionScripts::Base
|
2
|
+
def self.description
|
3
|
+
"Promote staging to production and run migrations on production"
|
4
|
+
end
|
5
|
+
|
6
|
+
def run
|
7
|
+
step "Promoting staging to production" do
|
8
|
+
heroku "pipelines:promote", remote: :staging
|
9
|
+
end
|
10
|
+
|
11
|
+
step "Running migrations on production" do
|
12
|
+
heroku "run rails db:migrate", remote: :production
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class AbtionScripts::Pushit < AbtionScripts::Base
|
2
|
+
def self.description
|
3
|
+
"Pulls code, runs test, pushes your code"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.help
|
7
|
+
<<-EOF
|
8
|
+
abtion pushit
|
9
|
+
|
10
|
+
Pulls the latest code, restarts, runs the tests, and pushes
|
11
|
+
your new code up.
|
12
|
+
EOF
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
run_script :update
|
17
|
+
run_script :test
|
18
|
+
|
19
|
+
step "Pushing" do
|
20
|
+
system('git push')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class AbtionScripts::Rspec < AbtionScripts::Base
|
2
|
+
def self.description
|
3
|
+
"Runs your RSpec suite"
|
4
|
+
end
|
5
|
+
|
6
|
+
def run
|
7
|
+
begin
|
8
|
+
load(File.expand_path("./spring", __FILE__))
|
9
|
+
rescue LoadError
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'bundler/setup'
|
13
|
+
|
14
|
+
step "Running RSpec" do
|
15
|
+
command = ['bundle', 'exec', 'rspec', *argv]
|
16
|
+
system!(command.join(" "))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class AbtionScripts::Test < AbtionScripts::Base
|
2
|
+
def self.description
|
3
|
+
"Runs all test suites for CI/pushit"
|
4
|
+
end
|
5
|
+
|
6
|
+
def run
|
7
|
+
step "Running test suite" do
|
8
|
+
rspec
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def rspec
|
15
|
+
AbtionScripts::Rspec.run
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class AbtionScripts::TodayI < AbtionScripts::Base
|
2
|
+
def self.help
|
3
|
+
<<-EOF
|
4
|
+
abtion today-i
|
5
|
+
|
6
|
+
Prints out a list of commit message names that you worked on today.
|
7
|
+
EOF
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.description
|
11
|
+
"Prints a list of commit msgs from today"
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
date_string = Time.now.to_s.split(' ')[0]
|
16
|
+
|
17
|
+
lines = %x{
|
18
|
+
git log \
|
19
|
+
--date=local \
|
20
|
+
--oneline \
|
21
|
+
--after="#{date_string} 00:00" \
|
22
|
+
--before="#{date_string} 23:59"
|
23
|
+
}
|
24
|
+
|
25
|
+
lines.each_line do |line|
|
26
|
+
puts line.split(" ", 2)[1]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
class AbtionScripts::Update < AbtionScripts::Base
|
2
|
+
def self.help
|
3
|
+
<<-EOF
|
4
|
+
abtion update
|
5
|
+
|
6
|
+
This script is a way to update your development environment automatically.
|
7
|
+
EOF
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.description
|
11
|
+
"Updates your dev environment automatically"
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
pull_git
|
16
|
+
install_dependencies
|
17
|
+
update_db
|
18
|
+
remove_old_logs
|
19
|
+
restart_servers
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def pull_git
|
25
|
+
step "Pulling from git" do
|
26
|
+
system! "git pull --rebase"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def install_dependencies
|
31
|
+
step "Installing dependencies" do
|
32
|
+
if bundler?
|
33
|
+
system! 'command -v bundler > /dev/null || gem install bundler --conservative'
|
34
|
+
system! 'bundle install'
|
35
|
+
end
|
36
|
+
|
37
|
+
if yarn?
|
38
|
+
system! "yarn install"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def update_db
|
44
|
+
if rails?
|
45
|
+
step "Updating database" do
|
46
|
+
system! 'rake db:migrate db:test:prepare'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def remove_old_logs
|
52
|
+
if rails?
|
53
|
+
step "Removing old logs and tempfiles" do
|
54
|
+
system! 'rake log:clear tmp:clear'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def restart_servers
|
60
|
+
restart_rails if rails?
|
61
|
+
end
|
62
|
+
|
63
|
+
def restart_rails
|
64
|
+
step "Attempting to restart Rails" do
|
65
|
+
output = `bin/rails restart`
|
66
|
+
|
67
|
+
if $?.exitstatus > 0
|
68
|
+
puts colorize(
|
69
|
+
:light_red,
|
70
|
+
"skipping restart, not supported in this version of Rails (needs >= 6)"
|
71
|
+
)
|
72
|
+
else
|
73
|
+
puts output
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
RSpec.configure do |config|
|
2
|
+
# rspec-expectations config goes here. You can use an alternate
|
3
|
+
# assertion/expectation library such as wrong or the stdlib/minitest
|
4
|
+
# assertions if you prefer.
|
5
|
+
config.expect_with :rspec do |expectations|
|
6
|
+
# This option will default to `true` in RSpec 4. It makes the `description`
|
7
|
+
# and `failure_message` of custom matchers include text for helper methods
|
8
|
+
# defined using `chain`, e.g.:
|
9
|
+
# be_bigger_than(2).and_smaller_than(4).description
|
10
|
+
# # => "be bigger than 2 and smaller than 4"
|
11
|
+
# ...rather than:
|
12
|
+
# # => "be bigger than 2"
|
13
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
14
|
+
end
|
15
|
+
|
16
|
+
# rspec-mocks config goes here. You can use an alternate test double
|
17
|
+
# library (such as bogus or mocha) by changing the `mock_with` option here.
|
18
|
+
config.mock_with :rspec do |mocks|
|
19
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
20
|
+
# a real object. This is generally recommended, and will default to
|
21
|
+
# `true` in RSpec 4.
|
22
|
+
mocks.verify_partial_doubles = true
|
23
|
+
end
|
24
|
+
|
25
|
+
# These two settings work together to allow you to limit a spec run
|
26
|
+
# to individual examples or groups you care about by tagging them with
|
27
|
+
# `:focus` metadata. When nothing is tagged with `:focus`, all examples
|
28
|
+
# get run.
|
29
|
+
config.filter_run :focus
|
30
|
+
config.run_all_when_everything_filtered = true
|
31
|
+
|
32
|
+
# This setting enables warnings. It's recommended, but in some cases may
|
33
|
+
# be too noisy due to issues in dependencies.
|
34
|
+
config.warnings = true
|
35
|
+
|
36
|
+
# Many RSpec users commonly either run the entire suite or an individual
|
37
|
+
# file, and it's useful to allow more verbose output when running an
|
38
|
+
# individual spec file.
|
39
|
+
if config.files_to_run.one?
|
40
|
+
# Use the documentation formatter for detailed output,
|
41
|
+
# unless a formatter has already been configured
|
42
|
+
# (e.g. via a command-line flag).
|
43
|
+
config.default_formatter = 'doc'
|
44
|
+
end
|
45
|
+
|
46
|
+
# Print the 10 slowest examples and example groups at the
|
47
|
+
# end of the spec run, to help surface which specs are running
|
48
|
+
# particularly slow.
|
49
|
+
config.profile_examples = 10
|
50
|
+
|
51
|
+
# Run specs in random order to surface order dependencies. If you find an
|
52
|
+
# order dependency and want to debug it, you can fix the order by providing
|
53
|
+
# the seed, which is printed after each run.
|
54
|
+
# --seed 1234
|
55
|
+
config.order = :random
|
56
|
+
|
57
|
+
# Seed global randomization in this process using the `--seed` CLI option.
|
58
|
+
# Setting this allows you to use `--seed` to deterministically reproduce
|
59
|
+
# test failures related to randomization by passing the same `--seed` value
|
60
|
+
# as the one that triggered the failure.
|
61
|
+
Kernel.srand config.seed
|
62
|
+
end
|