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
depositque 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 à listaledgerna forma de{'amount': amount, 'description': description}. - Um método
withdrawque aceita um valor e uma descrição opcional (padrão para uma string vazia). O método deve armazenar emledgero valor passado como um número negativo, e deve retornarTruese a retirada for bem-sucedida eFalsecaso contrário. - Um método
get_balanceque retorna o saldo atual da categoria com base emledger. - Um método
transferque aceita um valor e outra instância deCategory, retira o valor com a descriçãoTransfer to [Destination], deposita na outra categoria com a descriçãoTransfer from [Source], onde[Destination]e[Source]devem ser substituídos pelos nomes das categorias de destino e origem. O método deve retornarTruequando a transferência for bem-sucedida eFalsecaso contrário. - Um método
check_fundsque aceita um valor e retornaFalsese ele exceder o saldo ouTruecaso contrário. Este método deve ser usado tanto pelos métodoswithdrawetransfer.
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
ledgercom 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.
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
100até0em passos de 10. - Use os caracteres
opara as barras. - Inclua uma linha horizontal dois espaços além da última barra.
- Escreva os nomes das categorias verticalmente abaixo da barra.
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