Contact Manager

contact manager graphic

Almost everyone these days has some type of contact set for managing the phone numbers and email addresses of friends, co-workers, and acquaintances. Some use Google contacts( contacts.google.com ), others use the contacts app on their phone, and some still even prefer old-fashioned paper-and-pencil organization.

In this assignment, you will implement a very simple contact organizer application in Python. You should write a program called contact_manager.py. Using this application, you will be able to request contact information, as well as add new contacts to the contact manager.

You are NOT allowed to use dictionaries or lists (with one exception). The exception is that you MAY use lists when it comes to reading in content from a file and splitting the lines, but you may not use them for storing the contacts for later access. Thus, you should use sets and tuples.

Specifically, I recommend storing the contacts in a set of tuples. The set will contain all of the contacts. Each contact will be represented by a tuple, and each tuple should contain exactly three values: name, email, and phone number. Your program should not allow a contact with the same name, email, and phone number to appear twice. Using a set can help you maintain this property of the contact list!

Reading from a file

The contacts should also be able to be loaded from a file called contacts.txt.

contacts.txt will have a file format that looks like the following:

Bill Jones | bjon@gmail.com | 520-999-8765
Sam Dekker | dekker@apple.com | 123-456-7890
Janet Keller | kel@yahoo.com | 456-2356
James Jamie | jjamie@gmail.com | 435-234-2334

The precise names, emails, and phone numbers may vary. Also, the number of contacts in the file may vary. You should not assume that the file has any particular number of contacts in it, but you can assume that the file exists. You can assume that the contacts.txt file is in the same directory as the program you are implementing (contact_manager.py).

When contact_manager.py begins, it should read in and save all of the contact names, emails, and phone numbers into the program. Since you won’t know how many contacts are in the file ahead-of-time, you should use a data structure to store the contacts.

Command Types

After optionally reading in all of the contacts from the contacts file, your program should repeatedly prompt the user to enter in commands. Your program should support three main types of commands.


Showing contacts

The user can enter a command of the form show contacts with A B, where A is either name, email, or phone, and B is the name or email or phone to search for. If the command that a user types begins with show contacts with, then you can assume that the A and B components exist. You should loop through the set of contacts and print out all of the ones where the name, email, or phone matches the search string.

Contacts should be reported with the following format:

C's contact info:
email: A
phone: B

However, you should replace C, A, and B with the actual name, email, and phone number. If there are no matching contacts, then print

None

Either way, after processing the command, the program should prompt the user for the next command afterward.

Adding a Contact

When add contact is typed, the program will continue to prompt the user for three additional values: The name, email, and number of the contact. Once it prompts the user for these three things, the program will add this new contact to the set of contact info that are stored in the program. Below is an example of what this should look like:

> add contact
name: X
email: Y
phone: Z
contact added!

This is what it would look like, but the X, Y, and Z values will be custom values entered by the user. Each time an add contact command is processed, a new contact should be added to the set. You do not need to validate that X, Y, and Z are any particular type of input.

Exit

If the user types exit (all lower case) then the program should print an exit message and end. For example:

> exit
Goodbye!

Extra Credit: saving

Complete the following feature for extra credit. When the user requests the program to exit, the program should save the contents of the contact set back into the contacts.txt file. This is important so that your program will remember all of the newly-added contacts when it runs again in the future.

If contacts were added via the add contact command, these must be saved into the contacts.txt file, using the format described earlier.

Other

If any other command is entered, your program should print Huh? and then prompt the user for another command.


I will be providing a lot of example runs/output on the diff-testing tool on the class website. You should take care to make sure that the output of your program very closely matches the example runs that I post. That will be the best way to make sure you are implementing the program correctly.

Diff-Testing

Several test-cases on the diff-testing tool on the class website. The text of each test will have multiple parts.

Note that for some of the test cases, the ordering of contacts does not need to match perfectly in some cases. This is because order is not guaranteed for elements in a set!

Submission and grading

It is due on 11/27/2018 at 7:00pm.

You should put all of your code in to a python file named contact_manager.py. Submit contact_manager.py on Gradescope.