Skip to content
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
5 changes: 2 additions & 3 deletions lib/code_corps/cloudex/cloudex_test.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,12 @@ defmodule CloudexTest do
end
end

@spec upload(String.t) :: {:ok, %Cloudex.UploadedImage{}}
@spec upload(String.t) :: {:ok, Cloudex.UploadedImage.t}
def upload(_url) do
{:ok, %Cloudex.UploadedImage{public_id: fake_cloudinary_id()}}
end

defp fake_cloudinary_id do
:crypto.strong_rand_bytes(5)
|> Base.encode64
:crypto.strong_rand_bytes(5) |> Base.encode64()
end
end
5 changes: 3 additions & 2 deletions lib/code_corps/cloudex/uploader.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ defmodule CodeCorps.Cloudex.Uploader do

@cloudex Application.get_env(:code_corps, :cloudex)

def upload(url) do
@cloudex.upload(url)
@spec upload(list | String.t) :: Cloudex.upload_result()
def upload(list_or_url) do
@cloudex.upload(list_or_url)
end
end
2 changes: 1 addition & 1 deletion lib/code_corps/emails/receipt_email.ex
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ defmodule CodeCorps.Emails.ReceiptEmail do
end
end

@spec get_subscription(String.t) :: Subscription.t | nil
@spec get_subscription(String.t) :: StripeConnectSubscription.t | nil
defp get_subscription(subscription_id_from_stripe) do
StripeConnectSubscription
|> Repo.get_by(id_from_stripe: subscription_id_from_stripe)
Expand Down
2 changes: 2 additions & 0 deletions lib/code_corps/model/organization_invite.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ defmodule CodeCorps.OrganizationInvite do

use CodeCorps.Model

@type t :: %__MODULE__{}

schema "organization_invites" do
field :code, :string
field :email, :string
Expand Down
4 changes: 2 additions & 2 deletions lib/code_corps/model/stripe_connect_subscription.ex
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ defmodule CodeCorps.StripeConnectSubscription do
:quantity, :stripe_connect_plan_id, :user_id
]

@spec create_changeset(CodeCorps.StripeConnectPlan.t, map) :: Ecto.Changeset.t
@spec create_changeset(CodeCorps.StripeConnectSubscription.t, map) :: Ecto.Changeset.t
def create_changeset(struct, params \\ %{}) do
struct
|> cast(params, @permitted_params)
Expand All @@ -75,7 +75,7 @@ defmodule CodeCorps.StripeConnectSubscription do

@update_params [:cancelled_at, :current_period_end, :current_period_start, :ended_at, :quantity, :start, :status]

@spec webhook_update_changeset(CodeCorps.StripeConnectPlan.t, map) :: Ecto.Changeset.t
@spec webhook_update_changeset(CodeCorps.StripeConnectSubscription.t, map) :: Ecto.Changeset.t
def webhook_update_changeset(struct, params \\ %{}) do
struct
|> cast(params, @update_params)
Expand Down
35 changes: 22 additions & 13 deletions lib/code_corps/services/markdown_renderer_service.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,34 @@ defmodule CodeCorps.Services.MarkdownRendererService do

alias Ecto.Changeset

@spec render_markdown_to_html(Changeset.t, atom, atom) :: Changeset.t
@spec render_markdown_to_html(Changeset.t(), atom, atom) :: Changeset.t()
def render_markdown_to_html(%Changeset{valid?: false} = changeset, _, _), do: changeset
def render_markdown_to_html(changeset, source_field, destination_field) do
case Changeset.get_change(changeset, source_field) do
"" -> Changeset.put_change(changeset, destination_field, nil)
nil -> changeset
markdown -> markdown |> convert_into_html() |> put_into(changeset, destination_field)
end
change = changeset |> Changeset.get_change(source_field)
changeset |> handle_change(change, destination_field)
end

@spec convert_into_html(String.t) :: String.t
defp convert_into_html(markdown) do
# Prism.js requires a `language-` prefix in code classes
# See: https://github.com/pragdave/earmark#syntax-highlightning
Earmark.as_html!(markdown, %Earmark.Options{code_class_prefix: "language-"})
@spec handle_change(Changeset.t(), String.t() | nil, atom) :: Changeset.t()
defp handle_change(changeset, nil, _), do: changeset
defp handle_change(changeset, "", destination_field) do
Changeset.put_change(changeset, destination_field, nil)
end
defp handle_change(changeset, lines, destination_field) when is_binary(lines) do
lines
|> convert_into_html()
|> put_into(changeset, destination_field)
end

