Skip to content

Instantly share code, notes, and snippets.

@alisonamerico
Last active March 3, 2020 15:25
Show Gist options
  • Save alisonamerico/e10c4673ffb6e9ec14824757df78b18d to your computer and use it in GitHub Desktop.
Save alisonamerico/e10c4673ffb6e9ec14824757df78b18d 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 result
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",
"address",
"name",
"phone",
"id",
"company",
]
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")
===============================================================================================================
# vamo_ver.py
## Assim isolado funciona:
import csv
import requests
response = requests.get("https://jsonplaceholder.typicode.com/users").json()
with open("cached_users.csv", "w", newline="") as csvfile:
fieldnames = [
"email",
"website",
"hemisferio",
"username",
"address",
"name",
"phone",
"id",
"company",
]
csv_writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter=",")
csv_writer.writeheader()
for line in response:
csv_writer.writerow(line)
@davinirjr
Copy link

davinirjr commented Feb 29, 2020

função consultar_api(username: str) -> Dict:
    querystring = {"username": username}
    response = requests.get('https://jsonplaceholder.typicode.com/users', params=querystring)
    if response.status_code != 200:
        raise <>
    json_response = response.json()
    if len(json_response) == 0:
        raise <>
    result = {
        "email": json_response[0]["email"]
        "website": json_response[0]["website"]
        "hemisferio": "sul" if json_response[0]["lat"].startswith("-") else "norte"
    }
    return result


função registra_cache(username: str, response: Dict) -> bool:
    # 1. Grava infor no CSV
    return True


função consultar_cache(username: str) -> Dict:
    # 1. Lê CSV
    # 2. Procura username no CSV
    return {}


função consultar_username(username: str) -> Dict:
    response = consultar_cache(username)
    if not bool(response):
        response = consultar_api(username)
        registra_cache(username, response)
    return response


@patch()
função test_consultar_api_status_code_200():
    response = consultar_api('bla')
    response.status_code == 200


função test_consultar_username_ok():
    resposta = consultar_username('bla')
    assert resposta = {}


username = ler_parametro()  # DONE
resposta = consultar_username(username)
imprimir("email:", resposta["email"])
imprimir("website:", resposta["website"])
imprimir("hemisferio:", resposta["hemisferio"])

@davinirjr
Copy link

Estou na função "registra_cache", tentanndo criar o arquivo "cached_users.csv", com base no meu response "response = requests.get("https://jsonplaceholder.typicode.com/users", params=querystring)" que está na função "consultar_api".
Dúvida:
Como acessar os dados direto da api para criar o arquivo.csv?

  1. Toda vez q vc for gravar uma entrada nova de "cache" vc vai gravar uma linha de cabeçalho?

  2. Vc não acessa "dados direto da api", o item a cachear é recebido na assinatura do método registra_cache: é o parametro response!

@davinirjr
Copy link

davinirjr commented Mar 3, 2020

Parece q não registrou meu comentário, e como vc vai ver logo, vou correr aqui.

# vamo_ver.py

Você está perdendo o foco do valor que precisa gerar, cuidado com isso.

Na primeira "entrega" fizemos:

  1. consultar_api()
  2. imprimir()

Lembra?

Depois evoluímos para algo do tipo:

  1. consultar_cache()
  2. se resultado, imprimir() e encerrar
  3. consultar_api()
  4. registrar_cache()
  5. imprimir()

Nesse ultimo exemplo, vc carregou a API inteira pro cache, e não foi isso que foi solicitado.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment