Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
97a6ceb
update to correct ruby version
vnikki13 Feb 25, 2020
ed00bf1
added tests for Wave 1.1 - upgrading times
vnikki13 Feb 25, 2020
1d50fa3
calculate specific time durations of trips using Time class
vnikki13 Feb 25, 2020
a35adce
updated ruby file gem
vnikki13 Feb 25, 2020
96f586a
write tests for net_expenditures method
vnikki13 Feb 25, 2020
2284776
create net_expenditures method
vnikki13 Feb 25, 2020
ecb7aa6
Made a Driver class that initiates and created from_csv method
vnikki13 Feb 25, 2020
4f1fc16
made a total_time_spent method
vnikki13 Feb 25, 2020
99844bf
made tests for passenger total_time_spent method
vnikki13 Feb 25, 2020
dc479f3
Made test run
vnikki13 Feb 25, 2020
79b32c1
made driver tests work
vnikki13 Feb 25, 2020
b2ff292
add add_trip method and defaulted status to sym
vnikki13 Feb 26, 2020
fe156ae
added driver_id and driver attributes and updated connect method
vnikki13 Feb 26, 2020
84b0f62
called driver.load_all, updated connect method, and added a find_driv…
vnikki13 Feb 26, 2020
f668972
updated tests to reflect changes
vnikki13 Feb 26, 2020
48d8e8c
updated tests to reflect changes
vnikki13 Feb 26, 2020
54e8bbe
add tests for total_revenue method
vnikki13 Feb 26, 2020
c3bd8e1
add average_rating and total_revenue methods
vnikki13 Feb 26, 2020
1d665b9
add test for request_trip method
vnikki13 Feb 26, 2020
8f5ac75
begin writing request_trip method
vnikki13 Feb 26, 2020
132481e
made status writeable
seaweeddol Feb 26, 2020
914b711
added if statement to check if nil for end_time and rating
seaweeddol Feb 26, 2020
8b2a7fd
updated request_trip arguments to return new Trip correctly and set d…
seaweeddol Feb 26, 2020
2c34fc1
updated from Class method to instance method
seaweeddol Feb 26, 2020
c003e65
added tests for average_rating and total_revenue when there are in pr…
seaweeddol Feb 26, 2020
38e661e
created tests for TripDispatcher request_trip method
seaweeddol Feb 26, 2020
caca236
complete all requirements for TripDispatcher request_trip method
seaweeddol Feb 26, 2020
9e0c9c6
updated average_rating and total_revenue methods to account for nil v…
seaweeddol Feb 26, 2020
4ee3082
added helper method trip_in_progress
seaweeddol Feb 26, 2020
cf52051
added pick_driver_for_trip helper method and added new logic for wave 4
seaweeddol Feb 26, 2020
31dab54
called pick_driver_for_trip instead of loop to pick first avail driver
seaweeddol Feb 26, 2020
3d9e725
changed tests to use test data and created tests for new pick_driver_…
seaweeddol Feb 26, 2020
c709b19
cleaned and refactored code
seaweeddol Feb 27, 2020
4838654
fix order of variables to match trips.csv order
seaweeddol Feb 27, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
source 'http://rubygems.org'

ruby '2.5.5'
ruby '2.6.5'

gem 'rake'

Expand Down
34 changes: 34 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
GEM
remote: http://rubygems.org/
specs:
ansi (1.5.0)
awesome_print (1.8.0)
builder (3.2.4)
csv (3.1.2)
minitest (5.14.0)
minitest-reporters (1.4.2)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
minitest-skip (0.0.1)
minitest (~> 5.0)
rake (13.0.1)
ruby-progressbar (1.10.1)

PLATFORMS
ruby

DEPENDENCIES
awesome_print
csv
minitest
minitest-reporters
minitest-skip
rake

RUBY VERSION
ruby 2.5.5p157

BUNDLED WITH
2.1.4
8 changes: 2 additions & 6 deletions lib/csv_record.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,7 @@ def self.load_all(full_path: nil, directory: nil, file_name: nil)
end

def self.validate_id(id)
if id.nil? || id <= 0
raise ArgumentError, 'ID cannot be blank or less than one.'
end
raise ArgumentError.new('ID cannot be blank or less than one.') if id.nil? || id <= 0
end

private
Expand All @@ -35,9 +33,7 @@ def self.from_csv(record)
end

def self.build_path(directory, file_name)
unless directory
raise ArgumentError, "Either full_path or directory is required"
end
raise ArgumentError.new("Either full_path or directory is required") unless directory

unless file_name
class_name = self.to_s.split('::').last
Expand Down
65 changes: 65 additions & 0 deletions lib/driver.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
require 'csv'
require_relative 'csv_record'

module RideShare
class Driver < CsvRecord
attr_reader :id, :name, :vin, :trips
attr_accessor :status

def initialize(
id:,
name:,
vin:,
status: :AVAILABLE,
trips: nil
)
super(id)

(vin.length == 17) ? (@vin = vin) : (raise ArgumentError)
[:AVAILABLE, :UNAVAILABLE].include?(status) ? (@status = status.to_sym) : (raise ArgumentError)

@name = name
@trips = trips || []

end

def trip_in_progress(trip)
@status = :UNAVAILABLE
add_trip(trip)
end

def add_trip(trip)
@trips << trip
end

def average_rating
# get all trips where rating is not nil
completed_trips = trips.select{ |trip| trip.rating != nil }

