Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Binary file added .DS_Store
Binary file not shown.
12 changes: 12 additions & 0 deletions Pipfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]
pytest = "*"

[requires]
python_version = "3.9"
Binary file added __pycache__/conftest.cpython-39-pytest-6.2.5.pyc
Binary file not shown.
3 changes: 3 additions & 0 deletions before_review.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Thank you for taking the time to review my work! I apologize if it took too much time to complete,
but I would just like to note that in order for the data to be read in correctly the code must be ran
from the main CashRegister directory, not one level deeper in the register directory. Thank you again!
Empty file added conftest.py
Empty file.
5 changes: 5 additions & 0 deletions input/data.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
3.33, 5.01
1.23, 4.00
0.78, 5.00
2.76, 3.00
0.01, 1.00
Empty file added register/__init__.py
Empty file.
Binary file added register/__pycache__/__init__.cpython-39.pyc
Binary file not shown.
Binary file added register/__pycache__/cash_register.cpython-39.pyc
Binary file not shown.
170 changes: 170 additions & 0 deletions register/cash_register.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
import csv
from decimal import Decimal
import random


DENOMINATIONS_VALUE = {'dollar': Decimal('1.00'),
'quarter': Decimal('0.25'),
'dime': Decimal('0.10'),
'nickel': Decimal('0.05'),
'penny': Decimal('0.01')}


def calculate_minimum_denominations(change):
dynamic_change = change
final_change = []
while dynamic_change >= DENOMINATIONS_VALUE['dollar']:
final_change.append('dollar')
dynamic_change = (dynamic_change - DENOMINATIONS_VALUE['dollar'])
while dynamic_change <= DENOMINATIONS_VALUE['dollar'] and dynamic_change > DENOMINATIONS_VALUE['quarter']:
final_change.append('quarter')
dynamic_change = (dynamic_change - DENOMINATIONS_VALUE['quarter'])
while dynamic_change <= DENOMINATIONS_VALUE['quarter'] and dynamic_change > DENOMINATIONS_VALUE['dime']:
final_change.append('dime')
dynamic_change = (dynamic_change - DENOMINATIONS_VALUE['dime'])
while dynamic_change <= DENOMINATIONS_VALUE['dime'] and dynamic_change > DENOMINATIONS_VALUE['nickel']:
final_change.append('nickel')
dynamic_change = (dynamic_change - DENOMINATIONS_VALUE['nickel'])
while dynamic_change <= DENOMINATIONS_VALUE['nickel'] and dynamic_change >= DENOMINATIONS_VALUE['penny']:
final_change.append('penny')
dynamic_change = dynamic_change - DENOMINATIONS_VALUE['penny']
return final_change


def calculate_random_denominations(change):
denoms = ['dollar', 'quarter', 'dime', 'nickel', 'penny']
#print(type(change))
dynamic_change = change
final_change = []
while dynamic_change > Decimal('0.00'):
if dynamic_change >= DENOMINATIONS_VALUE['dollar']:
random_denom = random.choice(denoms)
final_change.append(random_denom)
dynamic_change = (dynamic_change - DENOMINATIONS_VALUE[random_denom])
elif dynamic_change >= DENOMINATIONS_VALUE['quarter'] and dynamic_change < DENOMINATIONS_VALUE['dollar']:
exception = ['dollar']
random_denom = random.choice([denom for denom in denoms if denom not in exception])
final_change.append(random_denom)
dynamic_change = (dynamic_change - DENOMINATIONS_VALUE[random_denom])
elif dynamic_change >= DENOMINATIONS_VALUE['dime'] and dynamic_change < DENOMINATIONS_VALUE['quarter']:
exception = ['dollar', 'quarter']
random_denom = random.choice([denom for denom in denoms if denom not in exception])
final_change.append(random_denom)
dynamic_change = (dynamic_change - DENOMINATIONS_VALUE[random_denom])
elif dynamic_change >= DENOMINATIONS_VALUE['nickel'] and dynamic_change < DENOMINATIONS_VALUE['dime']:
exception = ['dollar', 'quarter', 'dime']
random_denom = random.choice([denom for denom in denoms if denom not in exception])
final_change.append(random_denom)
dynamic_change = (dynamic_change - DENOMINATIONS_VALUE[random_denom])
elif dynamic_change >= DENOMINATIONS_VALUE['penny'] and dynamic_change < DENOMINATIONS_VALUE['nickel']:
final_change.append(DENOMINATIONS_VALUE['penny'])
dynamic_change = (dynamic_change - DENOMINATIONS_VALUE['penny'])
else:
pass
return final_change


def sum_final_change(final_change, DENOMINATIONS_):
for denomination in final_change:
if denomination == 'dollar':
DENOMINATIONS_['dollar'] += 1
elif denomination == 'quarter':
DENOMINATIONS_['quarter'] += 1
elif denomination == 'dime':
DENOMINATIONS_['dime'] += 1
elif denomination == 'nickel':
DENOMINATIONS_['nickel'] += 1
else:
DENOMINATIONS_['penny'] += 1
return DENOMINATIONS_


