Skip to content

Commit

Permalink
Merge pull request #7 from unb-cic-esw/master
Browse files Browse the repository at this point in the history
PR para sincronização
  • Loading branch information
teogenesmoura authored Jun 12, 2018
2 parents b5f2102 + 0506873 commit 2445314
Show file tree
Hide file tree
Showing 514 changed files with 105,057 additions and 14,106 deletions.
3 changes: 3 additions & 0 deletions .bowerrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"directory": "public/bower_components/"
}
54 changes: 54 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Javascript Node CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2
jobs:
build:
docker:
# specify the version you desire here
- image: circleci/node:9.10
- image: mongo:3.4.4 # and this image as the secondary service container
# Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
# - image: circleci/mongo:3.4.4

working_directory: ~/repo

steps:
- checkout

- run:
name: install-cairo
command: sudo apt-get install libcairo2-dev

# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "package.json" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run: npm install

- save_cache:
paths:
- node_modules
key: v1-dependencies-{{ checksum "package.json" }}

# run lint!
- run:
name: Run lint
command: npm run lint

# run tests!
- run:
name: Run tests
command: |
for i in $(seq 1 5); do npm test && s=0 && break || s=$? && sleep 1; done; (exit $s)
environment:
NODE_ENV: test
PORT: 3000
MONGO_HOST: mongodb://localhost:27017/data-viz
MONGO_PORT: 27017

16 changes: 16 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Ambiente de desenvolvimento
# Aconselhado: 'development'
NODE_ENV=<env>

# Porta do servidor
# Aconselhado: port={0, 65536}
PORT=port

# Host do servidor de MongoDB
# 'data-viz' é o nome do banco de dados
MONGO_HOST=mongodb://localhost/data-viz

