Skip to content

Commit

Permalink
Expand the capabilities of dictionaries (#75)
Browse files Browse the repository at this point in the history
* Expand the capabilities of dictionaries

* Added config option 'default_dictionary' for use any custom dictionary
* Added config option 'additional_dictionaries' for expand exist dictionary

* Refactoring of generate_dictionary/1 and concat_dictionaries/2
  • Loading branch information
vkatsuba authored Nov 15, 2021
1 parent 3ca3ff7 commit d135010
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 1 deletion.
18 changes: 17 additions & 1 deletion src/sheldon_dictionary.erl
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ bazinga_name(Lang) ->

-spec fill_cashe(atom(), term()) -> ok.
fill_cashe(Name, Source) ->
{ok, SourceBin} = file:read_file(Source),
SourceBin = generate_dictionary(Source),
Words = re:split(SourceBin, "\n"), % one word per line
Name = ets:new(Name, [named_table, bag, {read_concurrency, true}]),

Expand Down Expand Up @@ -168,3 +168,19 @@ typo_model(Word) ->
end,
[Word],
[lists:split(I, Word) || I <- lists:seq(0, length(Word))]).

-spec generate_dictionary(file:name_all()) -> binary().
generate_dictionary(Source) ->
DefaultDictionary = application:get_env(sheldon, default_dictionary, Source),
AdditionalDictionaries = application:get_env(sheldon, additional_dictionaries, []),
concat_dictionaries(DefaultDictionary, AdditionalDictionaries).

-spec concat_dictionaries(file:name_all(), [file:name_all()] | []) -> binary().
concat_dictionaries(Source, AdditionalDictionaries) ->
{ok, SourceBin} = file:read_file(Source),
lists:foldl(fun(Path, Acc) ->
{ok, Bin} = file:read_file(Path),
<<Acc/binary, "\n", Bin/binary>>
end,
SourceBin,
AdditionalDictionaries).
1 change: 1 addition & 0 deletions test/dictionaries/additional_dictionary_1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
wiki
1 change: 1 addition & 0 deletions test/dictionaries/additional_dictionary_2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fabuloso
1 change: 1 addition & 0 deletions test/dictionaries/default_dictionary.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
wikipedia
62 changes: 62 additions & 0 deletions test/sheldon_dictionaries_SUITE.erl
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
-module(sheldon_dictionaries_SUITE).

-behaviour(ct_suite).

-export([all/0, init_per_suite/1, end_per_suite/1, init_per_testcase/2,
end_per_testcase/2]).
-export([default_dictionary/1, additional_dictionary/1]).

%% =============================================================================
%% Common test
%% =============================================================================

-spec all() -> [atom()].
all() ->
[default_dictionary, additional_dictionary].

-spec init_per_suite(ct_suite:ct_config()) -> ct_suite:ct_config().
init_per_suite(Config) ->
Dictionary = [code:priv_dir(sheldon), "/../test/dictionaries/default_dictionary.txt"],
ok = application:set_env(sheldon, default_dictionary, Dictionary),
Config.

-spec end_per_suite(ct_suite:ct_config()) -> ct_suite:ct_config().
end_per_suite(Config) ->
Config.

-spec init_per_testcase(ct_suite:ct_testname(), ct_suite:ct_config()) ->
ct_suite:ct_config() | {fail, term()} | {skip, term()}.
init_per_testcase(default_dictionary, Config) ->
ok = sheldon:start(),
Config;
init_per_testcase(additional_dictionary, Config) ->
One = [code:priv_dir(sheldon), "/../test/dictionaries/additional_dictionary_1.txt"],
Two = [code:priv_dir(sheldon), "/../test/dictionaries/additional_dictionary_2.txt"],
ok = application:set_env(sheldon, additional_dictionaries, [One, Two]),
ok = sheldon:start(),
Config;
init_per_testcase(_Name, Config) ->
Config.

-spec end_per_testcase(ct_suite:ct_testname(), ct_suite:ct_config()) ->
term() | {fail, term()} | {save_config, ct_suite:ct_config()}.
end_per_testcase(_Name, _Config) ->
ok = application:stop(sheldon),
ok.

%% =============================================================================
%% Test Cases
%% =============================================================================

-spec default_dictionary(ct_suite:ct_config()) -> ok | no_return().
default_dictionary(_Config) ->
ok = sheldon:check("wikipedia"),
#{bazinga := _} = sheldon:check("wiki"),
ok.

-spec additional_dictionary(ct_suite:ct_config()) -> ok | no_return().
additional_dictionary(_Config) ->
ok = sheldon:check("Wikipedia"),
ok = sheldon:check("Wiki"),
ok = sheldon:check("Fabuloso"),
ok.

0 comments on commit d135010

Please sign in to comment.