Skip to content

Instantly share code, notes, and snippets.

@alisonamerico
Last active March 6, 2020 16:01
Show Gist options
  • Save alisonamerico/a0d0defb8bab6af35ffe140dcdeb6eda to your computer and use it in GitHub Desktop.
Save alisonamerico/a0d0defb8bab6af35ffe140dcdeb6eda to your computer and use it in GitHub Desktop.
"""
Exercício:
1 - Escreva um programa que recebe como entrada um username e retorna as seguintes informações:
e-mail
website
hemisfério (norte ou sul)
A fonte de dados original é a seguinte API:
https://jsonplaceholder.typicode.com/users
Para consultar as informações dela, use a biblioteca requests.
Para ler um parâmetro na entrada do seu programa veja a documentação do sys.argv:
https://docs.python.org/3/library/sys.html#sys.argv
Agora que o seu programa consulta informações na API e mostra os dados de
interesse na tela, adicione um cache para evitar uma consulta quando a
informação for conhecida.
Existe alguns serviços que podem ser usados para isso, geralmente um
banco de dados ou algum serviço específico de cache
como o Memcached.
Para este exercício você pode usar um arquivo CSV.
CSV (comma-separated values) é um formato de arquivo que possui valores
separados por vírgulas ou algum outro separador.
Um exemplo com alguns dados referentes à este exercício:
mail,website,hemisferio,username
[email protected],hildegard.org,sul,Bret
[email protected],anastasia.net,sul,Antonette
Na biblioteca padrão do Python existe um módulo para ler e escrever
arquivos CSV:
https://docs.python.org/3/library/csv.html
Regras
Sua solução deve funcionar com Python 3.6 ou mais recente.
Use a biblioteca requests para fazer requisições na API.
Seu programa deve usar o arquivo CSV como cache:
O arquivo começa vazio
Ao executar o programa uma vez para um determinado username deve adicionar apenas os dados do username consultado
Em consultas futuras desse username, deve retornar os dados do CSV, sem fazer consulta na API
"""
# import os
# import sys
# import csv
# import requests
# import pytest
# if __name__ == "__main__":
# if len(sys.argv) > 1:
# username = sys.argv[1]
# # Seu código entra aqui
# else:
# print("passe um username")
========================================================================================================================
# main.py
import csv
import os
import sys
import requests
from typing import Dict
def consultar_api(username: str) -> Dict:
"""Função que lista usuários e ao informar um usuário deve retornar:
- e-mail
- website
- hemisfério (norte ou sul)
Arguments:
username {str} -- lista um usuário
Returns:
Dict -- Retorna um dicionário com os dados desse usuário: e-mail, website e hemisfério
"""
querystring = {"username": username}
response = requests.get(
"https://jsonplaceholder.typicode.com/users", params=querystring
)
if response.status_code != 200:
raise requests.HTTPError(f"Ocorreu erro, {response.status_code}")
json_response = response.json()
if len(json_response) == 0:
raise requests.HTTPError("Arquivo está vazio!")
result = {
"email": json_response[0]["email"],
"website": json_response[0]["website"],
"hemisferio": "sul" if json_response[0]["lat"].startswith("-") else "norte",
}
return json_response
def registra_cache(username: str, response: Dict) -> bool:
"""Função que grava informações no CSV
Arguments:
username {str} -- nome de usuário
response {Dict} --
Returns:
bool -- returna os dados que foram gravados no csv
"""
with open("cached_users.csv", "w", newline="") as csvfile:
fieldnames = [
"email",
"website",
"hemisferio",
"username",
]
csv_writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter=",")
csv_writer.writeheader()
for line in response:
csv_writer.writerow(line)
return True
def consultar_cache(username: str) -> Dict:
"""Função que ler informações no CSV
Arguments:
username {str} -- nome de usuário
Returns:
[Dict] -- retorna um dicionário com as informações já armazenadas.
"""
with open("cached_users.csv", newline="") as csvfile:
csv_reader = csv.DictReader(csvfile)
for line in csv_reader:
print(line["email"], line["website"], line["hemisferio"], line["username"])
# 2. Procura username no CSV
return {}
def consultar_username(username: str) -> Dict:
"""Função que consulta um username específico dentro do "cached_users.csv".
Arguments:
username {str} -- nome do usuário
Returns:
Dict -- retorna um usuário
"""
response = consultar_cache(username)
if not bool(response):
response = consultar_api(username)
registra_cache(username, response)
return response
if __name__ == "__main__":
if len(sys.argv) > 1:
username = sys.argv[1]
response = consultar_username(username)
print("email:", response["email"])
print("website:", response["website"])
print("hemisferio:", response["hemisferio"])
else:
print("passe um username")
#test_main.py
from main import *
import responses
import pytest
import json
# @pytest.fixture
# def mocked_responses():
# with responses.RequestsMock() as rsps:
# yield rsps
# def test_consultar_api_status_code_200(mocked_responses):
# mocked_responses.add(
# responses.GET,
# "https://jsonplaceholder.typicode.com/users",
# body="{}",
# status=200,
# content_type="application/json",
# )
# resp = requests.get("https://jsonplaceholder.typicode.com/users")
# assert resp.status_code == 200
# @patch(requests, 'get', lambda *args, **kwargs: return responses.RequestsMock())
# def test_consultar_api_status_code_200():
# response = consultar_api('bla')
# response.status_code == 200
def test_consultar_username_ok() -> None:
response = consultar_username("Bret")
assert response == {}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment