Instruções

Construir um app de orçamento

Neste laboratório, você construirá um aplicativo simples de orçamento que rastreia os gastos em diferentes categorias e pode mostrar a porcentagem relativa de gastos em um gráfico. Objetivo: Cumprir as user stories abaixo e fazer todos os testes passarem para completar o laboratório. Histórias de Usuário: 1. Você deve ter uma classe Category que aceita um nome como argumento. 1. A classe Category deve ter um atributo de instância ledger que seja uma lista, e contenha a lista de transações. 1. A classe Category deve ter os seguintes métodos:
  • Um método deposit que aceita um valor e uma descrição opcional. Se nenhuma descrição for fornecida, deve ser usada uma string vazia por padrão. O método deve adicionar um objeto à lista ledger na forma de {'amount': amount, 'description': description}.
  • Um método withdraw que aceita um valor e uma descrição opcional (padrão para uma string vazia). O método deve armazenar em ledger o valor passado como um número negativo, e deve retornar True se a retirada for bem-sucedida e False caso contrário.
  • Um método get_balance que retorna o saldo atual da categoria com base em ledger.
  • Um método transfer que aceita um valor e outra instância de Category, retira o valor com a descrição Transfer to [Destination], deposita na outra categoria com a descrição Transfer from [Source], onde [Destination] e [Source] devem ser substituídos pelos nomes das categorias de destino e origem. O método deve retornar True quando a transferência for bem-sucedida e False caso contrário.
  • Um método check_funds que aceita um valor e retorna False se ele exceder o saldo ou True caso contrário. Este método deve ser usado tanto pelos métodos withdraw e transfer.
1. Quando um objeto Category for impresso, ele deve:
  • Exibir uma linha de título de 30 caracteres com o nome da categoria centralizado entre os caracteres *.
  • Listar cada entrada do ledger com até 23 caracteres da sua descrição alinhados à esquerda e o valor alinhado à direita (duas casas decimais, máximo de 7 caracteres).
  • Mostrar uma linha final Total: [balance], onde [balance] deve ser substituído pelo total da categoria.
Aqui está um exemplo de uso:
food = Category('Food')
   food.deposit(1000, 'initial deposit')
   food.withdraw(10.15, 'groceries')
   food.withdraw(15.89, 'restaurant and more food for dessert')
   clothing = Category('Clothing')
   food.transfer(50, clothing)
   print(food)
E aqui está um exemplo da saída:
*Food*
   initial deposit        1000.00
   groceries               -10.15
   restaurant and more foo -15.89
   Transfer to Clothing    -50.00
   Total: 923.96
1. Você deve ter uma função fora da classe Category chamada create_spend_chart(categories) que recebe uma lista de categorias e retorna uma string de gráfico de barras. Para construir o gráfico:
  • Comece com o título Percentage spent by category.
  • Calcule porcentagens apenas dos saques e não dos depósitos. A porcentagem deve ser a porcentagem do valor gasto para cada categoria em relação ao total gasto em todas as categorias (arredondado para baixo para o múltiplo de 10 mais próximo).
  • Rotule o eixo y de 100 até 0 em passos de 10.
  • Use os caracteres o para as barras.
  • Inclua uma linha horizontal dois espaços além da última barra.
  • Escreva os nomes das categorias verticalmente abaixo da barra.
Esta função será testada com até quatro categorias. Certifique-se de que o espaçamento da saída do exemplo seja exatamente igual:
Percentage spent by category
   100|          
    90|          
    80|          
    70|          
    60| o        
    50| o        
    40| o        
    30| o        
    20| o  o     
    10| o  o  o  
     0| o  o  o  
       ----------
        F  C  A  
        o  l  u  
        o  o  t  
        d  t  o  
           h     
           i     
           n     
           g
NOTA: abra o console do navegador com F12 para ver uma saída mais detalhada dos testes.

O que fazer:

Testes:

  • O método `deposit` deve criar um objeto específico na variável de instância do livro-razão.
  • Chamar o método `deposit` sem descrição deve criar uma descrição em branco.
  • O método `withdraw` deve criar um objeto específico na variável de instância `ledger`.
  • Chamar o método `withdraw` sem descrição deve criar uma descrição em branco.
  • O método `withdraw` deve retornar `True` se a retirada ocorreu.
  • Chamar `food.deposit(900, 'deposit')` e `food.withdraw(45.67, 'milk, cereal, eggs, bacon, bread')` deve retornar um saldo de `854.33`.
  • Chamar o método `transfer` em um objeto de categoria deve criar um item específico no razão contábil desse objeto de categoria.
  • O método `transfer` deve retornar `True` se a transferência ocorreu.
  • Chamar `transfer` em um objeto de categoria deve reduzir o saldo no objeto de categoria.
  • O método `transfer` deve aumentar o saldo do objeto categoria passado como seu argumento.
  • O método `transfer` deve criar um item específico no livro-razão no objeto de categoria passado como seu argumento.
  • O método `check_funds` deve retornar `False` se o valor passado para o método for maior que o saldo da categoria.
  • O método `check_funds` deve retornar `True` se o valor passado para o método não for maior que o saldo da categoria.
  • O método `withdraw` deve retornar `False` se a retirada não ocorreu.
  • O método `transfer` deve retornar `False` se a transferência não ocorreu.
  • Imprimir uma instância de `Category` deve fornecer uma representação em string diferente do objeto.
  • O título no topo do gráfico `create_spend_chart` deve dizer `Percentage spent by category`.
  • O gráfico `create_spend_chart` deve ter as porcentagens corretas ao longo do lado esquerdo.
  • A altura de cada barra no gráfico `create_spend_chart` deve ser arredondada para baixo até o múltiplo de 10 mais próximo.
  • Cada linha no gráfico `create_spend_chart` deve ter o mesmo comprimento. Barras para diferentes categorias devem ser separadas por dois espaços, com mais dois espaços após a barra final.
  • `create_spend_chart` deve mostrar corretamente a linha horizontal abaixo das barras. Usando três caracteres `-` para cada categoria, e no total ultrapassando em dois caracteres a barra final.
  • `create_spend_chart` gráfico não deve ter caractere de nova linha no final.
  • O gráfico `create_spend_chart` deve ter o nome de cada categoria escrito verticalmente abaixo da barra. Cada linha deve ter o mesmo comprimento, cada categoria deve ser separada por dois espaços, com mais dois espaços após a categoria final.
  • `create_spend_chart` deve imprimir uma representação diferente do gráfico. Verifique se todos os espaçamentos estão exatos. Abra o console do seu navegador com F12 para mais detalhes.

Preview