# Prism.js requires a `language-` prefix in code classes
# See: https://github.com/pragdave/earmark#syntax-highlightning
@spec convert_into_html(String.t()) :: String.t()
defp convert_into_html(lines) do
lines
|> Earmark.as_html!(%Earmark.Options{code_class_prefix: "language-"})
end

@spec put_into(String.t, Changeset.t, atom) :: Changeset.t
@spec put_into(String.t(), Changeset.t(), atom) :: Changeset.t()
defp put_into(html, changeset, destination_field) do
Changeset.put_change(changeset, destination_field, html)
changeset |> Changeset.put_change(destination_field, html)
end
end
4 changes: 2 additions & 2 deletions lib/code_corps/services/user_service.ex
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,15 @@ defmodule CodeCorps.Services.UserService do
end
end

@spec do_update_connect_customers(%StripePlatformCustomer{}, map) :: [%StripeConnectCustomer{}]
@spec do_update_connect_customers(StripePlatformCustomer.t, map) :: [{:ok, StripeConnectCustomer.t}] | [{:error, Stripe.Error.t}]
defp do_update_connect_customers(stripe_platform_customer, attributes) do
stripe_platform_customer
|> Repo.preload([stripe_connect_customers: :stripe_connect_account])
|> Map.get(:stripe_connect_customers)
|> Enum.map(&do_update_connect_customer(&1, attributes))
end

@spec do_update_connect_customer(%StripeConnectCustomer{}, map) :: [%StripeConnectCustomer{}]
@spec do_update_connect_customer(StripeConnectCustomer.t, map) :: {:ok, StripeConnectCustomer.t} | {:error, Stripe.Error.t}
defp do_update_connect_customer(%StripeConnectCustomer{} = stripe_connect_customer, attributes) do
StripeConnectCustomerService.update(stripe_connect_customer, attributes)
end
Expand Down
16 changes: 4 additions & 12 deletions lib/code_corps/stripe_service/events/connect_charge_succeeded.ex
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,19 @@ defmodule CodeCorps.StripeService.Events.ConnectChargeSucceeded do
@api Application.get_env(:code_corps, :stripe)

def handle(%{data: %{object: %{id: id_from_stripe}}, user_id: connect_account_id_from_stripe}) do
with {:ok, charge} <- create_charge(id_from_stripe, connect_account_id_from_stripe) do
charge |> track_created
with {:ok, %StripeConnectCharge{} = charge} <- StripeConnectChargeService.create(id_from_stripe, connect_account_id_from_stripe) do
charge |> track_created()

charge
|> try_create_receipt(connect_account_id_from_stripe)
|> maybe_send_receipt
|> maybe_send_receipt()
else
failure -> failure
end
end

defp create_charge(id_from_stripe, account_id_from_stripe) do
StripeConnectChargeService.create(id_from_stripe, account_id_from_stripe)
end

defp try_create_receipt(%StripeConnectCharge{invoice_id_from_stripe: invoice_id} = charge, account_id) do
with {:ok, %Stripe.Invoice{} = invoice} <- retrieve_invoice(invoice_id, account_id),
with {:ok, %Stripe.Invoice{} = invoice} <- @api.Invoice.retrieve(invoice_id, connect_account: account_id),
%Bamboo.Email{} = receipt <- Emails.ReceiptEmail.create(charge, invoice)
do
{:ok, charge, receipt}
Expand All @@ -34,10 +30,6 @@ defmodule CodeCorps.StripeService.Events.ConnectChargeSucceeded do
end
end

defp retrieve_invoice(invoice_id, account_id) do
@api.Invoice.retrieve(invoice_id, connect_account: account_id)
end

defp maybe_send_receipt({:ok, charge, receipt}) do
with %Bamboo.Email{} = email <- receipt |> Mailer.deliver_now do
{:ok, charge, email}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ defmodule CodeCorps.StripeService.StripeConnectChargeService do

@api Application.get_env(:code_corps, :stripe)

@spec create(String.t, String.t) :: Ecto.Changeset.t
@spec create(String.t, String.t) :: {:ok, StripeConnectCharge.t} | {:error, Ecto.Changeset.t}
def create(id_from_stripe, connect_account_id_from_stripe) do
with {:ok, %StripeConnectAccount{} = stripe_connect_account} <- get_connect_account(connect_account_id_from_stripe),
{:ok, %Stripe.Charge{} = api_charge} <- @api.Charge.retrieve(id_from_stripe, connect_account: connect_account_id_from_stripe),
{:ok, params} = StripeConnectChargeAdapter.to_params(api_charge, stripe_connect_account)
do
%StripeConnectCharge{}
|> StripeConnectCharge.create_changeset(params)
|> Repo.insert
|> Repo.insert()
end
end

