Skip to content

Latest commit

 

History

History
247 lines (191 loc) · 10.1 KB

README.md

File metadata and controls

247 lines (191 loc) · 10.1 KB

Story: Mineração de Dados Legislativos

Nota do Wells: Esse desafio faz parte de uma série de desafios e quaisquer informações adicionais e/ou ajuda que você precise, é só conferir aqui no Guia oficial dos Desafios JS Expert! Bons estudos e ótimo desafio! 🚀

Motivação

Com o objetivo de trazer cenários reais aplicando os conteúdos vistos no módulo 06 - Expressões Regulares - RegExp, a idéia é levar vocês a fazer um "CSV parser" customizado usando Expressões Regulares para obter as informações de dentro de um arquivo CSV, mas não só isso como também aplicar essas Expressões Regulares nas informações retornadas para extrair ainda mais informação de valor, formatação e padronização ao nosso código final, tudo isso enquanto usamos TDD na prática aprendendo padrões de projeto como Fluent API e Facade, e também entendemos mais sobre a validação de segurança de Expressões Regulares!

Idéia geral

A Assembléia Legislativa de São Paulo (ALESP), onde se organiza o poder legislativo estadual do Estado de São Paulo - que é onde se propõem e discutem as leis a entrarem ou não em vigor no estado -, seguindo os preceitos da política de dados abertos do governo federal, disponibiliza os dados sobre a Legislação do Estado de São Paulo (como Proposições, Processos e demais informações que vocês podem ver no Portal de dados abertos da ALESP) para o público geral.

Resumindo essa questão dos Dados Abertos:

"Qualquer pessoa pode livremente usá-los, reutilizá-los e redistribuí-los, estando sujeito a, no máximo, a exigência de creditar a sua autoria e compartilhar pela mesma licença." - Definição de Dados Abertos pela Open Knowledge Foundation, mencionada em ambos os portais de Dados Abertos citados anteriormente.

Esses dados podem ser amplamente utilizados em diversos segmentos empresariais, especialmente os que oferecem Monitoramento Legislativo sobre o andamento de Projetos de lei e propostas do gênero que visem mudar a estrutura legal do Estado - que é o tipo de coisa que toda e qualquer empresa que lide com a Estrutura Urbana, Organização Social, Mobilidade e afins, como Uber, AirBnB, Yellow, e afins; precisa se preocupar constantemente -.

O projeto

Pensando na importância dos dados mencionados a pouco, dentre esta vastidão de dados disponibilizados no Portal de dados abertos da ALESP, usaremos como base o CSV de Projetos de Lei para fazer uma aplicação que lê os projetos de lei presentes no CSV e extrai informações úteis sobre eles, facilitando a busca e exibição desses dados em outros portais no futuro.

Etapa 1 - Leitura do CSV

Usando Expressões Regulares e o Projeto base feito em aula durante o módulo 06, faça uma aplicação usando os padrões de projeto Fluent API e Facade que leia e extraia as informações presentes no CSV de Projetos de Lei fornecido no desafio e as deixe prontas para o uso da aplicação.

image

Objetivo

Ler e deixar utilizáveis os campos título, link, autor, etapa, ementa e indexadoresnorma.

Objeto de exemplo

{
  título: 'Projeto de lei 584/2016',
  link: 'http://www.al.sp.gov.br/propositura?id=1322563',
  autor: 'Jorge Wilson Xerife do Consumidor',
  etapa: 'PAUTA',
  ementa:
    'Dispõe sobre a inclusão de cláusula nos contratos de adesão aos serviços de telefonia fixa, de telefonia móvel e de banda larga móvel, e dá outras providências.',
  indexadoresnorma:
    'CONTRATO, OBRIGATORIEDADE, CLÁUSULA, SERVIÇO, TELEFONIA MÓVEL, TELEFONIA FIXA, PRAZO, INCLUSÃO, RESCISÃO CONTRATUAL, LIBERAÇÃO',
}

Arquivos pertinentes:

  • index.js: responsável por instanciar o TextProcessorFacade, ler o arquivo CSV e fornecer o texto contido no CSV à instância do TextProcessorFacade.
  • textProcessorFacade.js: responsável por abstrair a execução do TextProcessorFluentAPI implementando um método getProjectsFromCSV que contém as chamadas ao Fluent API em ordem.
  • textProcessorFluentAPI.js: responsável por implementar a Fluent API separando em etapas o processo de leitura e formatação do arquivo.

Etapa 2 - Extração de dados úteis