# Porta aberta pelo servidor Mongo
# Default pelo MongoDB: 27017
# Verificar a porta utilizada
MONGO_PORT=portMDB
13 changes: 8 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
.DS_Store
/node_modules
credentials.json
controllers/*.png
yarn-error.log
logs/
.env
docs/
logs/
node_modules/
server/controllers/*.png
config/credentials.json
yarn-error.logs
coverage/
102 changes: 50 additions & 52 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,37 @@
# Visualização de dados com Google Spreadsheets
# Visualização de Dados das Eleições 2018

[![npm](https://img.shields.io/npm/v/npm.svg?style=flat-square)](https://www.npmjs.com/package/npm) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/your/your-project/blob/master/LICENSE)

![Spreadsheet](https://i.imgur.com/1nWhycw.png)

Este repositório compõe projeto de pesquisa com foco empírico nas eleições brasileiras de 2018 do grupo de pesquisa [Resocie](http://resocie.org) do [Instituto de Ciência Política - IPOL](http://ipol.unb.br/) com o apoio técnico do [Departamento de Computação - CIC](http://www.cic.unb.br/) da [Universidade de Brasília - UnB](http://unb.br).

O projeto consiste na coleta sistemática de informações quantitativas da plataforma Twitter com o objetivo de subsidiar a análise do comportamento político de alguns atores da cena eleitoral durante o período de campanha. Além de seu objetivo finalístico para a coleta de dados, o projeto tem também por intuito servir de material de estudo dos alunos da disciplina Engenharia de Software do Departamento de Ciência da Computação da UnB no 1º semestre de 2018.
O projeto consiste na coleta sistemática de informações quantitativas de diferentes plataformas com o objetivo de subsidiar a análise do comportamento político de alguns atores da cena eleitoral durante o período de campanha. Além de seu objetivo finalístico para a coleta de dados, o projeto tem também por intuito servir de material de estudo dos alunos da disciplina Engenharia de Software do Departamento de Ciência da Computação da UnB no 1º semestre de 2018.

As instruções a seguir trazem orientações para aqueles que quiserem contribuir com a iniciativa.

## Pré-requisitos

Seu sistema precisa ter [Node.js](https://nodejs.org/en/download/package-manager/) v9.x (preferencialmente) ou v8.x (mínimo) e npm instalados.

O projeto utiliza a biblioteca [chartjs-node](https://github.com/vmpowerio/chartjs-node), que requer a instalação da biblioteca Cairo em seu sistema, guias de como instalar podem ser encontrados [clicando aqui](https://cairographics.org/download/).

Também é necessário que seu sistema possua MongoDB instalado, instruções de como instalá-lo podem ser encontradas no site [Install MongoDB](https://docs.mongodb.com/manual/installation/).

Uma parte do projeto (visualização de planilhas Google) precisa de uma chave de autenticação para usar a Google API. Para conseguir as credenciais, acesse o [Console de Desenvolvedores](https://console.developer.google.com/). Selecione o projeto do grupo `resocie-data-viz`, clique em *APIs & auth* e em seguida em *credentials*, e crie sua credencial ou escolha uma existente.

Mais informações de como funciona a autenticação em Oauth2 das APIs do Google podem ser encontradas no seguinte link:

[Google API Node JS Client](https://github.com/google/google-api-nodejs-client#authorizing-and-authenticating)

## Instalação

Veja os [pré-requisitos](#prerequisitos) antes de instalar qualquer coisa.
Garanta que todos os [pré-requisitos](#pré-requisitos) foram completados

O primeiro passo para executar o código deste repositório consiste em clona-lo localmente.

```shell
git clone https://github.com/teogenesmoura/spreadsheetsGoogle.git
git clone https://github.com/unb-cic-esw/data-viz.git
```

Logo após, precisamos instalar as dependências do projeto. No seu terminal,
Expand All @@ -27,68 +41,58 @@ digite o seguinte comando:
npm install
```

Após a instalação das dependências e a escrita do arquivo de credenciais (visite a seção "Prerequisitos"), execute o projeto com:
Entre na página de credencials no painel da Google API e baixe a credencial de sua escolha, salve-a na pasta `config` como `credentials.json`.

```shell
node index.js
```
Renomeie o arquivo de configurações `.env.example` para `.env`, executando `mv .env.example .env`, abra-o e altere os dados preenchendo com as configurações de sua máquina.

O projeto estará rodando em

```shell
http://localhost:3000
```
# Ambiente de desenvolvimento
NODE_ENV=development
## Desenvolvimento

### Ferramentas
Este projeto usa principalmente, mas não exclusivamente:

Javascript ES6

Node JS
# Porta do servidor
PORT=3000
Express js
# Host do servidor de MongoDB
# data-viz é o nome do banco de dados
MONGO_HOST=mongodb://localhost/data-viz
googleapis

Chart JS
# Porta aberta pelo servidor Mongo
# Normalmente 27017
MONGO_PORT=27017
```

### Prerequisitos
Após a instalação das dependências, a escrita do arquivo de credenciais e o de configurações execute o projeto com:

Note que este projeto utiliza a biblioteca [chartjs-node](https://github.com/vmpowerio/chartjs-node), que requer a instalação da biblioteca Cairo previamente no seu sistema. Para instalá-lo execute `sudo apt-get install libcairo2-dev libjpeg-dev libgif-dev`, os avisos podem ser ignorados.
```shell
npm start
```

Para que o programa execute, é necessária a obtenção da chave de autenticação da API do Google. Deverá, então, ser criado um arquivo chamado "credentials.json" na pasta raíz do projeto, cujo conteúdo se assemelha ao seguinte:
O projeto estará rodando em

```javascript
{
"web":{
"client_id":"SEU_CLIENT_ID",
"project_id":"SEU_ID_DE_PROJETO",
"auth_uri":"https://accounts.google.com/o/oauth2/auth",
"token_uri":"https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
"client_secret":"SUA_CHAVE_DE_CLIENTE",
"redirect_uris": [
"http://localhost:3000"
]
}
}
```shell
http://localhost:3000
```

Para conseguir as credenciais *client_id* e *client_secret*, acesse o [Console de Desenvolvedores](https://console.developer.google.com/). Selecione o projeto do grupo `resocie-data-viz`, clique em *APIs & auth* e em seguida em *credentials*, faça o download do arquivo e salve-o na raiz deste diretório como `credentials.json`.
Ou na porta definida em `.env`.

Mais informações de como funciona a autenticação em Oauth2 das APIs do Google podem ser encontradas no seguinte link:
## Desenvolvimento

[Google API Node JS Client](https://github.com/google/google-api-nodejs-client#authorizing-and-authenticating)
### Ferramentas

Este projeto usa principalmente, mas não exclusivamente:

* Javascript ES2017
* Node.js
* Mongoose/MongoDB
* Express.js
* googleapis
* Chart.js

## Versionamento

Sugere-se usar o [SemVer](http://semver.org/) para o versionamento do código.
A versão atual é 1.0.0


## Testes

O projeto utiliza a biblioteca [Jest](https://facebook.github.io/jest/) para executar testes. O seguinte comando roda os testes de caso implementados:
Expand Down Expand Up @@ -138,17 +142,11 @@ jsdoc index.js -d docs

Este comando gerará a documentação para o arquivo index.js na pasta */docs*.

