• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

coryodaniel / k8s / 807e93631268e5fd52ca29e3e4755088cf11bf27-PR-262

pending completion
807e93631268e5fd52ca29e3e4755088cf11bf27-PR-262

Pull #262

github

mruoss
add possibility to wait for delete
Pull Request #262: add possibility to wait for delete

6 of 6 new or added lines in 1 file covered. (100.0%)

732 of 1009 relevant lines covered (72.55%)

44.92 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

45.0
/lib/k8s/resource/named_list.ex
1
defmodule K8s.Resource.NamedList do
2
  @moduledoc """
3
  Provides an accessor to a list of maps whereas each element in the list has a key named "name". The name should
4
  be unique within the list and therefore defining the element.
5
  """
6

7
  @doc """
8
  Provides an accessor to a list of maps whereas each element in the list has a key named "name". If no such element
9
  exists within the given list, get_in() will return nil while updating will create an empty element with the given
10
  name.
11

12
  ## Examples
13
    iex> get_in([%{"name" => "key1", "value" => "value1"}, %{"name" => "key2", "value" => "value2"}], [K8s.Resource.NamedList.access("key2"), "value"])
14
    "value2"
15

16
    iex> get_in([%{"name" => "key1", "value" => "value1"}, %{"name" => "key2", "value" => "value2"}], [K8s.Resource.NamedList.access("key2")])
17
    %{"name" => "key2", "value" => "value2"}
18

19
    iex> get_in([%{"name" => "key1", "value" => "value1"}], [K8s.Resource.NamedList.access("missing-key"), "value"])
20
    nil
21

22
    iex> get_in([%{"name" => "key1", "value" => "value1"}], [K8s.Resource.NamedList.access("missing-key")])
23
    nil
24

25
    iex> put_in([%{"name" => "key1", "value" => "value1"}, %{"name" => "key2", "value" => "value2"}], [K8s.Resource.NamedList.access("key1"), "value"], "value_new")
26
    [%{"name" => "key1", "value" => "value_new"}, %{"name" => "key2", "value" => "value2"}]
27

28
    iex> put_in([%{"name" => "key1", "value" => "value1"}], [K8s.Resource.NamedList.access("missing-key"), "value"], "value_new")
29
    [%{"name" => "missing-key", "value" => "value_new"}, %{"name" => "key1", "value" => "value1"}]
30

31
    iex> pop_in([%{"name" => "key1", "value" => "value1"}, %{"name" => "key2", "value" => "value2"}], [K8s.Resource.NamedList.access("key1"), "value"])
32
    {"value1", [%{"name" => "key1"}, %{"name" => "key2", "value" => "value2"}]}
33

34
    iex> pop_in([%{"name" => "key1", "value" => "value1"}], [K8s.Resource.NamedList.access("missing-key"), "value"])
35
    {nil, [%{"name" => "missing-key"}, %{"name" => "key1", "value" => "value1"}]}
36

37
    iex> pop_in([%{"name" => "key1", "value" => "value1"}], [K8s.Resource.NamedList.access("missing-key")])
38
    {%{"name" => "missing-key"}, [%{"name" => "key1", "value" => "value1"}]}
39
  """
40
  @spec access(binary) :: Access.access_fun(data :: list(), get_value :: term)
41
  def access(name), do: create_accessor(name, raise: false)
126✔
42