Expand Down
4 changes: 2 additions & 2 deletions lib/code_corps/stripe_service/stripe_connect_plan.ex
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ defmodule CodeCorps.StripeService.StripeConnectPlanService do
{:ok, %Project{}} <- ProjectCanEnableDonations.validate(project),
%{} = create_attributes <- get_create_attributes(project_id),
connect_account_id <- project.organization.stripe_connect_account.id_from_stripe,
{:ok, plan} <- @api.Plan.create(create_attributes, connect_account: connect_account_id),
{:ok, %Stripe.Plan{} = plan} <- @api.Plan.create(create_attributes, connect_account: connect_account_id),
{:ok, params} <- StripeConnectPlanAdapter.to_params(plan, attributes)
do
%StripeConnectPlan{}
|> StripeConnectPlan.create_changeset(params)
|> Repo.insert
|> Repo.insert()
else
failure -> failure
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ defmodule CodeCorps.StripeService.StripeConnectSubscriptionService do

alias CodeCorps.{
Project, Repo, StripeConnectCustomer, StripeConnectAccount,
StripeConnectPlan, StripeConnectSubscription, User
StripeConnectCard, StripeConnectPlan, StripeConnectSubscription, User
}
alias CodeCorps.Services.{DonationGoalsService, ProjectService}
alias CodeCorps.StripeService.{StripeConnectCardService, StripeConnectCustomerService}
Expand Down Expand Up @@ -93,7 +93,7 @@ defmodule CodeCorps.StripeService.StripeConnectSubscriptionService do
{:ok, connect_customer} <- StripeConnectCustomerService.find_or_create(platform_customer, connect_account, user),
{:ok, connect_card} <- StripeConnectCardService.find_or_create(platform_card, connect_customer, platform_customer, connect_account),
create_attributes <- api_create_attributes(connect_card, connect_customer, plan, attributes),
{:ok, subscription} <- @api.Subscription.create(create_attributes, connect_account: connect_account.id_from_stripe),
{:ok, %Stripe.Subscription{} = subscription} <- @api.Subscription.create(create_attributes, connect_account: connect_account.id_from_stripe),
insert_attributes <- local_insert_attributes(attributes, plan),
{:ok, params} <- StripeConnectSubscriptionAdapter.to_params(subscription, insert_attributes),
{:ok, %StripeConnectSubscription{} = stripe_connect_subscription} <- insert_subscription(params)
Expand Down Expand Up @@ -123,18 +123,24 @@ defmodule CodeCorps.StripeService.StripeConnectSubscriptionService do
end
end

@spec insert_subscription(map) :: {:ok, StripeConnectSubscription.t} | {:error, Ecto.Changeset.t}
defp insert_subscription(params) do
%StripeConnectSubscription{}
|> StripeConnectSubscription.create_changeset(params)
|> Repo.insert
|> Repo.insert()
end

@spec api_create_attributes(StripeConnectCard.t, StripeConnectCustomer.t, StripeConnectPlan.t, map) :: map
defp api_create_attributes(card, customer, plan, %{"quantity" => quantity}) do
%{
application_fee_percent: 5,
customer: customer.id_from_stripe,
plan: plan.id_from_stripe,
quantity: quantity,
items: [
%{
plan: plan.id_from_stripe,
quantity: quantity
}
],
source: card.id_from_stripe
}
end
Expand Down Expand Up @@ -166,6 +172,6 @@ defmodule CodeCorps.StripeService.StripeConnectSubscriptionService do
defp update_subscription(%StripeConnectSubscription{} = record, params) do
record
|> StripeConnectSubscription.webhook_update_changeset(params)
|> Repo.update
|> Repo.update()
end
end
34 changes: 33 additions & 1 deletion lib/code_corps/stripe_testing/subscription.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ defmodule CodeCorps.StripeTesting.Subscription do
{:ok, do_retrieve(map)}
end

defp do_create(%{quantity: quantity}) do
defp do_create(%{items: [%{quantity: quantity}]}) do
{:ok, plan} = CodeCorps.StripeTesting.Plan.create(%{}, [])

