retrospective.rb (91 lines of code) (raw):
#!/usr/bin/env ruby
require 'docopt'
require 'yaml'
require './lib/gitlab_api'
require './lib/release_collection'
require './lib/retrospective'
require './lib/team'
class RetrospectiveCommand
def initialize
@options = Docopt::docopt(docstring)
@read_client = GitlabApi.new(token: options.fetch('--read-token'))
@write_client = GitlabApi.new(token: options.fetch('--write-token'))
@retrospective = Retrospective.new(read_client: read_client, write_client: write_client)
@dry_run = options.fetch('--dry-run', false)
end
def call
exit_code = if options.fetch('--all-teams', false)
run_for_all_teams
else
run_for_team(Team.find(options.fetch('--team')))
end
exit(exit_code)
rescue Docopt::Exit => e
puts e.message
exit 1
rescue GitlabApi::UpdateFailed
exit 1
end
private
attr_reader :options, :retrospective, :read_client, :write_client, :dry_run
def run_for_all_teams
results = Team.all.map do |team|
success = begin
run_for_team(team)
true
rescue => e
puts "#{team.name} failed:"
puts e
puts e.backtrace
false
end
[team.name, success]
end
exit_code = results.all?(&:last) ? 0 : 1
puts Retrospective::LOG_SEPARATOR
puts 'All done!'
results.each do |(name, success)|
puts "#{name} #{success ? 'succeeded' : 'failed'}"
end
puts "#{Retrospective::LOG_SEPARATOR}\n"
return exit_code
end
def run_for_team(team)
if options.fetch('create', false)
retrospective.create_issue(team: team, release: release('create', :current), dry_run: dry_run)
elsif options.fetch('update', false)
retrospective.update_issue(team: team, release: release('update', :previous), dry_run: dry_run)
end
0 # exit code
end
def release(action, release_selector)
releases = ReleaseCollection.new(api_client: read_client)
target_release = options.fetch('--release')
release = target_release ? releases.at(target_release) : releases.send(release_selector)
exit(0) unless correct_date?(action, release) || options.fetch('--force', false)
release
end
def correct_date?(action, release)
if action == 'create'
Date.today - Date.parse(release['start_date']) == 9
elsif action == 'update'
Date.today - Date.parse(release['due_date']) == 4
end
end
def docstring
<<~DOCSTRING
Create a retrospective issue
Usage:
#{__FILE__} (create|update) --read-token=<token> --write-token=<token> (--all-teams|--team=<team>) [--dry-run] [--force] [--release=<release>]
#{__FILE__} -h | --help
Options:
-h --help Show this screen.
--dry-run Print the issue contents to standard output.
--force Force the process to run, regardless of date.
--read-token=<token> GitLab API token with read permission.
--write-token=<token> GitLab API token with write permission to the group intended to manage retrospective issues.
--all-teams Run for all teams and print a summary of the results.
--team=<team> Team name, including initial caps (team info in teams.yml).
--release=<release> Target release (eg 17.5). Defaults to latest
DOCSTRING
end
end
# Allow for testing by halting execution when this file is required from another
return unless $0 == __FILE__
RetrospectiveCommand.new.call