Usando Expressões Regulares e o TextProcessorFluentAPI feito na Etapa 1, crie uma classe que receba como valores os campos "raw" (título, link, autor, etapa, ementa e indexadoresnorma) e extraia informações úteis desses campos, retornando no construtor uma instância formatada com informações pertinentes.

image

Objetivo

Criar uma classe que receba no construtor os campos título, link, autor, etapa, ementa e indexadoresnorma e retorne uma instância com os campos id, numero, ano, autores, url e indexadores.

Objeto de exemplo:

{
  id: '1322563',
  numero: '584',
  ano: '2016',
  autores: [
    {
      nome: 'Jorge Consumidor',
    },
  ],
  url: 'http://www.al.sp.gov.br/propositura?id=1322563',
  indexadores: [
    'CONTRATO',
    'OBRIGATORIEDADE',
    'CLÁUSULA',
    'SERVIÇO',
    'TELEFONIA MÓVEL',
    'TELEFONIA FIXA',
    'PRAZO',
    'INCLUSÃO',
    'RESCISÃO CONTRATUAL',
    'LIBERAÇÃO',
  ],
},

Arquivos pertinentes:

  • textProcessorFluentAPI.js: responsável por implementar na Fluent API um método que chama a classe de mapeamento.
  • project.js: responsável por implementar a classe Project conforme mencionado acima.

Requisitos do desafio

  • Uso de TDD do início ao fim do projeto
  • Testes Unitários e 100% de Code Coverage image
  • Uso de Expressões Regulares
  • Validação de segurança de Expressões Regulares
  • Uso do padrão Fluent API e também o padrão Facade

Dica do Wells: parece difícil, mas é só se basear no Projeto base feito em aula durante o módulo 06 que fica tranquilo, confia! :)

Dicas

  • Atendendo a pedidos, agora temos ainda mais dicas de como resolver o desafio, pro caso de em algum momento você ficar preso durante o desenvolvimento. O arquivo DICAS_EXTRAS.md no projeto pode te ajudar.

  • Lembre-se que para trabalhar com Expressões Regulares, é possível testar elas em tempo real usando o site Regex101, e lembre-se sempre que além das aulas e das anotações, pesquisar no Google e fazer calls na comunidade do discord pode ser algo muito bom caso você fique preso testando as regex.

Dica Wells do dia: Seguir certinho o passo a passo usando TDD muito provavelmente vai deixar as coisas bem mais fáceis também :)

  • Usar o comando npm run test:dev e inserir um .only() no teste em que estiver trabalhando pode ajudar a focar nas mensagens de erro e na implementação de 1 teste por vez.

  • Sinta-se livre para traçar sua próprie estratégia de desenvolvimento, mas caso precise, esse print do projeto com 100% de code coverage pode trazer umas idéias das etapas/testes necessários pra concluir o desafio image

  • Para melhorar sua experiência de desenvolvimento, você pode usar a extensão TODO Highlight no VSCode, recebendo o auxilio visual para encontrar os //TODO: comments, assim: image

Extras

  • Dessa vez não tem desafio opcional, já que ele ficaria muito complexo, maaas, como sempre, para quem busca os "próximos passos" e um desafio ainda maior que o proposto, lá no arquivo test/mock/valid.js tem uma sessão de "Nota extra + Dica do Wells" que pode servir de base para um "desafio extra" - mas eu fortemente recomendo que você faça o desafio normal primeiro :)

Arquitetura e onde trabalhar

project
│   README.md
│   package.json
│
└───docs
│   │  projeto-de-lei.csv
│
└───src
│   │  index.js
│   │  project.js
│   │  textProcessorFacade.js
│   │  textProcessorFluentAPI.js
│   │  util.js
│
└───test
│   │  project.test.js
│   │  textProcessorFluentAPI.test.js
│   │  util.test.js
│   │
│   └───mock
│   │   │   valid.js
│   │
│

Submissão

  1. Crie um fork deste repositório e modifique o README.md inserindo o seu nome no início do arquivo.

  2. Instale as dependências usando npm i.

  3. Implemente cada um dos arquivos esperados (com um //@TODO: comment no início)

  4. Envie o link no canal #desafios-jsexpert da nossa comunidade no discord.

Até quando?

Se você está pegando esse desafio na estréia, corre lá e envia pra gente até Quinta-feira, 28 de abril de 2022 (28/04/2022)!

Dica extra do Wells: Data de entrega curiosamente no dia do aniversário de 22 anos desse que vos fala, então se terminar o desafio no último dia, só vai ser aceito se mandar um parabéns no chat, hein? 😄 Bons estudos e ótimo desafio!