Build a Budget App Project - Build a Budget App Project

Tell us what’s happening:

I cannot pass the last test which is about the chart and I cannot use my browser console to see what is wrong as my laptop broke and currently doing the project on my ipad. Can somebody help??

Your code so far


class Category:
    def __init__(self, name):
        self.name = name
        self.ledger = []
        self.balance = 0
    def deposit(self, amount, description = ''):
        space = 26 + len(self.name[:23]) - len(description[:23]) - len(str(amount)) - 3        
        #self.ledger.append(f'{description}{" " * space}{amount:>7.2f}')
        self.ledger.append({'amount': amount, 'description': description})
        self.balance += amount
    def withdraw(self, amount2, description2 = ''):
        self.balance -= amount2
        space2 = 26 + len(self.name[:23]) - len(description2[:23]) - len(str(amount2)) - 2
        if self.balance >= 0:
            #self.ledger.append(f'\n{description2[:23]}{" " * space2}{0 - amount2:>7.2f}')
            self.ledger.append({'amount': 0 - amount2, 'description': description2})
            return True
        return False
    def get_balance(self):
        return self.balance
    def transfer(self, amount3, category_name):
        self.balance -= amount3
        if self.balance >= 0:
            self.ledger.append({'amount': 0 - amount3, 'description': f'Transfer to {category_name.name}'})
            category_name.deposit(amount3, f'Transfer from {self.name}')
            return True
        return False
    def check_funds(self, amount4):
        if amount4 > self.balance:
            return False
        elif amount4 <= self.balance:
            return True
    def __str__(self):
        space3 = round((30 - len(self.name)) / 2)
        
        #return f'{"*" * space3}{self.name}{"*" * space3}\n{"".join(self.ledger)}\nTotal: {self.balance:>7.2f}'
        #print(len(self.ledger))
        result = f'{"*" * space3}{self.name}{"*" * space3}\n'
        for i in range(0, len(self.ledger)):
            formatted = f'{self.ledger[i]["amount"]:>7.2f}'
            space4 = 30 - len(formatted) - len(self.ledger[i]['description'][:23])
            #print(self.ledger[i]['description'])
            #print(formatted)
            result += f'{self.ledger[i]["description"][:23]}{" " * space4}{self.ledger[i]["amount"]:>7.2f}\n'
        result += f'Total: {self.balance:>.2f}'
        return result

def create_spend_chart(categories):
    #print('function called with:',categories)
    #if isinstance(categories, list):
        #print('yes')
        #print(''.join(categories))
        
        category_names = [category.name for category in categories]
        #print(category_names)

        string = f'Percentage spent by category'
        string += f'\n'
        list2 = []
        list3 = []
        for k in range(0,len(category_names),1):
            #print(k)
            collect_minus = [a['amount'] for a in categories[k].ledger if a['amount'] < 0]
            sum_of_it = sum(collect_minus)
            list2.append(sum_of_it)
            list3.append(sum_of_it)
        list2 = sum(list2)
        #print(list2)
        list3 = [int((a / list2 * 100)) for a in list3]
        #print('list3:',list3)
        range1 = range(100,-1,-10)
        range2 = range(0,len(list3),1)
        list4 = []
        #for j in range2:
        for i in range1:
            if len(list3) == 1:
                value2 = ' o' if list3[0] >= i else ''
                value3 = ''
                value4 = ''
                value5 = ''
            elif len(list3) == 2:
                value2 = ' o' if list3[0] >= i else ''
                value3 = ' o' if list3[1] >= i else ''
                value4 = ''
                value5 = ''
            elif len(list3) == 3:
                value2 = ' o' if list3[0] >= i else ''
                value3 = ' o' if list3[1] >= i else '  '
                value4 = ' o' if list3[2] >= i else ' '
                value5 = ''
            else:
                value2 = ' o' if list3[0] >= i else ''
                value3 = ' o' if list3[1] >= i else '  '
                value4 = ' o' if list3[2] >= i else '    '
                value5 = ' o' if list3[3] >= i else ''

                #you do not need the outer for loop? there is no 'j' used
            string += f'{" " * (4 - len(str(i)) - 1)}{i}|{value2} {value3} {value4} {value5}\n'
        string += f'    {"-" * (len(list3) * 3 + 1)}\n'
        #print(category_names)
        list5 = []
        for i in range2:
            abc = ''.join(category_names[i])
            
            defg = '     '.join(abc)
        category_names1 = ['\n'.join(word) for word in category_names]
        sum_of_it2 = sum([len(a) for a in category_names])
        #print(sum_of_it2)
        for i in range(sum_of_it2):
            joining = ''.join(category_names)
            for j in range(len(joining)):
                #print(j)
                joining2 = '\n'.join(joining[j])
                #string += f'{joining2}'
                if j == len(category_names[0]) - 1 or j == sum_of_it2 - 1:
                    make_space = '   '
        max_1 = max([len(i) for i in category_names])
        #print('a',range2)
        if len(category_names) == 1:
            name = category_names[0].ljust(len(category_names[0]))
            for i in range(len(category_names[0])):
                string += f'     {name[i]}\n'
        elif len(category_names) == 2:
            max_name_length = max(len(category_names[0]), len(category_names[1]))
            name1 = category_names[0].ljust(max_name_length)
            name2 = category_names[1].ljust(max_name_length)
            #print(name1, name2)
            for i in range(max_name_length):
                string += f'     {name1[i]}  {name2[i]}\n'
        elif len(category_names) == 3:
            max_name_length2 = max(len(category_names[0]), len(category_names[1]), len(category_names[2]))
            name1 = category_names[0].ljust(max_name_length2)
            name2 = category_names[1].ljust(max_name_length2)
            name3 = category_names[2].ljust(max_name_length2)
            for i in range(max_name_length2):
                string += f'     {name1[i]}  {name2[i]}  {name3[i]}\n'
        elif len(category_names) == 4:
            max_length3 = max(len(category_names[0]), len(category_names[1]), len(category_names[2]), len(category_names[3]))
            name1 = category_names[0].ljust(max_length3)
            name2 = category_names[1].ljust(max_length3)
            name3 = category_names[2].ljust(max_length3)
            name4 = category_names[3].ljust(max_length3)
            for i in range(max_length3):
                string += f'     {name1[i]}  {name2[i]}  {name3[i]}  {name4[i]}\n'

        return string

