Skip to content

Commit

Permalink
Adds working inflection for middlenames, names and lastnames
Browse files Browse the repository at this point in the history
Changes:
1. Adds public interface functions
2. Adds some basic setup for gender detection
3. Adds new tests and travis support
4. Change library main module name
5. Adds development config
6. Adds base store agent to be reused in any other agents
  • Loading branch information
sobolevn committed Jun 17, 2017
1 parent bf4ddb1 commit 4a8a6cd
Show file tree
Hide file tree
Showing 14 changed files with 393 additions and 66 deletions.
19 changes: 19 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
language: elixir

sudo: false

elixir:
- 1.4

otp_release:
- 18.2
- 19.3

env: MIX_ENV=test

script:
- mix coveralls.travis
- mix credo --strict

notifications:
email: false
1 change: 1 addition & 0 deletions config/config.exs
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,4 @@ use Mix.Config
# import_config "#{Mix.env}.exs"

if Mix.env == :test, do: import_config "test.exs"
if Mix.env == :dev, do: import_config "dev.exs"
6 changes: 6 additions & 0 deletions config/dev.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
use Mix.Config

# Configure Petrovich to use `rules` submodule:
config :petrovich_elixir,
rules_path: "rules/rules.json",
gender_path: "rules/gender.json"
3 changes: 2 additions & 1 deletion config/test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ use Mix.Config

# Configure Petrovich to use `rules` submodule:
config :petrovich_elixir,
rules_dir: "rules"
rules_path: "rules/rules.json",
gender_path: "rules/gender.json"
26 changes: 12 additions & 14 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ defmodule PetrovichElixir.Mixfile do
use Mix.Project

@version "0.0.1"
@url "https://github.com/sobolevn/ecto_autoslug_field"
@url "https://github.com/petrovich/petrovich_elixir"

def project do
[app: :petrovich_elixir,
Expand All @@ -19,31 +19,29 @@ defmodule PetrovichElixir.Mixfile do
description: description(),
package: package(),
source_url: @url,
homepage_url: @url]
homepage_url: @url,

# Test coverage:
test_coverage: [tool: ExCoveralls],
preferred_cli_env: [
"coveralls": :test,
"coveralls.detail": :test,
"coveralls.post": :test,
"coveralls.html": :test,
]]
end

# Configuration for the OTP application
#
# Type "mix help compile.app" for more information
def application do
# Specify extra applications you'll use from Erlang/Elixir
[extra_applications: [:logger]]
end

