O Quake 3 Parser é uma aplicação escrita em Python 3.6, com o auxilio do microframework Flask.
A aplicação faz o parse de um log de um servidor de Quake 3 e o expõe, por meio de uma API RESTful, as estatísticas de mortes de cada partida no seguinte formato:
"game_1": {
"total_kills": 4,
"players": [
"Dono da Bola",
"Mocinha",
"Isgalamido",
"Zeh"
],
"kills": {
"Dono da Bola": -1,
"Mocinha": 0,
"Isgalamido": 1,
"Zeh": -2
}
}
A API possui dois endpoints:
/games
: retorna as estatísticas de todos os jogos
/games/{numero_do_jogo}
: retorna as estatísticas de um jogo específico
Para rodar a aplicação é necessário ter instalado o Python 3.6 e o pip
Também sugere-se que se tenha o Docker e/ou virtualenv instalado, apesar de não serem estritamente necessários.
Existem três possiveis maneiras de rodar a aplicação:
A maneira mais simples e rápida de executar a aplicação é a partir do docker com o comando:
$ docker run -p 5000:5000 henriqueamitay/quake_parser:v2
Que irá baixar a imagem já upada no Docker-hub e executá-la. Com isso a API poderá ser utilizada em 127.0.0.1:5000
O repositório possui dois scripts que provisionam um virtualenv e rodam a aplicação neste ambiente virtual. Apenas rode:
$ git clone git@github.com:Hamitay/quake3_parser.git
$ cd quake3_parser
$ bash setup_venv.sh
$ bash run_server.sh
Com isso a API poderá ser utilizada em 127.0.0.1:5000
- Observação: Talvez seja necessário alterar o permissionamento destes scripts para poder executá-los.
Para rodar a aplicação manualmente e no mesmo ambiente é necessário executar os seguintes passos:
- Clonar o repositório:
$ git clone git@github.com:Hamitay/quake3_parser.git
$ cd quake3_parser
- Instalar as dependências:
$ pip3 install -r requirements.txt
- Setar as variaveis de ambiente:
$ export FLASK_APP=api
Caso queira usar algum outro arquivo de log para testar a api, pode-se alterar o caminho alterando a seguinte variável
$ export GAME_LOG_PATH=<caminho do .log>
- Rodar a aplicação:
$ python3.6 -m api.server
Com isso a API poderá ser utilizada em 127.0.0.1:5000
Os testes unitários podem ser rodados facilmente com o pytest. Para executar os testes:
$ docker exec -it <id do container> pytest
Garanta que o virtualenv já exista e rode:
$ source env/bin/activate
$ pytest
Apenas esteja no diretório da aplicação e rode:
$ pytest
A aplicação funciona por meio de dois pacotes:
-
parser : pacote que executa o parseamento. Basicamente o log do servidor é aberto e suas informações são filtradas por meio de um série de expressões regulares.
-
api : pacote com a API propriamente dita, desenvolvida em Flask devido à sua simplicidade.
Uma questão interessante durante o desenvolvimento foi a necessidade de se usar cookies (ou algum tipo de cacheamento) ou algum banco de dados (ou outro tipo de permanência de informação) para que o arquivo não precise ser parseado em toda requisição.
Porém, apesar desta questão, foi decidido manter o parseamento em toda requisição devido a possibilidade de garantir que esta aplicação tenha uma resposta dinâmica. Poderiamos por exemplo, direcionar o output de um servidor de Quake 3 para a pasta que a aplicação acessa, com isso a API retornaria as informações do servidor em tempo real.