Skip to content

Commit 6838ff7

Browse files
authored
Merge pull request #293 from BinaryNoggin/support-map-in-assign-new
Allows `assign_new/2` to take a map of values Thank you Amos
2 parents 87e52a1 + ba916c8 commit 6838ff7

File tree

4 files changed

+83
-4
lines changed

4 files changed

+83
-4
lines changed

lib/scenic/driver.ex

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,11 +344,15 @@ defmodule Scenic.Driver do
344344
@doc """
345345
Convenience function to assign a list of values into a driver struct.
346346
"""
347-
@spec assign(driver :: Driver.t(), key_list :: Keyword.t()) :: Driver.t()
347+
@spec assign(driver :: Driver.t(), key_list :: Keyword.t() | map) :: Driver.t()
348348
def assign(%Driver{} = driver, key_list) when is_list(key_list) do
349349
Enum.reduce(key_list, driver, fn {k, v}, acc -> assign(acc, k, v) end)
350350
end
351351

352+
def assign(%Driver{assigns: assigns} = driver, key_map) when is_map(key_map) do
353+
%{driver | assigns: Map.merge(assigns, key_map)}
354+
end
355+
352356
@doc """
353357
Convenience function to assign a value into a driver struct.
354358
"""
@@ -358,15 +362,19 @@ defmodule Scenic.Driver do
358362
end
359363

360364
@doc """
361-
Convenience function to assign a list of new values into a driver struct.
365+
Convenience function to assign a list or map of new values into a driver struct.
362366
363367
Only values that do not already exist will be assigned
364368
"""
365-
@spec assign_new(driver :: Driver.t(), key_list :: Keyword.t()) :: Driver.t()
369+
@spec assign_new(driver :: Driver.t(), key_list :: Keyword.t() | map) :: Driver.t()
366370
def assign_new(%Driver{} = driver, key_list) when is_list(key_list) do
367371
Enum.reduce(key_list, driver, fn {k, v}, acc -> assign_new(acc, k, v) end)
368372
end
369373

374+
def assign_new(%Driver{assigns: assigns} = driver, key_map) when is_map(key_map) do
375+
%{driver | assigns: Map.merge(key_map, assigns)}
376+
end
377+
370378
@doc """
371379
Convenience function to assign a new values into a driver struct.
372380

lib/scenic/scene.ex

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,11 +415,15 @@ defmodule Scenic.Scene do
415415
416416
Only values that do not already exist will be assigned
417417
"""
418-
@spec assign_new(scene :: Scene.t(), key_list :: Keyword.t()) :: Scene.t()
418+
@spec assign_new(scene :: Scene.t(), key_list :: Keyword.t() | map) :: Scene.t()
419419
def assign_new(%Scene{} = scene, key_list) when is_list(key_list) do
420420
Enum.reduce(key_list, scene, fn {k, v}, acc -> assign_new(acc, k, v) end)
421421
end
422422

423+
def assign_new(%Scene{assigns: assigns} = scene, key_map) when is_map(key_map) do
424+
%{scene | assigns: Map.merge(key_map, assigns)}
425+
end
426+
423427
@doc """
424428
Convenience function to assign a new values into a scene struct.
425429

test/scenic/driver_test.exs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,25 @@ defmodule Scenic.DriverTest do
188188
assert Driver.fetch(driver, :def) == {:ok, 456}
189189
end
190190

191+
test "assign assigns map of values" do
192+
driver =
193+
%Driver{}
194+
|> Driver.assign(%{abc: 123, def: 456})
195+
196+
assert Driver.fetch(driver, :abc) == {:ok, 123}
197+
assert Driver.fetch(driver, :def) == {:ok, 456}
198+
end
199+
200+
test "assign_new overrides existing values" do
201+
driver =
202+
%Driver{assigns: %{abc: 123, hij: :original}}
203+
|> Driver.assign(abc: 789, def: 456)
204+
205+
assert Driver.fetch(driver, :abc) == {:ok, 789}
206+
assert Driver.fetch(driver, :def) == {:ok, 456}
207+
assert Driver.fetch(driver, :hij) == {:ok, :original}
208+
end
209+
191210
test "assign_new assigns single value" do
192211
driver =
193212
%Driver{}
@@ -214,6 +233,24 @@ defmodule Scenic.DriverTest do
214233
assert Driver.fetch(driver, :def) == {:ok, 456}
215234
end
216235

236+
test "assign_new assigns map of values" do
237+
driver =
238+
%Driver{}
239+
|> Driver.assign_new(%{abc: 123, def: 456})
240+
241+
assert Driver.fetch(driver, :abc) == {:ok, 123}
242+
assert Driver.fetch(driver, :def) == {:ok, 456}
243+
end
244+
245+
test "assign_new with a map ignores existing values" do
246+
driver =
247+
%Driver{assigns: %{abc: 123}}
248+
|> Driver.assign_new(%{abc: 789, def: 456})
249+
250+
assert Driver.fetch(driver, :abc) == {:ok, 123}
251+
assert Driver.fetch(driver, :def) == {:ok, 456}
252+
end
253+
217254
test "set_busy sets the busy flag" do
218255
driver = %Driver{}
219256
assert Map.get(driver, :busy) == false

test/scenic/scene_test.exs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,36 @@ defmodule Scenic.SceneTest do
208208
assert scene.assigns == %{one: 1, two: 2, three: "three"}
209209
end
210210

211+
test "assign_new assigns list of values", %{scene: scene} do
212+
scene = Scene.assign_new(scene, abc: 123, def: 456)
213+
214+
assert scene.assigns == %{abc: 123, def: 456}
215+
end
216+
217+
test "assign_new ignores existing values", %{scene: scene} do
218+
scene =
219+
scene
220+
|> Scene.assign(abc: :original)
221+
|> Scene.assign_new(abc: 123, def: 456)
222+
223+
assert scene.assigns == %{abc: :original, def: 456}
224+
end
225+
226+
test "assign_new assigns map of values", %{scene: scene} do
227+
scene = Scene.assign_new(scene, %{abc: 123, def: 456})
228+
229+
assert scene.assigns == %{abc: 123, def: 456}
230+
end
231+
232+
test "assign_new with a map ignores existing values", %{scene: scene} do
233+
scene =
234+
scene
235+
|> Scene.assign(abc: :original)
236+
|> Scene.assign_new(%{abc: 123, def: 456})
237+
238+
assert scene.assigns == %{abc: :original, def: 456}
239+
end
240+
211241
test "get gets a value from assigns - works like map", %{scene: scene} do
212242
scene =
213243
Scene.assign(scene,

0 commit comments

Comments
 (0)