This Ruby code simmulates a checkout register at a grocery store.
The objective of this project is to showcase my design and implementation of production quality code as a member of your development team.
The Farmer’s Market
We sell the following four products at the local farmer’s market every week.
+--------------|--------------|---------+
| Product Code | Name | Price |
+--------------|--------------|---------+
| CH1 | Chai | $3.11 |
| AP1 | Apples | $6.00 |
| CF1 | Coffee | $11.23 |
| MK1 | Milk | $4.75 |
| OM1 | Oatmeal | $3.69 |
+--------------|--------------|---------+
This week, we’re celebrating our one year anniversary and would like to offer the following specials. To do so, we’ll need to update our checkout system to apply the following rules.
- BOGO -- Buy-One-Get-One-Free Special on Coffee. (Unlimited)
- APPL -- If you buy 3 or more bags of Apples, the price drops to $4.50.
- CHMK -- Purchase a box of Chai and get milk free. (Limit 1)
- APOM -- Purchase a bag of Oatmeal and get 50% off a bag of Apples
At any time, we should be able to print out the current register to see what the state of the basket is. This should include the price and the applied discount or special, if any.
For example, given the following basket:
CH1, AP1, AP1, AP1, MK1
After CH1 and AP1, it should yield:
Item Price
---- -----
CH1 3.11
AP1 6.00
-----------------------------------
9.11
After the entire basket is added, it would yield:
Item Price
---- -----
CH1 3.11
AP1 6.00
APPL -1.50
AP1 6.00
APPL -1.50
AP1 6.00
APPl -1.50
MK1 4.75
CHMK -4.75
-----------------------------------
16.61
Use Python, Ruby, Javascript, or Golang to implement a checkout system that allows us to fulfill the above requirements. Submit the code via a Dockerfile which builds a Docker container to run the code sample in. A readme should be included which describes how to execute the code. The source code needs to be publicly accessible for code review.
Here’s some test data for your specs:
Basket: CH1, AP1, CF1, MK1
Total price expected: $20.34
Basket: MK1, AP1
Total price expected: $10.75
Basket: CF1, CF1
Total price expected: $11.23
Basket: AP1, AP1, CH1, AP1
Total price expected: $16.61
The scope of this project is meant to be fairly narrow, but there are a lot of details to consider. We’re looking for the following things when reviewing your code:
- Design
- Testing
- Accuracy
- Flexibility
- Containerization
The below Class Diagrams describes all the implemented classes and their relationships.
There are 2 ways to try out the code sample with Docker or without Docker.
Note: This code was tested with Ruby 2.4.5 and 2.6.5
Install Docker if you don't have it yet.
git clone git://github.com/developertogo/yacs-checkout.git
cd yacs-checkout
docker build -t developertogo/yacs-checkout .
docker run -it --rm developertogo/yacs-checkout
Install Ruby, and bundler
if you don't have it already, as follows: gem install bundle
.
git clone git://github.com/developertogo/yacs-checkout.git
cd yacs-checkout
bundle install
ruby yacs_register.rb
Simply run:
$ rspec