Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Maria de Fatima - Semana08 #26

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
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
13 changes: 13 additions & 0 deletions Biblioteca.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from Livro import Livro
class Biblioteca :
def __init__(self):

self.livros = []

def adicionar_livro(self, livro: Livro):
if(not isinstance (livro, Livro)): #funçao de atribuição - #not= não é do tipo livro dará um erro...
raise TypeError(f"Esperado Livro obtido valor {livro} do tipo {type(livro)}")
self.livros.append(livro)

def exibir_livro(self,livro_auto_ajuda, livro_como_ficar_milionario):

8 changes: 8 additions & 0 deletions Livro.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class Livro:
def __init__(self, nome, autor, ano): # propriedade

self.nome = nome
self.autor = autor
self.esta_emprestado = False


83 changes: 33 additions & 50 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,50 +1,33 @@
<h1 align="center">
<img src="assets/reprograma-fundos-claros.png" alt="logo reprograma" width="500">
</h1>

# Projeto guiado #2

Turma Online ON26 | back-end | Semana 08 | 2023 | Professora [Mayara Ferreira](https://github.com/mayaracsferreira)

### Requisitos
- Python3
- Pip
- Git
- Visual Studio Code ou alguma outra IDE

### Instruções
Antes de começar, vamos organizar nosso setup.
* Fork esse repositório
* Clone o fork na sua máquina (Para isso basta abrir o seu terminal e digitar `git clone https://github.com/reprograma/on26-python-s08-projeto-guiado-II`)
* Entre na pasta do seu repositório (Para isso basta abrir o seu terminal e digitar `cd on26-python-s08-projeto-guiado-II`)

### Resumo
O que veremos na aula de hoje?
* [Projeto Guiado II](#TDD)

## Conteúdo
### Projeto Guiado II - TDD
Projeto guiado visando colocar em prática os conceitos vistos no módulo: Orientação a Objetos e Testes.

Criar um sistema de gerenciamento de biblioteca usando TDD com as funcionalidades:
- Adicionar livros
- Listar livros
- Emprestar livros

***
### Exercícios
* [Exercicio para sala](https://github.com/reprograma/on26-python-s08-projeto-guiado-II/tree/main/exercicios/para-sala)
* [Exercicio para casa](https://github.com/reprograma/on26-python-s08-projeto-guiado-II/tree/main/exercicios/para-casa)

#### Como criar meu Pull Request?
[Instruções Pull Request](https://github.com/reprograma/on26-python-s08-projeto-guiado-II/blob/main/exercicios/para-casa/instrucoes-pull-request.md)

### Material da aula
- [Material de apoio](https://docs.google.com/presentation/d/1xn1iPDu5aDmG7-mEh9EotPsqHcNHsSpadulo1WazRzo/edit?usp=sharing)

### Links Úteis
- [Referências](https://github.com/reprograma/on26-python-s08-projeto-guiado-II/blob/main/material/material.md)

<p align="center">
Desenvolvido com :purple_heart:
</p>
# Exercício de Casa 🏠

## Criar método remove_book
Critérios de aceitação:
- O método deve ter ao menos 1 (um) teste associado
- O método deve receber como parâmetro o nome do livro e remover da propriedade Books
- O método deve remover apenas 1 (um) livro por vez
- Caso o livro não seja encontrado o método não deve dar erro ou exceções
- Apenas livros não emprestados podem ser removidos (opcional)

## Criar método search_book
Critérios de aceitação:
- O método deve ter ao menos 1 (um) teste associado
- O método deve receber como parâmetro o nome do livro a ser buscado e retornar o nome do livro, autor e informação se livro está disponível ou emprestado
- Caso o livro não seja encontrado o método deve retornar a mensagem "Livro não encontrado"

## Criar método return_book
Critérios de aceitação:
- O método deve ter ao menos 1 (um) teste associado
- O método deve receber como parâmetro o nome do livro a ser devolvido e mudar o status do livro para não emprestado na propriedade Books
- Caso o livro não seja encontrado o método deve apenas exibir a mensagem "Livro não encontrado"

---

Terminou o exercício? Dá uma olhada nessa checklist e confere se tá tudo certinho, combinado?!

- [ ] Fiz o fork do repositório.
- [ ] Clonei o fork na minha máquina (`git clone url-do-meu-fork`).
- [ ] Resolvi o exercício.
- [ ] Adicionei as mudanças. (`git add .` para adicionar todos os arquivos, ou `git add nome_do_arquivo` para adicionar um arquivo específico)
- [ ] Commitei a cada mudança significativa ou na finalização do exercício (`git commit -m "Mensagem do commit"`)
- [ ] Pushei os commits na minha branch (`git push origin nome-da-branch`)
- [ ] Criei um Pull Request seguindo as orientaçoes que estao nesse [documento](https://github.com/reprograma/on26-python-s08-projeto-guiado-II/blob/main/exercicios/para-casa/instrucoes-pull-request.md).
Empty file added __init__.py
Empty file.
15 changes: 15 additions & 0 deletions exercicios/para-casa/Biblioteca.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from Livro import Livro # o from vem de "tal" lugar... do modulo livro importamos a classe livros
class Biblioteca: # criando uma nova biblioteca chamada livro
def __init__(self): # método construtor INIT para definir as propriedades ou atribuições da nossa classe

self.livros = [] # com a funçaõ self a gente vai acessar a variável livro associando a uma lista'[]

def adicionar_livro(self, livro: Livro): # def é usado em uma ação(verbo no infinitvo) neste caso
if(not isinstance (livro, Livro)): #funçao de atribuição - #not isinstace diz que o "livro" só existe mas n foi utilizado
raise TypeError(f"Esperado Livro obtido valor {livro} do tipo {type(livro)}") # o raise vai estourar essa exceção e vai passar a atribuir esse livro as ações
self.livros.append(livro) # o append adiconar as "coisas" dentro de listas

def exibir_livro(self):
return self.livros


9 changes: 9 additions & 0 deletions exercicios/para-casa/Livro.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class Livro: # criando a classe livros, que vai ser usado dentro dos métodos da classe de biblioteca
def __init__(self, nome, autor, ano): # método construtor INIT para definir as propriedades ou atribuições da nossa classe
# self é uma função que vai ajudar a chamar a atribuição
self.nome = nome
self.autor = autor
self.ano = ano
self.esta_emprestado = False # estar_emprestado recebe uma palavra reservada(false/true, nesse caso)

# módulos só é modulo quando tem um init.py(todos os arquivos denro se tornam modulos)
Empty file.
19 changes: 19 additions & 0 deletions exercicios/para-casa/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#não é obrigatorio#

from Biblioteca import Biblioteca
from Livro import Livro

nome_livro = "O mito da beleza"
autor_livro = "Naomi Wolf"
livro_objeto = Livro(nome = nome_livro,autor = autor_livro)

biblioteca_objeto = Biblioteca()


print(biblioteca_objeto.livros)

biblioteca_objeto.adicionar_livro(livro_objeto)

for livro in biblioteca_objeto.livros:
print(livro.nome)
print(livro.autor)
76 changes: 76 additions & 0 deletions exercicios/para-casa/testBiblioteca.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
from unittest import TestCase # de dentro de unittest importamos a ferramenta TestCase

from Livro import Livro # de dentro do módulo livro importamos a classe livro
from Biblioteca import Biblioteca # de dentro do modulo bibliteca a classe biblioteca

class TestBiblioteca(TestCase): # criando uma classe de teste biblioteca que vai usar a ferramenta testCase
def setUp(self): # setup é usado para abreviar uma função grande
self.biblioteca = Biblioteca() #acessando a varável biblioteca e atribuindoa classe

def test_init_deve_passar(self): # o __INIT__ é chamado de consultor, ele permite e dar inicio os métodos e propriedades
# Arrange / Act
#biblioteca = Biblioteca()

# Assert
self.assertIsInstance(self.biblioteca.livros, list) # testando se os livros da biblioteca estão associados a uma lista
def test_adicionar_livro_deve_passar(self):

# Arrange
#biblioteca = Biblioteca()
nome_livro = "Bunker"
autor_livro = "Kevin Brooks"
ano = 2002
livro = Livro(nome_livro, autor_livro, ano)

# Act
self.biblioteca.adicionar_livro(livro)

# Assert
self.assertEqual(1, len(self.biblioteca.livros)) #

# def test_adicionar_livro_nao_deve_inserir_numero(self):
# Arrange
#biblioteca = Biblioteca()
# livro = 1988

# Act
#self.biblioteca.adicionar_livro(livro) # essa função está sendo chamada na linha 38

# Assert
# with self.assertRaises(TypeError):
# self.biblioteca.adicionar_livro(livro)

# def test_init_exibir_livros_vazio(self): # o self aparece dentro de todas as funções que
# lista_vazia = Biblioteca() #criando uma nova variável chamada lista vazia que recebe o módulo biblioteca
# livros_listados = lista_vazia.exibir_livro() #
# self.assertEqual(0, len(livros_listados)) == 0 # os dois == e o zero garante que a lista está vazia fazem(que a lista é do tamanho de zero que é iguala zero)

# def test_init_exibir_livros(self):
# lista = Biblioteca()
# lista.adicionar_livro(Livro("Bunker", "Keven Brooks", 2002))
# relacao = lista.exibir_livro()
# self.assertEqual(1, len(relacao)) #relação é os livros disponíveis para exibir
# self.assertEqual(relacao[0].nome, "Bunker")
# self.assertEqual(relacao[0].autor, "Keven Brooks")
# self.assertEqual(relacao[0].ano, 2002)


#fazer devolução
def test__initt__devolver_livro(self):
lista_devolucao = Biblioteca() # a class aqui é biblioteca de onde tiraremos as informações para
lista_devolucao.devolver_livro(Livro("Bunker", "Keven Brooks", 2002))
self.assertEqual(lista_devolucao[1].nome, "Bunker")
self.assertEqual(lista_devolucao[1].autor, "Keven Brooks")
self.assertEqual(lista_devolucao[0].ano, 2002)
## será que deveria ter um return?##

####### MAIS PRA FRENTE EU VOLTO PRA FAZER OS DEMAIS\ºº/######
# nome_livro = "livro_auto_ajuda" , "livro_como_ficar_milionario"
# autor_livro = "João" , "Fernanda"
#livro_auto_ajuda = livro_auto_ajuda(nome_livro, autor_livro)
# livro_como_ficar_milionario = livro_como_ficar_milionario(nome_livro, autor_livro)
# return nome_livro - str(self.livro_auto_ajuda, livro_como_ficar_milionario)

#self.livro_como_ficar_milionario = livro_como_ficar_milionario


16 changes: 16 additions & 0 deletions exercicios/para-casa/testLivro.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from unittest import TestCase # pra essa situação vamos usar o unittest que é uma biblioteca com ferramentas de teste, por ex: testCase
from Livro import Livro # precisa importar do modulo "arquivo" livro, importamos a classe livros

class testlivro(TestCase): # criando a classe de teste livro usando da ferramenta testCase
def test_init_deve_passar(self): # a gente utilizou novamente o método construtor que leva como parâmentro SELF
# Arrange é usado para definir as configuraçõe do que se precisa
nome = "Anjos e Demonios" # variável nome e autor
autor = "Dan Browm"

# Act é ação
livro = Livro(nome, autor) # dentro do act cria uma varíavel ou um objeto que realiza a ação de acessar os parâmetros da classe

# Assert é o teste
self.assertEqual(nome, livro.nome) # o assertEqual ele define que tem que ser igual
self.assertEqual(autor, livro.autor)
self.assertEqual(False, livro.esta_emprestado) # por ser uma palavra reservada chamamos direto da classe livros e não associamos ao objeto criado no ACT
31 changes: 31 additions & 0 deletions instrucoes-pull-request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Como criar meu Pull Request? 🤔

Olá, meninas! <br>
O checklist da atividade ta todo preenchido? Entao agora tá na hora de fazer nosso pull request para o repositório original. <br>
Você deverá navegar até o seu repositório onde você fez o fork e pressionar o botão “New pull request” no lado esquerdo da página. <br> <br>
![alt](https://assets.digitalocean.com/articles/eng_python/PullRequest/PRButton.png)

Você poderá modificar a branch na próxima tela.

Depois de ter escolhido a branch main do repositório original no lado esquerdo, e a nova-branch do seu fork do lado direito, você deve ver uma tela assim:

![alt](https://assets.digitalocean.com/articles/eng_python/PullRequest/PullRequest.png)
<br> <br>
O GitHub vai lhe alertar de que é possível mesclar as duas branches porque não há código concorrente. Você deve adicionar um título, e um comentário descrevendo o seu PR. <br> <br>
DICAS: <br>
1. Você pode seguir esse modelo para o título do seu PR:
```
Nome da Atividade - Seu nome.
```
2. Você pode seguir esse modelo para a descrição do seu PR:
```
O que?
Resolução dos exercícios de lógica.

Como?
* Adicionei um arquivo para resolver a atividade 1 utilizando os métodos slice e split;
* Adicionei casos de testes unitários para cada um dos exercícios utilizando jest;
* Outro ponto que você queira adicionar.
```
Feito isso, é so clicar em “Create pull request”. <br> <br>
Tcharaaaannn! Agora é só esperar a prof revisar seu PR 💜
19 changes: 19 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#não é obrigatorio#

from Biblioteca import Biblioteca
from Livro import Livro

nome_livro = "O mito da beleza"
autor_livro = "Naomi Wolf"
livro_objeto = Livro(nome = nome_livro,autor = autor_livro)

biblioteca_objeto = Biblioteca()


print(biblioteca_objeto.livros)

biblioteca_objeto.adicionar_livro(livro_objeto)

for livro in biblioteca_objeto.livros:
print(livro.nome)
print(livro.autor)
55 changes: 55 additions & 0 deletions testBiblioteca.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from unittest import TestCase

from Livro import Livro
from Biblioteca import Biblioteca

class TestBiblioteca(TestCase):
def setUp(self):
self.biblioteca = Biblioteca()

def test_init_deve_passar(self): # usa o DEF pq ele é um método
# Arrange / Act
#biblioteca = Biblioteca()

# Assert
self.assertIsInstance(self.biblioteca.livros, list)
def test_adicionar_livro_deve_passar(self):
# Arrange
#biblioteca = Biblioteca()
nome_livro = "Bunker"
autor_livro = "Kevin Brooks"
livro = Livro(nome_livro, autor_livro)

# Act
self.biblioteca.adicionar_livro(livro)

# Assert
self.assertEqual(1, len(self.biblioteca.livros))

def test_adicionar_livro_nao_deve_inserir_numero(self):
# Arrange
#biblioteca = Biblioteca()
livro = 1988

# Act
#self.biblioteca.adicionar_livro(livro) # essa função está sendo chamada na linha 38

# Assert
with self.assertRaises(TypeError):
self.biblioteca.adicionar_livro(livro)

def test_init_exibir_livros(self, livro_auto_ajuda, livro_como_ficar_milionario):
self.biblioteca = exibir_livros



def test_init_emprestar_livro(self, livro: livros):
nome_livro = "livro_auto_ajuda" , "livro_como_ficar_milionario"
autor_livro = "João" , "Fernanda"
livro_auto_ajuda = livro_auto_ajuda(nome_livro, autor_livro)
livro_como_ficar_milionario = livro_como_ficar_milionario(nome_livro, autor_livro)
return nome_livro - str(self.livro_auto_ajuda, livro_como_ficar_milionario)

self.livro_como_ficar_milionario = livro_como_ficar_milionario


16 changes: 16 additions & 0 deletions testLivro.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from unittest import TestCase
from Livro import Livro

class testlivro(TestCase):
def test_init_deve_passar(self):
# Arrange
nome = "Anjos e Demonios"
autor = "Dan Browm"

# Act
livro = Livro(nome, autor)

# Assert
self.assertEqual(nome, livro.nome)
self.assertEqual(autor, livro.autor)
self.assertEqual(False, livro.esta_emprestado)