ProFiler

Boas-vindas ao repositório do projeto ProFiler

Requisitos do projeto

Antes de começar, não deixe de ler o tópico [🧑‍💻 O que deverá ser desenvolvido]!

1. Elimine o(s) bug(s) da função show_deepest_file

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ário context;
  • Todos os testes do arquivo tests/actions/test_deepest_file.py devem passar.

2. Elimine o(s) bug(s) da função find_file_by_name

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 chave all_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 string search_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âmetro case_sensitive;
  • A função find_file_by_name deve retornar uma lista vazia caso não haja arquivos listados no dicionário context;
  • Todos os testes do arquivo tests/actions/test_find_file_by_name.py devem passar.

3. Crie testes para a função show_preview

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 apenas all_files e all_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 em pro_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.

4. Crie testes para a função show_details

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 ou directory);
  • 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 em pro_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.

5. Crie testes para a função show_disk_usage

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 ⚠️: Como pode ser observado na implementação de 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 em all_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 em pro_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.

6. Crie testes para a função find_duplicate_files

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 de find_duplicate_files, a comparação de conteúdo de arquivos é feita com auxílio da função filecmp.cmp(...). Essa função é nativa do Python, e compara o conteúdo dos arquivos (retornando True se forem iguais). Caso algum dos arquivos não exista, é levantada uma exceção FileNotFoundError.

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 em all_files como diferentes;
  • Os seus testes rejeitam implementações de find_duplicate_files que consideram todos os arquivos em all_files como iguais;
  • Os seus testes rejeitam implementações de find_duplicate_files que não levanta ValueError caso algum arquivo em all_files não exista;
  • Os seus testes aprovam a implementação de find_duplicate_files presente em pro_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!

Formulário de avaliação do projeto

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