## ToDo

Este é apenas um esqueleto de projeto para que o grupo comece a trabalhar. Resta ainda muito trabalho a ser feito. Algumas ideias:
## To-do

* Implementar mais casos de teste unitário
* Implementar testes de comportamento (BDD)
* Gerar mais de um gráfico
* Expandir quantidade dos dados utilizados
* Pesar o custo de gerar gráficos server-side e verificar se vale a pena fazê-lo no cliente
* Implementar mecanismo para automatização da coleta recorrente dos dados
* Persistir dados coletados em base estruturada
* Disponibilizar uma API publica para que leigos possam gerar visualizações interessantes
* Google Spreadsheets vs MongoDB?
* Ignorar os docs no repositório já que eles são gerados automaticamente? Discutir
Expand Down
13 changes: 13 additions & 0 deletions config/config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// require and configure dotenv, will load vars in .env in PROCESS.ENV
require("dotenv").config();

const config = {
env: process.env.NODE_ENV,
port: process.env.PORT,
mongo: {
host: `${process.env.MONGO_HOST}-${process.env.NODE_ENV}`,
port: process.env.MONGO_PORT,
},
};

module.exports = config;
10 changes: 10 additions & 0 deletions config/credentials-stub.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"web": {
"client_id":"irrelevant",
"project_id":"resocie-data-viz",
"auth_uri":"https://accounts.google.com/o/oauth2/auth",
"token_uri":"https://accounts.google.com/o/oauth2/token",
"auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
"client_secret":"irrelevant"
}
}
43 changes: 43 additions & 0 deletions config/express.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
const express = require("express");
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");
const compress = require("compression");
const methodOverride = require("method-override");
const cors = require("cors");
const helmet = require("helmet");
const path = require("path");

const routes = require("../server/routes/index.route");

// Open an http server to accept the oauth callback. In this
// simple example, the only request to our webserver is to
// /oauth2callback?code=<code>
const app = express();

// parse body params and attach them to req.body
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// parse the cookies
app.use(cookieParser());

app.use(compress());
app.use(methodOverride());

// secure apps by setting various HTTP headers
app.use(helmet());

// enable CORS - Cross Origin Resource Sharing
app.use(cors());

// mount all routes on / path
app.use("/", routes);

// Load View Engine
app.set("views", path.join(__dirname, "../views"));
app.set("view engine", "pug");

// Set Public Folder
app.use(express.static(path.join(__dirname, "../public")));

module.exports = app;
32 changes: 32 additions & 0 deletions config/google-auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
const { google } = require("googleapis");
const path = require("path");
const fs = require("fs");
const config = require("./config");

/* Reference code for OAuth and Spreadsheets:
https://github.com/google/google-api-nodejs-client/blob/master/samples/sheets/quickstart.js
*/
let credentialsFileName = "credentials.json";
if (config.env === "test") {
credentialsFileName = "credentials-stub.json";
}
const keyfile = path.join(__dirname, credentialsFileName);
const keys = JSON.parse(fs.readFileSync(keyfile));
const scopes = ["https://www.googleapis.com/auth/spreadsheets.readonly"];
const client = (redirectUri) => {
return new google.auth.OAuth2(
keys.web.client_id,
keys.web.client_secret,
redirectUri,
);
};
// Generate the url that will be used for authorization
const authorizeUrl = (cClient) => {
return cClient.generateAuthUrl({
access_type: "offline",
prompt: "consent",
scope: scopes,
});
};

module.exports = { client, authorizeUrl };
3 changes: 3 additions & 0 deletions config/jest-setup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
const logger = require("./logger");

logger.remove(logger.transports.Console);
Loading

0 comments on commit 2445314

Please sign in to comment.