Skip to content

Instantly share code, notes, and snippets.

@ruuts
Created February 27, 2020 16:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ruuts/0824f430ead8a3cf9c49aa74e8d2389d to your computer and use it in GitHub Desktop.
Save ruuts/0824f430ead8a3cf9c49aa74e8d2389d to your computer and use it in GitHub Desktop.
Booking Experts - Join our team
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