trip_ratings = completed_trips.map { |trip| trip.rating.to_f }

return 0 if trip_ratings.length == 0
return trip_ratings.sum / trip_ratings.length
end

def total_revenue
# get all trips where cost is not nil and is more than 1.65
completed_trips = trips.select{ |trip| trip.cost != nil && trip.cost > 1.65 }

trip_revenues = completed_trips.map { |trip| (trip.cost - 1.65) * 0.8 }

return trip_revenues.sum.round(2)
end

private

def self.from_csv(record)
return new(
id: record[:id],
name: record[:name],
vin: record[:vin],
status: record[:status].to_sym
)
end
end
end
12 changes: 12 additions & 0 deletions lib/passenger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,18 @@ def add_trip(trip)
@trips << trip
end

def net_expenditures
all_trips = @trips.map { |trip| trip.cost }

return all_trips.sum
end

def total_time_spent
all_trips_duration = @trips.map { |trip| trip.calculate_duration }

return all_trips_duration.sum
end

private

def self.from_csv(record)
Expand Down
40 changes: 31 additions & 9 deletions lib/trip.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
require 'csv'
require 'time'

require_relative 'csv_record'

module RideShare
class Trip < CsvRecord
attr_reader :id, :passenger, :passenger_id, :start_time, :end_time, :cost, :rating
attr_reader :id, :passenger, :passenger_id, :start_time, :end_time, :cost, :rating, :driver_id, :driver

def initialize(
id:,
driver_id: nil,
driver: nil,
passenger: nil,
passenger_id: nil,
start_time:,
Expand All @@ -16,25 +19,37 @@ def initialize(
rating:
)
super(id)
if end_time != nil
raise ArgumentError if end_time < start_time
end

if passenger
@passenger = passenger
@passenger_id = passenger.id

elsif passenger_id
@passenger_id = passenger_id

else
raise ArgumentError, 'Passenger or passenger_id is required'
end

if driver
@driver = driver
@driver_id = driver.id
elsif driver_id
@driver_id = driver_id
else
raise ArgumentError, 'driver or driver_id is required'
end

@start_time = start_time
@end_time = end_time
@cost = cost
@rating = rating

if @rating > 5 || @rating < 1
raise ArgumentError.new("Invalid rating #{@rating}")
if @rating != nil
if @rating > 5 || @rating < 1
raise ArgumentError.new("Invalid rating #{@rating}")
end
end
end

Expand All @@ -46,9 +61,15 @@ def inspect
"PassengerID=#{passenger&.id.inspect}>"
end

def connect(passenger)
def connect(passenger, driver)
@passenger = passenger
passenger.add_trip(self)
@driver = driver
driver.add_trip(self)
end

def calculate_duration()
return end_time - start_time
end

private
Expand All @@ -57,10 +78,11 @@ def self.from_csv(record)
return self.new(
id: record[:id],
passenger_id: record[:passenger_id],
start_time: record[:start_time],
end_time: record[:end_time],
start_time: Time.parse(record[:start_time]),
end_time: Time.parse(record[:end_time]),
cost: record[:cost],
rating: record[:rating]
rating: record[:rating],
driver_id: record[:driver_id]
)
end
end
Expand Down
57 changes: 56 additions & 1 deletion lib/trip_dispatcher.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class TripDispatcher
def initialize(directory: './support')
@passengers = Passenger.load_all(directory: directory)
@trips = Trip.load_all(directory: directory)
@drivers = Driver.load_all(directory: directory)
connect_trips
end

Expand All @@ -19,6 +20,11 @@ def find_passenger(id)
return @passengers.find { |passenger| passenger.id == id }
end

def find_driver(id)
Driver.validate_id(id)
return @drivers.find { |driver| driver.id == id }
end

def inspect
# Make puts output more useful
return "#<#{self.class.name}:0x#{object_id.to_s(16)} \
Expand All @@ -27,12 +33,61 @@ def inspect
#{passengers.count} passengers>"
end

def pick_driver_for_trip
# gets all drivers who are available
available_drivers = @drivers.select{ |driver| driver.status == :AVAILABLE}
raise "No drivers are currently available" if available_drivers.length == 0

picked_driver = ""
oldest_end_time = Time.now

available_drivers.each do |driver|
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome!

# picks first driver who has never driven
if driver.trips.length == 0
picked_driver = driver
return picked_driver
else
# picks driver whos most recent trip is the oldest compared to today
driver_most_recent_end_time = driver.trips.max_by { |trip| trip.end_time }.end_time
if driver_most_recent_end_time < oldest_end_time
oldest_end_time = driver_most_recent_end_time
picked_driver = driver
end
end
end

return picked_driver
end

def request_trip(passenger_id)

found_passenger = find_passenger(passenger_id)
available_driver = pick_driver_for_trip
new_trip = Trip.new(
id: @trips.length + 1,
passenger: found_passenger,
start_time: Time.now,
end_time: nil,
cost: nil,
rating: nil,
driver_id: available_driver.id,
driver: available_driver
)

available_driver.trip_in_progress(new_trip)
found_passenger.add_trip(new_trip)
@trips.push(new_trip)

return new_trip
end

private

def connect_trips
@trips.each do |trip|
passenger = find_passenger(trip.passenger_id)
trip.connect(passenger)
driver = find_driver(trip.driver_id)
trip.connect(passenger, driver)
end

return trips
Expand Down
Loading