Skip to content

Elixir updates #212

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Aug 5, 2018
Merged
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
23 changes: 23 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
version: 2.0
jobs:
build:
docker:
- image: circleci/elixir:1.6.6-otp-21
steps:
- checkout
- restore_cache:
keys:
- v2-dependency-cache-{{ checksum "mix.lock" }}
- run: mix local.hex --force
- run: mix local.rebar --force
- run: mix deps.get
- run: mix deps.compile
- run: mix compile
- run: ./integration/hack_out_incompatible_tests.sh
- run: mix credo --strict
- run: mix coveralls.circle
- save_cache:
key: v2-dependency-cache-{{ checksum "mix.lock" }}
paths:
- _build
- deps
4 changes: 0 additions & 4 deletions .credo.exs
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,6 @@
{Credo.Check.Warning.BoolOperationOnSameValues},
{Credo.Check.Warning.IExPry},
{Credo.Check.Warning.IoInspect, false},
{Credo.Check.Warning.NameRedeclarationByAssignment, false},
{Credo.Check.Warning.NameRedeclarationByCase, false},
{Credo.Check.Warning.NameRedeclarationByDef, false},
{Credo.Check.Warning.NameRedeclarationByFn, false},
{Credo.Check.Warning.OperationOnSameValues, false},
# Disabled because of p.x == p.x in Ecto queries
{Credo.Check.Warning.OperationWithConstantResult},
Expand Down
4 changes: 4 additions & 0 deletions .formatter.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Used by "mix format"
[
inputs: ["mix.exs", "{config,lib,test,bench}/**/*.{ex,exs}"]
]
2 changes: 2 additions & 0 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
erlang 21.0.1
elixir 1.6.6-otp-21
25 changes: 0 additions & 25 deletions .travis.yml

This file was deleted.

