Skip to content
Snippets Groups Projects

851 review apps landing page

Merged Kushal Pandya requested to merge 851-review-apps-landing-page into master
1 unresolved thread
Files
218
+ 71
0
#!/usr/bin/env ruby
require 'docopt'
require 'yaml'
docstring = <<DOCSTRING
Pick some random team members!
Usage:
#{__FILE__} <n> [--min=<m>] [--reports-to=<reports-to>]... [--role=<role>]...
#{__FILE__} -h | --help
Options:
-h --help Show this screen.
--min=<m> Pick a minimum number of team members from each category.
--reports-to=<reports-to> Pick team members who report to the given team members.
--role=<role> Pick team members with the given role.
DOCSTRING
def strip_html(string)
string.gsub(/<[^>]+>/, '')
end
def print_selected(options)
selected = []
team_members = YAML.load_file('data/team.yml')
n = options['<n>'].to_i
min = options['--min'].to_i
reports_to, role = options.values_at('--reports-to', '--role')
# Key the team members by (reports to, role). If --reports-to isn't passed,
# use nil for that part of the key; do the same for --role. Strip HTML tags
# from both.
categorised_team_members = team_members.group_by do |member|
[
reports_to && strip_html(member['reports_to']),
role && strip_html(member['role'])
]
end
reports_to ||= [nil]
role ||= [nil]
chosen_hash_keys = reports_to.product(role)
available_categorised_team_members = categorised_team_members.values_at(*chosen_hash_keys).compact
# If min * selected categories > n, then we can't enforce that.
if min > 0 && (min * available_categorised_team_members.length) <= n
available_categorised_team_members.map! do |members|
sampled = members.sample(min)
selected += sampled
n -= min
members - sampled
end
end
selected += available_categorised_team_members.flatten.sample(n)
puts selected.map { |member| member['name'] }.sort
end
begin
options = Docopt::docopt(docstring)
print_selected(options)
rescue Docopt::Exit => e
puts e.message
end
Loading