Skip to content

Commit db4b36e

Browse files
authored
Merge pull request #13 from resuelve/upgrade
upgrade libs and setup CI
2 parents 9838f26 + b8e936a commit db4b36e

File tree

17 files changed

+240
-115
lines changed

17 files changed

+240
-115
lines changed

.github/workflows/ci.yml

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
---
2+
name: CI
3+
4+
on:
5+
pull_request:
6+
branches: master
7+
8+
env:
9+
GOOGLE_CREDENTIALS: ./secrets/google_credentials.json
10+
11+
jobs:
12+
build-and-test:
13+
name: Build and test
14+
runs-on: ubuntu-latest
15+
container: elixir:1.10-alpine
16+
steps:
17+
- uses: actions/checkout@v2
18+
- name: Install build dependencies
19+
run: |
20+
touch ./secrets/google_credentials.json
21+
apk add --update bash openssl git
22+
mix local.hex --force && mix local.rebar --force
23+
- name: Install elixir dependencies
24+
run: mix deps.get
25+
- name: Run CI Tests
26+
env:
27+
MIX_ENV: test
28+
run: mix ci

.github/workflows/publish-hexpm.yml

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
name: Publish to hex.pm
3+
4+
on:
5+
push:
6+
tags:
7+
- "*"
8+
9+
env:
10+
GOOGLE_CREDENTIALS: ./secrets/google_credentials.json
11+
12+
jobs:
13+
publish-hexpm:
14+
name: publish to hex.pm
15+
runs-on: ubuntu-latest
16+
container: elixir:1.10-alpine
17+
steps:
18+
- uses: actions/checkout@v2
19+
- name: Install dependencies
20+
run: |
21+
touch ./secrets/google_credentials.json
22+
apk add --update bash openssl git
23+
mix local.hex --force && mix local.rebar --force
24+
- name: Install elixir dependencies
25+
run: mix deps.get
26+
- name: publish to hex.pm
27+
run: mix hex.publish --yes
28+
env:
29+
HEX_API_KEY: ${{ secrets.HEX_KEY_PUBLISH }}

config/config.exs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This file is responsible for configuring your application
22
# and its dependencies with the aid of the Mix.Config module.
3-
use Mix.Config
3+
import Config
44

55
# This configuration is loaded before any dependency and is restricted
66
# to this project. If another project depends on this project, this
@@ -29,4 +29,4 @@ use Mix.Config
2929
#
3030
# import_config "#{Mix.env}.exs"
3131

32-
import_config "#{Mix.env}.exs"
32+
import_config "#{Mix.env()}.exs"

config/dev.exs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use Mix.Config
1+
import Config
22

33
config :chatex, host: System.get_env("GOOGLE_CHAT_URL")
44
config :chatex, token: System.get_env("BOT_TOKEN")
55
config :chatex, client_email: System.get_env("BOT_CLIENT_EMAIL")
66

77
config :goth,
8-
json: System.get_env("GOOGLE_CREDENTIALS") |> File.read!
8+
json: System.get_env("GOOGLE_CREDENTIALS") |> File.read!()

config/prod.exs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use Mix.Config
1+
import Config
22

33
config :chatex, host: "${GOOGLE_CHAT_URL}"
44
config :chatex, token: "${BOT_TOKEN}"
55
config :chatex, client_email: "${BOT_CLIENT_EMAIL}"
66

77
config :goth,
8-
json: "${GOOGLE_CREDENTIALS}" |> File.read!
8+
json: "${GOOGLE_CREDENTIALS}" |> File.read!()

config/test.exs

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
use Mix.Config
1+
import Config
22

33
config :chatex, host: "api.dialogflow.com"
44
config :chatex, bot: "LBot"
55
config :chatex, client_email: "[email protected]"
66

