Skip to content

Commit

Permalink
Adds basic gender detector.
Browse files Browse the repository at this point in the history
Changes:
1. Adds more tests
2. Fixes credo issues
  • Loading branch information
sobolevn committed Jun 24, 2017
1 parent ea886fd commit 053f388
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 10 deletions.
40 changes: 39 additions & 1 deletion lib/petrovich/detector.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,49 @@ defmodule Petrovich.Detector do
Guesses the gender by person's name.
"""

alias Petrovich.GenderStore

@doc """
Returns gender from person's name
"""
def detect_gender(values, type) do
def detect_gender(value, type) do
GenderStore.start_link()

%{"exceptions" => exceptions,
"suffixes" => suffixes} = GenderStore.get("gender", to_string(type))

value
|> String.downcase
|> maybe_exception(exceptions)
|> maybe_rule(suffixes)
end

defp maybe_exception(name, exceptions) do
exceptions
|> Enum.find(fn({_, names}) -> name in names end)
|> case do
{gender, _} -> {:ok, gender}
nil -> {:error, name}
end
end

defp maybe_rule({:ok, gender}, _), do: {:ok, gender}
defp maybe_rule({:error, name}, suffixes) do
suffixes
|> Enum.find(fn({_, rule}) -> fits?(name, rule) end)
|> case do
{gender, _} -> {:ok, gender}
nil -> {:error, name}
end
end

defp fits?(name, rule) do
name_len = String.length(name)

Enum.any?(rule, fn(test) ->
test_len = String.length(test)
test == String.slice(name, name_len - test_len, test_len)
end)
end

end
16 changes: 7 additions & 9 deletions lib/petrovich/stores/base.ex
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,13 @@ defmodule Petrovich.Store do
end

defp load_values do
try do
:petrovich_elixir
|> Config.get_env(@setting)
|> File.read!
|> Poison.decode!
rescue
e in File.Error ->
raise RulesFileException, message: Exception.message(e)
end
:petrovich_elixir
|> Config.get_env(@setting)
|> File.read!
|> Poison.decode!
rescue
e in File.Error ->
raise RulesFileException, message: Exception.message(e)
end
end
end
Expand Down
16 changes: 16 additions & 0 deletions test/petrovich_test/detector_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
defmodule PetrovichTest.DetectorTest do
use ExUnit.Case

alias Petrovich.Detector

test "detects exception genders" do
assert Detector.detect_gender("Никита", :firstname) == {:ok, "male"}
assert Detector.detect_gender("Женя", :firstname) == {:ok, "androgynous"}
assert Detector.detect_gender("Наташа", :firstname) == {:ok, "female"}
end

test "detects correct gender" do
assert Detector.detect_gender("Айгуль", :firstname) == {:ok, "female"}
assert Detector.detect_gender("Ибрагим", :firstname) == {:ok, "male"}
end
end

0 comments on commit 053f388

Please sign in to comment.