Created
February 27, 2020 16:44
-
-
Save ruuts/0824f430ead8a3cf9c49aa74e8d2389d to your computer and use it in GitHub Desktop.
Booking Experts - Join our team
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module BookingExperts | |
module HasRoles | |
ROLES = { | |
backend: %w[Ruby Rails Postgres], | |
full_stack: %w[Ruby Rails Postgres React Javascript], | |
dev_ops: %w[Ruby Rails Postgres AWS Redis Elasticsearch], | |
product_design: %w[Sketch] | |
} | |
ROLES.each do |role, basic_tools| | |
define_method(role) do |&block| | |
@roles ||= {} | |
@roles[role] ||= Role.new(role, basic_tools) | |
@roles[role].instance_eval(&block) | |
end | |
end | |
def members | |
@roles.values.flat_map(&:members) | |
end | |
class Role | |
attr_reader :members | |
def initialize(name, tools) | |
@name = name | |
@tools = tools | |
@members = [] | |
end | |
def add *args | |
@members << Member.new(@tools, *args) | |
end | |
end | |
class Member | |
attr_reader :name, :exp, :school | |
def initialize(basic_tools, name, exp, extra_tools = []) | |
@basic_tools = basic_tools | |
@name = name | |
@exp = exp | |
@school = nil | |
@extra_tools = extra_tools | |
end | |
def went_to(school) | |
@school = school | |
end | |
def tools | |
@basic_tools + @extra_tools | |
end | |
end | |
end | |
class Team | |
include HasRoles | |
SCHOOLS = %w[university_of_twente saxion] | |
def self.build(&block) | |
new.tap do |team| | |
team.instance_eval(&block) | |
end | |
end | |
SCHOOLS.each do |school| | |
define_method(school) do |&block| | |
@schools ||= {} | |
@schools[school] ||= School.new(school.split('_').join(' ').capitalize) | |
@schools[school].instance_eval(&block) | |
end | |
end | |
def members | |
super + @schools.values.flat_map(&:members) | |
end | |
def experience | |
puts "Average experience of #{(members.sum(&:exp).to_f / members.count).round(2)} years" | |
end | |
def technology | |
puts members.flat_map(&:tools).uniq.join(', ') | |
end | |
def education | |
puts members.flat_map(&:school).compact.uniq.join(', ') | |
end | |
def join | |
puts "Join the team, send your motivation to: dev@bookingexperts.nl" | |
end | |
def source_code | |
puts "https://gist.github.com/ruuts/0824f430ead8a3cf9c49aa74e8d2389d" | |
end | |
end | |
class School < Struct.new(:name) | |
include HasRoles | |
def members | |
super.each { |member| member.went_to(name) } | |
super | |
end | |
end | |
end | |
BookingExperts::Team.build do | |
university_of_twente do | |
backend do | |
add 'Stefan', 24, %w(React) | |
add 'Rob', 23, %w(AWS) | |
add 'Gerjan', 16 | |
add 'Rob', 6 | |
end | |
full_stack do | |
add 'Thomas', 10, %w(React Elixir) | |
add 'Rein', 18 | |
end | |
dev_ops { add 'Arthur', 23, %w(AWS Docker) } | |
product_design { add 'Mustafa', 10, %w(Sketch) } | |
end | |
saxion do | |
backend do | |
add 'Eelco', 13 | |
add 'Feyzu', 5 | |
end | |
end | |
full_stack { add 'Ruud', 11 } | |
source_code # => https://gist.github.com/ruuts/0824f430ead8a3cf9c49aa74e8d2389d | |
experience # => Average experience of 12 years | |
technology # => Ruby, Rails, Postgres, React, Elasticsearch, AWS, Typescript, Elixir, Phoenix, Docker, Redis, Sketch, Illustrator | |
education # => UT, Saxion, nil | |
join # => Send your motivation to: join@bookingexperts.nl | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment