I’m not sure how to tell the exact difference between my output and the test modules output. I would like to be able to see where its outputting spaces and newlines, because maybe then I could just fix it.
I’m only missing the last test, for the create_spend_chart, so…
Heres my code:
class Category:
multi_ledger = []
def __init__(self, name):
self.name = name
self.balance = 0
self.ledger = []
@classmethod
def percent_spent(cls):
percents = []
total = 0
for spot in Category.multi_ledger:
total += spot['amount']
count = 0
for spot in Category.multi_ledger:
percents.append((spot['amount'] / total) * 100)
count += 1
return Category.multi_ledger
def __repr__(self):
title = f"{self.name:*^30}\n"
lines = ""
total = f"Total: {self.balance}"
for x in self.ledger:
line = f"{x['description']:<23.23}" + f"{x['amount']:>7.2f}" + "\n"
lines += line
output = title + lines + total
return output
def deposit(self, amount, description=""):
self.ledger.append({"amount": amount, "description": description})
self.balance = self.get_balance()
def withdraw(self, amount, description=""):
if(self.check_funds(amount)) == True:
self.ledger.append({"amount": -amount, "description": description})
Category.multi_ledger.append({"name": self.name.lower() ,"amount": -amount, "description": description})
self.balance = self.get_balance()
return True
else:
return False
def get_balance(self):
bal = 0
for items in self.ledger:
bal += items['amount']
return bal
def transfer(self, amount, cat):
if(self.check_funds(amount)) == True:
self.withdraw(amount, f"Transfer to {cat.name}")
cat.deposit(amount, f"Transfer from {self.name}")
return True
else:
return False
def check_funds(self, amount):
if self.get_balance() >= amount:
return True
else:
return False
food = Category("Food")
entertainment = Category("Entertainment")
business = Category("Business")
food.deposit(900, "deposit")
entertainment.deposit(900, "deposit")
business.deposit(900, "deposit")
food.withdraw(105.55)
entertainment.withdraw(33.40)
business.withdraw(10.99)
print("Percentage spent by category\n100| \n 90| \n 80| \n 70| o \n 60| o \n 50| o \n 40| o \n 30| o \n 20| o o \n 10| o o \n 0| o o o \n ----------\n B F E \n u o n \n s o t \n i d e \n n r \n e t \n s a \n s i \n n \n m \n e \n n \n t ")
def create_spend_chart(categories):
percents = []
str_cats = []
cats = []
for cat in categories:
str_cats.append(cat.name.lower())
for ledger in Category.multi_ledger:
for cat in str_cats:
if cat in ledger['name']:
cats.append(ledger)
arrange = []
count= 0
for key, val in enumerate(str_cats):
for key2, val2 in enumerate(cats):
if val2['name'] in val:
arrange.append(val2)
cats = arrange
total = 0
for cat in cats:
total += cat['amount']
for cat in cats:
percents.append((cat['amount'] / total) * 100)
height = len(max(str_cats, key = len))
width = 5 + (3 * len(str_cats))
title = "Percentage spent by category\n"
bars = ""
count= 0
countdown = 100
while countdown >= 0:
bars += f"{countdown: >3}| "
for p in percents:
if p > countdown:
bars += "o "
else:
bars += " "
countdown -= 10
count += 1
if countdown > -1: bars += "\n"
dashes = " -" + f"{'-'*3 * len(cats)}"
downcats = ""
count = 0
while count <= height-1:
downcats += " "
for cat in str_cats:
try:
if count == 0:
downcats += f"{cat[count]} ".upper()
else:
downcats += f"{cat[count]} "
except:
downcats += " "
if count < height -1:
downcats += "\n"
count += 1
output = f"{title}{bars}\n{dashes}\n{downcats}"
return output
print(create_spend_chart([business, food, entertainment]))
Please help me, oh brialiant internet people. XD