Skip to content

Instantly share code, notes, and snippets.

@vestige
Created October 1, 2018 12:32
Show Gist options
  • Save vestige/eefd9d7091b39cd09432386b65238570 to your computer and use it in GitHub Desktop.
Save vestige/eefd9d7091b39cd09432386b65238570 to your computer and use it in GitHub Desktop.
class Schedule
def scheduled?(schedulable, start_date, end_date)
puts "This #{schedulable.class}" +
"is not scheduled¥n" +
" between #{start_date} and #{end_date}"
false
end
end
class Bicycle
attr_reader :schedule, :size, :chain, :tire_size
def initialize(args={})
@schedule = args[:schedule] || Schedule.new
@size = args[:size]
@chain = args[:chain] || default_chain
@tire_size = args[:tire_size] || default_tire_size
end
def schedulable?(start_date, end_date)
!scheduled?(start_date - lead_days, end_date)
end
def scheduled?(start_date, end_date)
schedule.scheduled?(self, start_date, end_date)
end
def lead_days
1
end
def default_chain
'10-speed'
end
def default_tire_size
raise NotImplementedError,
"This #{self.class} cannot responds to:"
end
end
class RoadBike < Bicycle
attr_reader :tape_color
def initialize(args)
@tape_color = args[:tape_color]
super(args)
end
def default_tire_size
'23'
end
def spares
if style == :road
[chain: '10-speed',
tire_size: '23',
tape_color: tape_color ]
else
[chain: '10-speed',
tire_size: '2.1',
rear_shock: rear_shock ]
end
end
end
class MountainBike < Bicycle
attr_reader :front_shock, :rear_shock
def initialize(args)
@front_shock = args[:front_shock]
@rear_shock = args[:rear_shock]
super(args)
end
def default_tire_size
'2.1'
end
def spares
super.merge(rear_shock: rear_shock)
end
end
class RecumbentBike < Bicycle
def default_chain
'9-speed'
end
end
=begin
road = RoadBike.new(
size: 'M',
tape_color: 'red'
)
p road.size
mountain = MountainBike.new(
size: 'S',
front_shock: 'Manitou',
rear_shock: 'Fox'
)
p mountain.size
bent = RecumbentBike.new
=end
require 'date'
starting = Date.parse("2015/09/04")
ending = Date.parse("2015/09/14")
b = Bicycle.new
b.schedulable?(starting, ending)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment