In this project, we have created a console app that will help one to keep a record of different types of things he/she wins: books, music albums, movies, and games. Everything will be based on the UML class diagram presented below. The data is stored in JSON files and contains a database that has tables structure that is analogical to the program's class structure.
- Each class from the [UML class diagram](./assets/catalog_of_my_things.png) should be created in a separate .rb file.
- All associations (1-to-many relationships) and aggregations (parent-child relationships) between classes should be implemented.
- All properties visible in the diagram should be defined and set up in the constructor method. _Exception: properties for the 1-to-many relationships should NOT be set in the constructor method. Instead, they should have a custom setter method created._
- All methods visible in the diagram should be implemented:
- add_item method (in all classes that have that method)
- should take an instance of the Item class as an input.
- should add the input item to the collection of items.
- should add self as a property of the item object (by using the correct setter from the item object).
- can_be_archived?() in the Item class
- should return true if published_date is older than 10 years.
- otherwise, it should return false.
- move_to_archive() in the Item class
- should reuse can_be_archived?() method.
- should change the archived property to true if the result of the can_be_archived?() method is true.
- should do nothing if the result of the can_be_archived?() method is false.
- can_be_archived?() in the Book class
- should override the method from the parent class.
- should return true if parent's method returns true OR if cover_state equals to "bad".
- otherwise, it should return false.
- can_be_archived?() in the MusicAlbum class
- should override the method from the parent class.
- should return true if parent's method returns true AND if on_spotify equals true.
- otherwise, it should return false.
- can_be_archived?() in the Movie class
- should override the method from the parent class.
- should return true if parent's method returns true OR if silent equals true.
- otherwise, it should return false.
- can_be_archived?() in the Game class
- should override the method from the parent class.
- should return true if parent's method returns true AND if last_played_at is older than 2 years.
- otherwise, it should return false.
- Add unit tests for all implemented methods.
- Create a main.rb file that will serve as your console app entry-point.
- Your console app, at the start, should:
- Present the user with a list of options to perform.
- Let users choose an option.
- If needed, ask for parameters for the option.
- Have a way to quit the app.
- The following options should be available:
- List all books
- List all music albums
- List all movies
- List of games
- List all genres (e.g 'Comedy', 'Thriller')
- List all labels (e.g. 'Gift', 'New')
- List all authors (e.g. 'Stephen King')
- List all sources (e.g. 'From a friend', 'Online shop')
- Add a book
- Add a music album
- Add a movie
- Add a game
- All data should be preserved by saving collections in .json files.
To run the project, you need to install Ruby and the gems necessary to run the project.
$ gem install bundler
$ bundle install
You can get a copy of the project from GitHub.
Ali Jendoubi
Joy Kwamboka
Mandela T
Contributions, issues, and feature requests are welcome!
Feel free to check the issues page.
Give a if you like this project!
This project is MIT licensed.