#fix the ledger so you can append with the value with object
food = Category('Food')
food.deposit(1000, 'deposit')
food.withdraw(10.15, 'groceries')
food.withdraw(15.89, 'restaurant and more food for dessert')

clothing = Category('Clothing')
food.transfer(50, clothing)
clothing.withdraw(23.21, 'bought a shirt')

shoes = Category('Shoes')
food.transfer(80, shoes)
shoes.withdraw(78.51, 'bought a pair of shoes')

emergency = Category('Emergency')
food.transfer(50, emergency)
emergency.withdraw(25, 'medical insurance')

print(food)
print(clothing)
print(shoes)
print(emergency)
print(create_spend_chart([food, clothing, ]))
#print(create_spend_chart(food))

Your browser information:

User Agent is: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15

Challenge Information:

Build a Budget App Project - Build a Budget App Project

Hi @ayato_oz

Here is an output

batched @ pyodide.asm.js:9
pyodide.asm.js:9  ======================================================================
batched @ pyodide.asm.js:9
pyodide.asm.js:9  FAIL: test_create_spend_chart (test_module.UnitTests.test_create_spend_chart)
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ----------------------------------------------------------------------
batched @ pyodide.asm.js:9
pyodide.asm.js:9  Traceback (most recent call last):
batched @ pyodide.asm.js:9
pyodide.asm.js:9    File "/home/pyodide/test_module.py", line 23, in test_create_spend_chart
batched @ pyodide.asm.js:9
pyodide.asm.js:9      self.assertEqual(actual, expected, 'Expected different chart representation. Check that all spacing is exact.')
batched @ pyodide.asm.js:9
pyodide.asm.js:9  AssertionError: 'Perc[31 chars]     \n 90|      \n 80|      \n 70|  o   \n 60[280 chars] t\n' != 'Perc[31 chars]         \n 90|          \n 80|          \n 70[343 chars] t  '
batched @ pyodide.asm.js:9
pyodide.asm.js:9    Percentage spent by category
batched @ pyodide.asm.js:9
pyodide.asm.js:9  - 100|      
batched @ pyodide.asm.js:9
pyodide.asm.js:9  + 100|          
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?           ++++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -  90|      
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +  90|          
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?           ++++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -  80|      
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +  80|          
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?           ++++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -  70|  o   
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +  70|    o     
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?       ++    ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -  60|  o   
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +  60|    o     
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?       ++    ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -  50|  o   
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +  50|    o     
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?       ++    ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -  40|  o   
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +  40|    o     
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?       ++    ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -  30|  o   
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +  30|    o     
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?       ++    ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -  20|  o  o 
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +  20|    o  o  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?       ++     +
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -  10|  o  o 
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +  10|    o  o  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?       ++     +
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -   0| o  o  o 
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +   0| o  o  o  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?              +
batched @ pyodide.asm.js:9
pyodide.asm.js:9        ----------
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -      B  F  E
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +      B  F  E  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -      u  o  n
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +      u  o  n  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -      s  o  t
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +      s  o  t  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -      i  d  e
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +      i  d  e  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -      n     r
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +      n     r  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -      e     t
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +      e     t  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -      s     a
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +      s     a  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -      s     i
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +      s     i  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -            n
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +            n  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -            m
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +            m  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -            e
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +            e  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -            n
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +            n  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ++
batched @ pyodide.asm.js:9
pyodide.asm.js:9  -            t
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ?             ^
batched @ pyodide.asm.js:9
pyodide.asm.js:9  +            t  ?             ^^
batched @ pyodide.asm.js:9
pyodide.asm.js:9   : Expected different chart representation. Check that all spacing is exact.
batched @ pyodide.asm.js:9
pyodide.asm.js:9  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  ----------------------------------------------------------------------
batched @ pyodide.asm.js:9
pyodide.asm.js:9  Ran 1 test in 0.098s
batched @ pyodide.asm.js:9
pyodide.asm.js:9  
batched @ pyodide.asm.js:9
pyodide.asm.js:9  FAILED (failures=1)
batched @ pyodide.asm.js:9

Happy coding

Thank you for the output.
Could you teach me where to fix from the result? I don’t know where to look at…

AssertionError: 'Perc[31 chars]     \n 90|      \n 80|      \n 70|  o   \n 60[280 chars] t\n' 
             != 'Perc[31 chars]         \n 90|          \n 80|          \n 70[343 chars] t  '

remember the first one is yours. You are missing spaces everywhere. The final string should be a rectangle using the spaces