17 changes: 5 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
[![Build Status](https://travis-ci.org/scouten/sqlite_ecto2.svg?branch=master "Build Status")](https://travis-ci.org/scouten/sqlite_ecto2)
[![CircleCI](https://circleci.com/gh/Sqlite-Ecto/sqlite_ecto2.svg?style=svg)](https://circleci.com/gh/Sqlite-Ecto/sqlite_ecto2)
[![Hex.pm](https://img.shields.io/hexpm/v/sqlite_ecto2.svg)](https://hex.pm/packages/sqlite_ecto2)
[![Ebert](https://ebertapp.io/github/scouten/sqlite_ecto2.svg)](https://ebertapp.io/github/scouten/sqlite_ecto2)
[![Coverage Status](https://coveralls.io/repos/github/scouten/sqlite_ecto2/badge.svg?branch=master)](https://coveralls.io/github/scouten/sqlite_ecto2?branch=master)
[![Coverage Status](https://coveralls.io/repos/github/Sqlite-Ecto/sqlite_ecto2/badge.svg?branch=master)](https://coveralls.io/github/Sqlite-Ecto/sqlite_ecto2?branch=master)

# sqlite_ecto2

Expand All @@ -10,18 +9,11 @@
Read [the tutorial](./docs/tutorial.md) for a detailed example of how to setup and use a SQLite repo with Ecto, or just check-out the CliffsNotes in the sections below if you want to get started quickly.


## SEEKING NEW MAINTAINER

My sincere apologies, but I must step down from maintaining this project. Some life events have conspired to leave me without the time I would need to devote to properly continue the development of this project. If you are interested in giving it the love it needs (especially, following the changes for Ecto 3.0), please file an issue or contact me at <[email protected]> to discuss taking ownership of this module.

I'll review PRs from time to time if they can be merged easily, but I do not have the ability to review or attempt to fix unsolved issues.


## Ecto Version Compatibility

**IMPORTANT:** This release will _only_ work with Ecto 2.2.x. If you need compatibility with older versions of Ecto, please see:

* Ecto 2.1.x -> [`sqlite_ecto2` 2.0.x series](https://github.com/scouten/sqlite_ecto2/tree/v2.0)
* Ecto 2.1.x -> [`sqlite_ecto2` 2.0.x series](https://github.com/Sqlite-Ecto/sqlite_ecto2/tree/v2.0)
* Ecto 1.x -> [`sqlite_ecto` v1.x series](https://github.com/jazzyb/sqlite_ecto)


Expand Down Expand Up @@ -62,7 +54,8 @@ Note that the Travis configuration for this repo specifically excludes OTP 19.0

## Dependencies

This library makes use of [sqlitex](https://github.com/mmmries/sqlitex) and [esqlite](https://github.com/mmzeeman/esqlite). Since esqlite uses Erlang NIFs to incorporate SQLite, you will need a valid C compiler to build the library.
This library makes use of [sqlite3](https://github.com/Sqlite-Ecto/sqlitex)
Since esqlite uses Erlang NIFs to incorporate SQLite, you will need a valid C compiler to build the library.

## Example

Expand Down
13 changes: 0 additions & 13 deletions config/dogma.exs

This file was deleted.

39 changes: 25 additions & 14 deletions lib/sqlite_db_connection/protocol.ex
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ defmodule Sqlite.DbConnection.Protocol do

@spec connect(Keyword.t) :: {:ok, state}
def connect(opts) do
{db_path, _opts} = Keyword.pop(opts, :database)
db_path = Keyword.fetch!(opts, :database)
db_timeout = Keyword.get(opts, :db_timeout, 5000)

{:ok, db} = Sqlitex.Server.start_link(db_path)
{:ok, db} = Sqlitex.Server.start_link(db_path, db_timeout: db_timeout)
:ok = Sqlitex.Server.exec(db, "PRAGMA foreign_keys = ON")
{:ok, [[foreign_keys: 1]]} = Sqlitex.Server.query(db, "PRAGMA foreign_keys")

Expand Down Expand Up @@ -81,7 +82,7 @@ defmodule Sqlite.DbConnection.Protocol do
:transaction -> "BEGIN"
:savepoint -> "SAVEPOINT sqlite_ecto_savepoint"
end
handle_transaction(sql, s)
handle_transaction(sql, [timeout: Keyword.get(opts, :timeout, 5000)], s)
end

@spec handle_commit(Keyword.t, state) ::
Expand All @@ -91,7 +92,7 @@ defmodule Sqlite.DbConnection.Protocol do
:transaction -> "COMMIT"
:savepoint -> "RELEASE SAVEPOINT sqlite_ecto_savepoint"
end
handle_transaction(sql, s)
handle_transaction(sql, [timeout: Keyword.get(opts, :timeout, 5000)], s)
end

@spec handle_rollback(Keyword.t, state) ::
Expand All @@ -101,7 +102,7 @@ defmodule Sqlite.DbConnection.Protocol do
:transaction -> "ROLLBACK"
:savepoint -> "ROLLBACK TO SAVEPOINT sqlite_ecto_savepoint"
end
handle_transaction(sql, s)
handle_transaction(sql, [timeout: Keyword.get(opts, :timeout, 5000)], s)
end

defp refined_info(prepared_info) do
Expand All @@ -125,10 +126,10 @@ defmodule Sqlite.DbConnection.Protocol do
defp maybe_atom_to_lc_string(nil), do: nil
defp maybe_atom_to_lc_string(item), do: item |> to_string |> String.downcase

defp handle_execute(%Query{statement: sql}, params, _sync, _opts, s) do
defp handle_execute(%Query{statement: sql}, params, _sync, opts, s) do
# Note that we rely on Sqlitex.Server to cache the prepared statement,
# so we can simply refer to the original SQL statement here.
case run_stmt(sql, params, s) do
case run_stmt(sql, params, opts, s) do
{:ok, result} ->
{:ok, result, s}
other ->
Expand All @@ -145,10 +146,16 @@ defmodule Sqlite.DbConnection.Protocol do
message: to_string(message)}, s}
end

defp run_stmt(query, params, s) do
opts = [decode: :manual, types: true, bind: params]
defp run_stmt(query, params, opts, s) do
query_opts = [
timeout: Keyword.get(opts, :timeout, 5000),
decode: :manual,
types: true,
bind: params
]

command = command_from_sql(query)
case query_rows(s.db, to_string(query), opts) do
case query_rows(s.db, to_string(query), query_opts) do
{:ok, %{rows: raw_rows, columns: raw_column_names}} ->
{rows, num_rows, column_names} = case {raw_rows, raw_column_names} do
{_, []} -> {nil, get_changes_count(s.db, command), nil}
Expand All @@ -160,6 +167,8 @@ defmodule Sqlite.DbConnection.Protocol do
command: command}}
{:error, {_sqlite_errcode, _message}} = err ->
sqlite_error(err, s)
{:error, %Sqlite.DbConnection.Error{} = err} ->
{:error, err, s}
{:error, :args_wrong_length} ->
{:error,
%ArgumentError{message: "parameters must match number of placeholders in query"},
Expand Down Expand Up @@ -193,8 +202,8 @@ defmodule Sqlite.DbConnection.Protocol do
String.to_atom(List.first(words))
end

defp handle_transaction(stmt, s) do
{:ok, _rows} = query_rows(s.db, stmt, into: :raw_list)
defp handle_transaction(stmt, opts, s) do
{:ok, _rows} = query_rows(s.db, stmt, Keyword.merge(opts, [into: :raw_list]))
command = command_from_sql(stmt)
result = %Sqlite.DbConnection.Result{rows: nil,
num_rows: nil,
Expand All @@ -207,8 +216,10 @@ defmodule Sqlite.DbConnection.Protocol do
try do
Sqlitex.Server.query_rows(db, stmt, opts)
catch
:exit, _ ->
{:raise, %Sqlite.DbConnection.Error{message: "Disconnected"}}
:exit, {:timeout, _gen_server_call} ->
{:error, %Sqlite.DbConnection.Error{message: "Timeout"}}
:exit, _ex ->
{:error, %Sqlite.DbConnection.Error{message: "Disconnected"}}
end
end
end
4 changes: 4 additions & 0 deletions lib/sqlite_db_connection/stream.ex
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,8 @@ defimpl Enumerable, for: Sqlite.DbConnection.Stream do
def count(_) do
{:error, __MODULE__}
end

def slice(_) do
{:error, __MODULE__}
end
end
4 changes: 2 additions & 2 deletions lib/sqlite_ecto/connection.ex
Original file line number Diff line number Diff line change
Expand Up @@ -565,10 +565,10 @@ if Code.ensure_loaded?(Sqlitex.Server) do

# DDL

alias Ecto.Migration.Table
alias Ecto.Migration.Constraint
alias Ecto.Migration.Index
alias Ecto.Migration.Reference
alias Ecto.Migration.Constraint
alias Ecto.Migration.Table

@drops [:drop, :drop_if_exists]

Expand Down
28 changes: 16 additions & 12 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,13 @@ defmodule Sqlite.Ecto2.Mixfile do
# testing
build_per_environment: false,
test_paths: test_paths(),
test_coverage: [tool: Coverex.Task, coveralls: true],
test_coverage: [tool: ExCoveralls],
preferred_cli_env: [
coveralls: :test,
"coveralls.detail": :test,
"coveralls.html": :test,
"coveralls.circle": :test
],

# hex
description: description(),
Expand All @@ -25,33 +31,31 @@ defmodule Sqlite.Ecto2.Mixfile do

# Configuration for the OTP application
def application do
[applications: [:db_connection, :ecto, :logger, :sqlitex],
[extra_applications: [:logger],
mod: {Sqlite.DbConnection.App, []}]
end

# Dependencies
defp deps do
[{:connection, "~> 1.0.3"},
{:coverex, "~> 1.4.11", only: :test},
{:credo, "~> 0.7", only: [:dev, :test]},
{:credo, "~> 0.10", only: [:dev, :test]},
{:db_connection, "~> 1.1.0"},
{:decimal, "~> 1.2"},
{:dogma, "~> 0.1", only: :dev},
{:esqlite, "~> 0.2.3"},
{:ex_doc, "~> 0.16", only: :dev},
{:ecto, "~> 2.2.2"},
{:decimal, "~> 1.5"},
{:excoveralls, "~> 0.9", only: :test},
{:ex_doc, "~> 0.18", runtime: false, only: :docs},
{:ecto, "~> 2.2"},
{:poison, "~> 2.2 or ~> 3.0", optional: true},
{:postgrex, "~> 0.13.0", optional: true},
{:postgrex, "~> 0.13", optional: true},
{:sbroker, "~> 1.0"},
{:sqlitex, "~> 1.3.2 or ~> 1.4"}]
end

defp description, do: "SQLite3 adapter for Ecto2"

defp package do
[maintainers: ["Eric Scouten", "Jason M Barnes"],
[maintainers: ["Eric Scouten", "Jason M Barnes", "Connor Rigby"],
licenses: ["MIT"],
links: %{"Github" => "https://github.com/scouten/sqlite_ecto2"}]
links: %{"Github" => "https://github.com/Sqlite-Ecto/sqlite_ecto2"}]
end

defp elixirc_paths(:test), do: ["lib", "test/sqlite_db_connection/support"]
Expand Down
24 changes: 16 additions & 8 deletions mix.lock
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
%{"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm"},
%{
"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm"},
"certifi": {:hex, :certifi, "1.0.0", "1c787a85b1855ba354f0b8920392c19aa1d06b0ee1362f9141279620a5be2039", [:rebar3], [], "hexpm"},
"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"},
"coverex": {:hex, :coverex, "1.4.13", "d90833b82bdd6a1ec05a6d971283debc3dd9611957489010e4b1ab0071a9ee6c", [:mix], [{:hackney, "~> 1.5", [hex: :hackney, repo: "hexpm", optional: false]}, {:poison, "~> 1.5 or ~> 2.0 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"},
"credo": {:hex, :credo, "0.8.1", "137efcc99b4bc507c958ba9b5dff70149e971250813cbe7d4537ec7e36997402", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}], "hexpm"},
"credo": {:hex, :credo, "0.10.0", "66234a95effaf9067edb19fc5d0cd5c6b461ad841baac42467afed96c78e5e9e", [: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.2", "2865c2a4bae0714e2213a0ce60a1b12d76a6efba0c51fbda59c9ab8d1accc7a8", [: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.4.0", "fac965ce71a46aab53d3a6ce45662806bdd708a4a95a65cde8a12eb0124a1333", [:mix], [], "hexpm"},
"dogma": {:hex, :dogma, "0.1.15", "5bceba9054b2b97a4adcb2ab4948ca9245e5258b883946e82d32f785340fd411", [:mix], [{:poison, ">= 2.0.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"},
"earmark": {:hex, :earmark, "1.2.2", "f718159d6b65068e8daeef709ccddae5f7fdc770707d82e7d126f584cd925b74", [:mix], [], "hexpm"},
"decimal": {:hex, :decimal, "1.5.0", "b0433a36d0e2430e3d50291b1c65f53c37d56f83665b43d79963684865beab68", [:mix], [], "hexpm"},
"dogma": {:hex, :dogma, "0.1.16", "3c1532e2f63ece4813fe900a16704b8e33264da35fdb0d8a1d05090a3022eef9", [:mix], [{:poison, ">= 2.0.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"},
"earmark": {:hex, :earmark, "1.2.5", "4d21980d5d2862a2e13ec3c49ad9ad783ffc7ca5769cf6ff891a4553fbaae761", [:mix], [], "hexpm"},
"ecto": {:hex, :ecto, "2.2.2", "e9bd6ebc044eaaab1cb369e3465686d8aca830aa5bf545ef2bae000a3d42c54b", [: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"},
"esqlite": {:hex, :esqlite, "0.2.3", "1a8b60877fdd3d50a8a84b342db04032c0231cc27ecff4ddd0d934485d4c0cd5", [:rebar3], [], "hexpm"},
"ex_doc": {:hex, :ex_doc, "0.16.3", "cd2a4cfe5d26e37502d3ec776702c72efa1adfa24ed9ce723bb565f4c30bd31a", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}], "hexpm"},
"elixir_make": {:hex, :elixir_make, "0.4.2", "332c649d08c18bc1ecc73b1befc68c647136de4f340b548844efc796405743bf", [:mix], [], "hexpm"},
"esqlite": {:hex, :esqlite, "0.2.4", "3a8a352c190afe2d6b828b252a6fbff65b5cc1124647f38b15bdab3bf6fd4b3e", [:rebar3], [], "hexpm"},
"ex_doc": {:hex, :ex_doc, "0.19.0", "e22b6434373b4870ea77b24df069dbac7002c1f483615e9ebfc0c37497e1c75c", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.7", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"},
"excoveralls": {:hex, :excoveralls, "0.9.1", "14fd20fac51ab98d8e79615814cc9811888d2d7b28e85aa90ff2e30dcf3191d6", [:mix], [{:hackney, ">= 0.12.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm"},
"hackney": {:hex, :hackney, "1.7.1", "e238c52c5df3c3b16ce613d3a51c7220a784d734879b1e231c9babd433ac1cb4", [:rebar3], [{:certifi, "1.0.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "4.0.0", [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"},
"idna": {:hex, :idna, "4.0.0", "10aaa9f79d0b12cf0def53038547855b91144f1bfcc0ec73494f38bb7b9c4961", [:rebar3], [], "hexpm"},
"jason": {:hex, :jason, "1.1.1", "d3ccb840dfb06f2f90a6d335b536dd074db748b3e7f5b11ab61d239506585eb2", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
"makeup": {:hex, :makeup, "0.5.1", "966c5c2296da272d42f1de178c1d135e432662eca795d6dc12e5e8787514edf7", [:mix], [{:nimble_parsec, "~> 0.2.2", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"},
"makeup_elixir": {:hex, :makeup_elixir, "0.8.0", "1204a2f5b4f181775a0e456154830524cf2207cf4f9112215c05e0b76e4eca8b", [:mix], [{:makeup, "~> 0.5.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 0.2.2", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"},
"mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"},
"nimble_parsec": {:hex, :nimble_parsec, "0.2.2", "d526b23bdceb04c7ad15b33c57c4526bf5f50aaa70c7c141b4b4624555c68259", [: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.3", "c277cfb2a9c5034d445a722494c13359e361d344ef6f25d604c2353185682bfc", [: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"},
"sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [:rebar3], [], "hexpm"},
"sqlitex": {:hex, :sqlitex, "1.3.2", "ec4c78306dcc2c45761b9c1bdf2864ab3f18e077d31c84aa8aed5dc76841c535", [:mix], [{:decimal, "~> 1.1", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.2.3", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm"}}
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm"},
}