{"id":28223465,"url":"https://github.com/lmuffato/project-inventory-report-trybe","last_synced_at":"2026-05-18T15:35:07.676Z","repository":{"id":139798681,"uuid":"452893904","full_name":"lmuffato/Project-inventory-report-Trybe","owner":"lmuffato","description":"Projeto inventory report - Projeto avaliativo da Trybe do Bloco 33: Programação Orientada a Objetos e Padrões de Projeto","archived":false,"fork":false,"pushed_at":"2022-01-28T00:48:10.000Z","size":824,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"lmuffato-inventory-report","last_synced_at":"2025-07-23T11:21:04.705Z","etag":null,"topics":["abstractclass","abstractmethod","class","csv","heritage","iterator","json","object-oriented-programming","oop","poo","python","read-file","report","trybe","trybe-projects","xml"],"latest_commit_sha":null,"homepage":"https://github.com/lmuffato/Project-job-insights-Trybe","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lmuffato.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-01-28T00:46:45.000Z","updated_at":"2023-04-10T09:46:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"1e1974fa-90e0-46b7-8683-5fbd5181d2d0","html_url":"https://github.com/lmuffato/Project-inventory-report-Trybe","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lmuffato/Project-inventory-report-Trybe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmuffato%2FProject-inventory-report-Trybe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmuffato%2FProject-inventory-report-Trybe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmuffato%2FProject-inventory-report-Trybe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmuffato%2FProject-inventory-report-Trybe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lmuffato","download_url":"https://codeload.github.com/lmuffato/Project-inventory-report-Trybe/tar.gz/refs/heads/lmuffato-inventory-report","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lmuffato%2FProject-inventory-report-Trybe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33183010,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T09:27:30.708Z","status":"ssl_error","status_checked_at":"2026-05-18T09:27:28.300Z","response_time":71,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["abstractclass","abstractmethod","class","csv","heritage","iterator","json","object-oriented-programming","oop","poo","python","read-file","report","trybe","trybe-projects","xml"],"created_at":"2025-05-18T08:09:41.888Z","updated_at":"2026-05-18T15:35:07.642Z","avatar_url":"https://github.com/lmuffato.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"### Termos de acordos\n\nAo iniciar este projeto, você concorda com as diretrizes do Código de Ética e Conduta e do Manual da Pessoa Estudante da Trybe.\n\n# Boas vindas ao repositório do projeto de Relatório de Estoque!\n\nVocê já usa o GitHub diariamente para desenvolver os exercícios, certo? Agora, para desenvolver os projetos, você deverá seguir as instruções a seguir. Fique atento a cada passo e, se tiver qualquer dúvida, nos envie por _Slack_! #vqv 🚀\n\nAqui você vai encontrar os detalhes de como estruturar o desenvolvimento do seu projeto a partir desse repositório, utilizando uma branch específica e um _Pull Request_ para colocar seus códigos.\n\n---\n\n## SUMÁRIO\n\n- [Habilidades](#habilidades)\n- [Data de entrega](#data-de-entrega)\n- [Entregáveis](#entregáveis)\n- [O que deverá ser desenvolvido](#o-que-deverá-ser-desenvolvido)\n- [Desenvolvimento e testes](#desenvolvimento-e-testes)\n- [Dados](#dados)\n- [Antes de começar a desenvolver](#antes-de-começar-a-desenvolver)\n\nLista de requisitos:\n- [Requisitos obrigatórios](#requisitos-obrigatórios)\n  - [1 - Criar um método `generate` numa classe `SimpleReport` do módulo `inventory_report/reports/simple_report.py`. Esse método deverá receber dados numa lista contendo estruturas do tipo `dict` e deverá retornar uma string formatada como um relatório](#1---criar-um-método-generate-numa-classe-simplereport-do-módulo-inventory_reportreportssimple_reportpy-esse-método-deverá-receber-dados-numa-lista-contendo-estruturas-do-tipo-dict-e-deverá-retornar-uma-string-formatada-como-um-relatório)\n  - [2 - Criar um método `generate` numa classe `CompleteReport` do módulo `inventory_report/reports/complete_report.py`. Esse método deverá receber dados numa lista contendo estruturas do tipo `dict` e deverá retornar uma string formatada como um relatório](#2---criar-um-método-generate-numa-classe-completereport-do-módulo-inventory_reportreportscomplete_reportpy-esse-método-deverá-receber-dados-numa-lista-contendo-estruturas-do-tipo-dict-e-deverá-retornar-uma-string-formatada-como-um-relatório)\n  - [3 - Criar um método `import_data` dentro de uma classe `Inventory` do módulo `inventory_report/inventory/inventory.py`, capaz de ler um arquivo CSV o qual o caminho é passado como parâmetro](#3---criar-um-método-import_data-dentro-de-uma-classe-inventory-do-módulo-inventory_reportinventoryinventorypy-capaz-de-ler-um-arquivo-csv-o-qual-o-caminho-é-passado-como-parâmetro)\n  - [4 - Criar um método `import_data` dentro de uma classe `Inventory` do módulo `inventory_report/inventory/inventory.py`, capaz de ler um arquivo JSON o qual o caminho é passado como parâmetro](#4---criar-um-método-import_data-dentro-de-uma-classe-inventory-do-módulo-inventory_reportinventoryinventorypy-capaz-de-ler-um-arquivo-json-o-qual-o-caminho-é-passado-como-parâmetro)\n  - [5 - Criar um método `import_data` dentro de uma classe `Inventory` do módulo `inventory_report/inventory/inventory.py`, capaz de ler um arquivo XML o qual o caminho é passado como parâmetro](#5---criar-um-método-import_data-dentro-de-uma-classe-inventory-do-módulo-inventory_reportinventoryinventorypy-capaz-de-ler-um-arquivo-xml-o-qual-o-caminho-é-passado-como-parâmetro)\n  - [6 - Criar uma classe abstrata `Importer` no módulo `inventory_report/importer/importer.py`, que terá três classes herdeiras: `CsvImporter`, `JsonImporter` e `XmlImporter`, cada uma definida em seu respectivo módulo](#6---criar-uma-classe-abstrata-importer-no-módulo-inventory_reportimporterimporterpy-que-terá-três-classes-herdeiras-csvimporter-jsonimporter-e-xmlimporter-cada-uma-definida-em-seu-respectivo-módulo)\n  - [7 - Criar uma classe `InventoryIterator` no módulo `inventory_report/inventory/inventory_iterator.py`, que implementa a interface de um iterator (`Iterator`). A classe `InventoryRefactor` deve implementar o método `__iter__`, que retornará este iterador](#7---criar-uma-classe-inventoryiterator-no-módulo-inventory_reportinventoryinventory_iteratorpy-que-implementa-a-interface-de-um-iterator-iterator-a-classe-inventoryrefactor-deve-implementar-o-método-__iter__-que-retornará-este-iterador)\n- [Requisitos bônus](#requisitos-bônus)\n  - [8 - Preencha a função main no módulo `inventory_report/main.py` que, ao receber pela linha de comando o caminho de um arquivo e o tipo de relatório, devolve o relatório correto](#8---preencha-a-função-main-no-módulo-inventory_reportmainpy-que-ao-receber-pela-linha-de-comando-o-caminho-de-um-arquivo-e-o-tipo-de-relatório-devolve-o-relatório-correto)\n\n- [Depois de terminar o desenvolvimento (opcional)](#depois-de-terminar-o-desenvolvimento)\n  - [Revisando um Pull Request](#revisando-um-pull-request)\n- [Avisos finais](#avisos-finais)\n\n---\n\n## Habilidades\n\nNesse projeto, você será capaz de:\n\n- Você vai aprender sobre paradigmas de programação\n- Conceitos de OO na prática, criando classes e instâncias\n- Leitura e escria de arquivos\n\n---\n\n## Data de entrega\n\n  - Projeto obrigatório;\n  - Serão `2` dias de projeto.\n  - Data de entrega para avaliação final do projeto: `11/01/2022 - 14:00h`.\n\n---\n\n## Entregáveis\n\nPara entregar o seu projeto você deverá criar um _Pull Request_ neste repositório. Este _Pull Request_ deverá conter, para aprovação em todos os requisitos, os arquivos que se encontram neste diretório. Os códigos serão desenvolvidos nos arquivos presentes no diretório `inventory_report`: `main.py`, `reports/simple_report.py`, `reports/complete_report.py`, `importer/importer.py`, `importer/json_importer.py`, `importer/xml_importer.py`, `importer/csv_importer.py`, `inventory/inventory.py`, `inventory/invetory_iterator.py`.\n\n### ⚠️ É importante que seus arquivos tenham exatamente estes nomes! ⚠️\n\nVocê pode adicionar outros arquivos se julgar necessário. Qualquer dúvida, procure a gente no Slack!.\n\n---\n\n## O que deverá ser desenvolvido\n\nNo projeto passado você implementou algumas funções que faziam leitura e escrita de arquivos `JSON` e `CSV`, correto? Neste projeto nós vamos fazer algo parecido, mas utilizando a Programação Orientada a Objetos! Você implementará um gerador de relatórios que recebe como entrada arquivos com dados de um estoque e gera, como saída, um relatório acerca destes dados.\n\nEsses dados de estoque poderão ser obtidos de diversas fontes:\n\n- Através da importação de um arquivo `CSV`;\n\n- Através da importação de um arquivo `JSON`;\n\n- Através da importação de um arquivo `XML`;\n\nAlém disso, o relatório final deverá poder ser gerado em duas versões: simples e completa.\n\n### Como o projeto deve ser executável\n\nApós implementar o requisito bônus, seu programa deverá ser executável **via linha de comando** com o comando `inventory_report \u003cargumento1\u003e \u003cargumento2\u003e`:\n\n- O **\u003cargumento 1\u003e** deve receber o caminho de um arquivo a ser importado. O arquivo pode ser um `csv`, `json` ou `xml`.\n\n- O **\u003cargumento 2\u003e** pode receber duas strings: `simples` ou `completo`, cada uma gerando o respectivo relatório.\n\n---\n\n## Desenvolvimento e testes\n\nEste repositório já contém um _template_ com a estrutura de diretórios e arquivos, tanto de código quanto de teste criados. Veja abaixo:\n\n```\n.\n├── dev-requirements.txt\n├── inventory_report\n│   ├── data\n│   │   ├── inventory.csv\n│   │   ├── inventory.json\n│   │   └── inventory.xml\n│   ├── importer\n│   │   ├── csv_importer.py\n│   │   ├── importer.py\n│   │   ├── json_importer.py\n│   │   └── xml_importer.py\n│   ├── inventory\n│   │   ├── inventory_iterator.py\n│   │   └── inventory.py\n│   ├── main.py\n│   └── reports\n│       ├── complete_report.py\n│       └── simple_report.py\n├── pyproject.toml\n├── README.md\n├── requirements.txt\n├── setup.cfg\n├── setup.py\n└── tests\n    ├── __init__.py\n    ├── test_complete_report.py\n    ├── test_csv_importer.py\n    ├── test_importer.py\n    ├── test_inventory.py\n    ├── test_json_importer.py\n    ├── test_main.py\n    ├── test_simple_report.py\n    └── test_xml_importer.py\n```\n\nApesar do projeto já possuir uma estrutura base, você quem deve implementar as classes. Novos arquivos podem ser criados conforme a necessidade.\n\nPara executar os testes, lembre-se de primeiro **criar e ativar o ambiente virtual**, além de também instalar as dependências do projeto. Isso pode ser feito através dos comandos:\n\n```bash\n$ python3 -m venv .venv\n\n$ source .venv/bin/activate\n\n$ python3 -m pip install -r dev-requirements.txt\n```\n\nO arquivo `dev-requirements.txt` contém todos as dependências que serão utilizadas no projeto, ele está agindo como se fosse um `package.json` de um projeto `Node.js`. Com as dependências já instaladas, para executar os testes basta usar o comando:\n\n```bash\n$ python3 -m pytest\n```\n\nSe quiser saber mais sobre a instalação de dependências com `pip`, veja esse artigo: https://medium.com/python-pandemonium/better-python-dependency-and-package-management-b5d8ea29dff1\n\nPara verificar se você está seguindo o guia de estilo do Python corretamente, você pode executá-lo com o seguinte comando:\n\n```bash\n$ python3 -m flake8\n```\n\n---\n\n## Dados\n\nArquivos de exemplo nos três formatos de importação estão disponíveis no diretório `data` dentro do diretório `inventory_report`.\n\n### Importação de arquivos CSV\n\nOs arquivos **CSV** são separados por vírgula, como no exemplo abaixo:\n\n```csv\nid,nome_do_produto,nome_da_empresa,data_de_fabricacao,data_de_validade,numero_de_serie,instrucoes_de_armazenamento\n1,Nicotine Polacrilex,Target Corporation,2020-02-18,2022-09-17,CR25 1551 4467 2549 4402 1,morbi ut odio cras mi pede malesuada in imperdiet et commodo vulputate justo in blandit\n2,fentanyl citrate,\"Galena Biopharma, Inc.\",2019-12-06,2022-12-25,FR29 5951 7573 74OY XKGX 6CSG D20,bibendum morbi non quam nec dui luctus rutrum nulla tellus in\n3,NITROUS OXIDE,Keen Compressed Gas Co. Inc.,2019-12-22,2023-11-07,CZ09 8588 0858 8435 9140 2695,ipsum dolor sit amet consectetuer adipiscing elit proin risus praesent\n```\n\n### Importação de arquivos JSON\n\nOs arquivos JSON seguem o seguinte modelo:\n\n```json\n[\n  {\n    \"id\":1,\n    \"nome_do_produto\":\"CALENDULA OFFICINALIS FLOWERING TOP, GERANIUM MACULATUM ROOT, SODIUM CHLORIDE, THUJA OCCIDENTALIS LEAFY TWIG, ZINC, and ECHINACEA ANGUSTIFOLIA\",\n    \"nome_da_empresa\":\"Forces of Nature\",\n    \"data_de_fabricacao\":\"2020-07-04\",\n    \"data_de_validade\":\"2023-02-09\",\n    \"numero_de_serie\":\"FR48 2002 7680 97V4 W6FO LEBT 081\",\n    \"instrucoes_de_armazenamento\":\"in blandit ultrices enim lorem ipsum dolor sit amet consectetuer adipiscing elit proin interdum mauris non ligula pellentesque ultrices phasellus\"\n  }\n]\n```\n\n### Importação de arquivos XML\n\nOs arquivos **XML** seguem o seguinte modelo:\n\n```xml\n\u003c?xml version='1.0' encoding='UTF-8'?\u003e\n\u003cdataset\u003e\n  \u003crecord\u003e\n    \u003cid\u003e1\u003c/id\u003e\n    \u003cnome_do_produto\u003evalsartan and hydrochlorothiazide\u003c/nome_do_produto\u003e\n    \u003cnome_da_empresa\u003eLake Erie Medical \u0026amp; Surgical Supply DBA Quality Care Products LLC\u003c/nome_da_empresa\u003e\n    \u003cdata_de_fabricacao\u003e2019-10-27\u003c/data_de_fabricacao\u003e\n    \u003cdata_de_validade\u003e2022-08-31\u003c/data_de_validade\u003e\n    \u003cnumero_de_serie\u003eMT08 VVDN 2131 9NFL C1JG KTDV RS1L LOZ\u003c/numero_de_serie\u003e\n    \u003cinstrucoes_de_armazenamento\u003eat lorem integer tincidunt ante vel ipsum praesent blandit lacinia erat\u003c/instrucoes_de_armazenamento\u003e\n  \u003c/record\u003e\n\u003c/dataset\u003e\n```\n\n---\n\n\n## Instruções para entregar seu projeto:\n\n### ⚠️ Se você estiver fazendo esse projeto em duplas ⚠️\n\nÉ **essencial** que cada integrante da dupla tenha pelo menos 1 Push com o código completo do projeto. A nota de cada pessoa será computada individualmente, então o Push de uma pessoa não garante a nota da outra.\n\nExemplo:\n- Estudante `Rafa` implementa 50% dos requisitos obrigatórios\n- Em seguida `Gabs`, sua dupla, complementa com os 50% restantes (atingindo 100% dos obrigatórios)\n  - Neste momento **SOMENTE** `Gabs` obteve aprovação.\n- `Rafa` faz um Push em sua branch, com o código completo (atingindo 100% dos obrigatórios) \n  - Neste momento `Rafa` também obtém a aprovação\n\nPara mais detalhes de como deve ocorrer a dinâmica, [consulte este material](TODO:link/da/apresentação/feita/para/a/turma/na/explicação/do/projeto)\n\n### ANTES DE COMEÇAR A DESENVOLVER:\n\n1. Clone o repositório\n\n- `git clone git@github.com:tryber/sd-010-a-inventory-report.git`.\n- Entre na pasta do repositório que você acabou de clonar:\n  - `sd-010-a-inventory-report`\n\n2. Crie o ambiente virtual para o projeto\n\n- `python3 -m venv .venv \u0026\u0026 source .venv/bin/activate`\n\nNota: após terminar o trabalho, para desativar o ambiente virtual digite `deactivate`\n\n3. Instale as dependências\n\n- `python3 -m pip install -r dev-requirements.txt`\n\n4. Crie uma branch a partir da branch `master`\n\n- Verifique que você está na branch `master`\n  - Exemplo: `git branch`\n- Se não estiver, mude para a branch `master`\n  - Exemplo: `git checkout master`\n- Agora crie uma branch à qual você vai submeter os `commits` do seu projeto\n  - Você deve criar uma branch no seguinte formato: `nome-github-nome-do-projeto`\n  - Exemplo: `git checkout -b exemplo-inventory-report`\n\n5. Adicione as mudanças ao _stage_ do Git e faça um `commit`\n\n- Verifique que as mudanças ainda não estão no _stage_\n  - Exemplo: `git status` (deve aparecer listada a pasta _exemplo_ em vermelho)\n- Adicione o novo arquivo ao _stage_ do Git\n  - Exemplo:\n    - `git add .` (adicionando todas as mudanças - _que estavam em vermelho_ - ao stage do Git)\n    - `git status` (deve aparecer listado o arquivo _exemplo/README.md_ em verde)\n- Faça o `commit` inicial\n  - Exemplo:\n    - `git commit -m 'iniciando o projeto inventory-report'` (fazendo o primeiro commit)\n    - `git status` (deve aparecer uma mensagem tipo _nothing to commit_ )\n\n6. Adicione a sua branch com o novo `commit` ao repositório remoto\n\n- Usando o exemplo anterior: `git push -u origin exemplo-project-name`\n\n7. Crie um novo `Pull Request` _(PR)_\n\n- Vá até a página de _Pull Requests_ do [repositório no GitHub](https://github.com/tryber/sd-010-a-inventory-report/pulls)\n- Clique no botão verde _\"New pull request\"_\n- Clique na caixa de seleção _\"Compare\"_ e escolha a sua branch **com atenção**\n- Clique no botão verde _\"Create pull request\"_\n- Adicione uma descrição para o _Pull Request_ e clique no botão verde _\"Create pull request\"_\n- **Não se preocupe em preencher mais nada por enquanto!**\n- Volte até a [página de _Pull Requests_ do repositório](https://github.com/tryber/sd-010-a-inventory-report/pulls) e confira que o seu _Pull Request_ está criado\n\n---\n\n## Requisitos obrigatórios:\n\n#### 1 - Criar um método `generate` numa classe `SimpleReport` do módulo `inventory_report/reports/simple_report.py`. Esse método deverá receber dados numa lista contendo estruturas do tipo `dict` e deverá retornar uma string formatada como um relatório.\n\n- Deve ser possível executar o método `generate` sem instanciar um objeto de `SimpleReport`\n- O método deve receber de parâmetro uma lista de dicionários no seguinte formato:\n\n   ```json\n   [\n     {\n       \"id\": 1,\n       \"nome_do_produto\": \"CALENDULA OFFICINALIS FLOWERING TOP, GERANIUM MACULATUM ROOT, SODIUM CHLORIDE, THUJA OCCIDENTALIS LEAFY TWIG, ZINC, and ECHINACEA ANGUSTIFOLIA\",\n       \"nome_da_empresa\": \"Forces of Nature\",\n       \"data_de_fabricacao\": \"2020-07-04\",\n       \"data_de_validade\": \"2023-02-09\",\n       \"numero_de_serie\": \"FR48 2002 7680 97V4 W6FO LEBT 081\",\n       \"instrucoes_de_armazenamento\": \"in blandit ultrices enim lorem ipsum dolor sit amet consectetuer adipiscing elit proin interdum mauris non ligula pellentesque ultrices    phasellus\"\n     }\n   ]\n   ```\n\n- O método deverá retornar uma saída com o seguinte formato:\n\n   ```bash\n   Data de fabricação mais antiga: YYYY-MM-DD\n   Data de validade mais próxima: YYYY-MM-DD\n   Empresa com maior quantidade de produtos estocados: NOME DA EMPRESA\n   ```\n- A data de validade mais próxima, somente considera itens que ainda não venceram.\n\n**Dica**: O módulo [datetime](https://docs.python.org/3/library/datetime.html) vai te ajudar.\n\n##### As seguintes verificações serão feitas:\n\n- 1.1 - Será validado que é possível que o método `generate` da classe `SimpleReport` retorne a data de fabricação mais antiga\n\n- 1.2 - Será validado que é possível que o método `generate` da classe `SimpleReport` retorne a validade mais próxima\n\n- 1.3 - Será validado que é possível que o método `generate` da classe `SimpleReport` retorne a empresa com maior estoque\n\n- 1.4 - Será validado que é possível que o método `generate` da classe `SimpleReport` retorne o relatório no formato correto\n\n#### 2 - Criar um método `generate` numa classe `CompleteReport` do módulo `inventory_report/reports/complete_report.py`. Esse método deverá receber dados numa lista contendo estruturas do tipo `dict` e deverá retornar uma string formatada como um relatório.\n\n- A classe `CompleteReport` deve herdar o método (`generate`) da classe `SimpleReport`, de modo a especializar seu comportamento.\n\n- O método deve receber de parâmetro uma lista de dicionários no seguinte formato:\n\n   ```json\n   [\n     {\n       \"id\": 1,\n       \"nome_do_produto\": \"CALENDULA OFFICINALIS FLOWERING TOP, GERANIUM MACULATUM ROOT, SODIUM CHLORIDE, THUJA OCCIDENTALIS LEAFY TWIG, ZINC, and ECHINACEA ANGUSTIFOLIA\",\n       \"nome_da_empresa\": \"Forces of Nature\",\n       \"data_de_fabricacao\": \"2020-07-04\",\n       \"data_de_validade\": \"2023-02-09\",\n       \"numero_de_serie\": \"FR48 2002 7680 97V4 W6FO LEBT 081\",\n       \"instrucoes_de_armazenamento\": \"in blandit ultrices enim lorem ipsum dolor sit amet consectetuer adipiscing elit proin interdum mauris non ligula pellentesque ultrices    phasellus\"\n     }\n   ]\n   ```\n\n- O método deverá retornar uma saída com o seguinte formato:\n\n   ```bash\n   Data de fabricação mais antiga: YYYY-MM-DD\n   Data de validade mais próxima: YYYY-MM-DD\n   Empresa com maior quantidade de produtos estocados: NOME DA EMPRESA\n\n   Produtos estocados por empresa:\n   - Physicians Total Care, Inc.: QUANTIDADE\n   - Newton Laboratories, Inc.: QUANTIDADE\n   - Forces of Nature: QUANTIDADE\n   ```\n\n##### As seguintes verificações serão feitas:\n\n- 2.1 - Será validado que é possível que o método `generate` da classe `CompleteReport` retorne a data de fabricação mais antiga\n\n- 2.2 - Será validado que é possível que o método `generate` da classe `CompleteReport` retorne a validade de fabricação mais próxima\n\n- 2.3 - Será validado que é possível que o método `generate` da classe `CompleteReport` retorne a empresa com maior estoque\n\n- 2.4 - Será validado que é possível que o método `generate` da classe `CompleteReport` retorne a quantidade de produtos por empresa\n\n- 2.5 - Será validado que é possível que o método `generate` da classe `CompleteReport` retorne o relatório no formato correto\n\n#### 3 - Criar um método `import_data` dentro de uma classe `Inventory` do módulo `inventory_report/inventory/inventory.py`, capaz de ler um arquivo CSV o qual o caminho é passado como parâmetro.\n\n- O método, receberá como parâmetro o caminho para o arquivo CSV e o tipo de relatório a ser gerado (`\"simples\"`, `\"completo\"`). De acordo com os parâmetros recebidos, deve recuperar os dados do arquivo e chamar o método de gerar relatório correspondente à entrada passada. Ou seja, o método da classe `Inventory` deve chamar o método `generate` da classe que vai gerar o relatório (`SimpleReport`, `CompleteReport`).\n\n##### As seguintes verificações serão feitas:\n\n- 3.1 - Será validado que ao importar um arquivo csv simples será retornado com sucesso\n\n- 3.2 - Será validado que ao importar um arquivo csv completo será retornado com sucesso\n\n#### 4 - Criar um método `import_data` dentro de uma classe `Inventory` do módulo `inventory_report/inventory/inventory.py`, capaz de ler um arquivo JSON o qual o caminho é passado como parâmetro.\n\n- O método, receberá como parâmetro o caminho para o arquivo JSON e o tipo de relatório a ser gerado (`\"simples\"`, `\"completo\"`). De acordo com os parâmetros recebidos, deve recuperar os dados do arquivo e chamar o método de gerar relatório correspondente à entrada passada. Ou seja, o método da classe `Inventory` deve chamar o método `generate` da classe que vai gerar o relatório (`SimpleReport`, `CompleteReport`).\n\n📌 Atente que estamos utilizando o mesmo método do requisito anterior.\n\n##### As seguintes verificações serão feitas:\n\n- 4.1 - Será validado que ao importar um arquivo json simples será retornado com sucesso\n\n- 4.2 - Será validado que ao importar um arquivo json completo será retornado com sucesso\n\n#### 5 - Criar um método `import_data` dentro de uma classe `Inventory` do módulo `inventory_report/inventory/inventory.py`, capaz de ler um arquivo XML o qual o caminho é passado como parâmetro.\n\n- O método, receberá como parâmetro o caminho para o arquivo XML e o tipo de relatório a ser gerado (`\"simples\"`, `\"completo\"`). De acordo com os parâmetros recebidos, deve recuperar os dados do arquivo e chamar o método de gerar relatório correspondente à entrada passada. Ou seja, o método da classe `Inventory` deve chamar o método `generate` da classe que vai gerar o relatório (`SimpleReport`, `CompleteReport`).\n\n📌 Atente que estamos utilizando o mesmo método do requisito anterior.\n\n##### As seguintes verificações serão feitas:\n\n- 5.1 - Será validado que ao importar um arquivo xml simples será retornado com sucesso\n\n- 5.2 - Será validado que ao importar um arquivo xml completo será retornado com sucesso\n\n#### 6 - Criar uma classe abstrata `Importer` no módulo `inventory_report/importer/importer.py`, que terá três classes herdeiras: `CsvImporter`, `JsonImporter` e `XmlImporter`, cada uma definida em seu respectivo módulo.\n\n- A classe abstrata deve definir a assinatura do método `import_data` a ser implementado por cada classe herdeira. Ela deve receber como parâmetro o nome do arquivo a ser importado.\n\n- O método `import_data` definido por cada classe herdeira deve lançar uma exceção caso a extensão do arquivo passado por parâmetro seja inválida. Por exemplo, quando se passa um  caminho de um arquivo extensão CSV para o `JsonImporter`.\n\n- O método deverá ler os dados do arquivo passado e retorná-los estruturados em uma lista de dicionários conforme exemplo abaixo:\n\n   ```json\n   [\n     {\n       \"id\": 1,\n       \"nome_do_produto\": \"CALENDULA OFFICINALIS FLOWERING TOP, GERANIUM MACULATUM ROOT, SODIUM CHLORIDE, THUJA OCCIDENTALIS LEAFY TWIG, ZINC, and ECHINACEA ANGUSTIFOLIA\",\n       \"nome_da_empresa\": \"Forces of Nature\",\n       \"data_de_fabricacao\": \"2020-07-04\",\n       \"data_de_validade\": \"2023-02-09\",\n       \"numero_de_serie\": \"FR48 2002 7680 97V4 W6FO LEBT 081\",\n       \"instrucoes_de_armazenamento\": \"in blandit ultrices enim lorem ipsum dolor sit amet consectetuer adipiscing elit proin interdum mauris non ligula pellentesque ultrices    phasellus\"\n     }\n   ]\n   ```\n\n##### As seguintes verificações serão feitas:\n\n- 6.1 - Será validado que a casse CsvImporter está herdando a classe Importer\n\n- 6.2 - Será validado que a casse JsonImporter está herdando a classe Importer\n\n- 6.3 - Será validado que a casse XmlImporter está herdando a classe Importer\n\n- 6.4 - Será validado que a classe CsvImporter esta importando os dados para uma lista\n\n- 6.5 - Será validado que a classe JsonImporter esta importando os dados para uma lista\n\n- 6.6 - Será validado que a classe XmlImporter esta importando os dados para uma lista\n\n- 6.7 - Será validado que ao enviar um arquivo com extensão incorreta para o CsvImporter irá gerar um erro\n\n- 6.8 - Será validado que ao enviar um arquivo com extensão incorreta para o JsonImporter irá gerar um erro\n\n- 6.9 - Será validado que ao enviar um arquivo com extensão incorreta para o XmlImporter irá gerar um erro\n\n👀 Estamos separando a lógica em várias classes (estratégias), preparando para aplicarmos o padrão de projeto **Strategy**. É uma solução para o caso em que uma classe possui muitas responsabilidades (propósitos).\n\n#### 7 - Criar uma classe `InventoryIterator` no módulo `inventory_report/inventory/inventory_iterator.py`, que implementa a interface de um iterator (`Iterator`). A classe `InventoryRefactor` deve implementar o método `__iter__`, que retornará este iterador.\n\n- A classe `Inventory` deverá ser refatorada (copiada) em outro arquivo chamado `inventory_report/inventory/inventory_refactor.py`. Nesse arquivo você irá refatorar a classe `Inventory` chamando-a de `InventoryRefactor`.\n\n- A classe `InventoryRefactor` deve utilizar as classes definidas no requisito 6 para lidar com a lógica de importação, via **composição** no método `import_data`.\n\n- A classe `InventoryRefactor` deve receber por seu construtor a classe que será utilizada para lidar com a lógica de importação e armazenar em um atributo chamado `importer`.\n\n- As classes `InventoryIterator` e `InventoryRefactor` devem implementar corretamente a interface do padrão de projeto **Iterator**, de modo que seja possível iterar sobre os itens em estoque.\n\n- Ao importar os dados, os mesmos devem ser armazenados na instância, em adição aos itens já presentes naquela instância. O atributo de `InventoryRefactor` que armazena esses dados deve se chamar `data`.\n\n- Os atributos e os métodos devem ser públicos.\n\n✍️  Para testar manualmente você pode fazer:\n\n```python\niterator = iter(inventory)\nfirst_item = next(iterator)\n```\n\n##### As seguintes verificações serão feitas:\n\n- 7.1 - Será validado que a instancia de InventoryRefactor é iterável (Iterable)\n\n- 7.2 - Será validado que é possivel iterar o primeiro item da lista usando csv\n\n- 7.3 - Será validado que é possivel iterar o primeiro item da lista usando json\n\n- 7.4 - Será validado que é possivel iterar o primeiro item da lista usando xml\n\n- 7.5 - Será validado que é possivel receber duas fontes de dados sem sobreescrita\n\n- 7.6 - Será validado que não é possivel enviar arquivo inválido\n\n\n## Requisitos bônus:\n\n#### 8 - Preencha a função `main` no módulo `inventory_report/main.py` que, ao receber pela linha de comando o caminho de um arquivo e o tipo de relatório, devolve o relatório correto.\n\n- Deverá ser usado a classe `InventoryRefactor` para recuperar os dados e gerar o relatório.\n\n- Ao chamar o comando no formato abaixo pelo terminal, deve ser impresso na tela o devido relatório no formato da saída dos requisitos `1` e `2`: \n\n```bash\n$ inventory_report \u003ccaminho_do_arquivo_input\u003e \u003ctipo_de_relatório\u003e\n```\n\n- Caso a chamada tenha menos de três argumentos (o nome `inventory_report` é considerado o primeiro argumento), exiba a mensagem de erro \"Verifique os argumentos\" na `stderr`.\n\n📌 A função `sys.argv` deve ser utilizada para receber a entrada de dados da pessoa usuária.\n\n✍️  Teste manual: dentro de um ambiente virtual onde seu projeto foi configurado, digite o comando `inventory_report parametro_1 parametro_2`, assim você conseguirá interagir com o menu.\n\n##### As seguintes verificações serão feitas:\n\n- 8.1 - Será validado se o menu importa um arquivo csv simples\n\n- 8.2 - Será validado se o menu importa um arquivo csv completo\n\n- 8.3 - Será validado se o menu importa um arquivo json simples\n\n- 8.4 - Será validado se o menu importa um arquivo json completo\n\n- 8.5 - Será validado se o menu importa um arquivo xml simples\n\n- 8.6 - Será validado se o menu importa um arquivo xml completo\n\n- 8.7 - Será validado se houverem argumentos faltantes será retornando um erro\n\n---\n\n## Depois de terminar o desenvolvimento\n\nPara sinalizar que o seu projeto está pronto para o _\"Code Review\"_ dos seus colegas, faça o seguinte:\n\n* Vá até a página **DO SEU** _Pull Request_, adicione a label de _\"code-review\"_ e marque seus colegas:\n\n  * No menu à direita, clique no _link_ **\"Labels\"** e escolha a _label_ **code-review**;\n\n  * No menu à direita, clique no _link_ **\"Assignees\"** e escolha **o seu usuário**;\n\n  * No menu à direita, clique no _link_ **\"Reviewers\"** e digite `students`, selecione o time `tryber/students-sd-010-a`.\n\nCaso tenha alguma dúvida, [aqui tem um video explicativo](https://vimeo.com/362189205).\n\n---\n\n## Revisando um pull request\n\nUse o conteúdo sobre [Code Review](https://app.betrybe.com/course/real-life-engineer/code-review/) para te ajudar a revisar os _Pull Requests_.\n\n---\n\n# Avisos finais\n\nAo finalizar e submeter o projeto, não se esqueça de avaliar sua experiência preenchendo o formulário. Leva menos de 3 minutos!\n\nLink: [FORMULÁRIO DE AVALIAÇÃO DE PROJETO](https://bit.ly/39qMu3s)\n\nO avaliador automático não necessariamente avalia seu projeto na ordem em que os requisitos aparecem no readme. Isso acontece para deixar o processo de avaliação mais rápido. Então, não se assuste se isso acontecer, ok?\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flmuffato%2Fproject-inventory-report-trybe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flmuffato%2Fproject-inventory-report-trybe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flmuffato%2Fproject-inventory-report-trybe/lists"}