77
config :goth,
8-
json: "[{\"type\": \"test_service_account\",\"project_id\": \"resuelve-1819\",\"private_key_id\": \"19011998\"," <>
9-
"\"private_key\": \"-----BEGIN PRIVATE KEY-----fakekey-----END PRIVATE KEY-----\"," <>
10-
"\"client_email\": \"[email protected]\"," <>
11-
"\"client_id\": \"19011998\",\"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\"," <>
12-
"\"token_uri\": \"https://accounts.google.com/o/oauth2/token\"," <>
13-
"\"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\",\"client_x509_cert_url\":" <> "\"https://www.googleapis.com/robot/v1/metadata/x509/c_blanco%40resuelve-1819.iam.gserviceaccount.com\"}]"
8+
json:
9+
"[{\"type\": \"test_service_account\",\"project_id\": \"resuelve-1819\",\"private_key_id\": \"19011998\"," <>
10+
"\"private_key\": \"-----BEGIN PRIVATE KEY-----fakekey-----END PRIVATE KEY-----\"," <>
11+
"\"client_email\": \"[email protected]\"," <>
12+
"\"client_id\": \"19011998\",\"auth_uri\": \"https://accounts.google.com/o/oauth2/auth\"," <>
13+
"\"token_uri\": \"https://accounts.google.com/o/oauth2/token\"," <>
14+
"\"auth_provider_x509_cert_url\": \"https://www.googleapis.com/oauth2/v1/certs\",\"client_x509_cert_url\":" <>
15+
"\"https://www.googleapis.com/robot/v1/metadata/x509/c_blanco%40resuelve-1819.iam.gserviceaccount.com\"}]"

lib/chatex.ex

+6-3
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@ defmodule Chatex do
88
@doc """
99
Envía una respuesta generada a google chat.
1010
"""
11-
@spec request(atom, String.t, String.t) :: tuple
11+
@spec request(atom, String.t(), String.t()) :: tuple
1212
def request(method, path, body) do
13-
HTTPoison.start
13+
HTTPoison.start()
1414

1515
case HTTPoison.request(method, "#{host()}#{path}", body, headers()) do
1616
{:ok, %HTTPoison.Response{status_code: status, body: body}} when status in 200..299 ->
1717
{:ok, Poison.decode!(body)}
18+
1819
{:ok, %HTTPoison.Response{status_code: status, body: body}} when status in 400..499 ->
1920
{:error, Poison.decode!(body)}
21+
2022
{:ok, %HTTPoison.Response{status_code: status, body: body}} when status >= 500 ->
2123
{:error, Poison.decode!(body)}
24+
2225
{:error, %HTTPoison.Error{reason: reason}} ->
2326
{:error, Poison.decode!(reason)}
2427
end
@@ -27,7 +30,7 @@ defmodule Chatex do
2730
# ---------------------------------------------------------------------------
2831
# URL de Google chat API.
2932
# ---------------------------------------------------------------------------
30-
@spec host :: String.t
33+
@spec host :: String.t()
3134
defp host, do: Application.get_env(:chatex, :host)
3235

3336
# ---------------------------------------------------------------------------

lib/chatex/helpers/card_helper.ex

