O Switchboard facilita o trabalho com APIs. O Switchboard ajuda você a converter facilmente esquemas JSON. Ao criar uma central telefônica e definir alguns cabos, você pode gerenciar quais campos do esquema antigo implicam em quais campos do novo esquema.
O nome Switchboard é uma associação de antigas operadoras de telefonia. Ao utilizar a Central Telefónica, você atua como operador. Vincular campos de esquema entre si é semelhante a uma central telefônica de uma operadora de telefonia. Foto de Gawler History.
Ao trabalhar com integrações e APIs de terceiros, por exemplo, muitas vezes você se depara com situações em que os dados devem ser escavados manualmente. Vamos considerar que você tem o seguinte tipo de esquema de banco de dados simples:
Column | Type ---------------+------- first_name | string last_name | string email | string
Você está trabalhando com uma API de usuário de terceiros, por exemplo, que retorna o seguinte tipo de carga útil:
{ "id": 12335, "firstName": "John", "lastName": "Doe", "contactInfo": {"primaryEmail": "[email protected]" } }
Então, o que fazer agora? Qual é a melhor maneira de converter a carga útil em seu próprio formato? Isso parece familiar:
resposta_dict = json.loads(response.body)data = {"primeiro_nome": resposta_dict.get("primeiroNome"),"sobrenome": resposta_dict.get("sobrenome"),"email": resposta_dict.get("contactInfo" , {}).get("primaryEmail") }
Infelizmente, a solução acima se torna extremamente confusa ao trabalhar com estruturas JSON aninhadas, várias APIs de terceiros ou uma combinação delas. É por isso que o Switchboard é útil: ao definir um novo switchboard, você pode gerenciar facilmente os mapeamentos de dados entre diferentes esquemas.
from switchboard import Switchboard, Cordclass UserSwitchboard(Switchboard):first_name = Cord("firstName")last_name = Cord("lastName")email = Cord(["contactInfo", "primaryEmail"]) # Observe como é simples acessar aninhados dados!
Agora, o código parece muito melhor. Legal!
resposta_dict = json.loads(response.body)data = UserSwitchboard().apply(response_dict)
Este projeto ainda está em andamento. Uma documentação melhor virá mais tarde.
Definir novos Quadros de Distribuição é fácil. Tudo que você precisa fazer é importá-lo e definir alguns acordes.
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):pet_name = Cord(source="petName", # Source informa a localização do campo no source schemarequired=True, # Se o campo for obrigatório e estiver ausente, a exceção será levantadadefault="Mr. Dog" # Se o campo estiver faltando, o valor padrão está sendo usado)
A funcionalidade do painel de controle pode ser ajustada usando a classe Meta:
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):class Meta:# Diz o que fazer com campos ausentes. A funcionalidade padrão é INCLUDE,# o que significa que se o campo de origem estiver faltando, o campo será anexado, mas o valor do campo# será Nonemissing = Switchboard.EXCLUDE # Opções: Switchboard.EXCLUDE | Quadro de distribuição.INCLUIR | Switchboard.RAISEpet_name = Cord("petName")
Cords podem acessar campos aninhados e até mesmo listas.
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):target_field = Cord(source=["field1", # Corresponde ao campo chave0, # Corresponde ao índice da lista"campo2" # Corresponde ao campo chave] )MySwitchboard().apply({ "field1": [{ "field2": "value" }] })# > { "target_field": "value" }
many
atributos do painel de controle ajudam a lidar com listas. Por exemplo:
class MySwitchboard(Switchboard):target = Cord("source")data_in = [ {"fonte": 1}, {"fonte": 2}, {"fonte": 3}, {"fonte": 4} ]MySwitchboard(many=True).apply(data_in)# > [{ "target": 1 }, { "target": 2 }, { "target": 3 }, {"target": 4 }]