Skip to content

Commit

Permalink
New release: Filometro v0.3.0 (#14)
Browse files Browse the repository at this point in the history
  • Loading branch information
matheusfelipeog authored Mar 29, 2022
2 parents 46af521 + 2000447 commit a9e5c08
Show file tree
Hide file tree
Showing 7 changed files with 154 additions and 122 deletions.
4 changes: 2 additions & 2 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ verify_ssl = true
name = "pypi"

[packages]
requests = "*"
pandas = "*"
requests = ">=2.27.1"
pandas = ">=1.4.1"

[dev-packages]

Expand Down
110 changes: 57 additions & 53 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,16 @@ Esse método recarrega todos os dados com as informações mais recentes dispon

- `Filometro.reload(...)` - Recarregar os dados com as informações mais recentes.
- `Filometro.all_postos(...)` - Retorna os dados de todos os postos.
- `Filometro.all_postos_open(...)` - Retorna os dados de todos os postos abertos no momento da busca.
- `Filometro.all_postos_closed(...)` - Retorna os dados de todos os postos fechados no momento da busca.
- `Filometro.by_zone(...)` - Retorna os dados dos postos por zona selecionada.
- `Filometro.by_modality(...)` - Retorna os dados dos postos por modalidade selecionada.
- `Filometro.by_district(...)` - Retorna os dados dos postos por distrito selecionado.
- `Filometro.by_situation(...)` - Retorna os dados dos postos por situação selecionada.
- `Filometro.by_immunizing(...)` - Retorna os dados dos postos por imunizante selecionado.
- `Filometro.to_dict(...)` - Retorna uma lista de objetos do tipo `dict` contendo todos os dados de postos.
- `Filometro.to_json(...)` - Retorna uma string `json` contendo todos os dados de postos. Também há suporte para a manipulação do retorno utilizando os mesmos argumentos do [método json integrado ao Python](https://docs.python.org/3/library/json.html).
- `Filometro.to_dataframe(...)` - Retorna um [DataFrame](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) contendo os dados de todos os postos.

### Identificadores para filtragem (Enums)

Expand Down
2 changes: 1 addition & 1 deletion filometro/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
'District',
'Filometro'
]
__version__ = '0.2.0'
__version__ = '0.3.0'
__author__ = 'Matheus Felipe'

from filometro.enums import Zone
Expand Down
53 changes: 0 additions & 53 deletions filometro/convert.py

This file was deleted.

95 changes: 85 additions & 10 deletions filometro/filometro.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,34 +13,76 @@

from typing import List

import json

from dataclasses import asdict

from pandas import DataFrame

from filometro.deolhonafila import APIDeOlhoNaFila

from filometro.dataclasses import Posto

from filometro import convert

from filometro.enums import Zone
from filometro.enums import Modality
from filometro.enums import Situation
from filometro.enums import Immunizing
from filometro.enums import District

from pandas import DataFrame

def _posto_dict_to_posto_object(posto_dict: dict) -> Posto:
"""Converte um dict com informações de um posto em um objeto Posto."""

return Posto(
equipment=posto_dict['equipamento'],
address=posto_dict['endereco'],
district=posto_dict['distrito'],
zone=posto_dict['crs'],
astrazeneca=posto_dict['astrazeneca'],
coronavac=posto_dict['coronavac'],
coronavac_pediatrica=posto_dict['corona_ped'],
pfizer=posto_dict['pfizer'],
pfizer_pediatrica=posto_dict['pfizer_ped'],
janssen=posto_dict['janssen'],
influenza=posto_dict['influenza'],
intercambialidade=posto_dict['intercambialidade'],
situation=posto_dict['status_fila'],
modality=posto_dict['tipo_posto'],
last_update=posto_dict['data_hora'],
_index_situation=posto_dict['indice_fila'],
_id_district=posto_dict['id_distrito'],
_id_zone=posto_dict['id_crs'],
_id_tb_unidades=posto_dict['id_tb_unidades'],
_id_modality=posto_dict['id_tipo_posto']
)


def _postos_dicts_to_postos_objects(postos_dicts: List[dict]) -> List[Posto]:
"""Converte uma lista de dict com informações de vários postos em
uma lista de objetos Posto."""

postos_objects = []
for posto_dict in postos_dicts:
posto_object = _posto_dict_to_posto_object(posto_dict)
postos_objects.append(posto_object)

return postos_objects


class Filometro():
"""Filometro é a API príncipal do pacote.
Fornence os métodos para coletar e filtrar os dados dos postos.
"""

def __init__(self) -> None:
self._api = APIDeOlhoNaFila()

self._postos = self._load_postos()

def _load_postos(self) -> List[Posto]:
postos_dicts = self._api.get_data()
postos_objects = convert.postos_dicts_to_postos_objects(postos_dicts)
postos_objects = _postos_dicts_to_postos_objects(postos_dicts)
return postos_objects

def reload(self) -> None:
Expand All @@ -54,10 +96,18 @@ def all_postos(self) -> List[Posto]:

return self._postos

def to_dataframe(self) -> DataFrame:
"""Retorna um DataFrame contendo os dados de todos os postos"""
def all_postos_open(self) -> List[Posto]:
"""Retorna uma lista com todos os postos abertos no momento da busca."""

return DataFrame(self.all_postos())
return [
posto for posto in self._postos
if posto.situation != Situation.NAO_FUNCIONANDO.value
]

def all_postos_closed(self) -> List[Posto]:
"""Retorna uma lista com todos os postos fechados no momento da busca."""

return self.by_situation(Situation.NAO_FUNCIONANDO)

def by_zone(self, zone: Zone) -> List[Posto]:
"""Retorna os dados dos postos por zona selecionada."""
Expand All @@ -81,5 +131,30 @@ def by_situation(self, situation: Situation) -> List[Posto]:

def by_immunizing(self, immunizing: Immunizing) -> List[Posto]:
"""Retorna os dados dos postos por imunizante selecionado."""

return [posto for posto in self._postos if posto.__dict__[immunizing.value] == '1']

def to_dict(self) -> List[dict]:
"""Retorna uma lista de dict contendo os dados de todos os postos."""

return [asdict(posto) for posto in self.all_postos()]

def to_json(self, *args, **kwargs) -> str:
"""Retorna uma string json contendo os dados de todos os postos.
Argumentos para configurar o retorno em json são aceitos:
>>> filometro.to_json(indent=4)
Consulte a documentação do pacote json para saber quais argumentos
são suportados.
"""

data = self.to_dict()

return json.dumps(data, *args, **kwargs)

def to_dataframe(self) -> DataFrame:
"""Retorna um DataFrame contendo os dados de todos os postos."""

return DataFrame(self.all_postos())
Loading

0 comments on commit a9e5c08

Please sign in to comment.