Boas-vindas ao repositório do projeto ProFiler
Antes de começar, não deixe de ler o tópico [🧑💻 O que deverá ser desenvolvido]!
Arquivo a ser alterado:
pro_filer/actions/beta_actions.py
Você está colaborando com a comunidade open-source e recebeu uma tarefa de corrigir bugs em algumas funções!
Encontre e corrija o(s) bug(s) da função show_deepest_file
para que ela informe corretamente o caminho arquivo mais profundo dentro do diretório informado.
Execute os testes do arquivo tests/actions/test_deepest_file.py
para te ajudar a encontrar o(s) bug(s): você saberá que o(s) bug(s) foi(ram) corrigido(s) quando todos os testes desse arquivo passarem.
🤖 Comportamento esperado da função show_deepest_file
A função show_deepest_file
deve receber um dicionário context
com a chave all_files
e imprime na saída padrão (stdout
) o caminho do arquivo mais profundo dentro do diretório informado. A chave all_files
armazena uma lista de strings, que representam os caminhos de todos os arquivos dentro de um diretório.
O caminho mais profundo será o caminho que possui a maior quantidade de diretórios aninhados. Considere esse exemplo:
context = {
"all_files": [
"/home/trybe/Downloads/trybe_logo.png",
"/home/trybe/Documents/aula/python/tests.txt",
]
}
show_deepest_file(context)
# Saída:
# Deepest file: /home/trybe/Documents/aula/python/tests.txt
context = {
"all_files": []
}
show_deepest_file(context)
# Saída:
# No files found
Na primeira chamada, o arquivo com caminho mais profundo é /home/trybe/Documents/aula/python/tests.txt
, pois ele possui 5 diretórios aninhados: home
, trybe
e Documents
, aula
e python
.
Na segunda chamada, não há arquivos dentro do diretório informado, então a função imprime No files found
.
De olho na dica 👀: Essa função pode ser acionada pelo comando
pro-filer <caminho> deepest-file
!
📌 O que será testado
- A função
show_deepest_file
deve imprimir, na saída padrão (stdout
), o caminho do arquivo mais profundo dentro do diretório informado; - A função
show_deepest_file
deve imprimir, na saída padrão (stdout
),No files found
caso não haja arquivos listados no dicionáriocontext
; - Todos os testes do arquivo
tests/actions/test_deepest_file.py
devem passar.
Arquivo a ser alterado:
pro_filer/actions/beta_actions.py
Com a resolução do último bug, as pessoas responsáveis pela manutenção do projeto ficaram extremamente satisfeitas e agora estão solicitando uma nova tarefa para você!
Encontre e corrija o(s) bug(s) da função find_file_by_name
para que ela faça corretamente a busca de arquivos baseada em um termo de busca.
Execute os testes do arquivo tests/actions/test_find_file_by_name.py
para te ajudar a encontrar o(s) bug(s): você saberá que o(s) bug(s) foi(ram) corrigido(s) quando todos os testes desse arquivo passarem.
🤖 Comportamento esperado da função find_file_by_name
A função find_file_by_name
deve receber como parâmetro:
- um dicionário
context
com a chaveall_files
, que armazena uma lista de strings, representando os caminhos de todos os arquivos dentro de um diretório - uma string
search_term
com a string a ser buscada - (opcional) um booleano
case_sensitive
que indica se a busca deve ser sensível a maiúsculas e minúsculas ou não. O valor padrão éTrue
.
O retorno será uma lista de strings com os caminhos dos arquivos que possuem o termo buscado em seu nome.
A busca é realizada considerando apenas o nome do arquivo (com sua extensão), ignorando o nome das pastas. Considere esse exemplo:
context = {
"all_files": [
"/home/trybe/Downloads/Trybe_logo.png",
"/home/trybe/Documents/aula/python/tests.py",
]
}
find_file_by_name(context, '.py')
# Retorno: ["/home/trybe/Documents/aula/python/tests.py"]
find_file_by_name(context, 'trybe', case_sensitive=False)
# Retorno: ["/home/trybe/Downloads/Trybe_logo.png"]
context = {
"all_files": []
}
find_file_by_name(context, "trybe")
# Retorno: []
Na 1ª chamada, apenas o segundo arquivo é encontrado pois apenas ele possui o termo .py
em seu nome.
Já na 2ª chamada, apenas o primeiro arquivo é encontrado, pois apenas ele possui o termo Trybe
em seu nome. Como case_sensitive
foi passado como False
, a busca não diferencia maiúsculas de minúsculas.
E na 3ª chamada, não há arquivos dentro do dicionário context
, então a função retorna uma lista vazia.
De olho na dica 👀: Essa função pode ser acionada pelo comando
pro-filer <caminho> search-file <termo_de_busca>
!
📌 O que será testado
- A função
find_file_by_name
deve retornar uma lista com todos os caminhos de arquivos que possuem o a stringsearch_term
em seu nome, ignorando o nome das pastas; - A função
find_file_by_name
deve realizar a busca por arquivos considerando corretamente o parâmetrocase_sensitive
; - A função
find_file_by_name
deve retornar uma lista vazia caso não haja arquivos listados no dicionáriocontext
; - Todos os testes do arquivo
tests/actions/test_find_file_by_name.py
devem passar.
Arquivo a ser alterado:
tests/actions/test_show_preview.py
Agora que você já corrigiu bugs do projeto e mostrou que consegue trabalhar com o Pytest
, as pessoas encarregadas do projeto solicitaram que você desenvolva testes para as funções que ainda não foram testadas!
Implemente testes para a função show_preview
do arquivo pro_filer/actions/main_actions.py
para garantir que ela está funcionando corretamente. Os testes devem ser implementados no arquivo tests/actions/test_show_preview.py
. Você pode criar quantas funções de teste desejar, desde que respeite o padrão do Pytest
.
🤖 Comportamento esperado da função show_preview
A função show_preview
deve receber como parâmetro um dicionário context
com as chaves all_files
e all_dirs
:
all_files
armazena uma lista de strings, representando os caminhos de todos os arquivos dentro de um diretório;all_dirs
armazena uma lista de strings, representando os caminhos de todos os diretórios dentro de um diretório.
A função imprime na saída padrão (stdout
):
- A quantidade de arquivos e diretórios listados;
- Se houver algum dado nas chaves do dicionário
context
, os 5 primeiros arquivos listados; - Se houver algum dado nas chaves do dicionário
context
, os 5 primeiros diretórios listados.
Considere esse exemplo:
context = {
"all_files": ["src/__init__.py", "src/app.py", "src/utils/__init__.py"],
"all_dirs": ["src", "src/utils"]
}
show_preview(context)
# Saída:
# Found 3 files and 2 directories
# First 5 files: ['src/__init__.py', 'src/app.py', 'src/utils/__init__.py']
# First 5 directories: ['src', 'src/utils']
context = {
"all_files": [],
"all_dirs": []
}
show_preview(context)
# Saída:
# Found 0 files and 0 directories
Na 1 primeira chamada, a função imprime as informações como.
Na 2ª chamada, não há arquivos listados em all_files
, então a função imprime apenas o espaço total ocupado: 0
.
De olho na dica 👀: Essa função pode ser acionada pelo comando
pro-filer <caminho> preview
!
De olho na dica 👀: Execute o teste da Trybe
tests/trybe/show_preview_test.py
para verificar se seus testes cobrem todos os casos de uso previstos!
📌 O que será testado
- Os seus testes rejeitam implementações de
show_preview
que consideram apenasall_files
eall_dirs
vazios; - Os seus testes rejeitam implementações de
show_preview
que exibem mais do que 5 arquivos e/ou diretórios; - Os seus testes aprovam a implementação de
show_preview
presente empro_filer/actions/main_actions.py
.
📌 Como seu teste é avaliado
O teste da Trybe irá avaliar se os seus testes estão passando conforme seu objetivo, e se estão falhando em alguns casos que deveria falhar.
Executaremos as funções de teste que você escrever no arquivo indicado (tests/actions/test_show_preview.py
) substituindo a função sendo testada (show_preview
) por outras implementações "quebradas".
❌ Se seu teste aprovar alguma das implementações "quebradas", o teste da Trybe FALHARÁ, indicando que o requisito não está aprovado.
✅ Se seu teste rejeitar todas as implementações "quebradas", o teste da Trybe PASSARÁ, indicando que o requisito está aprovado.
Arquivo a ser alterado:
tests/actions/test_show_details.py
Parabéns por todas as contribuições feitas até aqui! O time responsável pelo projeto está gostando do seu trabalho e tem uma nova tarefa para você: criar testes para outra funcionalidade!
Implemente testes para a função show_details
do arquivo pro_filer/actions/main_actions.py
para garantir que ela está funcionando corretamente. Os testes devem ser implementados no arquivo tests/actions/test_show_details.py
. Você pode criar quantas funções de teste desejar, desde que respeite o padrão do Pytest
.
🤖 Comportamento esperado da função show_details
A função show_details
deve receber como parâmetro um dicionário context
com as chave base_path
, que armazena uma string representando o caminho do arquivo (ou diretório) que deve ser analisado. A função então imprime na saída padrão (stdout
) as seguintes informações:
- O nome do arquivo informado;
- O tamanho ocupado pelo arquivo informado;
- O tipo do arquivo informado (
file
oudirectory
); - A extensão do arquivo informado (ou
[no extension]
caso não possua extensão); - A data da última modificação do arquivo informado, no formato
yyyy-mm-dd
.
context = {
"base_path": "/home/trybe/Downloads/Trybe_logo.png"
}
show_details(context)
# Saída:
# File name: Trybe_logo.png
# File size in bytes: 22438
# File type: file
# File extension: .png
# Last modified date: 2023-06-13
context = {
"base_path": "/home/trybe/????"
}
show_details(context)
# Saída:
# File '????' does not exist
Na 1ª chamada, o arquivo é um arquivo comum, então a função imprime file
como tipo do arquivo e .png
como extensão.
Na 2ª chamada, o arquivo informado não existe, então a função imprime File '????' does not exist
.
De olho na dica 👀: Essa função pode ser acionada pelo comando
pro-filer <caminho> file-details
!
De olho na dica 👀: Execute o teste da Trybe
tests/trybe/show_details_test.py
para verificar se seus testes cobrem todos os casos de uso previstos!
📌 O que será testado
- Os seus testes rejeitam implementações de
show_details
que não utilizam as mensagens corretas para exibir cada informação; - Os seus testes rejeitam implementações de
show_details
que utilizam o formato de data incorreto; - Os seus testes rejeitam implementações de
show_details
que não tratam corretamente o caso de o arquivo informado não existir; - Os seus testes rejeitam implementações de
show_details
que não tratam corretamente o caso de o arquivo não possuir extensão; - Os seus testes aprovam a implementação de
show_details
presente empro_filer/actions/main_actions.py
.
📌 Como seu teste é avaliado
O teste da Trybe irá avaliar se os seus testes estão passando conforme seu objetivo, e se estão falhando em alguns casos que deveria falhar.
Executaremos as funções de teste que você escrever no arquivo indicado (tests/actions/test_show_details.py
) substituindo a função sendo testada (show_details
) por outras implementações "quebradas".
❌ Se seu teste aprovar alguma das implementações "quebradas", o teste da Trybe FALHARÁ, indicando que o requisito não está aprovado.
✅ Se seu teste rejeitar todas as implementações "quebradas", o teste da Trybe PASSARÁ, indicando que o requisito está aprovado.
Arquivo a ser alterado:
tests/actions/test_show_disk_usage.py
Continuando suas contribuições no projeto, precisamos que você crie testes para mais uma funcionalidade importante do projeto!
Implemente testes para a função show_disk_usage
do arquivo pro_filer/actions/main_actions.py
para garantir que ela está funcionando corretamente. Os testes devem ser implementados no arquivo tests/actions/test_show_disk_usage.py
. Você pode criar quantas funções de teste desejar, desde que respeite o padrão do Pytest
.
🤖 Comportamento esperado da função show_disk_usage
A função show_disk_usage
deve receber como parâmetro um dicionário context
com a chave all_files
, que armazena uma lista de strings representando os caminhos de todos os arquivos dentro de um diretório. A função então imprime na saída padrão (stdout
) o espaço total ocupado por todos os arquivos dentro do diretório informado.
A função então imprime na saída padrão (stdout
) as seguintes informações:
- Para cada arquivo listado em
all_files
:- O caminho do arquivo;
- O espaço ocupado pelo arquivo, em bytes;
- A porcentagem do tamanho ocupado pelo arquivo em relação ao espaço total ocupado (por todos os arquivos listados em
all_files
);
- O espaço total ocupado por todos os arquivos listados em
all_files
, em bytes.
A listagem de arquivos é realizada em ordem decrescente de espaço ocupado. Considere esse exemplo:
context = {
"all_files": [
"src/app.py",
"src/__init__.py",
]
}
show_disk_usage(context)
# Saída:
# 'src/app.py': 2849 (100%)
# 'src/__init__.py': 0 (0%)
# Total size: 2849
context = {
"all_files": []
}
show_disk_usage(context)
# Saída:
# Total size: 0
Na 1 primeira chamada, a função imprime a listagem de arquivos e seu tamanho em bytes com a porcentagem do total e, ao final, o espaço total ocupado pelos arquivos listados.
Na 2ª chamada, não há arquivos listados em all_files
, então a função imprime apenas o espaço total ocupado: 0
.
Atenção show_disk_usage
, a formatação de cada linha da listagem de arquivos é feita com auxílio da função _get_printable_file_path
. Não se preocupe em validar o comportamento dessa função, você pode criar um dublê de teste para ela.
De olho na dica 👀: Essa função pode ser acionada pelo comando
pro-filer <caminho> disk-usage
!
De olho na dica 👀: Execute o teste da Trybe
tests/trybe/show_disk_usage_test.py
para verificar se seus testes cobrem todos os casos de uso previstos!
📌 O que será testado
- Os seus testes rejeitam implementações de
show_disk_usage
que não calculam corretamente o espaço total ocupado pelos arquivos listados emall_files
; - Os seus testes rejeitam implementações de
show_disk_usage
que consideram todos os arquivos como vazios; - Os seus testes rejeitam implementações de
show_disk_usage
que não ordenam corretamente a listagem de arquivos; - Os seus testes aprovam a implementação de
show_disk_usage
presente empro_filer/actions/main_actions.py
; - Os seus testes utilizam a fixture
tmp_path
para criar arquivos temporários.
📌 Como seu teste é avaliado
O teste da Trybe irá avaliar se os seus testes estão passando conforme seu objetivo, e se estão falhando em alguns casos que deveria falhar.
Executaremos as funções de teste que você escrever no arquivo indicado (tests/actions/test_show_disk_usage.py
) substituindo a função sendo testada (show_disk_usage
) por outras implementações "quebradas".
❌ Se seu teste aprovar alguma das implementações "quebradas", o teste da Trybe FALHARÁ, indicando que o requisito não está aprovado.
✅ Se seu teste rejeitar todas as implementações "quebradas", o teste da Trybe PASSARÁ, indicando que o requisito está aprovado.
Arquivo a ser alterado:
tests/actions/test_find_duplicate_files.py
Para concluir sua participação na temporada de melhorias, as pessoas responsáveis pelo projeto têm uma última tarefa para você: criar testes para uma funcionalidade final!
Implemente testes para a função find_duplicate_files
do arquivo pro_filer/actions/main_actions.py
para garantir que ela está funcionando corretamente. Os testes devem ser implementados no arquivo tests/actions/test_find_duplicate_files.py
. Você pode criar quantas funções de teste desejar, desde que respeite o padrão do Pytest
.
🤖 Comportamento esperado da função find_duplicate_files
A função find_duplicate_files
deve receber como parâmetro um dicionário context
com a chave all_files
, que armazena uma lista de strings representando os caminhos de todos os arquivos dentro de um diretório.
A função então retorna uma lista de tuplas com os pares de arquivos que possuem o mesmo conteúdo.
Considere esse exemplo:
context = {
"all_files": [
".gitignore",
"src/app.py",
"src/utils/__init__.py",
]
}
find_duplicate_files(context)
# Retorno:
# []
context = {
"all_files": [
"./tests/__init__.py",
"./tests/actions/__init__.py",
"./pro_filer/__init__.py",
]
}
find_duplicate_files(context)
# Retorno:
# [
# ('./tests/__init__.py', './tests/actions/__init__.py'),
# ('./tests/__init__.py', './pro_filer/__init__.py'),
# ('./tests/actions/__init__.py', './pro_filer/__init__.py')
# ]
Na 1 primeira chamada, o resultado é uma lista vazia pois não há arquivos duplicados: todos os arquivos possuem conteúdos diferentes.
Na 2ª chamada, o resultado é uma lista de tuplas com todos os pares de arquivos duplicados. Como todos os arquivos possuem o mesmo conteúdo, todos os pares são retornados.
Atenção
⚠️ : Como pode ser observado na implementação defind_duplicate_files
, a comparação de conteúdo de arquivos é feita com auxílio da funçãofilecmp.cmp(...)
. Essa função é nativa do Python, e compara o conteúdo dos arquivos (retornandoTrue
se forem iguais). Caso algum dos arquivos não exista, é levantada uma exceçãoFileNotFoundError
.
Caso a exceção FileNotFoundError
seja levantada na chamada de filecmp.cmp(...)
, a função find_duplicate_files
levantará uma exceção ValueError
. Você deve testar se a exceção ValueError
é levantada caso algum arquivo em all_files
não exista.
De olho na dica 👀: Essa função pode ser acionada pelo comando
pro-filer <caminho> find-duplicate
!
De olho na dica 👀: Execute o teste da Trybe
tests/trybe/find_duplicate_test.py
para verificar se seus testes cobrem todos os casos de uso previstos!
📌 O que será testado
- Os seus testes rejeitam implementações de
find_duplicate_files
que consideram todos os arquivos emall_files
como diferentes; - Os seus testes rejeitam implementações de
find_duplicate_files
que consideram todos os arquivos emall_files
como iguais; - Os seus testes rejeitam implementações de
find_duplicate_files
que não levantaValueError
caso algum arquivo emall_files
não exista; - Os seus testes aprovam a implementação de
find_duplicate_files
presente empro_filer/actions/main_actions.py
; - Os seus testes utilizam a fixture
tmp_path
para criar arquivos temporários.
📌 Como seu teste é avaliado
O teste da Trybe irá avaliar se os seus testes estão passando conforme seu objetivo, e se estão falhando em alguns casos que deveria falhar.
Executaremos as funções de teste que você escrever no arquivo indicado (tests/actions/test_show_disk_usage.py
) substituindo a função sendo testada (show_disk_usage
) por outras implementações "quebradas".
❌ Se seu teste aprovar alguma das implementações "quebradas", o teste da Trybe FALHARÁ, indicando que o requisito não está aprovado.
✅ Se seu teste rejeitar todas as implementações "quebradas", o teste da Trybe PASSARÁ, indicando que o requisito está aprovado.
🗣 Nos dê feedbacks sobre o projeto!
Ao finalizar e submeter o projeto, não se esqueça de avaliar sua experiência preenchendo o formulário. Leva menos de 3 minutos!
🗂 Compartilhe seu portfólio!
Você sabia que o LinkedIn é a principal rede social profissional e compartilhar o seu aprendizado lá é muito importante para quem deseja construir uma carreira de sucesso? Compartilhe esse projeto no seu LinkedIn, marque o perfil da Trybe (@trybe) e mostre para a sua rede toda a sua evolução.