diff --git a/lib/arke_postgres/query.ex b/lib/arke_postgres/query.ex index 4d867f9..7cfbb6d 100644 --- a/lib/arke_postgres/query.ex +++ b/lib/arke_postgres/query.ex @@ -22,7 +22,10 @@ defmodule ArkePostgres.Query do %{filters: filters, orders: orders, offset: offset, limit: limit} = arke_query, action ) do + paths = extract_paths(filters) ++ extract_paths(orders) + base_query(arke_query, action) + |> handle_paths_join(paths) |> handle_filters(filters) |> handle_orders(orders) |> handle_offset(offset) @@ -49,13 +52,16 @@ defmodule ArkePostgres.Query do def execute(query, :pseudo_query), do: generate_query(query, :pseudo_query) - def get_column(%{data: %{persistence: "arke_parameter"}} = parameter), - do: get_arke_column(parameter) + def get_column(column), do: get_column(column, false) + + def get_column(%{data: %{persistence: "arke_parameter"}} = parameter, joined), + do: get_arke_column(parameter, joined) - def get_column(%{data: %{persistence: "table_column"}} = parameter), + def get_column(%{data: %{persistence: "table_column"}} = parameter, _joined), do: get_table_column(parameter) def remove_arke_system(metadata, project_id) when project_id == :arke_system, do: metadata + def remove_arke_system(metadata, project_id) do case Map.get(metadata, "project") do "arke_system" -> Map.delete(metadata, "project") @@ -72,7 +78,10 @@ defmodule ArkePostgres.Query do end def get_manager_units(project_id) do - arke_link =%{id: :arke_link, data: %{parameters: [%{id: :type},%{id: :child_id},%{id: :parent_id},%{id: :metadata}]}} + arke_link = %{ + id: :arke_link, + data: %{parameters: [%{id: :type}, %{id: :child_id}, %{id: :parent_id}, %{id: :metadata}]} + } links = from(q in table_query(arke_link, nil), where: q.type in ["parameter", "group"]) @@ -81,7 +90,6 @@ defmodule ArkePostgres.Query do parameter_links = Enum.filter(links, fn x -> x.type == "parameter" end) group_links = Enum.filter(links, fn x -> x.type == "group" end) - parameters_id = Arke.Utils.DefaultData.get_parameters_id() list_arke_id = Arke.Utils.DefaultData.get_arke_id() @@ -93,13 +101,15 @@ defmodule ArkePostgres.Query do units_map = Map.new(unit_list, &{&1.id, &1.metadata}) parameter_links = merge_unit_metadata(parameter_links, units_map, project_id) - parameters = parse_parameters(Enum.filter(unit_list, fn u -> u.arke_id in parameters_id end), project_id) + parameters = + parse_parameters(Enum.filter(unit_list, fn u -> u.arke_id in parameters_id end), project_id) arke_list = parse_arke_list( Enum.filter(unit_list, fn u -> u.arke_id == "arke" end), parameter_links ) + groups = parse_groups( Enum.filter(unit_list, fn u -> u.arke_id == "group" end), @@ -123,27 +133,45 @@ defmodule ArkePostgres.Query do Enum.filter(parameter_links, fn x -> x.parent_id == id end), [], fn p, new_params -> - [%{id: String.to_atom(p.child_id), metadata: Enum.reduce(p.metadata,%{}, fn {key, val}, acc -> Map.put(acc, String.to_atom(key), val) end)} | new_params] + [ + %{ + id: String.to_atom(p.child_id), + metadata: + Enum.reduce(p.metadata, %{}, fn {key, val}, acc -> + Map.put(acc, String.to_atom(key), val) + end) + } + | new_params + ] end ) - updated_data = Enum.reduce(unit.data,%{}, fn {k,db_data},acc -> Map.put(acc,String.to_atom(k),db_data["value"]) end) + + updated_data = + Enum.reduce(unit.data, %{}, fn {k, db_data}, acc -> + Map.put(acc, String.to_atom(k), db_data["value"]) + end) |> Map.put(:id, id) |> Map.put(:metadata, metadata) - |> Map.update(:parameters,[], fn current -> params ++ current end) + |> Map.update(:parameters, [], fn current -> params ++ current end) - [ updated_data | new_arke_list] + [updated_data | new_arke_list] end) end - defp parse_parameters(parameter_list, project_id)do - Enum.reduce(parameter_list, [], fn %{id: id, arke_id: arke_id, metadata: metadata} = unit, new_parameter_list -> + defp parse_parameters(parameter_list, project_id) do + Enum.reduce(parameter_list, [], fn %{id: id, arke_id: arke_id, metadata: metadata} = unit, + new_parameter_list -> parsed_metadata = remove_arke_system(metadata, project_id) - updated_data = Enum.reduce(unit.data,%{}, fn {k,db_data},acc -> Map.put(acc,String.to_atom(k),db_data["value"]) end) - |> Map.put(:id, id) - |> Map.put(:type, arke_id) - |> Map.put(:metadata, parsed_metadata) - [ updated_data | new_parameter_list] + updated_data = + Enum.reduce(unit.data, %{}, fn {k, db_data}, acc -> + Map.put(acc, String.to_atom(k), db_data["value"]) + end) + |> Map.put(:id, id) + |> Map.put(:type, arke_id) + |> Map.put(:metadata, parsed_metadata) + + [updated_data | new_parameter_list] end) end @@ -157,23 +185,31 @@ defmodule ArkePostgres.Query do [%{id: String.to_atom(p.child_id), metadata: p.metadata} | new_params] end ) - updated_data = Enum.reduce(unit.data,%{}, fn {k,db_data},acc -> Map.put(acc,String.to_atom(k),db_data["value"]) end) - |> Map.put(:id, id) - |> Map.put(:metadata, metadata) - |> Map.update(:arke_list,[], fn db_arke_list -> - Enum.reduce(db_arke_list,[], fn key,acc -> - case Enum.find(arke_list, fn %{id: id, metadata: _metadata} -> to_string(id) == key end) do - nil -> [key|acc] - data -> - [data|acc] - end - end) - end) - [ updated_data | new_groups] + + updated_data = + Enum.reduce(unit.data, %{}, fn {k, db_data}, acc -> + Map.put(acc, String.to_atom(k), db_data["value"]) + end) + |> Map.put(:id, id) + |> Map.put(:metadata, metadata) + |> Map.update(:arke_list, [], fn db_arke_list -> + Enum.reduce(db_arke_list, [], fn key, acc -> + case Enum.find(arke_list, fn %{id: id, metadata: _metadata} -> + to_string(id) == key + end) do + nil -> + [key | acc] + + data -> + [data | acc] + end + end) + end) + + [updated_data | new_groups] end) end - ###################################################################################################################### # PRIVATE FUNCTIONS ################################################################################################## ###################################################################################################################### @@ -182,17 +218,31 @@ defmodule ArkePostgres.Query do defp base_query(%{link: nil} = _arke_query, action), do: arke_query(action) - defp base_query(%{link: %{unit: %{id: link_id},depth: depth, direction: direction,type: type}, project: project} = _arke_query, action), - do: - get_nodes( - project, - action, - [to_string(link_id)], - depth, - direction, - type - ) - defp base_query(%{link: %{unit: unit_list,depth: depth, direction: direction,type: type}, project: project} = _arke_query, action) when is_list(unit_list) do + defp base_query( + %{ + link: %{unit: %{id: link_id}, depth: depth, direction: direction, type: type}, + project: project + } = _arke_query, + action + ), + do: + get_nodes( + project, + action, + [to_string(link_id)], + depth, + direction, + type + ) + + defp base_query( + %{ + link: %{unit: unit_list, depth: depth, direction: direction, type: type}, + project: project + } = _arke_query, + action + ) + when is_list(unit_list) do get_nodes( project, action, @@ -261,6 +311,33 @@ defmodule ArkePostgres.Query do Arke.Core.Unit.load(arke, record) end + defp handle_paths_join(query, []), do: query + + defp handle_paths_join(query, paths) do + conditions = + Enum.reduce(paths, nil, fn path, acc -> + condition = dynamic([q, j], ^get_column(List.first(path)) == j.id) + if is_nil(acc), do: condition, else: dynamic([q, j], ^acc or ^condition) + end) + + from(q in query, left_join: j in "arke_unit", on: ^conditions) + end + + defp extract_paths(items) do + items + |> Enum.flat_map(&extract_path/1) + |> Enum.reject(&(is_nil(&1) or length(&1) == 0)) + |> Enum.uniq() + end + + def extract_path(%Arke.Core.Query.Filter{base_filters: base_filters}), + do: Enum.flat_map(base_filters, &extract_path/1) + + def extract_path(%Arke.Core.Query.BaseFilter{path: path}), do: [path] + def extract_path(%Arke.Core.Query.Order{path: path}), do: [path] + + def extract_path(_), do: [] + def handle_filters(query, filters) do Enum.reduce(filters, query, fn %{logic: logic, negate: negate, base_filters: base_filters}, new_query -> @@ -269,27 +346,66 @@ defmodule ArkePostgres.Query do end) end - defp handle_condition(logic, base_filters) do - Enum.reduce(base_filters, nil, fn %{ - parameter: parameter, - operator: operator, - value: value, - negate: negate - }, - clause -> - column = get_column(parameter) - value = get_value(parameter, value) - + defp handle_condition(parent_logic, filters), + do: handle_condition(nil, parent_logic, filters) + + defp handle_condition(clause, parent_logic, filters), + do: Enum.reduce(filters, clause, &handle_clause(&1, &2, parent_logic)) + + defp handle_clause( + %Arke.Core.Query.Filter{logic: logic, base_filters: nested_filters}, + clause, + parent_logic + ), + do: + handle_condition(nil, logic, nested_filters) + |> add_condition_to_clause(clause, parent_logic) + + defp handle_clause( + %Arke.Core.Query.BaseFilter{ + parameter: parameter, + operator: operator, + value: value, + negate: negate, + path: [] + }, + clause, + parent_logic + ), + do: + parameter_condition(clause, parameter, value, operator, negate, parent_logic) + |> add_condition_to_clause(clause, parent_logic) + + defp handle_clause( + %Arke.Core.Query.BaseFilter{ + parameter: parameter, + operator: operator, + value: value, + negate: negate, + path: [path_parameter | _] + }, + clause, + parent_logic + ) + when not is_nil(path_parameter), + do: + parameter_condition(clause, parameter, value, operator, negate, parent_logic, true) + |> add_nested_condition_to_clause(clause, parent_logic) + + defp handle_clause(_, clause, _), do: clause + + defp parameter_condition(clause, parameter, value, operator, negate, logic, joined \\ false) do + column = get_column(parameter, joined) + value = get_value(parameter, value) + + condition = if is_nil(value) or operator == :isnull do - condition = get_nil_query(parameter, column) |> handle_negate_condition(negate) - add_condition_to_clause(condition, clause, logic) + get_nil_query(parameter, column, negate, joined) else - condition = - filter_query_by_operator(parameter, column, value, operator) |> handle_negate_condition(negate) - - add_condition_to_clause(condition, clause, logic) + filter_query_by_operator(parameter, column, value, operator) end - end) + + handle_negate_condition(condition, negate) end defp handle_negate_condition(condition, true), do: dynamic([q], not (^condition)) @@ -299,10 +415,20 @@ defmodule ArkePostgres.Query do defp add_condition_to_clause(condition, clause, :and), do: dynamic([q], ^clause and ^condition) defp add_condition_to_clause(condition, clause, :or), do: dynamic([q], ^clause or ^condition) + defp add_nested_condition_to_clause(condition, nil, _), do: dynamic([_q, j], ^condition) + + defp add_nested_condition_to_clause(condition, clause, :and), + do: dynamic([_q, j], ^clause and ^condition) + + defp add_nested_condition_to_clause(condition, clause, :or), + do: dynamic([_q, j], ^clause or ^condition) + defp handle_orders(query, orders) do order_by = - Enum.reduce(orders, [], fn %{parameter: parameter, direction: direction}, new_order_by -> - column = get_column(parameter) + Enum.reduce(orders, [], fn %{parameter: parameter, direction: direction, path: path}, + new_order_by -> + joined = length(path) > 0 + column = get_column(parameter, joined) [{direction, column} | new_order_by] end) @@ -317,61 +443,152 @@ defmodule ArkePostgres.Query do defp get_table_column(%{id: id} = _parameter), do: dynamic([q], fragment("?", field(q, ^id))) - defp get_arke_column(%{id: id, data: %{multiple: true}} = _parameter), - do: dynamic([q], fragment("(? -> ? ->> 'value')::jsonb", field(q, :data), ^Atom.to_string(id))) + defp get_arke_column(%{id: id, data: %{multiple: true}} = _parameter, true), + do: + dynamic( + [_q, ..., j], + fragment("(? -> ? ->> 'value')::jsonb", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, data: %{multiple: true}} = _parameter, _joined), + do: + dynamic([q], fragment("(? -> ? ->> 'value')::jsonb", field(q, :data), ^Atom.to_string(id))) - defp get_arke_column(%{id: id, arke_id: :string} = _parameter), + defp get_arke_column(%{id: id, arke_id: :string} = _parameter, true), + do: + dynamic( + [_, ..., j], + fragment("(? -> ? ->> 'value')::text", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :string} = _parameter, _joined), do: dynamic([q], fragment("(? -> ? ->> 'value')::text", field(q, :data), ^Atom.to_string(id))) + defp get_arke_column(%{id: id, arke_id: :atom} = _parameter, true), + do: + dynamic( + [_, ..., j], + fragment("(? -> ? ->> 'value')::text", field(j, :data), ^Atom.to_string(id)) + ) - defp get_arke_column(%{id: id, arke_id: :atom} = _parameter), + defp get_arke_column(%{id: id, arke_id: :atom} = _parameter, _joined), do: dynamic([q], fragment("(? -> ? ->> 'value')::text", field(q, :data), ^Atom.to_string(id))) - defp get_arke_column(%{id: id, arke_id: :boolean} = _parameter), + defp get_arke_column(%{id: id, arke_id: :boolean} = _parameter, true), + do: + dynamic( + [_, ..., j], + fragment("(? -> ? ->> 'value')::boolean", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :boolean} = _parameter, _joined), do: dynamic( [q], fragment("(? -> ? ->> 'value')::boolean", field(q, :data), ^Atom.to_string(id)) ) - defp get_arke_column(%{id: id, arke_id: :datetime} = _parameter), + defp get_arke_column(%{id: id, arke_id: :datetime} = _parameter, true), + do: + dynamic( + [_q, ..., j], + fragment("(? -> ? ->> 'value')::timestamp", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :datetime} = _parameter, _joined), do: dynamic( [q], fragment("(? -> ? ->> 'value')::timestamp", field(q, :data), ^Atom.to_string(id)) ) - defp get_arke_column(%{id: id, arke_id: :date} = _parameter), + defp get_arke_column(%{id: id, arke_id: :date} = _parameter, true), + do: + dynamic( + [_q, ..., j], + fragment("(? -> ? ->> 'value')::date", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :date} = _parameter, _joined), do: dynamic( [q], fragment("(? -> ? ->> 'value')::date", field(q, :data), ^Atom.to_string(id)) ) - defp get_arke_column(%{id: id, arke_id: :time} = _parameter), + defp get_arke_column(%{id: id, arke_id: :time} = _parameter, true), + do: + dynamic( + [_, ..., j], + fragment("(? -> ? ->> 'value')::time", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :time} = _parameter, _joined), do: dynamic([q], fragment("(? -> ? ->> 'value')::time", field(q, :data), ^Atom.to_string(id))) - defp get_arke_column(%{id: id, arke_id: :integer} = _parameter), + defp get_arke_column(%{id: id, arke_id: :integer} = _parameter, true), + do: + dynamic( + [_q, ..., j], + fragment("(? -> ? ->> 'value')::integer", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :integer} = _parameter, _joined), do: dynamic( [q], fragment("(? -> ? ->> 'value')::integer", field(q, :data), ^Atom.to_string(id)) ) - defp get_arke_column(%{id: id, arke_id: :float} = _parameter), + defp get_arke_column(%{id: id, arke_id: :float} = _parameter, true), + do: + dynamic( + [_, ..., j], + fragment("(? -> ? ->> 'value')::float", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :float} = _parameter, _joined), do: dynamic([q], fragment("(? -> ? ->> 'value')::float", field(q, :data), ^Atom.to_string(id))) - defp get_arke_column(%{id: id, arke_id: :dict} = _parameter), + defp get_arke_column(%{id: id, arke_id: :dict} = _parameter, true), + do: + dynamic( + [_q, ..., j], + fragment("(? -> ? ->> 'value')::JSON", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :dict} = _parameter, _joined), do: dynamic([q], fragment("(? -> ? ->> 'value')::JSON", field(q, :data), ^Atom.to_string(id))) - defp get_arke_column(%{id: id, arke_id: :list} = _parameter), + defp get_arke_column(%{id: id, arke_id: :list} = _parameter, true), + do: + dynamic( + [_, ..., j], + fragment("(? -> ? ->> 'value')::JSON", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :list} = _parameter, _joined), do: dynamic([q], fragment("(? -> ? ->> 'value')::JSON", field(q, :data), ^Atom.to_string(id))) - defp get_arke_column(%{id: id, arke_id: :link} = _parameter), + defp get_arke_column(%{id: id, arke_id: :link} = _parameter, true), + do: + dynamic( + [_q, ..., j], + fragment("(? -> ? ->> 'value')::text", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :link} = _parameter, _joined), do: dynamic([q], fragment("(? -> ? ->> 'value')::text", field(q, :data), ^Atom.to_string(id))) - defp get_arke_column(%{id: id, arke_id: :dynamic} = _parameter), + defp get_arke_column(%{id: id, arke_id: :dynamic} = _parameter, true), + do: + dynamic( + [_, ..., j], + fragment("(? -> ? ->> 'value')::text", field(j, :data), ^Atom.to_string(id)) + ) + + defp get_arke_column(%{id: id, arke_id: :dynamic} = _parameter, _joined), do: dynamic([q], fragment("(? -> ? ->> 'value')::text", field(q, :data), ^Atom.to_string(id))) defp get_value(_parameter, value) when is_nil(value), do: value @@ -464,15 +681,32 @@ defmodule ArkePostgres.Query do end end - defp get_nil_query(%{id: id} = _parameter, column), + defp get_nil_query(%{id: id} = _parameter, column, false, false), do: dynamic( [q], - fragment("? IS NULL AND (data \\? ?)", ^column, ^Atom.to_string(id)) + fragment("? IS NULL AND (?.data \\? ?)", ^column, q, ^Atom.to_string(id)) ) - defp filter_query_by_operator(%{data: %{multiple: true}}, column, value, :eq), do: dynamic([q], fragment("jsonb_exists(?, ?)", ^column, ^value)) - defp filter_query_by_operator(parameter, column, value, :eq), do: dynamic([q], ^column == ^value) + defp get_nil_query(%{id: id} = _parameter, column, false, true), + do: + dynamic( + [q, ..., j], + fragment("? IS NULL AND (?.data \\? ?)", ^column, j, ^Atom.to_string(id)) + ) + + defp get_nil_query(%{id: id} = _parameter, column, true, _joined), + do: + dynamic( + [q], + is_nil(^column) + ) + + defp filter_query_by_operator(%{data: %{multiple: true}}, column, value, :eq), + do: dynamic([q], fragment("jsonb_exists(?, ?)", ^column, ^value)) + + defp filter_query_by_operator(parameter, column, value, :eq), + do: dynamic([q], ^column == ^value) defp filter_query_by_operator(parameter, column, value, :contains), do: dynamic([q], like(^column, fragment("?", ^("%" <> value <> "%")))) @@ -492,11 +726,18 @@ defmodule ArkePostgres.Query do defp filter_query_by_operator(parameter, column, value, :istartswith), do: dynamic([q], ilike(^column, fragment("?", ^(value <> "%")))) - defp filter_query_by_operator(parameter, column, value, :lte), do: dynamic([q], ^column <= ^value) + defp filter_query_by_operator(parameter, column, value, :lte), + do: dynamic([q], ^column <= ^value) + defp filter_query_by_operator(parameter, column, value, :lt), do: dynamic([q], ^column < ^value) defp filter_query_by_operator(parameter, column, value, :gt), do: dynamic([q], ^column > ^value) - defp filter_query_by_operator(parameter, column, value, :gte), do: dynamic([q], ^column >= ^value) - defp filter_query_by_operator(parameter, column, value, :in), do: dynamic([q], ^column in ^value) + + defp filter_query_by_operator(parameter, column, value, :gte), + do: dynamic([q], ^column >= ^value) + + defp filter_query_by_operator(parameter, column, value, :in), + do: dynamic([q], ^column in ^value) + defp filter_query_by_operator(parameter, column, value, _), do: dynamic([q], ^column == ^value) # defp filter_query_by_operator(query, key, value, "between"), do: from q in query, where: column_table(q, ^key) == ^value @@ -532,7 +773,9 @@ defmodule ArkePostgres.Query do where_field = get_where_field_by_direction(direction) |> get_where_condition_by_type(type) get_link_query(action, project, unit_id, link_field, tree_field, depth, where_field) end - def get_nodes(project, action, unit_id, depth, direction, type), do: get_nodes(project, action, [unit_id], depth, direction, type) + + def get_nodes(project, action, unit_id, depth, direction, type), + do: get_nodes(project, action, [unit_id], depth, direction, type) defp get_project(project) when is_atom(project), do: Atom.to_string(project) defp get_project(project), do: project @@ -578,40 +821,43 @@ defmodule ArkePostgres.Query do end defp get_link_query(_action, project, unit_id_list, link_field, tree_field, depth, where_field) do - q = from(r in from(a in "arke_unit", - left_join: - cte in fragment( - @raw_cte_query, - literal(^link_field), - literal(^project), - literal(^link_field), - ^unit_id_list, - literal(^project), - literal(^project), - literal(^project), - literal(^project), - literal(^project), - literal(^project), - literal(^link_field), - literal(^tree_field), - ^depth - ), - where: ^where_field, - distinct: [a.id, cte.starting_unit], - select: %{ - id: a.id, - arke_id: a.arke_id, - data: a.data, - metadata: a.metadata, - inserted_at: a.inserted_at, - updated_at: a.updated_at, - depth: cte.depth, - link_metadata: cte.metadata, - link_type: cte.type, - starting_unit: cte.starting_unit - } - )) - from x in subquery(q), select: x - end + q = + from( + r in from(a in "arke_unit", + left_join: + cte in fragment( + @raw_cte_query, + literal(^link_field), + literal(^project), + literal(^link_field), + ^unit_id_list, + literal(^project), + literal(^project), + literal(^project), + literal(^project), + literal(^project), + literal(^project), + literal(^link_field), + literal(^tree_field), + ^depth + ), + where: ^where_field, + distinct: [a.id, cte.starting_unit], + select: %{ + id: a.id, + arke_id: a.arke_id, + data: a.data, + metadata: a.metadata, + inserted_at: a.inserted_at, + updated_at: a.updated_at, + depth: cte.depth, + link_metadata: cte.metadata, + link_type: cte.type, + starting_unit: cte.starting_unit + } + ) + ) + from(x in subquery(q), select: x) + end end diff --git a/mix.exs b/mix.exs index c3c524c..c597d8d 100644 --- a/mix.exs +++ b/mix.exs @@ -31,6 +31,7 @@ defmodule ArkePostgres.MixProject do mod: {ArkePostgres.Application, []} ] end + defp versioning do [ tag_prefix: "v", @@ -49,7 +50,7 @@ defmodule ArkePostgres.MixProject do {:ex_doc, "~> 0.28", only: :dev, runtime: false}, {:credo, "~> 1.6", only: [:dev, :test], runtime: false}, {:excoveralls, "~> 0.10", only: :test}, - {:arke, "~> 0.3.2"} + {:arke, "~> 0.4.0"} ]) end diff --git a/mix.lock b/mix.lock index fd29996..4a843f9 100644 --- a/mix.lock +++ b/mix.lock @@ -1,54 +1,54 @@ %{ - "arke": {:hex, :arke, "0.3.2", "decf99665aab7aaf595ecb5b57332a9561fa38ddd16baef09879f842e8686b3f", [:mix], [{:calendar, "~> 1.0.0", [hex: :calendar, repo: "hexpm", optional: false]}, {:google_api_storage, "~> 0.34.0", [hex: :google_api_storage, repo: "hexpm", optional: false]}, {:goth, "~> 1.3.0", [hex: :goth, repo: "hexpm", optional: false]}, {:httpoison, "~> 2.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:libcluster, "~> 3.3", [hex: :libcluster, repo: "hexpm", optional: false]}, {:timex, "~> 3.7.11", [hex: :timex, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.2.1", [hex: :typed_struct, repo: "hexpm", optional: false]}, {:uuid, "~> 1.1", [hex: :uuid, repo: "hexpm", optional: false]}, {:xlsxir, "~> 1.6", [hex: :xlsxir, repo: "hexpm", optional: false]}], "hexpm", "f13ffe449c9e71cc8e3fdc0e1dba23eab37f22e8e09b5dd0249decbe2239440d"}, + "arke": {:hex, :arke, "0.4.0", "a76f7fc85893b6b239b18ecf1929411c938a6e454cb1773d040fbd0b42e0edba", [:mix], [{:calendar, "~> 1.0.0", [hex: :calendar, repo: "hexpm", optional: false]}, {:google_api_storage, "~> 0.34.0", [hex: :google_api_storage, repo: "hexpm", optional: false]}, {:goth, "~> 1.3.0", [hex: :goth, repo: "hexpm", optional: false]}, {:httpoison, "~> 2.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:libcluster, "~> 3.3", [hex: :libcluster, repo: "hexpm", optional: false]}, {:timex, "~> 3.7.11", [hex: :timex, repo: "hexpm", optional: false]}, {:typed_struct, "~> 0.2.1", [hex: :typed_struct, repo: "hexpm", optional: false]}, {:uuid, "~> 1.1", [hex: :uuid, repo: "hexpm", optional: false]}, {:xlsxir, "~> 1.6", [hex: :xlsxir, repo: "hexpm", optional: false]}], "hexpm", "9100821ffd7ef54a8a3c31404bdbe276d7db707365821efea817cd1d7c93e5be"}, "bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"}, "calendar": {:hex, :calendar, "1.0.0", "f52073a708528482ec33d0a171954ca610fe2bd28f1e871f247dc7f1565fa807", [:mix], [{:tzdata, "~> 0.1.201603 or ~> 0.5.20 or ~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "990e9581920c82912a5ee50e62ff5ef96da6b15949a2ee4734f935fdef0f0a6f"}, "castore": {:hex, :castore, "1.0.7", "b651241514e5f6956028147fe6637f7ac13802537e895a724f90bf3e36ddd1dd", [:mix], [], "hexpm", "da7785a4b0d2a021cd1292a60875a784b6caef71e76bf4917bdee1f390455cf5"}, - "certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"}, + "certifi": {:hex, :certifi, "2.15.0", "0e6e882fcdaaa0a5a9f2b3db55b1394dba07e8d6d9bcad08318fb604c6839712", [:rebar3], [], "hexpm", "b147ed22ce71d72eafdad94f055165c1c182f61a2ff49df28bcc71d1d5b94a60"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, "credo": {:hex, :credo, "1.7.0", "6119bee47272e85995598ee04f2ebbed3e947678dee048d10b5feca139435f75", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "6839fcf63d1f0d1c0f450abc8564a57c43d644077ab96f2934563e68b8a769d7"}, "db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"}, - "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, + "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, "earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"}, "ecto": {:hex, :ecto, "3.11.1", "4b4972b717e7ca83d30121b12998f5fcdc62ba0ed4f20fd390f16f3270d85c3e", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ebd3d3772cd0dfcd8d772659e41ed527c28b2a8bde4b00fe03e0463da0f1983b"}, "ecto_sql": {:hex, :ecto_sql, "3.11.1", "e9abf28ae27ef3916b43545f9578b4750956ccea444853606472089e7d169470", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ce14063ab3514424276e7e360108ad6c2308f6d88164a076aac8a387e1fea634"}, - "erlsom": {:hex, :erlsom, "1.5.1", "c8fe2babd33ff0846403f6522328b8ab676f896b793634cfe7ef181c05316c03", [:rebar3], [], "hexpm", "7965485494c5844dd127656ac40f141aadfa174839ec1be1074e7edf5b4239eb"}, + "erlsom": {:hex, :erlsom, "1.5.2", "3e47c53a199136fb4d20d5479edb7c9229f31624534c062633951c8d14dcd276", [:rebar3], [], "hexpm", "4e765cc677fb30509f7b628ff2914e124cf4dcc0fac1c0a62ee4dcee24215b5d"}, "ex_doc": {:hex, :ex_doc, "0.29.1", "b1c652fa5f92ee9cf15c75271168027f92039b3877094290a75abcaac82a9f77", [:mix], [{:earmark_parser, "~> 1.4.19", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "b7745fa6374a36daf484e2a2012274950e084815b936b1319aeebcf7809574f6"}, "excoveralls": {:hex, :excoveralls, "0.15.2", "809c1016660d80b28bbcd8cb7fd761791300def53345c1af5bd97db1330619ad", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "f359dda36f15ae885d3259a90919b09ae9318f37c583c403493fe23808b2b882"}, - "expo": {:hex, :expo, "0.5.2", "beba786aab8e3c5431813d7a44b828e7b922bfa431d6bfbada0904535342efe2", [:mix], [], "hexpm", "8c9bfa06ca017c9cb4020fabe980bc7fdb1aaec059fd004c2ab3bff03b1c599c"}, + "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, - "finch": {:hex, :finch, "0.18.0", "944ac7d34d0bd2ac8998f79f7a811b21d87d911e77a786bc5810adb75632ada4", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"}, - "gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"}, + "finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"}, + "gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"}, "google_api_storage": {:hex, :google_api_storage, "0.34.0", "4811461a5065f8a5d59a7fe71efd9c491ba593d20743f0d6f4714153c1dd575f", [:mix], [{:google_gax, "~> 0.4", [hex: :google_gax, repo: "hexpm", optional: false]}], "hexpm", "b343f2f1688acd2e8a2302bed399a24d93626f8e8c809b358214bb0fb7d2669a"}, "google_gax": {:hex, :google_gax, "0.4.1", "310105070626013712c56f8007b6ff7b4ead02ecad1efe7888350c6eaba52783", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:poison, ">= 3.0.0 and < 5.0.0", [hex: :poison, repo: "hexpm", optional: false]}, {:tesla, "~> 1.2", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm", "aef7dce7e04840c0e611f962475e3223d27d50ebd5e7d8e9e963c5e9e3b1ca79"}, "goth": {:hex, :goth, "1.3.1", "f3e08a7f23ea8992ab92d2e1d5c72ea1a8fbd2fe3a46ad1b08d0620f71374fdc", [:mix], [{:finch, "~> 0.9", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:jose, "~> 1.10", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "90326c2c0a7acda7fb75fc4a4f0cba84945d8fcb22694d36c9967cec8949937c"}, - "hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"}, - "hpax": {:hex, :hpax, "0.2.0", "5a58219adcb75977b2edce5eb22051de9362f08236220c9e859a47111c194ff5", [:mix], [], "hexpm", "bea06558cdae85bed075e6c036993d43cd54d447f76d8190a8db0dc5893fa2f1"}, - "httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"}, + "hackney": {:hex, :hackney, "1.24.1", "f5205a125bba6ed4587f9db3cc7c729d11316fa8f215d3e57ed1c067a9703fa9", [:rebar3], [{:certifi, "~> 2.15.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.4", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "f4a7392a0b53d8bbc3eb855bdcc919cd677358e65b2afd3840b5b3690c4c8a39"}, + "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, + "httpoison": {:hex, :httpoison, "2.2.3", "a599d4b34004cc60678999445da53b5e653630651d4da3d14675fedc9dd34bd6", [:mix], [{:hackney, "~> 1.21", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "fa0f2e3646d3762fdc73edb532104c8619c7636a6997d20af4003da6cfc53e53"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, - "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, + "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"}, - "libcluster": {:hex, :libcluster, "3.3.3", "a4f17721a19004cfc4467268e17cff8b1f951befe428975dd4f6f7b84d927fe0", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "7c0a2275a0bb83c07acd17dab3c3bfb4897b145106750eeccc62d302e3bdfee5"}, + "libcluster": {:hex, :libcluster, "3.5.0", "5ee4cfde4bdf32b2fef271e33ce3241e89509f4344f6c6a8d4069937484866ba", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.3", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ebf6561fcedd765a4cd43b4b8c04b1c87f4177b5fb3cbdfe40a780499d72f743"}, "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, "makeup_elixir": {:hex, :makeup_elixir, "0.16.0", "f8c570a0d33f8039513fbccaf7108c5d750f47d8defd44088371191b76492b0b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "28b2cbdc13960a46ae9a8858c4bebdec3c9a6d7b4b9e7f4ed1502f8159f338e7"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, - "mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"}, - "mint": {:hex, :mint, "1.6.0", "88a4f91cd690508a04ff1c3e28952f322528934be541844d54e0ceb765f01d5e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "3c5ae85d90a5aca0a49c0d8b67360bbe407f3b54f1030a111047ff988e8fefaa"}, - "nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"}, + "mimerl": {:hex, :mimerl, "1.4.0", "3882a5ca67fbbe7117ba8947f27643557adec38fa2307490c4c4207624cb213b", [:rebar3], [], "hexpm", "13af15f9f68c65884ecca3a3891d50a7b57d82152792f3e19d88650aa126b144"}, + "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, "poison": {:hex, :poison, "4.0.1", "bcb755a16fac91cad79bfe9fc3585bb07b9331e50cfe3420a24bcc2d735709ae", [:mix], [], "hexpm", "ba8836feea4b394bb718a161fc59a288fe0109b5006d6bdf97b6badfcf6f0f25"}, "postgrex": {:hex, :postgrex, "0.17.4", "5777781f80f53b7c431a001c8dad83ee167bcebcf3a793e3906efff680ab62b3", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "6458f7d5b70652bc81c3ea759f91736c16a31be000f306d3c64bcdfe9a18b3cc"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, - "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, - "tesla": {:hex, :tesla, "1.9.0", "8c22db6a826e56a087eeb8cdef56889731287f53feeb3f361dec5d4c8efb6f14", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, ">= 1.0.0", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.2", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "7c240c67e855f7e63e795bf16d6b3f5115a81d1f44b7fe4eadbf656bae0fef8a"}, + "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, + "tesla": {:hex, :tesla, "1.14.2", "fb1d4f0538bbb8a842c1d94028c886727e345f09f5239395eea19f1baa3314a0", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.13", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, ">= 1.0.0", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.21", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.2", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:mox, "~> 1.0", [hex: :mox, repo: "hexpm", optional: true]}, {:msgpax, "~> 2.3", [hex: :msgpax, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "ad6ac070f1052c96384693b07811e8b1974d9e98b66f29e0691f99926daf6127"}, "timex": {:hex, :timex, "3.7.11", "bb95cb4eb1d06e27346325de506bcc6c30f9c6dea40d1ebe390b262fad1862d1", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.20", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "8b9024f7efbabaf9bd7aa04f65cf8dcd7c9818ca5737677c7b76acbc6a94d1aa"}, "typed_struct": {:hex, :typed_struct, "0.2.1", "e1993414c371f09ff25231393b6430bd89d780e2a499ae3b2d2b00852f593d97", [:mix], [], "hexpm", "8f5218c35ec38262f627b2c522542f1eae41f625f92649c0af701a6fab2e11b3"}, - "tzdata": {:hex, :tzdata, "1.1.1", "20c8043476dfda8504952d00adac41c6eda23912278add38edc140ae0c5bcc46", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, + "tzdata": {:hex, :tzdata, "1.1.3", "b1cef7bb6de1de90d4ddc25d33892b32830f907e7fc2fccd1e7e22778ab7dfbc", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "d4ca85575a064d29d4e94253ee95912edfb165938743dbf002acdf0dcecb0c28"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.1", "a48703a25c170eedadca83b11e88985af08d35f37c6f664d6dcfb106a97782fc", [:rebar3], [], "hexpm", "b3a917854ce3ae233619744ad1e0102e05673136776fb2fa76234f3e03b23642"}, "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, "xlsxir": {:hex, :xlsxir, "1.6.4", "d1e69439cbd9edc1190950f9f883ac364e1f31641e0395ccdb27761791b169a3", [:mix], [{:erlsom, "~> 1.5", [hex: :erlsom, repo: "hexpm", optional: false]}], "hexpm", "38e91f65eb8a4c8dea07d941c8b7e21baf8c8d4938232395c9ffd19d2eb071f2"}, }