Compare commits

...

6 Commits

Author SHA1 Message Date
62c62f01df Mint version updated 2020-06-16 20:20:49 +03:00
96222a99a3 Updated depenedencies 2020-04-11 04:38:03 +03:00
264beada0d Updated Readme 2019-07-01 00:10:29 +03:00
34a3524dbc ExDoc in mix 2019-06-30 23:38:43 +03:00
e903b83f38 Added logo 2019-06-30 23:31:34 +03:00
ff5bb588fe Doc fixes 2019-06-30 10:21:49 +03:00
11 changed files with 147 additions and 48 deletions

View File

@ -1,3 +1,5 @@
<img align="right" width="50" height="50" src="assets/yandex_translate.svg">
# YandexTranslate
A simple Elixir interface to Cloud Yandex Translate's translation API
@ -58,7 +60,7 @@ Request for getting list of supported languages is #languages.
Request for detecting language of text is #detect.
```elixir
YandexTranslator.detect("Hello")
YandexTranslate.detect("Hello")
```
### Translation
@ -66,12 +68,12 @@ Request for detecting language of text is #detect.
Request for translating text is #translate.
```elixir
YandexTranslator.translate("Hello", "ru")
YandexTranslate.translate("Hello", "uk")
```
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/negrienko/yandex_translate.
Bug reports and pull requests are welcome on at https://gl.negrienko.com/negrienko/yandex_translate.
## License
@ -83,6 +85,6 @@ Use this package at your own peril and risk.
## Documentation
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
Documentation generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/yandex_translate](https://hexdocs.pm/yandex_translate).

BIN
assets/yandex_translate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="50px" height="50px" viewBox="0 0 50 50" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->
<title>yandex_translate</title>
<desc>Created with Sketch.</desc>
<g id="yandex_translate" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="yt" transform="translate(3.000000, 3.000000)">
<circle id="Ground" fill="#4A90E2" cx="22.5" cy="22.5" r="22.5"></circle>
<g id="Letters" transform="translate(7.000000, 7.000000)">
<circle id="Oval" fill="#FFFFFF" cx="20" cy="10" r="10"></circle>
<path d="M20.23,12.79 C19.872,12.053 19.525,11.156 19.26,10.094 C20.07,9.764 20.902,9.59 21.674,9.59 C21.85,9.59 22.022,9.6 22.19,9.617 C21.868,10.504 21.357,11.497 20.55,12.449 C20.448,12.567 20.34,12.679 20.23,12.789 L20.23,12.79 Z M16.272,13.917 C15.914,13.079 16.689,11.712 17.952,10.801 C18.268,11.961 18.672,12.944 19.085,13.741 C18.313,14.245 17.523,14.521 16.933,14.431 C16.605,14.381 16.401,14.223 16.273,13.918 L16.272,13.917 Z M23.978,8.605 C24.116,7.935 24.162,7.392 24.178,7.037 L22.73,7.037 C22.717,7.307 22.68,7.707 22.584,8.199 C21.456,8.034 20.184,8.193 18.966,8.644 C18.83,7.831 18.746,7.077 18.7,6.407 C23.036,6.157 25.595,5.1 25.713,5.05 L25.157,3.704 C25.13,3.714 22.709,4.706 18.644,4.949 C18.638,3.943 18.706,3.331 18.71,3.297 L17.258,3.297 C17.232,3.58 17.19,4.172 17.196,5 L17.063,5.004 C15.766,5.007 14.563,4.907 14.278,4.881 L14.278,6.348 C14.703,6.386 15.731,6.465 16.901,6.465 L17.254,6.461 C17.311,7.294 17.421,8.248 17.614,9.289 C15.694,10.442 14.17,12.679 14.946,14.496 C15.272,15.26 15.901,15.749 16.718,15.874 C16.855,15.894 16.996,15.906 17.142,15.906 C17.969,15.906 18.917,15.568 19.822,14.992 C20.412,15.882 20.89,16.352 20.932,16.392 L21.926,15.332 C21.916,15.322 21.496,14.912 20.969,14.102 C21.205,13.882 21.435,13.652 21.649,13.402 C22.609,12.268 23.207,11.092 23.579,10.04 C23.906,10.23 24.227,10.516 24.397,10.942 C24.975,12.392 24.14,14.066 23.362,14.794 L24.342,15.864 C25.637,14.654 26.532,12.388 25.737,10.396 C25.424,9.612 24.82,8.999 23.98,8.606 L23.978,8.605 Z" id="Shape" fill="#4A90E2" fill-rule="nonzero"></path>
<circle id="Oval" fill="#FFFFFF" cx="10" cy="20" r="10"></circle>
<path d="M11.795,20.744 L8.205,20.744 L10,16.158 L11.795,20.744 Z M10.775,13.742 L9.225,13.742 L4.405,25.454 L6.378,25.454 L7.563,22.338 L12.437,22.338 L13.622,25.454 L15.594,25.454 L10.775,13.742 Z" id="Shape" fill="#4A90E2" fill-rule="nonzero"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -1,8 +1,55 @@
defmodule YandexTranslate do
@moduledoc """
Basic functions for requests to Yandex Translate API on Yandex Cloud
"""
alias YandexTranslate.Client
@doc """
Retrieves the list of supported languages.
Return a map with language code (use it for translations) and native language name
```elixir
%{
languages: [
%{code: "az", name: "azərbaycan"},
%{code: "sq", name: "shqip"},
%{code: "am", name: "አማርኛ"},
%{code: "en", name: "English"},
%{code: "ar", name: "العربية"},
%{code: "hy", name: "հայերեն"},
%{code: "af", name: "Afrikaans"},
%{code: "eu", name: "euskara"},
...
]
}
```
"""
def languages(), do: Client.call(:listLanguages, %{})
@doc """
Detect the language of the text
Get text as a string param and return a map with language code
```elixir
YandexTranslate.detect("Криївка")
# Response
%{languageCode: "uk"}
```
Or get a map with :text and :languageCodeHints (for specify the most likely languages).
> In some languages, one and the same word has the same spelling. For example, the English word hand is also written as hand in German, Swedish, and Dutch. If the text you transmit contains words like this, Translate may detect the source language incorrectly.
To avoid mistakes, you can use the languageCodeHints field to specify which languages should be given priority when determining the language of the text
```elixir
YandexTranslate.detect(%{text: "Капелюх", languageCodeHints: ["uk"]})
# Response
%{languageCode: "uk"}
```
"""
def detect(params) when is_map(params), do: Client.call(:detectLanguage, params)
def detect(text) when is_binary(text), do: Client.call(:detectLanguage, %{text: text})

View File

@ -1,5 +1,5 @@
defmodule YandexTranslate.Auth.IAMToken do
alias YandexTranslate.Auth.JWTTokenConfig
alias YandexTranslate.Auth.SignerConfig
def get_auth_value() do
"Bearer " <> get_iam_token()
@ -8,12 +8,19 @@ defmodule YandexTranslate.Auth.IAMToken do
def get_iam_token() do
# Rewrite needed, signing process not worked. Fucking PS256 and hash length optoins on my opinion
# Pluged by old IAMToken
"CggVAgAAABoBMRKABDnO1uw1a7U-AIlRglhz8yQVQzXaKjXt1saXk5VDXHH41mlPpMpK3V9-GUgthtdposNYva9hj0DaaHE1YDZfBcZkiZU7T_45ilhFtouG5rARRP8E6GqR4-dMutrYo69XQ3Uj4-KPa0IkOa2HrCTJEePhDHGlz-iW_YnN0QXFIlKN7NMIrZQyYRJ1dvQExx29TARcy_OVWOO8234rU_Vi5BRBKXTfp7NFB589bMe6UhEoYTF-1PdOEtxDJ2DLMdqMiYw4BZnyhOwn81u8kAetHpC-R6kizR8P2omcMyZORk4zwMfgdWlDzAhrIGq4ev8aOpcQH2vH8xh8ZMTgqbRZ9rezOflEZ3bDdDVdcQWjMq4ZYABY1n278pzhucbiTZJl6uxxTXg9Ucbg7_9mpA8DOIBn72wx8dTmrJgXWTstSJ6aShpg_1VJE48gUSenO1AjXWnat9hcvhgrBGKdQFlmhqnrRTptnvhgdNctwvD_tjpjC9ZWa5pBPyE9pKdiZzYUkhSEKEpRKFAh7oGv4i0w5gCHDzQrQfrrMFxFUUPJCg8Hx0tUbLqMgF9sYXYS4vhJFWFtBl_x0dd3KMPy33Fg4oDxlbZwsolyrVI9QnT9Es2qXGp1Sw9TLMM3pAI8G8JOD7O8eTRCJalRrrFOgybbK8LjK7AKLBhI0MNtQs0A_QS-GnYKIGIxODQ5YTljMmQ4ZjRiNjQ5YTU1MzhhN2E1OTdkNDU3ELTgzugFGPSx0egFIj4KFGFqZTB1czQyMWdoNG9idmJwcW5iEg5leGNoYW5nZXJzNGRldioUYjFnbmw5N3VkNzltYXA3bmhnM2wwAjAFOAFQAVoA"
end
def get_jwt_token() do
signer = Joken.Signer.create("PS256", %{"pem" => get_rsa_key(:private)}, get_headers())
JWTTokenConfig.generate_and_sign(%{}, signer) |> elem(1)
{:ok, token, _payload} = SignerConfig.generate_and_sign(%{}, signer)
token
# {:ok, payload_map} = SignerConfig.generate_claims()
# {:ok, payload} = Jason.encode(payload_map)
# headers = Map.merge(get_headers(), %{"alg" => "PS256", "typ" => "JWT"})
# key = get_rsa_key(:private) |> JOSE.JWK.from_pem()
# {_alg, jwt} = JOSE.JWS.sign(key, payload, headers) |> JOSE.JWS.compact()
# jwt
end
defp get_headers(kid \\ Application.get_env(:yandex_translate, :authorized_key_id)),
@ -31,7 +38,9 @@ defmodule YandexTranslate.Auth.IAMToken do
|> elem(1)
end
defp fetch_key("-----BEGIN" <> _ = key_content), do: key_content
defp fetch_key("-----BEGIN" <> _ = key_content) do
key_content
end
defp fetch_key(key_file), do: File.read!(key_file) |> fetch_key()
end

View File

@ -1,15 +0,0 @@
defmodule YandexTranslate.Auth.JWTTokenConfig do
@iam_token_url "https://iam.api.cloud.yandex.net/iam/v1/tokens"
use Joken.Config
@impl Joken.Config
def token_config() do
default_claims(
iss: Application.get_env(:yandex_translate, :service_account_id),
default_exp: 60 * 60,
skip: [:jti, :nbf],
aud: Application.get_env(:yandex_translate, :iam_token_url) || @iam_token_url
)
end
end

View File

@ -0,0 +1,22 @@
defmodule YandexTranslate.Auth.SignerConfig do
@iam_token_url "https://iam.api.cloud.yandex.net/iam/v1/tokens"
use Joken.Config
# defp iss, do: Application.get_env(:yandex_translate, :service_account_id)
# defp aud, do: Application.get_env(:yandex_translate, :iam_token_url) || @iam_token_url
@impl Joken.Config
def token_config() do
default_claims(
iss: Application.get_env(:yandex_translate, :service_account_id),
default_exp: 59 * 60,
skip: [:jti, :nbf],
aud: Application.get_env(:yandex_translate, :iam_token_url) || @iam_token_url
)
# default_claims(skip: [:aud, :iss, :jti, :nbf])
# |> add_claim("aud", nil, &(&1 == iss()))
# |> add_claim("iss", nil, &(&1 == aud()))
end
end

View File

@ -74,7 +74,7 @@ defmodule YandexTranslate.Client do
defp valid_argument_keys(_), do: []
defp parse(body), do: Jason.decode!(body)
defp parse(body), do: Jason.decode!(body, keys: :atoms)
defp fetch(method, headers, body) do
{:ok, conn} = Mint.HTTP.connect(:https, @base_host, 443)

42
mix.exs
View File

@ -1,21 +1,36 @@
defmodule YandexTranslate.Mixfile do
defmodule YandexTranslate.MixProject do
use Mix.Project
@name "YandexTranslate"
@version "0.4.1"
# @repo_url "https://github.com/negrienko/yandex_translate"
@repo_url "https://gl.negrienko.com/negrienko/yandex_translate"
@homepage_url "https://negrienko.com/all/yandex-translate/"
@author_url "https://negrienko.com/"
@description """
Translate word and phrases using the Yandex Translate API. See README.md for information.
Translate word and phrases using the Yandex Cloud Yandex Translate API. See README.md for information.
"""
def project do
[
app: :yandex_translate,
version: "0.1.0",
elixir: "~> 1.8",
description: @description,
version: @version,
elixir: "~> 1.9",
build_embedded: Mix.env() == :prod,
start_permanent: Mix.env() == :prod,
package: package(),
deps: deps(),
source_url: "https://gl.negrienko.com/negrienko/yandex_translate"
# Docs
name: @name,
description: @description,
source_url: @repo_url,
homepage_url: @homepage_url,
docs: [
logo: "assets/yandex_translate.svg",
main: @name,
source_ref: @version,
source_url: @repo_url
]
]
end
@ -28,12 +43,13 @@ defmodule YandexTranslate.Mixfile do
defp deps do
[
{:joken, "~> 2.1.0"},
# {:jose, "~> 1.9.0"},
{:jason, "~> 1.1.2"},
{:mint, "~> 0.3.0"},
{:castore, "~> 0.1.2"},
{:ex_doc, "~> 0.20.2", only: :dev},
{:joken, "~> 2.2.0"},
{:jose, "~> 1.10.1"},
{:jason, "~> 1.2.1"},
{:mint, "~> 1.1.0"},
{:castore, "~> 0.1.6"},
{:ex_spec, "~> 2.0.1", only: :test},
{:ex_doc, "~> 0.21.3", only: :dev},
{:remix, "~> 0.0.2", only: :dev}
]
end
@ -42,7 +58,7 @@ defmodule YandexTranslate.Mixfile do
[
maintainers: ["Danylo Negriienko"],
licenses: ["MIT"],
links: %{"git" => "https://gl.negrienko.com/negrienko/yandex_translate"}
links: %{"git" => @repo_url, "author" => @author_url, "homepage" => @homepage_url}
]
end
end

View File

@ -1,27 +1,28 @@
%{
"base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"},
"castore": {:hex, :castore, "0.1.2", "81adb0683c4ec8ebb97ad777ec1b050405282d55453df14567a3c73ae25932a6", [:mix], [], "hexpm"},
"castore": {:hex, :castore, "0.1.6", "2da0dccb3eacb67841d11790598ff03cd5caee861e01fad61dce1376b5da28e6", [:mix], [], "hexpm", "f874c510b720d31dd6334e9ae5c859a06a3c9e67dfe1a195c512e57588556d3f"},
"certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"},
"earmark": {:hex, :earmark, "1.3.2", "b840562ea3d67795ffbb5bd88940b1bed0ed9fa32834915125ea7d02e35888a5", [:mix], [], "hexpm"},
"ex_doc": {:hex, :ex_doc, "0.20.2", "1bd0dfb0304bade58beb77f20f21ee3558cc3c753743ae0ddbb0fd7ba2912331", [:mix], [{:earmark, "~> 1.3", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.10", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"},
"earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"},
"ex_doc": {:hex, :ex_doc, "0.21.3", "857ec876b35a587c5d9148a2512e952e24c24345552259464b98bfbb883c7b42", [:mix], [{:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm", "0db1ee8d1547ab4877c5b5dffc6604ef9454e189928d5ba8967d4a58a801f161"},
"ex_spec": {:hex, :ex_spec, "2.0.1", "8bdbd6fa85995fbf836ed799571d44be6f9ebbcace075209fd0ad06372c111cf", [:mix], [], "hexpm", "b44fe5054497411a58341ece5bf7756c219d9d6c1303b5ac467f557a0a4c31ac"},
"hackney": {:hex, :hackney, "1.15.1", "9f8f471c844b8ce395f7b6d8398139e26ddca9ebc171a8b91342ee15a19963f4", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.4", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"},
"httpoison": {:hex, :httpoison, "1.5.1", "0f55b5b673b03c5c327dac7015a67cb571b99b631acc0bc1b0b98dcd6b9f2104", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"},
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"},
"jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
"joken": {:hex, :joken, "2.1.0", "bf21a73105d82649f617c5e59a7f8919aa47013d2519ebcc39d998d8d12adda9", [:mix], [{:jose, "~> 1.9", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm"},
"jose": {:hex, :jose, "1.9.0", "4167c5f6d06ffaebffd15cdb8da61a108445ef5e85ab8f5a7ad926fdf3ada154", [:mix, :rebar3], [{:base64url, "~> 0.0.1", [hex: :base64url, 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"},
"jason": {:hex, :jason, "1.2.1", "12b22825e22f468c02eb3e4b9985f3d0cb8dc40b9bd704730efa11abd2708c44", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b659b8571deedf60f79c5a608e15414085fa141344e2716fbd6988a084b5f993"},
"joken": {:hex, :joken, "2.2.0", "2daa1b12be05184aff7b5ace1d43ca1f81345962285fff3f88db74927c954d3a", [:mix], [{:jose, "~> 1.9", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "b4f92e30388206f869dd25d1af628a1d99d7586e5cf0672f64d4df84c4d2f5e9"},
"jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"},
"makeup": {:hex, :makeup, "1.0.1", "82f332e461dc6c79dbd82fbe2a9c10d48ed07146f0a478286e590c83c52010b5", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "49736fe5b66a08d8575bf5321d716bac5da20c8e6b97714fec2bcd6febcfa1f8"},
"makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d4b316c7222a85bbaa2fd7c6e90e37e953257ad196dc229505137c5e505e9eff"},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"},
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"},
"mint": {:hex, :mint, "0.3.0", "f00f09363e5cdba1572519914aab3cea1a73b4737c63a29afe74a08362f5f91c", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm"},
"mint": {:hex, :mint, "1.1.0", "1fd0189edd9e3ffdbd7fcd8bc3835902b987a63ec6c4fd1aa8c2a56e2165f252", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5bfd316c3789340b682d5679a8116bcf2112e332447bdc20c1d62909ee45f48d"},
"mojito": {:hex, :mojito, "0.3.0", "806cd3c1832333a9ee784e7ea2799863fbe4de55ecb4623a8f4ef870c2844cc6", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: false]}, {:mint, "~> 0.2.1", [hex: :mint, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}], "hexpm"},
"nimble_parsec": {:hex, :nimble_parsec, "0.5.0", "90e2eca3d0266e5c53f8fbe0079694740b9c91b6747f2b7e3c5d21966bba8300", [:mix], [], "hexpm"},
"nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm", "589b5af56f4afca65217a1f3eb3fee7e79b09c40c742fddc1c312b3ac0b3399f"},
"ojson": {:hex, :ojson, "1.0.0", "fd28614eadaec00a15cdb2f53f29d8717a812a508ddb80d202f2f2e2aaeabbcc", [:mix, :rebar3], [], "hexpm"},
"parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"},
"poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"},
"poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm"},
"remix": {:hex, :remix, "0.0.2", "f06115659d8ede8d725fae1708920ef73353a1b39efe6a232d2a38b1f2902109", [:mix], [], "hexpm"},
"remix": {:hex, :remix, "0.0.2", "f06115659d8ede8d725fae1708920ef73353a1b39efe6a232d2a38b1f2902109", [:mix], [], "hexpm", "5f5555646ed4fca83fab8620735150aa0bc408c5a17a70d28cfa7086bc6f497c"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.4", "f0eafff810d2041e93f915ef59899c923f4568f4585904d010387ed74988e77b", [:make, :mix, :rebar3], [], "hexpm"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"},
}