Created
September 30, 2013 16:27
-
-
Save spencereldred/6766356 to your computer and use it in GitHub Desktop.
Spencer't happy_trails.rb source code
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
# happy_tails.rb | |
# Spencer Eldred | |
# Sept 27, 2013 | |
# Activity: | |
# You are the manager at HappiTails animal shelter. You need to manage your shelter by storing and manipulating information about clients and animals. | |
# Object Specs: | |
# Animal: | |
# An animal should have a name, an age, a gender, a species, and can have multiple toys. | |
class Animal | |
attr_accessor :name, :age, :gender, :species, :toys | |
@@new_animal_id = 0 | |
def initialize(name, age, gender, species, toys) | |
@name = name | |
@age = age | |
@gender = gender | |
@species = species | |
@toys = toys | |
@@new_animal_id += 1 | |
end | |
def self.get_animal_id | |
@@new_animal_id | |
end | |
def add_toy(toy) | |
@toys << toy | |
end | |
def to_s | |
"#{@name}: Age: #{@age}, Gender: #{@gender}, Species: #{@species}, Toys: #{@toys}" | |
end | |
end | |
# Client: | |
# A client should have a name, a number of children, an age, and a number of pets. | |
class Client | |
attr_accessor :name, :number_of_children, :age, :number_of_pets, :animals | |
@@new_client_id = 0 | |
def initialize(name, number_of_children, age) | |
@name = name | |
@number_of_children = number_of_children | |
@age = age | |
@number_of_pets = 0 | |
@animals = [] | |
@@new_client_id += 1 | |
end | |
def add_animal(animal) | |
@animals << animal | |
@number_of_pets += 1 | |
end | |
def remove_animal(animal) | |
@animals.delete(animal) | |
@number_of_pets -= 1 | |
end | |
def display_pets | |
@animals.each { |animal| puts animal } | |
end | |
def self.get_client_id | |
@@new_client_id | |
end | |
def to_s | |
"#{@name}: Number of children: #{@number_of_children}, Age: #{@age}, Number of pets: #{@number_of_pets}" | |
end | |
end | |
# Shelter: | |
# The shelter should display all the clients, and all the animals. | |
class Shelter | |
attr_accessor :animals, :clients | |
def initialize(animals, clients) | |
@animals = animals | |
@clients = clients | |
end | |
def add_client(client) | |
@clients << client | |
end | |
def remove_client(client) | |
@client.delete(client) | |
end | |
def add_animal(animal) | |
@animals << animal | |
end | |
def remove_animal(animal) | |
@animals.delete(animal) | |
end | |
def display_clients | |
@clients.each { |client| display_user(client) unless client.name == "Visitor" } | |
end | |
def display_client(user) | |
@clients.each { |client| display_user(client) if client.name == user} | |
end | |
def display_user(client) | |
puts client | |
if client.number_of_pets > 0 | |
puts "\t#{client.name}'s' list of adopted animals: \n\t#{client.animals.join("\n\t")}." | |
else | |
puts "\t#{client.name} has not adopted any animals yet." | |
end | |
end | |
def display_animals | |
@animals.each { |animal| puts animal } | |
end | |
def display_animal(pet) | |
@animals.each { |animal| puts animal.name } | |
end | |
end # Shelter | |
# Login with error handling and custom error | |
class UserValidationError < StandardError | |
def message | |
display_banner | |
"The name you entered is not on the client list. \n" + | |
"Enter your name, or Visitor to log in:" | |
end | |
end | |
def validate_client(shelter) | |
puts "" | |
puts "Enter your name, or Visitor to log in:" | |
begin | |
user = gets.chomp | |
raise UserValidationError if !shelter.clients.any? { |client| client.name == user } | |
rescue StandardError => e # runs if there is an error | |
puts e.message | |
# puts "Retry [y/n]" | |
# try_again = gets.chomp | |
# if try_again == "n" # want to exit block if user needs to create client account | |
# login(shelter) | |
# end | |
retry # runs program starting at the begin block | |
ensure # always runs at the end of the block. good for closing files or closing databases | |
puts "Welcom #{user}, you are now logged in." | |
return user | |
end | |
end | |
# Relationships: | |
# A client should be able to adopt an animal. | |
# A client should be able to put an animal up for adoption | |
def adopt_an_animal(shelter, user) | |
puts "\tAdopt an animal" | |
animal_list(shelter) | |
puts "\nLogged in user account information:\n" | |
shelter.display_client(user) | |
puts "\nHello #{user}, type in the name of the animal you would like to adopt:" | |
pet = gets.chomp | |
if shelter.animals.any? { |animal| animal.name == pet } | |
shelter.clients.each do |client| | |
if client.name == user | |
shelter.animals.each { |animal| client.add_animal(animal) if animal.name == pet } | |
end | |
end | |
shelter.animals.each { |animal| shelter.remove_animal(animal) if animal.name == pet } | |
puts "Congratulations #{user}, you have just adopted #{pet}!" | |
else | |
puts "#{pet} is not one of the animals on the list. Return to menu and try again." | |
end | |
end | |
def put_animal_up_for_adoption(shelter, user) | |
#shelter.display_client(user) | |
puts "\tPut animal up for adoption:" | |
puts "Is this animal a stray? [y/n]" | |
stray = gets.chomp | |
if stray == "n" | |
puts "Hello #{user}, here is your current list of pets:" | |
shelter.clients.each { |client| client.display_pets if client.name == user} | |
puts "What pet would you like to put up for adoption:" | |
pet = gets.chomp | |
puts "youve requested animal: #{pet}" | |
shelter.clients.each do |client| | |
if client.name == user | |
client.animals.each do |animal| | |
shelter.add_animal(animal) | |
client.remove_animal(animal) | |
end # client.animals.each | |
end # if client.name == user | |
end # shelter.clients.each | |
else | |
create_animal(shelter) | |
put_animal_up_for_adoption(shelter,user) | |
end # if not stray | |
puts "#{pet} has been put up for adoption." | |
end | |
# class Animal(name, age, gender, species, toys) | |
def create_animal(shelter) | |
puts "\tCreate an animal" | |
puts "Enter the following data for your animal:" | |
print "Name: " | |
name = gets.chomp | |
print "Age: " | |
age = gets.chomp.to_i | |
print "Gender: " | |
gender = gets.chomp | |
print "Species: " | |
species = gets.chomp | |
print "Toys - (enter a comma separated list): " | |
toys = [] | |
toys << gets.chomp | |
shelter.add_animal(Animal.new(name, age, gender, species, toys.join.split(", "))) | |
end | |
# class Client(name, number_of_children, age, number_of_pets) | |
def create_client(shelter) | |
puts "\tCreate a client:" | |
puts "Enter the following data for client:" | |
print "Name: " | |
name = gets.chomp | |
print "Number of children: " | |
number_of_children = gets.chomp.to_i | |
print "Age: " | |
age = gets.chomp.to_i | |
shelter.add_client(Client.new(name, number_of_children, age)) | |
end | |
# Helper methods | |
def return_to_continue | |
puts "" | |
puts "press return to continue" | |
gets.chomp | |
end | |
def quit | |
puts "Aloha, come back again!" | |
end # def quit | |
def display_banner | |
puts `clear` | |
puts "Animal Shelter - adopt a new pet today!" | |
puts "****************************************" | |
end | |
def animal_list(shelter) | |
puts "" | |
puts "There are #{shelter.animals.length} animals available for adoption:" | |
puts "" | |
shelter.display_animals | |
end | |
def client_list(shelter) | |
puts "" | |
puts "Shelter client list: (#{shelter.clients.length} clients)" | |
puts "" | |
shelter.display_clients | |
end | |
# main menu | |
def main(shelter, user) | |
valid_mode = false | |
while !valid_mode | |
display_banner | |
puts "Enter number to execute request:" | |
puts " 1) Display all animals" | |
puts " 2) Display all clients" | |
puts " 3) Create an animal" | |
puts " 4) Create a client" | |
puts " 5) Adopt an animal" | |
puts " 6) Put an animal up for adoption" | |
puts " Q) Quit" | |
mode = gets.chomp.upcase | |
if mode == "1" || mode == "2" || mode == "3" || mode == "4" || mode == "5" || mode == "6" || mode == "Q" | |
valid_mode = true | |
display_banner | |
case mode | |
when "1" | |
animal_list(shelter) | |
when "2" | |
client_list(shelter) | |
when "3" | |
create_animal(shelter) | |
when "4" | |
create_client(shelter) | |
when "5" | |
if user == "Visitor" | |
puts "\n\tAs Visitor, you cannot adopt an animal, \n\tyou must create an account and log in." | |
else | |
adopt_an_animal(shelter, user) | |
end | |
when "6" | |
if user == "Visitor" | |
puts "\n\tAs Visitor, you cannot place an animal up for adoption, \n\tyou must create an account and log in." | |
else | |
put_animal_up_for_adoption(shelter, user) | |
end | |
when "Q" | |
quit | |
end # case mode | |
unless mode == "Q" | |
return_to_continue | |
main(shelter, user) unless mode == "Q" | |
end | |
else | |
puts "You didn't enter a valid selection, try again.\n\n" | |
end # if | |
end # while !valid_mode | |
end # def start_menu | |
# login menu | |
def login(shelter) | |
valid_mode = false | |
while !valid_mode | |
display_banner | |
puts "Select" | |
puts "1) Login" | |
puts "2) Create Client Account" | |
puts "Q) Quit" | |
mode = gets.chomp.upcase | |
if mode == "1" || mode == "2" || mode == "Q" | |
valid_mode = true | |
display_banner | |
case mode | |
when "1" | |
user = validate_client(shelter) | |
main(shelter, user) | |
when "2" | |
create_client(shelter) | |
client_list(shelter) | |
return_to_continue | |
login(shelter) | |
when "Q" | |
quit | |
else | |
login | |
end # case mode | |
else | |
puts "You didn't enter a valid selection, try again.\n\n" | |
end # if | |
end # while !valid_mode | |
end # def login | |
# initialize method, calls main | |
def init | |
# create the initial animals | |
# class Animal(name, age, gender, species, toys) | |
bootsie = Animal.new("Bootsie", 12, "female", "cat", ["roaches", "cane spiders", "geckos"]) | |
lani = Animal.new("Lani", 4, "female", "cat", ["fuzzy ball", "geckos"]) | |
thor = Animal.new("Thor", 8, "male", "dog", ["tennis ball", "apples"]) | |
lili = Animal.new("Lili", 4, "female", "cat", ["imaginary friend", "chair"]) | |
dexter = Animal.new("Dexter", 7, "male" ,"dog", ["chew toy", "stuffed animal"]) | |
# create the initial clients | |
# class Client(name, number_of_children, age, number_of_pets) | |
visitor = Client.new("Visitor", 0, 25) | |
bob = Client.new("Bob", 4, 76) | |
annie = Client.new("Annie", 0, 42) | |
adara = Client.new("Adara", 0, 16) | |
josh = Client.new("Josh", 0, 18) | |
# create the shelter with the initial animals and clients | |
animals = [bootsie, lani, thor, lili, dexter] | |
clients = [bob, annie, adara, josh,visitor] | |
shelter = Shelter.new(animals, clients) | |
# call login | |
login(shelter) | |
end | |
# Start the program with a call to "init" | |
init | |
# Instructions: | |
# Phase 1 | |
# Can create animals and clients | |
# Phase 2 | |
# New animals and clients can be added to the shelter | |
# Phase 3 | |
# When creating an animal or client, the user is prompted for information like names, gender etc. | |
# Phase 4 | |
# At start, the user is prompted with a menu of options: | |
# display all animals, display all clients, create an animal, create an client | |
# facilitate client adopts an animal, facilitate client puts an animal up for adoption | |
# After selecting from the menu the task the user is prompted through the entire process |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment