Skip to content

Latest commit

 

History

History
285 lines (202 loc) · 10.4 KB

README.md

File metadata and controls

285 lines (202 loc) · 10.4 KB

Exercício Instruct The Women 👩‍💻

Neste repositório você encontra o enunciado do exercício técnico para a vaga de trainee do programa Instruct The Women organizado pela Instruct em parceria com a Se Candidate, Mulher!.

Para saber mais sobre a empresa, leia o FAQ

Requisitos

  • Possuir uma conta no GitHub
  • Navegador Chrome ou Firefox
  • Familiaridade com VS Code

O que é importante você saber

  • Conhecer HTTP e APIs Rest
  • Saber sobre métodos HTTP como GET, POST e DELETE
  • Conhecer sobre JSON e estruturas como listas e dicionários (Arrays e Objects)

Ambiente de Desenvolvimento

Para esse exercício vamos utilizar um ambiente totalmente no browser e que não requer nenhuma instalação em seu computador.

É possível fazer o exercício localmente no seu computador. Nesse caso, a configuração de ferramentas para desenvolvimento é de sua responsabilidade e não temos como ajudar todas as participantes.

Faça um fork

Primeiro, crie um fork deste repositório com sua conta no GitHub.

Em termos simples, um fork é cópia de um repositório. Leia a documentação do GitHub para saber mais.

A partir de agora, todas as ações devem ser feitas no seu fork!

Ele estará disponível dessa forma: https://github.com/SEU_LOGIN/instruct-the-women-2021

Usando o browser (recomendado)

Abra o seu fork em uma aba do seu browser.

Você estará na sua cópia do repositório original.

Então, na sua cópia do repositório aberta, clique no botão abaixo:

Gitpod Ready-to-Code

Você será redirecionada para o gitpod.io e será necessário criar uma conta gratuita usando sua conta do GitHub.

Uma janela será aberta solicitando que você autorize o gitpod.io a acessar sua conta do GitHub.

Após a confirmação da solicitação de autorização, uma instância do VS Code será criada para você.

Aguarde alguns instantes, cerca de 2 a 3 minutos até o término do carregamento do ambiente.

Usando seu computador (avançado)

⚠️ Não temos como ajudar caso a caso as participantes na configuração de um ambiente de desenvolvimento. Se você não se sentir segura, use o ambiente pronto no browser que preparamos.

Caso já tenha experiência, também é possível clonar este repositório git no seu computador e desenvolver em ambiente local. Os requisitos são:

  • Python 3.8
  • pipenv
  • Bibliotecas de desenvolvimento para PostgreSQL (libpq-dev)

Você vai precisar também do k6 para testar seu projeto. Para instalar o k6 basta baixar o binário para o seu sistema operacional (Windows, Linux ou Mac).

E para fazer o deploy quando terminar, é necessário instalar o Heroku CLI.

Se você está num computador com Windows, é recomendado seguir o tutorial da Microsoft para configurar um ambiente de desenvolvimento com WSL.

O problema

A equipe de desenvolvimento Bleeding Edge Enthusiasts (BEE) se orgulha de usar as tecnologias mais recentes e modernas. Essa regra também se aplica aos projetos desenvolvidos em Python pela equipe BEE.

Quando uma funcionalidade não existe nativamente no interpretador Python, a equipe faz uso dos chamados pacotes. De maneira simples, um pacote é um conjunto de códigos prontos para serem usados por qualquer pessoa e que facilitam o desenvolvimento.

Para garantir que todos seus projetos em Python estão usando as últimas versões disponíves dos pacotes, a equipe pensou em criar uma ferramenta batizada de MagPy. A ferramenta recebe um nome de projeto, uma lista de pacotes e devolve a última versão de cada pacote.

Um dos integrantes da BEE apontou que a API pública do PyPI poderia ser usada para esse fim.

Solução

Você deve desenvolver a MagPy, uma API REST que gerencia uma coleção de projetos, sendo:

  • Cada projeto tem um nome e uma lista de pacotes.
  • Cada pacote tem um nome e uma versão.

O cadastro de um projeto recebe o nome e a lista de pacotes. Cada pacote da lista precisa obrigatoriamente especificar um nome, mas a versão é opcional.

Sua API deve validar o projeto cadastrado: todos os pacotes informados devem estar cadastrados no PyPI. Portanto você deve verificar o nome e a versão do pacote.

Quando o pacote vem apenas com o nome, sua API deve assumir que é preciso usar a última versão publicada no PyPI.

Abaixo, alguns exemplos de chamadas que serão feitas nessa API:

POST /api/projects
{
    "name": "titan",
    "packages": [
        {"name": "Django"},
        {"name": "graphene", "version": "2.0"}
    ]
}

O código HTTP de retorno deve ser 201 e o corpo esperado na resposta é:

{
    "name": "titan",
    "packages": [
        {"name": "Django", "version": "3.2.5"},  // Usou a versão mais recente
        {"name": "graphene", "version": "2.0"}   // Manteve a versão especificada
    ]
}

Se um dos pacotes informados não existir, ou uma das versões especificadas for inválida, um erro deve ser retornado.

Para uma chamada semelhante ao exemplo abaixo:

POST /api/projects
{
    "name": "titan",
    "packages": [
        {"name": "pypypypypypypypypypypy"},
        {"name": "graphene", "version": "1900"}
    ]
}

O código HTTP de retorno deve ser 400 e o corpo esperado na resposta é:

{
    "error": "One or more packages doesn't exist"
}

Também deve ser possível visitar projetos previamente cadastrados, usando o nome na URL:

GET /api/projects/titan
{
    "name": "titan",
    "packages": [
        {"name": "Django", "version": "3.2.5"},
        {"name": "graphene", "version": "2.0"}
    ]
}

E deletar projetos pelo nome:

DELETE /api/projects/titan
⚠️ Sua solução deve usar a API pública do PyPI. Não use outro caminho pra buscar as informações necessárias

Implementação

Este repositório tem parte da solução implementada e você deve continuar para que o projeto atenda a especificação descrita acima. Também está adiantado algumas configurações para publicação do projeto no Heroku. Este projeto usa principalmente Django e Django REST framework.

O projeto tem as assinaturas de algumas funções e métodos para orientar uma solução, mas você pode alterar o código à vontade, desde que a solução final passe nos testes. Mais detalhes sobre isso na seção "Avaliação" do README.

As funções e métodos para implementar estão em 2 arquivos:

  • api/pypi.py
  • api/serializers.py

Em api/pypi.py você escreverá algumas funções para fazer a integração com a API do PyPI. Essas funções serão úteis para validar os dados recebidos pela API desenvolvida.

Em api/serializers.py falta implementar a persistência dos dados e usar as funções criadas em api/pypi.py para a validação os dados.

Validando seu projeto

Nesse exercício incluímos testes usando a ferramenta k6. Com ela é possível testar o comportamento da API e validar se tudo está funcionando de acordo com a especificação.

Os testes básicos estão disponíveis neste repositório no arquivo tests-open.js. Use-os durante o desenvolvimento para avaliar se a sua API está correta.

Para rodar os testes, especifique a variável de ambiente "API_BASE" com o endereço base da API testada e no editor do gitpod.io, abra um novo terminal para executar o comando abaixo.

Exemplo de aplicação rodando no localhost na porta 8000:

k6 run -e API_BASE='http://localhost:8000/' tests-open.js

Fazendo deploy

  1. Crie uma conta gratuita no Heroku
  2. Na página Account Settings role até "API Key" e clique em "reveal"
  3. No editor do gitpod.io, abra um novo Terminal.
  4. Autentique-se com heroku login -i digite o e-mail da sua conta. No lugar da senha, digite o valor que você conseguiu no passo 2.
  5. No terminal digite heroku create para criar sua aplicação
  6. No terminal digite git push heroku para fazer o deploy
  7. No dashboard do Heroku entre no app que foi criado pelo passo anterior
  8. Na aba "Access" clique em "Add collaborator" e preencha com o e-mail [email protected]

Pronto! Seu projeto foi publicado e a Instruct tem acesso para avaliá-lo!

Quando finalizar a implementação, adicione o usuário com e-mail [email protected] como colaborador do app publicado até o fim do prazo estipulado. Isso nos garante acesso ao endereço em que sua API está publicada, para seguir com os testes automatizados.

⚠️ Você deve adicionar o usuário com e-mail [email protected] no app publicado no Heroku! Não é necessário adicionar acesso ao código fonte num repositório do GitHub.

Se você conseguiu chegar até aqui, parabéns!

Avaliação (opcional)

Caso você tenha feito o deploy no Heroku com sucesso, poderemos avaliar seu código!

Nós executaremos dois conjuntos de testes na sua API:

  1. Testes básicos (iguais aos que estão no repositório usando k6)
  2. Testes avançados (fechados)

Sua API deve passar ao menos nos testes básicos para avaliarmos.

Boa sorte!


FAQ

Como me candidatar para trabalhar na Instruct?

As inscrições são feitas através das vagas publicadas no site: https://instruct.com.br/trabalhe-com-a-gente/

Nessa página estão listadas as vagas abertas e todos os detalhes de nosso processo seletivo.

Como ser avisada de novas vagas?

Siga a Instruct no Linkedin.

Sempre publicamos quando novas vagas são abertas.

Como é trabalhar na Instruct?

Você pode ler nosso Handbook. Ele é a referência completa sobre como a Instruct funciona.

Destaque especial para as atribuições do papel de Analista de Desenvolvimento Trainee