43
  @doc """
44
  Provides an accessor to a list of maps whereas each element in the list has a key named "name". If no such element
45
  exists within the given list, an exception is raised.
46

47
  ## Examples
48
    iex> get_in([%{"name" => "key1", "value" => "value1"}, %{"name" => "key2", "value" => "value2"}], [K8s.Resource.NamedList.access!("key2"), "value"])
49
    "value2"
50

51
    iex> get_in([%{"name" => "key1", "value" => "value1"}, %{"name" => "key2", "value" => "value2"}], [K8s.Resource.NamedList.access!("key2")])
52
    %{"name" => "key2", "value" => "value2"}
53

54
    iex> get_in([%{"name" => "key1", "value" => "value1"}], [K8s.Resource.NamedList.access!("missing-key"), "value"])
55
    ** (ArgumentError) There is not item with name missing-key in the given named list.
56

57
    iex> get_in([%{"name" => "key1", "value" => "value1"}], [K8s.Resource.NamedList.access!("missing-key")])
58
    ** (ArgumentError) There is not item with name missing-key in the given named list.
59

60
    iex> put_in([%{"name" => "key1", "value" => "value1"}, %{"name" => "key2", "value" => "value2"}], [K8s.Resource.NamedList.access!("key1"), "value"], "value_new")
61
    [%{"name" => "key1", "value" => "value_new"}, %{"name" => "key2", "value" => "value2"}]
62

63
    iex> put_in([%{"name" => "key1", "value" => "value1"}], [K8s.Resource.NamedList.access!("missing-key"), "value"], "value_new")
64
    ** (ArgumentError) There is not item with name missing-key in the given named list.
65

66
    iex> pop_in([%{"name" => "key1", "value" => "value1"}, %{"name" => "key2", "value" => "value2"}], [K8s.Resource.NamedList.access!("key1"), "value"])
67
    {"value1", [%{"name" => "key1"}, %{"name" => "key2", "value" => "value2"}]}
68

69
    iex> pop_in([%{"name" => "key1", "value" => "value1"}], [K8s.Resource.NamedList.access!("missing-key"), "value"])
70
    ** (ArgumentError) There is not item with name missing-key in the given named list.
71

72
    iex> pop_in([%{"name" => "key1", "value" => "value1"}], [K8s.Resource.NamedList.access!("missing-key")])
73
    ** (ArgumentError) There is not item with name missing-key in the given named list.
74
  """
75
  @spec access!(binary) :: Access.access_fun(data :: list(), get_value :: term)
76
  def access!(name), do: create_accessor(name, raise: true)
×
77

78
  @spec create_accessor(binary, keyword) :: Access.access_fun(data :: list(), get_value :: term)
79
  defp create_accessor(name, opts) do
80
    fn op, data, next ->
126✔
81
      if Enum.count(data, match_name_callback(name)) > 1 do
126✔
82
        raise ArgumentError, "The name #{name} is not unique in the given list: #{inspect(data)}"
×
83
      end
84

85
      create_accessor(op, data, name, next, opts)
126✔
86
    end
87
  end
88

89
  @spec create_accessor(:get | :get_and_update, maybe_improper_list, term, function, keyword) ::
90
          any
91
  defp create_accessor(:get, data, name, next, opts) when is_list(data) do
92
    raise_if_key_does_not_exist = Keyword.get(opts, :raise, false)
126✔
93
    item = Enum.find(data, match_name_callback(name))
126✔
94

95
    if raise_if_key_does_not_exist && is_nil(item) do
126✔
96
      raise ArgumentError, "There is not item with name #{name} in the given named list."
×
97
    end
98

99
    next.(item)
126✔
100
  end
101

102
  defp create_accessor(:get_and_update, data, name, next, opts) when is_list(data) do
103
    {value, rest} =
×
104
      case Enum.find_index(data, match_name_callback(name)) do
105
        nil ->
106
          if Keyword.get(opts, :raise, false) do
×
107
            raise ArgumentError, "There is not item with name #{name} in the given named list."
×
108
          end
109

110
          {%{"name" => name}, data}
111

112
        index ->
113
          List.pop_at(data, index)
×
114
      end
115

116
    case next.(value) do
×
117
      {get, update} -> {get, [update | rest]}
×
118
      :pop -> {value, rest}
×
119
    end
120
  end
121

122
  defp create_accessor(_op, data, _name, _next, _opts) do
123
    raise ArgumentError,
×
124
          "Kubernetes.NamedList.access/1 expected a named list, got: #{inspect(data)}"
125
  end
126

127
  @spec match_name_callback(term) :: (nil | maybe_improper_list() | map() -> boolean())
128
  defp match_name_callback(name), do: &(&1["name"] == name)
252✔
129
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc