Last active
March 6, 2020 16:01
-
-
Save alisonamerico/a0d0defb8bab6af35ffe140dcdeb6eda to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Exercício: | |
1 - Escreva um programa que recebe como entrada um username e retorna as seguintes informações: | |
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: | |
- 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