Bump deps and update code for Elixir 1.9

This commit is contained in:
Mikko Ahlroth 2019-10-10 20:49:05 +03:00
parent cbab7e74b4
commit dc133690d2
13 changed files with 141 additions and 87 deletions

View file

@ -1,6 +1,4 @@
# This file is responsible for configuring your application
# and its dependencies with the aid of the Mix.Config module.
use Mix.Config
import Config
# This configuration is loaded before any dependency and is restricted
# to this project. If another project depends on this project, this
@ -29,8 +27,6 @@ use Mix.Config
#
# import_config "#{Mix.env}.exs"
config :ecto, json_library: Jason
config :tilastokeskus,
ecto_repos: [Tilastokeskus.Archive.Repo]

View file

@ -17,8 +17,7 @@ defmodule Tilastokeskus.Archive.Schemas.Event do
@spec changeset(Ecto.Schema.t(), map) :: Ecto.Changeset.t()
def changeset(data, params \\ %{}) do
data
|> cast(params, [:at, :type, :addr, :extra])
|> cast(params, [:at, :type, :addr, :extra, :session_id])
|> validate_required([:at])
|> put_assoc(:session, params[:session])
end
end

View file

@ -19,8 +19,7 @@ defmodule Tilastokeskus.Archive.Schemas.Session do
@spec changeset(Ecto.Schema.t(), map) :: Ecto.Changeset.t()
def changeset(data, params \\ %{}) do
data
|> cast(params, [])
|> put_change(:opened_at, DateTime.utc_now())
|> cast(params, [:opened_at])
end
@doc """

View file

@ -2,7 +2,7 @@ defmodule Tilastokeskus.Archive.Types.Inet do
@moduledoc """
Inet type for Ecto for storing IPs in PostgreSQL.
From: http://pedroassumpcao.ghost.io/ecto-type-for-ipv4-and-ipv6-addresses/
Originally from: http://pedroassumpcao.ghost.io/ecto-type-for-ipv4-and-ipv6-addresses/
"""
@behaviour Ecto.Type
@ -11,7 +11,7 @@ defmodule Tilastokeskus.Archive.Types.Inet do
@doc """
Defines what internal database type is used.
"""
def type(), do: :string
def type(), do: :inet
@impl Ecto.Type
@doc """
@ -35,4 +35,12 @@ defmodule Tilastokeskus.Archive.Types.Inet do
end
def dump(_), do: :error
@impl Ecto.Type
def equal?(term1, term2) do
term1 == term2
end
@impl Ecto.Type
def embed_as(_), do: :self
end

View file