# Dependencies can be Hex packages:
#
# {:my_dep, "~> 0.3.0"}
#
# Or git/path repositories:
#
# {:my_dep, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
#
# Type "mix help deps" for more examples and options
defp deps do
[{:poison, "~> 3.1"},

# Dev and test dependencies:
{:credo, "~> 0.8", only: [:dev, :test], runtime: false},
{:excoveralls, "~> 0.7", only: :test, runtime: false},
{:dialyxir, "~> 0.5", only: [:dev], runtime: false},
{:ex_doc, ">= 0.0.0", only: :dev}]
end
Expand Down
12 changes: 11 additions & 1 deletion mix.lock
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
%{"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm"},
"certifi": {:hex, :certifi, "1.2.1", "c3904f192bd5284e5b13f20db3ceac9626e14eeacfbb492e19583cf0e37b22be", [:rebar3], [], "hexpm"},
"credo": {:hex, :credo, "0.8.1", "137efcc99b4bc507c958ba9b5dff70149e971250813cbe7d4537ec7e36997402", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}], "hexpm"},
"dialyxir": {:hex, :dialyxir, "0.5.0", "5bc543f9c28ecd51b99cc1a685a3c2a1a93216990347f259406a910cf048d1d7", [:mix], [], "hexpm"},
"earmark": {:hex, :earmark, "1.2.2", "f718159d6b65068e8daeef709ccddae5f7fdc770707d82e7d126f584cd925b74", [:mix], [], "hexpm"},
"ex_doc": {:hex, :ex_doc, "0.16.1", "b4b8a23602b4ce0e9a5a960a81260d1f7b29635b9652c67e95b0c2f7ccee5e81", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}], "hexpm"},
"excoveralls": {:hex, :excoveralls, "0.7.0", "05cb3332c2b0f799df3ab90eb7df1ae5a147c86776e91792848a12b7ed87242f", [:mix], [{:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:hackney, ">= 0.12.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"},
"exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm"},
"hackney": {:hex, :hackney, "1.8.6", "21a725db3569b3fb11a6af17d5c5f654052ce9624219f1317e8639183de4a423", [:rebar3], [{:certifi, "1.2.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "5.0.2", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"},
"idna": {:hex, :idna, "5.0.2", "ac203208ada855d95dc591a764b6e87259cb0e2a364218f215ad662daa8cd6b4", [:rebar3], [{:unicode_util_compat, "0.2.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"},
"jsx": {:hex, :jsx, "2.8.2", "7acc7d785b5abe8a6e9adbde926a24e481f29956dd8b4df49e3e4e7bcc92a018", [:mix, :rebar3], [], "hexpm"},
"meck": {:hex, :meck, "0.8.4", "59ca1cd971372aa223138efcf9b29475bde299e1953046a0c727184790ab1520", [:make, :rebar], [], "hexpm"},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"},
"mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"},
"mock": {:hex, :mock, "0.2.1", "bfdba786903e77f9c18772dee472d020ceb8ef000783e737725a4c8f54ad28ec", [:mix], [{:meck, "~> 0.8.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm"},
"poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"}}
"poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.2.0", "dbbccf6781821b1c0701845eaf966c9b6d83d7c3bfc65ca2b78b88b8678bfa35", [:rebar3], [], "hexpm"}}
20 changes: 20 additions & 0 deletions test/petrovich_elixir_test/config_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
defmodule PetrovichTest.ConfigTest do
use ExUnit.Case

test "config can read regular config values" do
Application.put_env(:petrovich_elixir, :test_var, "test")

assert Petrovich.Config.get_env(:petrovich_elixir, :test_var) == "test"
end

test "config can read environment variables" do
System.put_env("TEST_VAR", "test_env_vars")
Application.put_env(
:petrovich_elixir,
:test_env_var,
{:system, "TEST_VAR"})

assert Petrovich.Config.get_env(
:petrovich_elixir, :test_env_var) == "test_env_vars"
end
end
10 changes: 5 additions & 5 deletions test/petrovich_elixir_test/parser_test/firstname_test.exs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
defmodule PetrovichElixirTest.ParserTest.FirstName.Normal do
defmodule PetrovichTest.ParserTest.FirstName.Normal do
use ExUnit.Case

alias PetrovichElixir.Parser
alias Petrovich.Parser

setup do
values = %{
Expand Down Expand Up @@ -76,10 +76,10 @@ defmodule PetrovichElixirTest.ParserTest.FirstName.Normal do
end


defmodule PetrovichElixirTest.ParserTest.FirstName.Exception do
defmodule PetrovichTest.ParserTest.FirstName.Exception do
use ExUnit.Case

alias PetrovichElixir.Parser
alias Petrovich.Parser

setup do
values = %{
Expand Down Expand Up @@ -128,7 +128,7 @@ defmodule PetrovichElixirTest.ParserTest.FirstName.Exception do
end
end

test "parses dative name", %{values: values} do
test "parses dative name", %{values: values} do
for {gender, name, result} <- values.dative do
assert Parser.parse(name, :firstname, :dative, gender) == result
end
Expand Down
149 changes: 149 additions & 0 deletions test/petrovich_elixir_test/parser_test/lastname_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
defmodule PetrovichTest.ParserTest.LastName.Normal do
use ExUnit.Case

alias Petrovich.Parser

setup do
values = %{
nomenative: [
{:male, "Соболев", "Соболев"},
{:female, "Горева", "Горева"}
],

genitive: [
{:male, "Соболев", "Соболева"},
{:female, "Горева", "Горевой"}
],

dative: [
{:male, "Соболев", "Соболеву"},
{:female, "Горева", "Горевой"}
],

accusative: [
{:male, "Соболев", "Соболева"},
{:female, "Горева", "Гореву"}
],

instrumental: [
{:male, "Соболев", "Соболевым"},
{:female, "Горева", "Горевой"}
],

prepositional: [
{:male, "Соболев", "Соболеве"},
{:female, "Горева", "Горевой"}
]
}
{:ok, values: values}
end

test "parses nomenative name", %{values: values} do
for {gender, name, result} <- values.nomenative do
assert Parser.parse(name, :lastname, :nomenative, gender) == result
end
end

test "parses genitive name", %{values: values} do
for {gender, name, result} <- values.genitive do
assert Parser.parse(name, :lastname, :genitive, gender) == result
end
end

test "parses dative name", %{values: values} do
for {gender, name, result} <- values.dative do
assert Parser.parse(name, :lastname, :dative, gender) == result
end
end

test "parses accusative name", %{values: values} do
for {gender, name, result} <- values.accusative do
assert Parser.parse(name, :lastname, :accusative, gender) == result
end
end

test "parses instrumental name", %{values: values} do
for {gender, name, result} <- values.instrumental do
assert Parser.parse(name, :lastname, :instrumental, gender) == result
end
end

test "parses prepositional name", %{values: values} do
for {gender, name, result} <- values.prepositional do
assert Parser.parse(name, :lastname, :prepositional, gender) == result
end
end
end



defmodule PetrovichTest.ParserTest.LastName.Multipart do
use ExUnit.Case

alias Petrovich.Parser

setup do
values = %{
nomenative: [
{:male, "Соболев-Водкин", "Соболев-Водкин"},
],

genitive: [
{:male, "Соболев-Водкин", "Соболева-Водкина"},
],

dative: [
{:male, "Соболев-Водкин", "Соболеву-Водкину"},
],

accusative: [
{:male, "Соболев-Водкин", "Соболева-Водкина"},
],

instrumental: [
{:male, "Соболев-Водкин", "Соболевым-Водкиным"},
],

prepositional: [
{:male, "Соболев-Водкин", "Соболеве-Водкине"},
]
}
{:ok, values: values}
end

test "parses nomenative name", %{values: values} do
for {gender, name, result} <- values.nomenative do
assert Parser.parse(name, :lastname, :nomenative, gender) == result
end
end

test "parses genitive name", %{values: values} do
for {gender, name, result} <- values.genitive do
assert Parser.parse(name, :lastname, :genitive, gender) == result
end
end

test "parses dative name", %{values: values} do
for {gender, name, result} <- values.dative do
assert Parser.parse(name, :lastname, :dative, gender) == result
end
end

test "parses accusative name", %{values: values} do
for {gender, name, result} <- values.accusative do
assert Parser.parse(name, :lastname, :accusative, gender) == result
end
end

test "parses instrumental name", %{values: values} do
for {gender, name, result} <- values.instrumental do
assert Parser.parse(name, :lastname, :instrumental, gender) == result
end
end

test "parses prepositional name", %{values: values} do
for {gender, name, result} <- values.prepositional do
assert Parser.parse(name, :lastname, :prepositional, gender) == result
end
end
end
76 changes: 76 additions & 0 deletions test/petrovich_elixir_test/parser_test/middlename_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
defmodule PetrovichTest.ParserTest.MiddleName.Normal do
use ExUnit.Case

alias Petrovich.Parser

setup do
values = %{
nomenative: [
{:male, "Андреевич", "Андреевич"},
{:female, "Викторовна", "Викторовна"}
],

genitive: [
{:male, "Андреевич", "Андреевича"},
{:female, "Викторовна", "Викторовны"}
],

dative: [
{:male, "Андреевич", "Андреевичу"},
{:female, "Викторовна", "Викторовне"}
],

accusative: [
{:male, "Андреевич", "Андреевича"},
{:female, "Викторовна", "Викторовну"}
],

instrumental: [
{:male, "Андреевич", "Андреевичем"},
{:female, "Викторовна", "Викторовной"}
],

prepositional: [
{:male, "Андреевич", "Андреевиче"},
{:female, "Викторовна", "Викторовне"}
]
}
{:ok, values: values}
end

test "parses nomenative name", %{values: values} do
for {gender, name, result} <- values.nomenative do
assert Parser.parse(name, :middlename, :nomenative, gender) == result
end
end

test "parses genitive name", %{values: values} do
for {gender, name, result} <- values.genitive do
assert Parser.parse(name, :middlename, :genitive, gender) == result
end
end

test "parses dative name", %{values: values} do
for {gender, name, result} <- values.dative do
assert Parser.parse(name, :middlename, :dative, gender) == result
end
end

test "parses accusative name", %{values: values} do
for {gender, name, result} <- values.accusative do
assert Parser.parse(name, :middlename, :accusative, gender) == result
end
end

test "parses instrumental name", %{values: values} do
for {gender, name, result} <- values.instrumental do
assert Parser.parse(name, :middlename, :instrumental, gender) == result
end
end

test "parses prepositional name", %{values: values} do
for {gender, name, result} <- values.prepositional do
assert Parser.parse(name, :middlename, :prepositional, gender) == result
end
end
end
Loading

0 comments on commit 4a8a6cd

Please sign in to comment.