diff --git a/Biblioteca.py b/Biblioteca.py new file mode 100644 index 0000000..ad09f30 --- /dev/null +++ b/Biblioteca.py @@ -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): + \ No newline at end of file diff --git a/Livro.py b/Livro.py new file mode 100644 index 0000000..7a9aa8c --- /dev/null +++ b/Livro.py @@ -0,0 +1,8 @@ +class Livro: + def __init__(self, nome, autor, ano): # propriedade + + self.nome = nome + self.autor = autor + self.esta_emprestado = False + + \ No newline at end of file diff --git a/README.md b/README.md index 77a119e..0a4f3e2 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,33 @@ -

- logo reprograma -

- -# 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) - -

-Desenvolvido com :purple_heart: -

\ No newline at end of file +# 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). diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exercicios/para-casa/Biblioteca.py b/exercicios/para-casa/Biblioteca.py new file mode 100644 index 0000000..d8ea727 --- /dev/null +++ b/exercicios/para-casa/Biblioteca.py @@ -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 + + diff --git a/exercicios/para-casa/Livro.py b/exercicios/para-casa/Livro.py new file mode 100644 index 0000000..407cf2e --- /dev/null +++ b/exercicios/para-casa/Livro.py @@ -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) \ No newline at end of file diff --git a/exercicios/para-casa/__init__.py b/exercicios/para-casa/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exercicios/para-casa/main.py b/exercicios/para-casa/main.py new file mode 100644 index 0000000..f9808db --- /dev/null +++ b/exercicios/para-casa/main.py @@ -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) \ No newline at end of file diff --git a/exercicios/para-casa/testBiblioteca.py b/exercicios/para-casa/testBiblioteca.py new file mode 100644 index 0000000..b3eebd6 --- /dev/null +++ b/exercicios/para-casa/testBiblioteca.py @@ -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 + + diff --git a/exercicios/para-casa/testLivro.py b/exercicios/para-casa/testLivro.py new file mode 100644 index 0000000..8cd4531 --- /dev/null +++ b/exercicios/para-casa/testLivro.py @@ -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 diff --git a/instrucoes-pull-request.md b/instrucoes-pull-request.md new file mode 100644 index 0000000..e7005a3 --- /dev/null +++ b/instrucoes-pull-request.md @@ -0,0 +1,31 @@ +# Como criar meu Pull Request? 🤔 + +Olá, meninas!
+O checklist da atividade ta todo preenchido? Entao agora tá na hora de fazer nosso pull request para o repositório original.
+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.

+![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) +

+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.

+DICAS:
+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”.

+Tcharaaaannn! Agora é só esperar a prof revisar seu PR 💜 diff --git a/main.py b/main.py new file mode 100644 index 0000000..60cf74d --- /dev/null +++ b/main.py @@ -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) \ No newline at end of file diff --git a/testBiblioteca.py b/testBiblioteca.py new file mode 100644 index 0000000..4fae88b --- /dev/null +++ b/testBiblioteca.py @@ -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 + + diff --git a/testLivro.py b/testLivro.py new file mode 100644 index 0000000..92c2b58 --- /dev/null +++ b/testLivro.py @@ -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)