Skip to content

Commit 3c8584d

Browse files
Update data mapper
1 parent c0dbb2a commit 3c8584d

File tree

4 files changed

+24
-17
lines changed

4 files changed

+24
-17
lines changed

lib/data_mapper.ex

+11-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ defmodule DataMapper do
55

66
@callback map_list(input :: any) :: [map()]
77

8-
@callback map(input :: any) :: map()
8+
@callback map(input :: any) :: any()
99

1010
@callback map(input :: any, mappings :: map()) :: map()
1111

@@ -17,12 +17,12 @@ defmodule DataMapper do
1717

1818
@callback pre_map_transform(any) :: any
1919

20-
@callback post_map_transform(any) :: map()
20+
@callback post_map_transform(any) :: any
2121

2222
defmacro __using__(opts) do
2323
{mappings, opts} = Keyword.pop!(opts, :mappings)
2424

25-
quote do
25+
quote location: :keep do
2626
@behaviour DataMapper
2727

2828
@doc """
@@ -41,7 +41,7 @@ defmodule DataMapper do
4141
Maps input to the mappings described in the `opts`.
4242
"""
4343
@impl DataMapper
44-
@spec map(map() | keyword()) :: map()
44+
@spec map(map() | keyword()) :: any()
4545
def map(input) do
4646
input
4747
|> pre_map_transform()
@@ -73,7 +73,12 @@ defmodule DataMapper do
7373

7474
# Flatten nested mapping.
7575
{from_key, sub_mapping}, acc when is_map(sub_mapping) ->
76-
map(input[from_key], sub_mapping, Keyword.merge(opts, into: acc))
76+
opts = Keyword.merge(opts, into: acc)
77+
78+
case input[from_key] do
79+
data when is_list(data) -> Enum.map(data, &map(&1, sub_mapping, opts))
80+
data -> map(data, sub_mapping, opts)
81+
end
7782

7883
# Normal mapping.
7984
{from_key, to_key}, acc ->
@@ -130,6 +135,6 @@ defmodule DataMapper do
130135
end
131136

132137
def to_map(input) when is_struct(input), do: Map.from_struct(input)
133-
def to_map(input) when is_list(input), do: Map.new(input)
134138
def to_map(input) when is_map(input), do: input
139+
def to_map([{_, _} | _] = input), do: Map.new(input)
135140
end

mix.exs

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ defmodule DataMapper.MixProject do
44
def project do
55
[
66
app: :data_mapper,
7-
version: "0.1.0",
7+
version: "0.2.0",
88
elixir: "~> 1.9",
99
start_permanent: Mix.env() == :prod,
1010
deps: deps(),
1111
dialyzer: [plt_file: {:no_warn, "priv/plts/dialyzer.plt"}],
12-
1312
name: "DataMapper",
1413
source_url: "https://github.com/ryanwinchester/data_mapper",
1514
homepage_url: "https://github.com/ryanwinchester/data_mapper",
@@ -18,7 +17,6 @@ defmodule DataMapper.MixProject do
1817
# logo: "path/to/logo.png",
1918
extras: ["README.md"]
2019
],
21-
2220
package: package()
2321
]
2422
end

