Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,6 @@ language: elixir
sudo: false
matrix:
include:
- elixir: 1.4
otp_release: 19.0
env: MIX_ENV=test
- elixir: 1.5
otp_release: 19.0
env: MIX_ENV=test
- elixir: 1.6
otp_release: 20.0
env: MIX_ENV=test
Expand Down
14 changes: 5 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Add PhoenixOauth2Provider to your list of dependencies in `mix.exs`:
def deps do
[
# ...
{:phoenix_oauth2_provider, "~> 0.4.1"}
{:phoenix_oauth2_provider, "~> 0.5.0"}
# ...
]
end
Expand All @@ -41,17 +41,13 @@ defmodule MyAppWeb.Router do
# Require user authentication
end

pipeline :oauth_public do
plug :put_secure_browser_headers
end

scope "/", MyAppWeb do
pipe_through :oauth_public
pipe_through :browser
oauth_routes :public
end

scope "/", MyAppWeb do
pipe_through :protected
pipe_through [:browser, :protected]
oauth_routes :protected
end

Expand All @@ -76,12 +72,12 @@ Please read the [ex_oauth2_provider](https://github.com/danschultzer/ex_oauth2_p

### Resource owner schema

By default `MyApp.User` is used as the `resource_owner`, you can change that in the following way:
By default `MyApp.Users.User` is used as the `resource_owner`, you can change that in the following way:

```elixir
config :phoenix_oauth2_provider, PhoenixOauth2Provider,
repo: MyApp.Repo,
resource_owner: MyApp.CustomUser
resource_owner: MyApp.CustomUsers.CustomUser
```

### Resource owner
Expand Down
3 changes: 2 additions & 1 deletion config/test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ config :phoenix_oauth2_provider, PhoenixOauth2Provider,

config :phoenix_oauth2_provider, ecto_repos: [PhoenixOauth2Provider.Test.Repo]
config :phoenix_oauth2_provider, PhoenixOauth2Provider.Test.Repo,
adapter: Ecto.Adapters.Postgres,
database: "phoenix_oauth2_provider_test",
pool: Ecto.Adapters.SQL.Sandbox,
priv: "priv/test"
Expand All @@ -28,3 +27,5 @@ if System.get_env("UUID") == "all" do
config :phoenix_oauth2_provider, PhoenixOauth2Provider,
app_schema: ExOauth2Provider.Schema.UUID
end

config :phoenix, :json_library, Jason
11 changes: 3 additions & 8 deletions lib/mix/tasks/phoenix_oauth2_provider.install.ex
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ defmodule Mix.Tasks.PhoenixOauth2Provider.Install do
## Option list
* A PhoenixOauth2Provider configuration will be appended to your `config/config.exs` file unless
the `--no-config` option is given.
* A `--resource-owner MyApp.User` option can be given to override the default resource owner module in config.
* A `--resource-owner MyApp.Users.User` option can be given to override the default resource owner module in config.
* A `--repo MyApp.Repo` option can be given to override the default Repo module.
* A `--config-file config/config.exs` option can be given to change what config file to append to.
* A `--controllers` option to generate controllers boilerplate (not default).
Expand Down Expand Up @@ -326,18 +326,13 @@ defmodule Mix.Tasks.PhoenixOauth2Provider.Install do
# Require user authentication
end

# Don't require CSRF protection
pipeline :oauth_public do
plug :put_secure_browser_headers
end

scope "/"#{namespace} do
pipe_through :oauth_public
pipe_through :browser
oauth_routes :public
end

scope "/"#{namespace} do
pipe_through :protected
pipe_through [:browser, :protected]
oauth_routes :protected
end
...
Expand Down
6 changes: 4 additions & 2 deletions lib/phoenix_oauth2_provider.ex
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,10 @@ defmodule PhoenixOauth2Provider do
end

defp web_module do
config()
|> Keyword.get(:module, Phoenix.base())
# TODO: Rewrite this to reflect Phoenix 1.4 handling of context app
context_app = Keyword.get(config(), :module) || Phoenix.base()

context_app
|> Kernel.to_string()
|> Kernel.<>("Web")
end
Expand Down
36 changes: 22 additions & 14 deletions lib/phoenix_oauth2_provider/view_helpers.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,29 +11,37 @@ defmodule PhoenixOauth2Provider.ViewHelpers do
"""
@spec error_tag(Changeset.t(), atom()) :: HTML.safe() | nil
def error_tag(form, field) do
if error = form.errors[field] do
Enum.map(Keyword.get_values(form.errors, field), fn error ->
content_tag(:span, translate_error(error), class: "help-block")
end
end)
end

@doc """
Translates an error message using gettext.
"""
@spec translate_error({binary(), Keyword.t()}) :: binary()
def translate_error({msg, opts}) do
# Because error messages were defined within Ecto, we must
# call the Gettext module passing our Gettext backend. We
# also use the "errors" domain as translations are placed
# in the errors.po file. On your own code and templates,
# this could be written simply as:
# When using gettext, we typically pass the strings we want
# to translate as a static argument:
#
# dngettext "errors", "1 file", "%{count} files", count
# # Translate "is invalid" in the "errors" domain
# dgettext("errors", "is invalid")
#
Gettext.dngettext(PhoenixOauth2Provider.Web.Gettext, "errors", msg, msg, opts[:count] || 0, opts)
end

@spec translate_error(binary()) :: binary()
def translate_error(msg) do
Gettext.dgettext(PhoenixOauth2Provider.Web.Gettext, "errors", msg)
# # Translate the number of files with plural rules
# dngettext("errors", "1 file", "%{count} files", count)
#
# Because the error messages we show in our forms and APIs
# are defined inside Ecto, we need to translate them dynamically.
# This requires us to call the Gettext module passing our gettext
# backend as first argument.
#
# Note we use the "errors" domain, which means translations
# should be written to the errors.po file. The :count option is
# set by Ecto and indicates we should also apply plural rules.
if count = opts[:count] do
Gettext.dngettext(PhoenixOauth2Provider.Web.Gettext, "errors", msg, msg, count, opts)
else
Gettext.dgettext(PhoenixOauth2Provider.Web.Gettext, "errors", msg, opts)
end
end
end
12 changes: 6 additions & 6 deletions lib/phoenix_oauth2_provider/web/gettext.ex
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
defmodule PhoenixOauth2Provider.Web.Gettext do
@moduledoc """
@moduledoc """
A module providing Internationalization with a gettext-based API.

By using [Gettext](https://hexdocs.pm/gettext),
your module gains a set of macros for translations, for example:

import MyappWeb.Gettext
import PowAssentDemoWeb.Gettext

# Simple translation
gettext "Here is the string to translate"
gettext("Here is the string to translate")

# Plural translation
ngettext "Here is the string to translate",
ngettext("Here is the string to translate",
"Here are the strings to translate",
3
3)

# Domain-based translation
dgettext "errors", "Here is the error message to translate"
dgettext("errors", "Here is the error message to translate")

See the [Gettext Docs](https://hexdocs.pm/gettext) for detailed usage.
"""
Expand Down
18 changes: 11 additions & 7 deletions mix.exs
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
defmodule PhoenixOauth2Provider.Mixfile do
use Mix.Project

@version "0.4.1"
@version "0.5.0"

def project do
[app: :phoenix_oauth2_provider,
version: @version,
elixir: "~> 1.4",
elixir: "~> 1.6",
elixirc_paths: elixirc_paths(Mix.env),
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
Expand Down Expand Up @@ -39,12 +39,16 @@ defmodule PhoenixOauth2Provider.Mixfile do

defp deps do
[
{:ex_oauth2_provider, "~> 0.4"},
# {:ex_oauth2_provider, "~> 0.4.4"},
{:ex_oauth2_provider, github: "danschultzer/ex_oauth2_provider"},
{:gettext, ">= 0.13.0"},
{:phoenix, "~> 1.3"},
{:phoenix_ecto, "~> 3.2 or ~> 3.3", only: [:test, :dev]},
{:phoenix_html, ">= 2.6.0 and < 2.12.0", only: [:test, :dev]},
{:postgrex, ">= 0.11.1", only: :test},
{:phoenix, "~> 1.4"},

{:ecto_sql, "~> 3.0.0", only: [:test]},
{:plug_cowboy, "~> 2.0", only: [:test]},
{:phoenix_ecto, "~> 4.0", only: [:test, :dev]},
{:phoenix_html, "~> 2.13.0", only: [:test, :dev]},
{:postgrex, ">= 0.14.0", only: :test},
{:credo, "~> 0.10", only: [:dev, :test]},
{:ex_doc, ">= 0.0.0", only: :dev}
]
Expand Down
38 changes: 21 additions & 17 deletions mix.lock
Original file line number Diff line number Diff line change
@@ -1,26 +1,30 @@
%{
"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm"},
"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"},
"cowboy": {:hex, :cowboy, "2.6.1", "f2e06f757c337b3b311f9437e6e072b678fcd71545a7b2865bdaa154d078593f", [:rebar3], [{:cowlib, "~> 2.7.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"},
"cowlib": {:hex, :cowlib, "2.7.0", "3ef16e77562f9855a2605900cedb15c1462d76fb1be6a32fc3ae91973ee543d2", [:rebar3], [], "hexpm"},
"credo": {:hex, :credo, "0.10.2", "03ad3a1eff79a16664ed42fc2975b5e5d0ce243d69318060c626c34720a49512", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"},
"db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
"decimal": {:hex, :decimal, "1.5.0", "b0433a36d0e2430e3d50291b1c65f53c37d56f83665b43d79963684865beab68", [:mix], [], "hexpm"},
"earmark": {:hex, :earmark, "1.2.6", "b6da42b3831458d3ecc57314dff3051b080b9b2be88c2e5aa41cd642a5b044ed", [:mix], [], "hexpm"},
"ecto": {:hex, :ecto, "2.2.11", "4bb8f11718b72ba97a2696f65d247a379e739a0ecabf6a13ad1face79844791c", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
"ex_doc": {:hex, :ex_doc, "0.19.1", "519bb9c19526ca51d326c060cb1778d4a9056b190086a8c6c115828eaccea6cf", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.7", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"},
"ex_oauth2_provider": {:hex, :ex_oauth2_provider, "0.4.3", "bcb6d5545262042e0940d0ee7cc750487303101ceae26b8cb5e57593290ac703", [:mix], [{:ecto, ">= 2.1.0 or < 2.3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:plug, ">= 1.0.0 and < 1.8.0", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.11.1", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm"},
"gettext": {:hex, :gettext, "0.16.0", "4a7e90408cef5f1bf57c5a39e2db8c372a906031cc9b1466e963101cb927dafc", [:mix], [], "hexpm"},
"db_connection": {:hex, :db_connection, "2.0.5", "ddb2ba6761a08b2bb9ca0e7d260e8f4dd39067426d835c24491a321b7f92a4da", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm"},
"decimal": {:hex, :decimal, "1.6.0", "bfd84d90ff966e1f5d4370bdd3943432d8f65f07d3bab48001aebd7030590dcc", [:mix], [], "hexpm"},
"earmark": {:hex, :earmark, "1.3.1", "73812f447f7a42358d3ba79283cfa3075a7580a3a2ed457616d6517ac3738cb9", [:mix], [], "hexpm"},
"ecto": {:hex, :ecto, "3.0.6", "d33ab5b3f7553a41507d4b0ad5bf192d533119c4ad08f3a5d63d85aa12117dc9", [:mix], [{:decimal, "~> 1.6", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm"},
"ecto_sql": {:hex, :ecto_sql, "3.0.4", "e7a0feb0b2484b90981c56d5cd03c52122c1c31ded0b95ed213b7c5c07ae6737", [:mix], [{:db_connection, "~> 2.0", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.0.6", [hex: :ecto, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.9.1", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.14.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.3.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"},
"ex_doc": {:hex, :ex_doc, "0.19.3", "3c7b0f02851f5fc13b040e8e925051452e41248f685e40250d7e40b07b9f8c10", [:mix], [{:earmark, "~> 1.2", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.10", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"},
"ex_oauth2_provider": {:git, "https://github.com/danschultzer/ex_oauth2_provider.git", "0884b1761c5b5236c0d3578bb5ae23e44ccdc095", []},
"gettext": {:hex, :gettext, "0.16.1", "e2130b25eebcbe02bb343b119a07ae2c7e28bd4b146c4a154da2ffb2b3507af2", [:mix], [], "hexpm"},
"jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
"makeup": {:hex, :makeup, "0.5.5", "9e08dfc45280c5684d771ad58159f718a7b5788596099bdfb0284597d368a882", [:mix], [{:nimble_parsec, "~> 0.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"},
"makeup_elixir": {:hex, :makeup_elixir, "0.10.0", "0f09c2ddf352887a956d84f8f7e702111122ca32fbbc84c2f0569b8b65cbf7fa", [:mix], [{:makeup, "~> 0.5.5", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"},
"mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"},
"nimble_parsec": {:hex, :nimble_parsec, "0.4.0", "ee261bb53214943679422be70f1658fff573c5d0b0a1ecd0f18738944f818efe", [:mix], [], "hexpm"},
"phoenix": {:hex, :phoenix, "1.3.4", "aaa1b55e5523083a877bcbe9886d9ee180bf2c8754905323493c2ac325903dc5", [:mix], [{:cowboy, "~> 1.0", [hex: :cowboy, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"},
"phoenix_ecto": {:hex, :phoenix_ecto, "3.5.0", "f72ec302589988698c096da7e8647e917fa2bb2f861c0c3739fc9d95708bacec", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
"phoenix_html": {:hex, :phoenix_html, "2.11.2", "86ebd768258ba60a27f5578bec83095bdb93485d646fc4111db8844c316602d6", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
"makeup": {:hex, :makeup, "0.8.0", "9cf32aea71c7fe0a4b2e9246c2c4978f9070257e5c9ce6d4a28ec450a839b55f", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"},
"makeup_elixir": {:hex, :makeup_elixir, "0.13.0", "be7a477997dcac2e48a9d695ec730b2d22418292675c75aa2d34ba0909dcdeda", [:mix], [{:makeup, "~> 0.8", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"},
"mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"},
"nimble_parsec": {:hex, :nimble_parsec, "0.5.0", "90e2eca3d0266e5c53f8fbe0079694740b9c91b6747f2b7e3c5d21966bba8300", [:mix], [], "hexpm"},
"phoenix": {:hex, :phoenix, "1.4.0", "56fe9a809e0e735f3e3b9b31c1b749d4b436e466d8da627b8d82f90eaae714d2", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.0.0", "c43117a136e7399ea04ecaac73f8f23ee0ffe3e07acfcb8062fe5f4c9f0f6531", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
"phoenix_html": {:hex, :phoenix_html, "2.13.1", "fa8f034b5328e2dfa0e4131b5569379003f34bc1fafdaa84985b0b9d2f12e68b", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "1.1.1", "6668d787e602981f24f17a5fbb69cc98f8ab085114ebfac6cc36e10a90c8e93c", [:mix], [], "hexpm"},
"plug": {:hex, :plug, "1.7.1", "8516d565fb84a6a8b2ca722e74e2cd25ca0fc9d64f364ec9dbec09d33eb78ccd", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}], "hexpm"},
"plug_cowboy": {:hex, :plug_cowboy, "2.0.1", "d798f8ee5acc86b7d42dbe4450b8b0dadf665ce588236eb0a751a132417a980e", [:mix], [{:cowboy, "~> 2.5", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
"plug_crypto": {:hex, :plug_crypto, "1.0.0", "18e49317d3fa343f24620ed22795ec29d4a5e602d52d1513ccea0b07d8ea7d4d", [:mix], [], "hexpm"},
"poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"},
"poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], [], "hexpm"},
"postgrex": {:hex, :postgrex, "0.13.5", "3d931aba29363e1443da167a4b12f06dcd171103c424de15e5f3fc2ba3e6d9c5", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm"},
"postgrex": {:hex, :postgrex, "0.14.1", "63247d4a5ad6b9de57a0bac5d807e1c32d41e39c04b8a4156a26c63bcd8a2e49", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.0", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"},
"ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm"},
"telemetry": {:hex, :telemetry, "0.3.0", "099a7f3ce31e4780f971b4630a3c22ec66d22208bc090fe33a2a3a6a67754a73", [:rebar3], [], "hexpm"},
}
Loading