Implemente em: src/jobs.py
Para começarmos a processar os dados, devemos antes carregá-los em nossa aplicação. Esta função será responsável por abrir o arquivo CSV e retornar os dados no formato de uma lista de dicionários.
- A função deve receber um path (uma string com o caminho para um arquivo).
- A função deve abrir o arquivo e ler seus conteúdos.
- A função deve tratar o arquivo como CSV.
- A função deve retornar uma lista de dicionários, onde as chaves são os cabeçalhos de cada coluna e os valores correspondem a cada linha.
📝Exemplo
Se o conteúdo do arquivo for:nome,cidade,telefone
Ana,Curitiba,1111111
Bernardo,Santos,999999
O retorno da função deverá ser:
[
{"nome": "Ana", "cidade": "Curitiba", "telefone": "1111111"},
{"nome": "Bernardo", "cidade": "Santos", "telefone": "999999"}
]✍️ Teste manual
Abra um terminal Python importando estas funções através do comandopython3 -i src/jobs.py e invoque a função utilizando diferentes _paths_.
🤖 O que será verificado pelo avaliador
- A função abre o arquivo passado como parâmetro
- A função retorna uma lista de dicionários
- A função retorna a quantidade correta de itens na lista
- Nos dicionários retornados pela função, as chaves correspondem aos cabeçalhos do arquivo
Implemente em:
src/insights.py
Agora que temos como carregar os dados, podemos começar a extrair informação deles. Primeiro, vamos identificar quais tipos de empregos existem.
- A função deve receber o path do arquivo csv com os dados.
- A função deve invocar a função
jobs.readcom o path recebido para obter os dados. - A função deve retornar uma lista de valores únicos presentes na coluna
job_type.
🤖 O que será verificado pelo avaliador
- A função carrega os dados do arquivo recebido como parâmetro
- A função retorna a quantidade correta de valores
- A função retorna os valores corretos
- A função desconsidera valores vazios
Implemente em:
src/insights.py
Da mesma forma, agora iremos identificar quais indústrias estão representadas nesse conjunto de dados.
- A função deve obter os dados da mesma forma que o requisito 2.
- A função deve retornar uma lista de valores únicos presentes na coluna
industry. - A função desconsidera valores vazios
🤖 O que será verificado pelo avaliador
- A função carrega os dados do arquivo recebido como parâmetro
- A função retorna a quantidade correta de valores
- A função retorna os valores corretos
Implemente em:
src/insights.py
Os dados apresentam faixas salariais para cada emprego exibido. Vamos agora encontrar o maior valor de todas as faixas.
- A função deve obter os dados da mesma forma que o requisito 2.
- A função deve ignorar os valores ausentes.
- A função deve retornar um valor inteiro com o maior salário presente na coluna
max_salary.
🤖 O que será verificado pelo avaliador
- A função carrega os dados do arquivo recebido como parâmetro
- A função retorna o valor correto
Implemente em:
src/insights.py
Os dados apresentam faixas salariais para cada emprego exibido. Vamos agora encontrar o menor valor de todas as faixas.
- A função deve obter os dados da mesma forma que o requisito 2.
- A função deve ignorar os valores ausentes.
- A função deve retornar um valor inteiro com o menor salário presente na coluna
min_salary.
🤖 O que será verificado pelo avaliador
- A função carrega os dados do arquivo recebido como parâmetro
- A função retorna o valor correto
Implemente em:
src/insights.py
Os empregos estão listados em um aplicativo web. Para permitir que a pessoa usuária possa filtrar os empregos por tipo de emprego, vamos precisar implementar esse filtro.
- A função deve receber uma lista de dicionários
jobscomo primeiro parâmetro. - A função deve receber uma string
job_typecomo segundo parâmetro. - A função deve retornar uma lista com todos os empregos onde a coluna
job_typecorresponde ao parâmetrojob_type.
🤖 O que será verificado pelo avaliador
- A função retorna a quantidade correta de valores
- A função retorna os valores corretos
- A função retorna os valores na ordem correta
- A função retorna uma lista vazia para
job_typesausentes nosjobsrecebidos
Implemente em:
src/insights.py
Do mesmo modo, o aplicativo precisa permitir uma filtragem por indústria. Vamos precisar implementar esse filtro também.
- A função deve receber uma lista de dicionários
jobscomo primeiro parâmetro. - A função deve receber uma string
industrycomo segundo parâmetro. - A função deve retornar uma lista de dicionários com todos os empregos onde a coluna
industrycorresponde ao parâmetroindustry.
🤖 O que será verificado pelo avaliador
- A função retorna a quantidade correta de valores
- A função retorna os valores corretos
- A função retorna os valores na ordem correta
- A função retorna uma lista vazia para
job_typesausentes nosjobsrecebidos
Implemente em:
src/insights.py
O aplicativo vai precisar filtrar os empregos por salário também. Como uma função auxiliar, implemente matches_salary_range para conferir que o salário procurado está dentro da faixa salarial daquele emprego. Vamos aproveitar também para conferir se a faixa salarial faz sentido -- isto é, se o valor mínimo é menor que o valor máximo.
- A função deve receber um dicionário
jobcomo primeiro parâmetro, com as chavesmin_salaryemax_salary. - A função deve receber um inteiro
salarycomo segundo parâmetro. - A função deve lançar um erro
ValueErrornos seguintes casos:- alguma das chaves
min_salaryoumax_salaryestão ausentes no dicionário; - alguma das chaves
min_salaryoumax_salarytem valores não-numéricos; - o valor de
min_salaryé maior que o valor demax_salary; - o parâmetro
salarytem valores não numéricos;
- alguma das chaves
- A função deve retornar
Truese o salário procurado estiver dentro da faixa salarial ouFalsese não estiver.
🤖 O que será verificado pelo avaliador
- A função retorna o booleano correto
- A função lança um
ValueErrorse o valor demin_salaryfor maior que o valor demax_salary - A função lança um
ValueErrorse as chavesmin_salaryoumax_salarytiverem valores não numéricos - A função lança um
ValueErrorse o parâmetrosalarytiver valor não numérico - A função lança um
ValueErrorse as chavesmin_salaryoumax_salaryestiverem ausentes no dicionário
Implemente em:
src/insights.py
Agora vamos implementar o filtro propriamente dito. Para esta filtragem, podemos usar a função auxiliar implementada no requisito anterior -- tomando o cuidado de descartar os empregos que apresentarem faixas salariais inválidas.
- A função deve receber uma lista de dicionários
jobscomo primeiro parâmetro. - A função deve receber um inteiro
salarycomo segundo parâmetro. - A função deve ignorar os empregos com valores inválidos para
min_salaryoumax_salary. - A função deve retornar uma lista com todos os empregos onde o salário
salaryestiver entre os valores da colunamin_salaryemax_salary.
🤖 O que será verificado pelo avaliador
- A função retorna a quantidade correta de valores
- A função retorna os valores corretos
- A função retorna os valores na ordem correta
- Empregos onde as chaves
min_salaryoumax_salarytiverem valores não numéricos devem ser ignorados - Empregos onde o valor de
min_salaryfor maior que o valor demax_salarydevem ser ignorados
Implemente em:
tests/counter/test_counter.py
A empresa cliente contratou um relatório que informa a quantidade de ocorrências das palavra Python e Javascript nos dados e, para isso, temos uma implementação pronta em src/counter.py. Durante o desenvolvimento, sofremos com alguns bugs, que já foram resolvidos. Para termos certeza e confiança da nossa entrega, no entanto, e não corrermos riscos, precisaremos de testes automatizados que garantam isso!
O nome deste teste deve ser test_counter, e ele deve garantir que atenda estas especificações:
- Chamar a função
count_ocurrencespassando dois parâmetros:pathuma string com o caminho do arquivo (src/jobs.csv);worduma string com a palavra a ser contabilizada.
- Garantir que a função retorna corretamente a quantidade de ocorrências da palavra solicitada
- A contagem de palavras deve ser case insentitive, ou seja, não diferenciar letras maiúsculas de minúsculas
📌Como seu teste é avaliado
O teste da Trybe irá avaliar se o seu teste está passando conforme seu objetivo e confirmará se ele está falhando em alguns casos que deve falhar. Para estes testes que esperemos que falhe, o requisito será considerado atendido quando a resposta do Pytest forXFAIL(Expected Fail) ao invés de PASS ou FAIL.
🤖 O que será verificado pelo avaliador
- O teste rejeita implementações que não retornam a quantidade de palavras corretamente.
- O teste aprova implementações corretas.
- Se o teste não é um falso positivo, ou seja, teste que passa sem realmente testar o código.