mix.lock

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
%{
2-
"dialyxir": {:hex, :dialyxir, "1.0.0", "6a1fa629f7881a9f5aaf3a78f094b2a51a0357c843871b8bc98824e7342d00a5", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "aeb06588145fac14ca08d8061a142d52753dbc2cf7f0d00fc1013f53f8654654"},
2+
"dialyxir": {:hex, :dialyxir, "1.4.3", "edd0124f358f0b9e95bfe53a9fcf806d615d8f838e2202a9f430d59566b6b53b", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "bf2cfb75cd5c5006bec30141b131663299c661a864ec7fbbc72dfa557487a986"},
33
"earmark": {:hex, :earmark, "1.4.9", "837e4c1c5302b3135e9955f2bbf52c6c52e950c383983942b68b03909356c0d9", [:mix], [{:earmark_parser, ">= 1.4.9", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "0d72df7d13a3dc8422882bed5263fdec5a773f56f7baeb02379361cb9e5b0d8e"},
4-
"earmark_parser": {:hex, :earmark_parser, "1.4.9", "819bda2049e6ee1365424e4ced1ba65806eacf0d2867415f19f3f80047f8037b", [:mix], [], "hexpm", "8bf54fddabf2d7e137a0c22660e71b49d5a0a82d1fb05b5af62f2761cd6485c4"},
5-
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
6-
"ex_doc": {:hex, :ex_doc, "0.22.1", "9bb6d51508778193a4ea90fa16eac47f8b67934f33f8271d5e1edec2dc0eee4c", [:mix], [{:earmark, "~> 1.4.0", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm", "d957de1b75cb9f78d3ee17820733dc4460114d8b1e11f7ee4fd6546e69b1db60"},
7-
"makeup": {:hex, :makeup, "1.0.3", "e339e2f766d12e7260e6672dd4047405963c5ec99661abdc432e6ec67d29ef95", [:mix], [{:nimble_parsec, "~> 0.5", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "2e9b4996d11832947731f7608fed7ad2f9443011b3b479ae288011265cdd3dad"},
8-
"makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"},
9-
"nimble_parsec": {:hex, :nimble_parsec, "0.6.0", "32111b3bf39137144abd7ba1cce0914533b2d16ef35e8abc5ec8be6122944263", [:mix], [], "hexpm", "27eac315a94909d4dc68bc07a4a83e06c8379237c5ea528a9acff4ca1c873c52"},
4+
"earmark_parser": {:hex, :earmark_parser, "1.4.41", "ab34711c9dc6212dda44fcd20ecb87ac3f3fce6f0ca2f28d4a00e4154f8cd599", [:mix], [], "hexpm", "a81a04c7e34b6617c2792e291b5a2e57ab316365c2644ddc553bb9ed863ebefa"},
5+
"erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"},
6+
"ex_doc": {:hex, :ex_doc, "0.34.2", "13eedf3844ccdce25cfd837b99bea9ad92c4e511233199440488d217c92571e8", [:mix], [{:earmark_parser, "~> 1.4.39", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "5ce5f16b41208a50106afed3de6a2ed34f4acfd65715b82a0b84b49d995f95c1"},
7+
"makeup": {:hex, :makeup, "1.1.2", "9ba8837913bdf757787e71c1581c21f9d2455f4dd04cfca785c70bbfff1a76a3", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cce1566b81fbcbd21eca8ffe808f33b221f9eee2cbc7a1706fc3da9ff18e6cac"},
8+
"makeup_elixir": {:hex, :makeup_elixir, "0.16.2", "627e84b8e8bf22e60a2579dad15067c755531fea049ae26ef1020cad58fe9578", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "41193978704763f6bbe6cc2758b84909e62984c7752b3784bd3c218bb341706b"},
9+
"makeup_erlang": {:hex, :makeup_erlang, "1.0.1", "c7f58c120b2b5aa5fd80d540a89fdf866ed42f1f3994e4fe189abebeab610839", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "8a89a1eeccc2d798d6ea15496a6e4870b75e014d1af514b1b71fa33134f57814"},
10+
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
1011
}

test/data_mapper_test.exs

+4-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ defmodule DataMapperTest do
5757
"b" => :b,
5858
"extra" => :extra,
5959
"nested" => {:nested, %{"foo" => :foo}},
60-
"flattened" => %{"f1" => :flattened_1, "f2" => :flattened_2}
60+
"flattened" => %{
61+
"f1" => :flattened_1,
62+
"f2" => :flattened_2
63+
}
6164
}
6265

6366
@impl DataMapper

0 commit comments

Comments
 (0)