def final_change_output(change_dict):
final_change_str = ""
change_copy = {**change_dict}
for denom in change_copy:
if change_copy['dollar'] > 0:
if change_copy[denom] == 1:
final_change_str = final_change_str + "1 dollar, "
change_copy[denom] = 0
elif change_copy[denom] > 1:
final_change_str = final_change_str + f"{change_copy['dollar']} dollars, "
change_copy[denom] = 0
if change_copy['quarter'] > 0:
if change_copy[denom] == 1:
final_change_str = final_change_str + "1 quarter, "
change_copy[denom] = 0
elif change_copy[denom] > 1:
final_change_str = final_change_str + f"{change_copy['quarter']} quarters, "
change_copy[denom] = 0
if change_copy['dime'] > 0:
if change_copy[denom] == 1:
final_change_str = final_change_str + "1 dime, "
change_copy[denom] = 0
elif change_copy[denom] > 1:
final_change_str = final_change_str + f"{change_copy['dime']} dimes, "
change_copy[denom] = 0
if change_copy['nickel'] > 0:
if change_copy[denom] == 1:
final_change_str = final_change_str + "1 nickel, "
change_copy[denom] = 0
elif change_copy[denom] > 1:
final_change_str = final_change_str + f"{change_copy['nickel']} nickels, "
change_copy[denom] = 0
if change_copy['penny'] > 0:
if change_copy[denom] == 1:
final_change_str = final_change_str + "1 penny, "
change_copy[denom] = 0
elif change_copy[denom] > 1:
final_change_str = final_change_str + f"{change_copy['penny']} pennies, "
change_copy[denom] = 0
return final_change_str


def main():
print()
print()
print("Thank you for using Creative Cash Draw Solutions Cash Register System!")
print()
print("In the data.csv file, please enter the price of the item being purchased")
print()
print("followed by the amount of money paid, separated by a comma. You may use the")
print()
print("data already in the file as a guide to input your own data, or leave it as it is.")
print()
print("After adding data, please rerun this file in order to get up to date results.")
print()
print("The data being displayed currently is the data that was in the data.csv file before runtime.")
print()
print()
print()
file = csv.reader(open('input/data.csv'), delimiter = ',')
for line in file:
(total, paid) = line
total = Decimal(total)
paid = Decimal(paid)
change = paid - total
rem = change % Decimal('.03')
DENOMINATIONS_ = {'dollar': 0,
'quarter': 0,
'dime': 0,
'nickel': 0,
'penny': 0}

if rem != Decimal('0.00'):
change = calculate_minimum_denominations(change)
change = sum_final_change(change, DENOMINATIONS_)
change = final_change_output(change)
print(change)
print()
else:
change = calculate_random_denominations(change)
change = sum_final_change(change, DENOMINATIONS_)
change = final_change_output(change)
print(change)
print()
DENOMINATIONS_ = DENOMINATIONS_.fromkeys(DENOMINATIONS_, 0)


if __name__ == "__main__":
main()
Empty file added tests/__innit__.py
Empty file.
Binary file not shown.
Binary file not shown.
71 changes: 71 additions & 0 deletions tests/test_cash_register.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import os, pytest, sys
from decimal import Decimal

myPath = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, myPath + '/../')

from register import cash_register

#two complete, add more
def test_sum_final_change_return_type():
DENOMINATIONS_ = {'dollar': 0,
'quarter': 0,
'dime': 0,
'nickel': 0,
'penny': 0}
change = ['quarter', 'dime', 'penny']
final_change = cash_register.sum_final_change(change, DENOMINATIONS_)
assert type(final_change) is dict


def test_sum_final_change_empty_input():
DENOMINATIONS_ = {'dollar': 0,
'quarter': 0,
'dime': 0,
'nickel': 0,
'penny': 0}
change = ['quarter', 'dime', 'penny']
final_change = cash_register.sum_final_change(change, DENOMINATIONS_)
assert DENOMINATIONS_['quarter'] == 1


def test_calculate_minimum_denominations_change_is_decimal():
change = 0.01
with pytest.raises(TypeError):
cash_register.calculate_minimum_denominations(change)


def test_calculate_minimum_denominations_return_not_empty():
change = Decimal('1.11')
change = cash_register.calculate_minimum_denominations(change)
assert print(len(change)) != 0


def test_calculate_random_denominations_change_is_decimal():
change = 0.01
with pytest.raises(TypeError):
cash_register.calculate_random_denominations(change)


def test_calculate_random_denominations_return_not_empty():
change = Decimal('1.11')
change = cash_register.calculate_minimum_denominations(change)
assert print(len(change)) != 0


def test_final_change_output_return_str():
change = {'dollar': 0, 'quarter': 4, 'dime': 4, 'nickel': 4, 'penny': 8}
output = cash_register.final_change_output(change)
assert type(output) is str


def test_final_change_input_dict():
change = ['sting1', 'string2', 'string3']
with pytest.raises(TypeError):
cash_register.final_change_output(change)


def test_final_change_output_not_empty():
change = {'dollar': 0, 'quarter': 4, 'dime': 4, 'nickel': 4, 'penny': 8}
output = cash_register.final_change_output(change)
assert len(output) > 0
5 changes: 5 additions & 0 deletions tests/test_data.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
4.89,10.00
3.33,10.00
2.66,5.00
2.64,5.00
abcd,efgh