@ -47,7 +47,7 @@ defmodule Tilastokeskus.Archive.Utils.Session do
"""
@spec create() :: {:ok, %Session{}} | {:error, term}
def create() do
cset = Session.changeset(%Session{}, %{})
Repo.insert(cset)
Session.changeset(%Session{}, %{opened_at: DateTime.utc_now() |> DateTime.truncate(:second)})
|> Repo.insert()
end
end

View file

@ -0,0 +1,36 @@
defmodule Tilastokeskus.Reception.FrontDesk do
@moduledoc """
Entry point for the Raxx web service.
"""
# Load files at compile time
@files Raxx.Static.setup(source: Path.expand("priv/static"))
def child_spec(server_options) do
{:ok, port} = Keyword.fetch(server_options, :port)
%{
id: {__MODULE__, port},
start: {__MODULE__, :start_link, [server_options]},
type: :supervisor
}
end
def init(init_arg) do
{:ok, init_arg}
end
def start_link(server_options) do
{:ok, hosts} = Keyword.fetch(server_options, :hosts)
stack =
Raxx.Stack.new(
[
{Raxx.Static, @files}
],
{Tilastokeskus.Reception.Router, hosts}
)
Ace.HTTP.Service.start_link(stack, server_options)
end
end

View file

@ -1,14 +1,8 @@
defmodule Tilastokeskus.Reception.Router do
@external_resource "priv/static/track.js"
@external_resource "priv/static/test.html"
use Raxx.Router
use Ace.HTTP.Service, port: 1971, cleartext: true
use Raxx.Logger
use Raxx.Router, [
section([{Raxx.Logger, level: :debug}], [
{%{method: :POST, path: ["track"]}, Tilastokeskus.Reception.Routes.PageView},
{_, Tilastokeskus.Reception.Routes.NotFound}
]
use Raxx.Static, "../../priv/static"
])
end

View file

@ -1,7 +1,7 @@
defmodule Tilastokeskus.Reception.Routes.NotFound do
use Raxx.Server
use Raxx.SimpleServer
@impl Raxx.Server
@impl Raxx.SimpleServer
def handle_request(_req, _state) do
response(404)
|> set_header("content-type", "application/json")

View file

@ -1,9 +1,9 @@
defmodule Tilastokeskus.Reception.Routes.PageView do
use Raxx.Server
use Raxx.SimpleServer
alias Tilastokeskus.Archive.Schemas.PageView
require Logger
@impl Raxx.Server
@impl Raxx.SimpleServer
def handle_request(req, state) do
body = URI.decode_query(req.body || "")
{path, path_noq, host, authority} = parse_url(body)
@ -28,14 +28,14 @@ defmodule Tilastokeskus.Reception.Routes.PageView do
# Run in one transaction to avoid multiple DB checkouts
{:ok, response} =
Tilastokeskus.Archive.Repo.transaction(fn ->
session = get_session(req)
session = Tilastokeskus.Reception.Session.extract(req)
cset =
PageView.changeset(
%PageView{},
%{
at: at,
session: session,
session_id: session.id,
addr: addr,
path: path,
path_noq: path_noq,
@ -63,10 +63,7 @@ defmodule Tilastokeskus.Reception.Routes.PageView do
response(200)
|> set_header("content-type", "application/json")
|> set_body(Jason.encode!(%{ok: "OK"}))
|> Raxx.Session.SignedCookie.embed(
session.id,
Tilastokeskus.Reception.Session.config()
)
|> Tilastokeskus.Reception.Session.embed(session)
{:error, err} ->
Logger.error("Error saving pageview: #{inspect(err)}")
@ -115,32 +112,6 @@ defmodule Tilastokeskus.Reception.Routes.PageView do
end
end
defp get_session(req) do
case get_session_id(req) do
{:ok, uuid} ->
case Tilastokeskus.Archive.Utils.Session.find_by_id(uuid) do
nil ->
new_session()
s ->
s
end
{:error, _} ->
new_session()
end
end
defp get_session_id(req) do
config = Tilastokeskus.Reception.Session.config()
Raxx.Session.SignedCookie.extract(req, config)
end
defp new_session() do
{:ok, session} = Tilastokeskus.Archive.Utils.Session.create()
session
end
defp parse_ua(req) do
Raxx.get_header(req, "user-agent", nil)
|> UAInspector.parse()

View file

@ -18,10 +18,52 @@ defmodule Tilastokeskus.Reception.Session do
end
@doc """
Raxx SignedCookie config for generating cookies for client.
Create Raxx SignedCookie config for generating cookies for client.
"""
@spec config() :: Raxx.Session.t()
def config() do
secret = System.get_env("RAXX_SECRET")
Raxx.Session.SignedCookie.config(secret: secret, cookie_name: "tilastokeskus.session")
Raxx.Session.config(
store: Raxx.Session.SignedCookie,
secret_key_base: secret,
salt: "statistikcentralen",
http_only: true,
key: "tilastokeskus-session-id"
)
end
@doc """
Embed given session into the response.
"""
@spec embed(Raxx.Response.t(), map) :: Raxx.Response.t()
def embed(%Raxx.Response{} = response, session) when is_map(session) do
Raxx.Session.embed(
response,
session,
config()
)
end
@doc """
Extract session from request or create new session.
"""
@spec extract(Raxx.Request.t()) :: map
def extract(%Raxx.Request{} = request) do
case Raxx.Session.unprotected_extract(request, config()) do
{:ok, %{id: id}} ->
case Tilastokeskus.Archive.Utils.Session.find_by_id(id) do
nil -> new_session()
session -> %{id: session.id}
end
_ ->
new_session()
end
end
defp new_session() do
{:ok, session} = Tilastokeskus.Archive.Utils.Session.create()
%{id: session.id}
end
end

View file

@ -16,7 +16,7 @@ defmodule Tilastokeskus.Application do
children = [
{Tilastokeskus.Archive.Repo, []},
{Tilastokeskus.Archive.Scrubinator, %{days: days}},
{Tilastokeskus.Reception.Router, [[hosts: hosts], [port: port]]}
{Tilastokeskus.Reception.FrontDesk, [hosts: hosts, port: port, cleartext: true]}
]
# See https://hexdocs.pm/elixir/Supervisor.html
@ -27,7 +27,7 @@ defmodule Tilastokeskus.Application do
defp get_hosts() do
case System.get_env("TILASTOKESKUS_HOSTS") do
nil -> ""
nil -> []
hosts -> String.split(hosts, ",")
end
end

View file

@ -4,8 +4,8 @@ defmodule Tilastokeskus.MixProject do
def project do
[
app: :tilastokeskus,
version: "0.1.0",
elixir: "~> 1.6",
version: "0.2.0",
elixir: "~> 1.9",
start_permanent: Mix.env() == :prod,
deps: deps()
]
@ -22,16 +22,19 @@ defmodule Tilastokeskus.MixProject do
# Run "mix help deps" to learn about dependencies.
defp deps do
[
{:raxx, "~> 0.15.4"},
{:raxx_static, "~> 0.6.1"},
{:ace, "~> 0.16.5"},
{:raxx, "~> 1.1.0"},
{:raxx_static, "~> 0.8.3"},
{:raxx_logger, "~> 0.2.2"},
{:raxx_session, "~> 0.2.5"},
{:ace, "~> 0.18.8"},
{:postgrex, ">= 0.0.0"},
{:ecto, "~> 2.2"},
{:jason, "~> 1.0"},
{:ua_inspector, github: "elixytics/ua_inspector"},
{:geolix, "~> 0.16.0"},
{:geolite2data, "~> 0.0.3"},
{:distillery, "~> 1.5", runtime: false}
{:ecto, "~> 3.2"},
{:ecto_sql, "~> 3.2"},
{:jason, "~> 1.1"},
{:ua_inspector, "~> 1.2"},
{:geolix, "~> 1.0"},
{:geolix_adapter_mmdb2, "~> 0.1.0"},
{:geolite2data, "~> 1.0"}
]
end
end

View file

@ -1,29 +1,35 @@
%{
"ace": {:hex, :ace, "0.16.5", "725f4511768bba7e083d3c93d8e499259101e49c0a9497252ce54a79a91e96e8", [:mix], [{:hpack, "~> 0.2.3", [hex: :hpack_erl, repo: "hexpm", optional: false]}, {:raxx, "~> 0.15.2", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"},
"ace": {:hex, :ace, "0.18.8", "9853110247f769e7d1600be7cd2abd638b53391c8c7b1ab11baad15184cb95d4", [:mix], [{:hpack, "~> 0.2.3", [hex: :hpack_erl, repo: "hexpm", optional: false]}, {:raxx, "~> 0.17.0 or ~> 0.18.0 or ~> 1.0", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"},
"certifi": {:hex, :certifi, "2.3.1", "d0f424232390bf47d82da8478022301c561cf6445b5b5fb6a84d49a9e76d2639", [:rebar3], [{:parse_trans, "3.2.0", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"},
"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"},
"cookie": {:hex, :cookie, "0.1.1", "89438362ee0f0ed400e9f076d617d630f82d682e3fbcf767072a46a6e1ed5781", [:mix], [], "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"},
"db_connection": {:hex, :db_connection, "2.1.1", "a51e8a2ee54ef2ae6ec41a668c85787ed40cb8944928c191280fe34c15b76ae5", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm"},
"decimal": {:hex, :decimal, "1.8.0", "ca462e0d885f09a1c5a342dbd7c1dcf27ea63548c65a65e67334f4b61803822e", [:mix], [], "hexpm"},
"distillery": {:hex, :distillery, "1.5.3", "b2f4fc34ec71ab4f1202a796f9290e068883b042319aa8c9aa45377ecac8597a", [:mix], [], "hexpm"},
"ecto": {:hex, :ecto, "2.2.10", "e7366dc82f48f8dd78fcbf3ab50985ceeb11cb3dc93435147c6e13f2cda0992e", [: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"},
"geolite2data": {:hex, :geolite2data, "0.0.3", "829acdaa56cc8a23909bd557c55e0bd158d03413e11d912ac44e980da70107f3", [:rebar3], [], "hexpm"},
"geolix": {:hex, :geolix, "0.16.0", "0095f5e828c0b46596216efaf6a4d46aba3f1a4da3bdfec735b2e49c8cd908fb", [:mix], [{:mmdb2_decoder, "~> 0.2.0", [hex: :mmdb2_decoder, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.0", [hex: :poolboy, repo: "hexpm", optional: false]}], "hexpm"},
"ecto": {:hex, :ecto, "3.2.1", "a0f9af0fb50b19d3bb6237e512ac0ba56ea222c2bbea92e7c6c94897932c76ba", [:mix], [{:decimal, "~> 1.6", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"},
"ecto_sql": {:hex, :ecto_sql, "3.2.0", "751cea597e8deb616084894dd75cbabfdbe7255ff01e8c058ca13f0353a3921b", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.2.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.2.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"},
"geolite2data": {:hex, :geolite2data, "1.0.0", "ee10a92a2a0443b1de6efe4babc2decd1c7e37ff9ff4d39c01adb3b9d5b2003b", [:rebar3], [], "hexpm"},
"geolix": {:hex, :geolix, "1.0.0", "b225d930fb0418871ce7d89dabf293bd80eb5bd66db1887f80510c122f4ef271", [:mix], [{:poolboy, "~> 1.0", [hex: :poolboy, repo: "hexpm", optional: false]}], "hexpm"},
"geolix_adapter_mmdb2": {:hex, :geolix_adapter_mmdb2, "0.1.0", "ec8e72b095cac319a8eeb546517126c28d9673b9af208f2455464e09fc66bb01", [:mix], [{:geolix, "~> 1.0", [hex: :geolix, repo: "hexpm", optional: false]}, {:mmdb2_decoder, "~> 1.0", [hex: :mmdb2_decoder, repo: "hexpm", optional: false]}], "hexpm"},
"hackney": {:hex, :hackney, "1.13.0", "24edc8cd2b28e1c652593833862435c80661834f6c9344e84b6a2255e7aeef03", [:rebar3], [{:certifi, "2.3.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "5.1.2", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"},
"hpack": {:hex, :hpack_erl, "0.2.3", "17670f83ff984ae6cd74b1c456edde906d27ff013740ee4d9efaa4f1bf999633", [:rebar3], [], "hexpm"},
"idna": {:hex, :idna, "5.1.2", "e21cb58a09f0228a9e0b95eaa1217f1bcfc31a1aaa6e1fdf2f53a33f7dbd9494", [:rebar3], [{:unicode_util_compat, "0.3.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"},
"jason": {:hex, :jason, "1.0.0", "0f7cfa9bdb23fed721ec05419bcee2b2c21a77e926bce0deda029b5adc716fe2", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
"jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"},
"mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"},
"mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"},
"mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"},
"mmdb2_decoder": {:hex, :mmdb2_decoder, "0.2.0", "34346c43bb1860d38d5505e5edf3d5e31a0d9fce4ee48f0c8c762875bcd05bb2", [:mix], [], "hexpm"},
"mmdb2_decoder": {:hex, :mmdb2_decoder, "1.1.0", "2e2347521bb3bf6b81b9ee58d3be2199cb68ea42dcbafcd0d8eb40214d2844cf", [:mix], [], "hexpm"},
"parse_trans": {:hex, :parse_trans, "3.2.0", "2adfa4daf80c14dc36f522cf190eb5c4ee3e28008fc6394397c16f62a26258c2", [:rebar3], [], "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"},
"raxx": {:hex, :raxx, "0.15.4", "62e4a487e55e9469d1ba2d5de590672167f51eaac310f027f3f871018cb6a9fc", [:mix], [{:cookie, "~> 0.1.0", [hex: :cookie, repo: "hexpm", optional: false]}], "hexpm"},
"raxx_static": {:hex, :raxx_static, "0.6.1", "8b48254fc3d1b8b1e473b7c307fbba0ae767c60482754ce823c664544c85d729", [:mix], [{:mime, "~> 1.1", [hex: :mime, repo: "hexpm", optional: false]}, {:raxx, "~> 0.15.2", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"},
"plug_crypto": {:hex, :plug_crypto, "1.0.0", "18e49317d3fa343f24620ed22795ec29d4a5e602d52d1513ccea0b07d8ea7d4d", [:mix], [], "hexpm"},
"poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm"},
"postgrex": {:hex, :postgrex, "0.15.1", "23ce3417de70f4c0e9e7419ad85bdabcc6860a6925fe2c6f3b1b5b1e8e47bf2f", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [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"},
"raxx": {:hex, :raxx, "1.1.0", "d6a03143a91f8092c0be1ec555075c76c8d680601236de706f020d17abcf8b16", [:mix], [], "hexpm"},
"raxx_logger": {:hex, :raxx_logger, "0.2.2", "51bbce9371298e7329de028fe13cf050bf59547bc8f1926910d479ba4b31c4b4", [:mix], [{:raxx, "~> 0.17.5 or ~> 0.18.0 or ~> 1.0", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"},
"raxx_session": {:hex, :raxx_session, "0.2.5", "d806650289dc8f5ce7c709ba903b2b3ef306920c680af706bbbb09bfc7c2a591", [:mix], [{:cookie, "~> 0.1.1", [hex: :cookie, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:raxx, "~> 1.0", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"},
"raxx_static": {:hex, :raxx_static, "0.8.3", "54022edeba731fa82f8c16fffe8a0c3f36bf55808aba7c3043922cb6b2951a1c", [:mix], [{:mime, "~> 1.1", [hex: :mime, repo: "hexpm", optional: false]}, {:raxx, "~> 0.17.0 or ~> 0.18.0 or ~> 1.0", [hex: :raxx, repo: "hexpm", optional: false]}], "hexpm"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm"},
"ua_inspector": {:git, "https://github.com/elixytics/ua_inspector.git", "3cd8fb927d5e14241a6646468f6a19e57afdaccb", []},
"telemetry": {:hex, :telemetry, "0.4.0", "8339bee3fa8b91cb84d14c2935f8ecf399ccd87301ad6da6b71c09553834b2ab", [:rebar3], [], "hexpm"},
"ua_inspector": {:hex, :ua_inspector, "1.2.0", "970339552466e6a814cc6339f582d34c6814f28952bb4513f29b1d0a1dbc8847", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:yamerl, "~> 0.7", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.3.1", "a1f612a7b512638634a603c8f401892afbf99b8ce93a45041f8aaca99cadb85e", [:rebar3], [], "hexpm"},
"yamerl": {:hex, :yamerl, "0.7.0", "e51dba652dce74c20a88294130b48051ebbbb0be7d76f22de064f0f3ccf0aaf5", [:rebar3], [], "hexpm"},
}