%Stripe.Subscription{
Expand All @@ -20,6 +20,22 @@ defmodule CodeCorps.StripeTesting.Subscription do
customer: "cus_123",
ended_at: nil,
id: "sub_123",
items: %{
object: "list",
data: [
%{
id: "sub_123",
object: "subscription_item",
created: 1_479_472_835,
metadata: %{},
plan: plan,
quantity: quantity
}
],
has_more: false,
total_count: 1,
url: "/v1/subscription_items?subscription=sub_123"
},
livemode: false,
metadata: %{},
plan: plan,
Expand All @@ -45,6 +61,22 @@ defmodule CodeCorps.StripeTesting.Subscription do
customer: "cus_123",
ended_at: nil,
id: "sub_123",
items: %{
object: "list",
data: [
%{
id: "sub_123",
object: "subscription_item",
created: 1_479_472_835,
metadata: %{},
plan: plan,
quantity: 1000
}
],
has_more: false,
total_count: 1,
url: "/v1/subscription_items?subscription=sub_123"
},
livemode: false,
metadata: %{},
plan: plan,
Expand Down
4 changes: 2 additions & 2 deletions lib/code_corps_web/controllers/fallback_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@ defmodule CodeCorpsWeb.FallbackController do
def call(%Conn{} = conn, {:error, :expired}) do
conn
|> put_status(:not_found)
|> render(CodeCorpsWeb.ErrorView, "404.json")
|> render(CodeCorpsWeb.ErrorView, "404.json", %{})
end
def call(%Conn{} = conn, nil) do
conn
|> put_status(:not_found)
|> render(CodeCorpsWeb.ErrorView, "404.json")
|> render(CodeCorpsWeb.ErrorView, "404.json", %{})
end
def call(%Conn{} = conn, {:error, :github}) do
conn
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ defmodule CodeCorpsWeb.StripeConnectPlanController do
defp handle_create_result({:error, :project_not_ready}, conn) do
conn
|> put_status(422)
|> render(CodeCorpsWeb.ErrorView, "422.json-api")
|> render(CodeCorpsWeb.ErrorView, "422.json-api", %{})
end
defp handle_create_result(other, _conn), do: other
end
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ defmodule CodeCorps.Mixfile do
elixir: "~> 1.5.2",
elixirc_paths: elixirc_paths(Mix.env),
compilers: [:phoenix, :gettext] ++ Mix.compilers,
dialyzer: [plt_add_deps: :transitive],
dialyzer: [plt_add_apps: [:kernel, :stdlib], plt_add_deps: :transitive],
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
aliases: aliases(),
Expand Down
6 changes: 3 additions & 3 deletions mix.lock
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@
"db_connection": {:hex, :db_connection, "1.1.2", "2865c2a4bae0714e2213a0ce60a1b12d76a6efba0c51fbda59c9ab8d1accc7a8", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
"decimal": {:hex, :decimal, "1.4.1", "ad9e501edf7322f122f7fc151cce7c2a0c9ada96f2b0155b8a09a795c2029770", [:mix], []},
"dialyxir": {:hex, :dialyxir, "0.5.1", "b331b091720fd93e878137add264bac4f644e1ddae07a70bf7062c7862c4b952", [:mix], []},
"earmark": {:hex, :earmark, "1.2.3", "206eb2e2ac1a794aa5256f3982de7a76bf4579ff91cb28d0e17ea2c9491e46a4", [:mix], []},
"earmark": {:hex, :earmark, "1.2.3", "206eb2e2ac1a794aa5256f3982de7a76bf4579ff91cb28d0e17ea2c9491e46a4", [:mix], [], "hexpm"},
"ecto": {:hex, :ecto, "2.2.6", "3fd1067661d6d64851a0d4db9acd9e884c00d2d1aa41cc09da687226cf894661", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
"ecto_ordered": {:hex, :ecto_ordered, "0.2.0-beta1", "cb066bc608f1c8913cea85af8293261720e6a88e3c99061e6877d7025352f045", [:mix], [{:ecto, "~> 2.0", [hex: :ecto, optional: false]}]},
"elixir_make": {:hex, :elixir_make, "0.4.0", "992f38fabe705bb45821a728f20914c554b276838433349d4f2341f7a687cddf", [:mix], []},
"ex_aws": {:hex, :ex_aws, "1.1.4", "4bdc4fff91f8d35c7fe2355b9da54cc51f980c92f1137715d8b2d70d8e8511cc", [:mix], [{:configparser_ex, "~> 0.2.1", [hex: :configparser_ex, optional: true]}, {:hackney, "1.6.3 or 1.6.5 or 1.7.1 or 1.8.6 or ~> 1.9", [hex: :hackney, optional: true]}, {:jsx, "~> 2.8", [hex: :jsx, optional: true]}, {:poison, ">= 1.2.0", [hex: :poison, optional: true]}, {:sweet_xml, "~> 0.6", [hex: :sweet_xml, optional: true]}, {:xml_builder, "~> 0.1.0", [hex: :xml_builder, optional: true]}]},
"ex_aws": {:hex, :ex_aws, "1.1.4", "4bdc4fff91f8d35c7fe2355b9da54cc51f980c92f1137715d8b2d70d8e8511cc", [:mix], [{:configparser_ex, "~> 0.2.1", [repo: "hexpm", hex: :configparser_ex, optional: true]}, {:hackney, "1.6.3 or 1.6.5 or 1.7.1 or 1.8.6 or ~> 1.9", [repo: "hexpm", hex: :hackney, optional: true]}, {:jsx, "~> 2.8", [repo: "hexpm", hex: :jsx, optional: true]}, {:poison, ">= 1.2.0", [repo: "hexpm", hex: :poison, optional: true]}, {:sweet_xml, "~> 0.6", [repo: "hexpm", hex: :sweet_xml, optional: true]}, {:xml_builder, "~> 0.1.0", [repo: "hexpm", hex: :xml_builder, optional: true]}], "hexpm"},
"ex_doc": {:hex, :ex_doc, "0.18.1", "37c69d2ef62f24928c1f4fdc7c724ea04aecfdf500c4329185f8e3649c915baf", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, optional: false]}]},
"ex_machina": {:hex, :ex_machina, "2.1.0", "4874dc9c78e7cf2d429f24dc3c4005674d4e4da6a08be961ffccc08fb528e28b", [:mix], [{:ecto, "~> 2.1", [hex: :ecto, optional: true]}]},
"excoveralls": {:hex, :excoveralls, "0.7.5", "339e433e5d3bce09400dc8de7b9040741a409c93917849916c136a0f51fdc183", [:mix], [{:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:hackney, ">= 0.12.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"},
Expand Down Expand Up @@ -60,7 +60,7 @@
"segment": {:hex, :segment, "0.1.1", "47bf9191590e7a533c105d1e21518e0d6da47c91e8d98ebb649c624db5dfc359", [:mix], [{:httpoison, "~> 0.8", [hex: :httpoison, optional: false]}, {:poison, "~> 1.3 or ~> 2.0", [hex: :poison, optional: false]}]},
"sentry": {:hex, :sentry, "6.0.4", "b7f93e77cdc2a44a55ec2bec886c3eeab7d562316fecd3000c04b68d1a6b0392", [:mix], [{:hackney, "~> 1.8 or 1.6.5", [hex: :hackney, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}, {:poison, "~> 1.5 or ~> 2.0 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}, {:uuid, "~> 1.0", [hex: :uuid, repo: "hexpm", optional: false]}], "hexpm"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], []},
"stripity_stripe": {:git, "https://github.com/code-corps/stripity_stripe.git", "dfd9b718ba7783c252d1d36af0ad6c8528884086", [branch: "2.0-beta"]},
"stripity_stripe": {:git, "https://github.com/code-corps/stripity_stripe.git", "1493e42eb5bd39b135a6686912a20ce200d07375", [branch: "2.0-beta"]},
"sweet_xml": {:hex, :sweet_xml, "0.6.5", "dd9cde443212b505d1b5f9758feb2000e66a14d3c449f04c572f3048c66e6697", [:mix], []},
"timber": {:hex, :timber, "2.6.1", "946dee43730b30748c7a3ed0085abe8690dcbaf4cd96031caba676b938dd40a6", [:mix], [{:ecto, ">= 2.0.0 and < 2.3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:hackney, "1.6.3 or 1.6.5 or 1.7.1 or 1.8.6 or ~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:msgpax, "~> 1.0", [hex: :msgpax, repo: "hexpm", optional: false]}, {:phoenix, ">= 1.2.0 and < 1.4.0", [hex: :phoenix, repo: "hexpm", optional: true]}, {:plug, ">= 1.2.0 and < 1.5.0", [hex: :plug, repo: "hexpm", optional: true]}, {:poison, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"},
"timex": {:hex, :timex, "3.1.24", "d198ae9783ac807721cca0c5535384ebdf99da4976be8cefb9665a9262a1e9e3", [:mix], [{:combine, "~> 0.7", [hex: :combine, optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, optional: false]}]},
Expand Down