+18-8
Original file line numberDiff line numberDiff line change
@@ -8,43 +8,53 @@ defmodule Chatex.Helpers.CardHelper do
88
99
https://developers.google.com/hangouts/chat/reference/message-formats/cards#buttons
1010
"""
11-
@spec button(String.t, String.t, String.t) :: map
12-
@spec button(String.t, String.t, String.t, list) :: map
11+
@spec button(String.t(), String.t(), String.t()) :: map
12+
@spec button(String.t(), String.t(), String.t(), list) :: map
1313
def button("text", text, redirect) do
1414
%{textButton: %{text: text, onClick: %{openLink: %{url: redirect}}}}
1515
end
16+
1617
def button("icon", name, redirect) do
1718
%{imageButton: %{icon: name, onClick: %{openLink: %{url: redirect}}}}
1819
end
20+
1921
def button("image", icon, redirect) do
2022
%{imageButton: %{iconUrl: icon, onClick: %{openLink: %{url: redirect}}}}
2123
end
24+
2225
def button("text", text, action, parameters) do
23-
%{textButton: %{text: text, onClick: %{
24-
action: %{actionMethodName: action, parameters: parameters}}
25-
}}
26+
%{
27+
textButton: %{
28+
text: text,
29+
onClick: %{
30+
action: %{actionMethodName: action, parameters: parameters}
31+
}
32+
}
33+
}
2634
end
2735

2836
@doc """
2937
Ayuda a establecer como se representará en el chat una lista de botones.
3038
"""
31-
@spec buttons_display(String.t, list) :: map | list
39+
@spec buttons_display(String.t(), list) :: map | list
3240
def buttons_display("inline", buttons) do
3341
%{buttons: Enum.map(buttons, fn button -> button end)}
3442
end
43+
3544
def buttons_display("block", buttons) do
3645
Enum.map(buttons, fn button -> %{buttons: [button]} end)
3746
end
47+
3848
def buttons_display("widget", buttons) do
3949
Enum.map(buttons, fn button -> %{widgets: [%{buttons: [button]}]} end)
4050
end
4151

4252
@doc """
4353
Establece el header de un card.
44-
54+
4555
https://developers.google.com/hangouts/chat/reference/message-formats/cards#headers
4656
"""
47-
@spec header(String.t, String.t, String.t, String.t) :: map
57+
@spec header(String.t(), String.t(), String.t(), String.t()) :: map
4858
def header(title, subtitle \\ nil, image \\ nil, style \\ "IMAGE") do
4959
%{title: title, subtitle: subtitle, imageUrl: image, imageStyle: style}
5060
end

lib/chatex/helpers/token_helper.ex

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ defmodule Chatex.Helpers.TokenHelper do
88
@doc """
99
Valida que el token sea el mismo que el proporcionado por Google Chat.
1010
"""
11-
@spec validate(nil | String.t) :: tuple
11+
@spec validate(nil | String.t()) :: tuple
1212
def validate(nil), do: {:error, "Token no encontrado"}
1313
def validate(send), do: _compare(send, _token())
1414

@@ -18,16 +18,17 @@ defmodule Chatex.Helpers.TokenHelper do
1818
defp _compare(send, expected) when send == expected do
1919
{:ok, "Token valido"}
2020
end
21+
2122
defp _compare(send, expected) do
22-
Logger.info "Token esperado: #{expected}"
23-
Logger.info "Token enviado: #{send}"
23+
Logger.info("Token esperado: #{expected}")
24+
Logger.info("Token enviado: #{send}")
2425

2526
{:error, "Token inválido"}
2627
end
2728

2829
# ---------------------------------------------------------------------------
2930
# URL de Google chat API.
3031
# ---------------------------------------------------------------------------
31-
@spec _token :: String.t
32+
@spec _token :: String.t()
3233
defp _token, do: Application.get_env(:chatex, :token)
3334
end

lib/chatex/service/spaces.ex

+10-4
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ defmodule Chatex.Service.Spaces do
88
@doc """
99
Lista los espacios en los cuales se ha agregado al bot.
1010
"""
11-
@spec list(integer, list, String.t | nil) :: tuple
11+
@spec list(integer, list, String.t() | nil) :: tuple
1212
def list(pageSize \\ 100, acc \\ [], pageToken \\ "") do
1313
case request(:get, "spaces?pageSize=#{pageSize}&pageToken=#{pageToken}", "") do
1414
{:ok, %{"spaces" => spaces, "nextPageToken" => ""}} ->
1515
{:ok, acc ++ spaces}
16+
1617
{:ok, %{"spaces" => spaces, "nextPageToken" => next_page_token}} ->
1718
list(pageSize, acc ++ spaces, next_page_token)
19+
1820
{:error, error} ->
1921
{:error, error}
2022
end
@@ -23,12 +25,16 @@ defmodule Chatex.Service.Spaces do
2325
@doc """
2426
Lista un atributo de los espacios.
2527
"""
26-
@spec list_attribute(String.t, integer) :: tuple
28+
@spec list_attribute(String.t(), integer) :: tuple
2729
def list_attribute(attribute \\ "displayName", pageSize \\ 100) do
2830
case list(pageSize) do
2931
{:ok, spaces} ->
30-
{:ok, Enum.reduce(spaces, "", fn(space, acc) -> acc <>
31-
"- #{space["#{attribute}"]}\n" end)}
32+
{:ok,
33+
Enum.reduce(spaces, "", fn space, acc ->
34+
acc <>
35+
"- #{space["#{attribute}"]}\n"
36+
end)}
37+
3238
{:error, error} ->
3339
{:error, error}
3440
end

lib/chatex/service/spaces/members.ex

+19-8
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ defmodule Chatex.Service.Spaces.Members do
88
@doc """
99
Lista todos los miembros de un canal.
1010
"""
11-
@spec list(String.t, integer, list, String.t | nil) :: tuple
11+
@spec list(String.t(), integer, list, String.t() | nil) :: tuple
1212
def list(room, pageSize \\ 100, acc \\ [], pageToken \\ nil) do
1313
case request(:get, "spaces/#{room}/members?pageSize=#{pageSize}&pageToken=#{pageToken}", "") do
1414
{:ok, %{"memberships" => members, "nextPageToken" => ""}} ->
1515
{:ok, acc ++ members}
16+
1617
{:ok, %{"memberships" => members, "nextPageToken" => next_page_token}} ->
1718
list(room, pageSize, acc ++ members, next_page_token)
19+
1820
{:error, error} ->
1921
{:error, error}
2022
end
@@ -23,12 +25,16 @@ defmodule Chatex.Service.Spaces.Members do
2325
@doc """
2426
Lista los miembros de un canal excluyendo usuarios anonimos.
2527
"""
26-
@spec list_active(String.t, integer) :: tuple
28+
@spec list_active(String.t(), integer) :: tuple
2729
def list_active(room, pageSize \\ 100) do
2830
case list(room, pageSize) do
2931
{:ok, members} ->
30-
{:ok, Enum.filter(members, fn(m) -> m["member"]["displayName"] !=
31-
"Anonymous User" end)}
32+
{:ok,
33+
Enum.filter(members, fn m ->
34+
m["member"]["displayName"] !=
35+
"Anonymous User"
36+
end)}
37+
3238
{:error, error} ->
3339
{:error, error}
3440
end
@@ -37,12 +43,16 @@ defmodule Chatex.Service.Spaces.Members do
3743
@doc """
3844
Lista un atributo de los miembros activos del canal.
3945
"""
40-
@spec list_attribute(String.t, String.t, integer) :: tuple
46+
@spec list_attribute(String.t(), String.t(), integer) :: tuple
4147
def list_attribute(room, attribute \\ "displayName", pageSize \\ 100) do
4248
case list_active(room, pageSize) do
4349
{:ok, members} ->
44-
{:ok, Enum.reduce(members, "", fn(m, acc) -> acc <>
45-
"- #{m["member"]["#{attribute}"]}\n" end)}
50+
{:ok,
51+
Enum.reduce(members, "", fn m, acc ->
52+
acc <>
53+
"- #{m["member"]["#{attribute}"]}\n"
54+
end)}
55+
4656
{:error, error} ->
4757
{:error, error}
4858
end
@@ -51,11 +61,12 @@ defmodule Chatex.Service.Spaces.Members do
5161
@doc """
5262
Obtiene el atributo de un miembro aleatorio.
5363
"""
54-
@spec random(String.t, String.t, integer) :: tuple
64+
@spec random(String.t(), String.t(), integer) :: tuple
5565
def random(room, attribute \\ "name", pageSize \\ 100) do
5666
case list_active(room, pageSize) do
5767
{:ok, members} ->
5868
{:ok, Enum.random(members)["member"]["#{attribute}"]}
69+
5970
{:error, error} ->
6071
{:error, error}
6172
end

lib/chatex/service/spaces/messages.ex

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,26 @@ defmodule Chatex.Service.Spaces.Messages do
88
@doc """
99
Crea un mensaje.
1010
"""
11-
@spec create(String.t, String.t) :: tuple
11+
@spec create(String.t(), String.t()) :: tuple
1212
def create(room, message) do
1313
request(:post, "spaces/#{room}/messages", Poison.encode!(message))
1414
end
1515

1616
@doc """
1717
Actualiza un mensaje.
1818
"""
19-
@spec update(String.t, String.t, map) :: tuple
19+
@spec update(String.t(), String.t(), map) :: tuple
2020
def update(room, update_mask, message) do
2121
request(:put, "spaces/#{room}?updateMask=#{update_mask}", Poison.encode!(message))
2222
end
2323

2424
@doc """
2525
Elimina un mensaje.
2626
"""
27-
@spec delete(String.t) :: tuple
28-
@spec delete(String.t, String.t) :: tuple
27+
@spec delete(String.t()) :: tuple
28+
@spec delete(String.t(), String.t()) :: tuple
2929
def delete(message_id), do: request(:delete, message_id, "")
30+
3031
def delete(room_id, message_id) do
3132
request(:delete, "spaces/#{room_id}/messages/#{message_id}", "")
3233
end

0 commit comments

Comments
 (0)