Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: bump minimum elixir to 1.13 #11

Merged
merged 2 commits into from
Aug 31, 2024
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
38 changes: 17 additions & 21 deletions lib/accessible.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,20 @@ defmodule Accessible do
quote location: :keep do
@behaviour Access

@impl Access
def fetch(struct, key), do: Map.fetch(struct, key)

if Version.compare(System.version(), "1.7.0") == :lt do
@impl Access
def delete(struct, key) do
put(struct, key, struct(__MODULE__)[key])
end

@impl Access
defdelegate fetch(struct, key), to: Map

def get(struct, key, default \\ nil) do
case struct do
%{^key => value} -> value
_else -> default
end
end

def put(struct, key, val) do
if Map.has_key?(struct, key) do
Map.put(struct, key, val)
else
struct
end
end

def delete(struct, key) do
put(struct, key, struct(__MODULE__)[key])
end

@impl Access
def get_and_update(struct, key, fun) when is_function(fun, 1) do
current = get(struct, key)
Expand All @@ -54,12 +42,20 @@ defmodule Accessible do
{val, updated}
end

defoverridable fetch: 2,
def put(struct, key, val) do
if Map.has_key?(struct, key) do
Map.put(struct, key, val)
else
struct
end
end

defoverridable delete: 2,
fetch: 2,
get: 3,
put: 3,
delete: 2,
get_and_update: 3,
pop: 3
pop: 3,
put: 3
end
end
end
13 changes: 12 additions & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ defmodule Accessible.Mixfile do
description: description(),
dialyzer: dialyzer(),
docs: docs(),
elixir: "~> 1.4",
elixir: "~> 1.13",
elixirc_options: [warnings_as_errors: true],
elixirc_paths: elixirc_paths(Mix.env()),
name: "Accessible",
package: package(),
source_url: "https://github.com/codedge-llc/accessible",
start_permanent: Mix.env() == :prod,
test_coverage: test_coverage(),
version: @version
]
end
Expand Down Expand Up @@ -67,4 +68,14 @@ defmodule Accessible.Mixfile do
maintainers: ["Henry Popp"]
]
end

defp test_coverage do
[
ignore_modules: [
Accessible.TestModule,
Accessible.TestModuleEnforceKeys
],
summary: [threshold: 70]
]
end
end
10 changes: 10 additions & 0 deletions test/accessible_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ defmodule AccessibleTest do
alias Accessible.{TestModule, TestModuleEnforceKeys}

describe "normal struct" do
test "enables map accessor syntax" do
assert %TestModule{}[:key_1] == 1234
end

test "fetch/2 returns value for given key" do
assert Access.fetch(%TestModule{}, :key_1) == {:ok, 1234}
end
Expand All @@ -23,6 +27,12 @@ defmodule AccessibleTest do
end

describe "struct with enforce keys" do
test "enables map accessor syntax" do
data = %TestModuleEnforceKeys{key_1: :example, key_2: 1234}
assert data[:key_1] == :example
assert data[:key_2] == 1234
end

test "fetch/2 returns value for given key" do
data = %TestModuleEnforceKeys{key_1: :example, key_2: 1234}
assert Access.fetch(data, :key_1) == {:ok, :example}
Expand Down
Loading