tr8n 3.1.8 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -1
- data/.rspec +1 -0
- data/.rvmrc +1 -1
- data/.watchr +18 -0
- data/Gemfile.lock +16 -10
- data/app/assets/images/tr8n/minus_node.png +0 -0
- data/app/assets/images/tr8n/pixel.gif +0 -0
- data/app/assets/images/tr8n/plus_node.png +0 -0
- data/app/assets/javascripts/tr8n/tr8n.js +1 -0
- data/app/assets/javascripts/tr8n/tr8n_client_sdk.js +581 -425
- data/app/assets/stylesheets/tr8n/layout.css.scss +1 -1
- data/app/assets/stylesheets/tr8n/tr8n.css.scss +20 -0
- data/app/controllers/tr8n/admin/base_controller.rb +4 -1
- data/app/controllers/tr8n/admin/clientsdk_controller.rb +1 -1
- data/app/controllers/tr8n/admin/metrics_controller.rb +30 -0
- data/app/controllers/tr8n/api/v1/base_controller.rb +12 -0
- data/app/controllers/tr8n/api/v1/language_controller.rb +7 -5
- data/app/controllers/tr8n/awards_controller.rb +1 -1
- data/app/controllers/tr8n/base_controller.rb +12 -6
- data/app/controllers/tr8n/dashboard_controller.rb +1 -1
- data/app/controllers/tr8n/forum_controller.rb +1 -1
- data/app/controllers/tr8n/glossary_controller.rb +1 -1
- data/app/controllers/tr8n/help_controller.rb +1 -1
- data/app/controllers/tr8n/phrases_controller.rb +1 -1
- data/app/controllers/tr8n/translator_controller.rb +8 -0
- data/app/helpers/tr8n/admin/base_helper.rb +1 -1
- data/app/helpers/tr8n/base_helper.rb +1 -1
- data/app/helpers/tr8n/dashboard_helper.rb +1 -1
- data/app/models/tr8n/base_filter.rb +1 -1
- data/app/models/tr8n/daily_language_metric.rb +1 -1
- data/app/models/tr8n/date_rule.rb +1 -1
- data/app/models/tr8n/gender_list_rule.rb +1 -1
- data/app/models/tr8n/gender_rule.rb +1 -1
- data/app/models/tr8n/glossary.rb +1 -1
- data/app/models/tr8n/glossary_filter.rb +1 -1
- data/app/models/tr8n/integration/ru/russian_gender_list_rule.rb +1 -1
- data/app/models/tr8n/integration/ru/russian_numeric_rule.rb +1 -1
- data/app/models/tr8n/ip_location.rb +1 -1
- data/app/models/tr8n/ip_location_filter.rb +1 -1
- data/app/models/tr8n/language.rb +19 -7
- data/app/models/tr8n/language_case.rb +1 -1
- data/app/models/tr8n/language_case_filter.rb +1 -1
- data/app/models/tr8n/language_case_rule.rb +1 -1
- data/app/models/tr8n/language_case_rule_filter.rb +1 -1
- data/app/models/tr8n/language_case_value_map.rb +1 -1
- data/app/models/tr8n/language_case_value_map_filter.rb +1 -1
- data/app/models/tr8n/language_filter.rb +1 -1
- data/app/models/tr8n/language_forum_abuse_report.rb +1 -1
- data/app/models/tr8n/language_forum_abuse_report_filter.rb +1 -1
- data/app/models/tr8n/language_forum_message.rb +1 -1
- data/app/models/tr8n/language_forum_message_filter.rb +1 -1
- data/app/models/tr8n/language_forum_topic.rb +1 -1
- data/app/models/tr8n/language_forum_topic_filter.rb +1 -1
- data/app/models/tr8n/language_metric.rb +1 -1
- data/app/models/tr8n/language_metric_filter.rb +1 -1
- data/app/models/tr8n/language_rule.rb +1 -1
- data/app/models/tr8n/language_rule_filter.rb +1 -1
- data/app/models/tr8n/language_user.rb +1 -1
- data/app/models/tr8n/language_user_filter.rb +1 -1
- data/app/models/tr8n/list_rule.rb +1 -1
- data/app/models/tr8n/monthly_language_metric.rb +1 -1
- data/app/models/tr8n/numeric_rule.rb +35 -28
- data/app/models/tr8n/sync_log.rb +1 -1
- data/app/models/tr8n/sync_log_filter.rb +1 -1
- data/app/models/tr8n/total_language_metric.rb +1 -1
- data/app/models/tr8n/translation.rb +4 -3
- data/app/models/tr8n/translation_domain.rb +11 -3
- data/app/models/tr8n/translation_domain_filter.rb +1 -1
- data/app/models/tr8n/translation_filter.rb +1 -1
- data/app/models/tr8n/translation_key.rb +73 -36
- data/app/models/tr8n/translation_key_comment.rb +1 -1
- data/app/models/tr8n/translation_key_comment_filter.rb +1 -1
- data/app/models/tr8n/translation_key_filter.rb +1 -1
- data/app/models/tr8n/translation_key_lock.rb +1 -1
- data/app/models/tr8n/translation_key_lock_filter.rb +1 -1
- data/app/models/tr8n/translation_key_source.rb +16 -5
- data/app/models/tr8n/translation_key_source_filter.rb +1 -1
- data/app/models/tr8n/translation_source.rb +12 -4
- data/app/models/tr8n/translation_source_filter.rb +1 -1
- data/app/models/tr8n/translation_source_language.rb +1 -1
- data/app/models/tr8n/translation_vote.rb +1 -1
- data/app/models/tr8n/translation_vote_filter.rb +1 -1
- data/app/models/tr8n/translator.rb +21 -5
- data/app/models/tr8n/translator_filter.rb +1 -1
- data/app/models/tr8n/translator_following.rb +1 -1
- data/app/models/tr8n/translator_following_filter.rb +1 -1
- data/app/models/tr8n/translator_log.rb +3 -3
- data/app/models/tr8n/translator_log_filter.rb +1 -1
- data/app/models/tr8n/translator_metric.rb +1 -1
- data/app/models/tr8n/translator_metric_filter.rb +1 -1
- data/app/models/tr8n/translator_report.rb +1 -1
- data/app/models/tr8n/translator_report_filter.rb +1 -1
- data/app/models/tr8n/value_rule.rb +1 -1
- data/app/views/tr8n/admin/clientsdk/index.html.erb +29 -29
- data/app/views/tr8n/admin/clientsdk/lb_samples.html.erb +1 -1
- data/app/views/tr8n/admin/metrics/_tabs.html.erb +22 -0
- data/app/views/tr8n/admin/metrics/index.html.erb +60 -0
- data/app/views/tr8n/common/_header.html.erb +3 -1
- data/app/views/tr8n/common/_language_selector.html.erb +4 -2
- data/app/views/tr8n/common/_scripts.html.erb +5 -0
- data/app/views/tr8n/common/_terms_of_service.html.erb +53 -0
- data/app/views/tr8n/help/credits.html.erb +4 -0
- data/app/views/tr8n/language/_select.html.erb +5 -1
- data/app/views/tr8n/translator/registration.html.erb +21 -0
- data/config/routes.rb +3 -1
- data/doc/classes.graffle +356 -7194
- data/lib/generators/tr8n/templates/config/tr8n/config.yml +9 -1
- data/lib/generators/tr8n/templates/config/tr8n/site/shortcuts.yml +1 -1
- data/lib/generators/tr8n/templates/config/tr8n/tokens/decorations.yml +4 -1
- data/lib/generators/tr8n/tr8n_generator.rb +1 -1
- data/lib/tasks/tr8n.rake +1 -1
- data/lib/tr8n.rb +23 -0
- data/lib/tr8n/active_dumper.rb +1 -1
- data/lib/tr8n/cache.rb +1 -8
- data/lib/tr8n/cache_adapters/memcached.rb +1 -1
- data/lib/tr8n/config.rb +37 -1
- data/lib/tr8n/dictionary.rb +1 -1
- data/lib/tr8n/engine.rb +4 -1
- data/lib/tr8n/exception.rb +1 -1
- data/lib/tr8n/extender.rb +1 -1
- data/lib/tr8n/extensions/action_controller_extension.rb +5 -4
- data/lib/tr8n/extensions/action_view_extension.rb +71 -20
- data/lib/tr8n/extensions/array_extension.rb +14 -1
- data/lib/tr8n/extensions/date_extension.rb +1 -1
- data/lib/tr8n/extensions/fixnum_extension.rb +1 -1
- data/lib/tr8n/extensions/hash_extension.rb +1 -1
- data/lib/tr8n/extensions/string_extension.rb +1 -1
- data/lib/tr8n/extensions/time_extension.rb +1 -1
- data/lib/tr8n/ip_address.rb +1 -1
- data/lib/tr8n/key_registration_exception.rb +1 -1
- data/lib/tr8n/keyboard_mapping.rb +1 -1
- data/lib/tr8n/logger.rb +1 -1
- data/lib/tr8n/railtie.rb +1 -1
- data/lib/tr8n/site_map.rb +1 -1
- data/lib/tr8n/site_map_section.rb +1 -1
- data/lib/tr8n/token.rb +1 -1
- data/lib/tr8n/token_exception.rb +1 -1
- data/lib/tr8n/tokenized_label.rb +2 -12
- data/lib/tr8n/tokens/data_token.rb +1 -1
- data/lib/tr8n/tokens/decoration_token.rb +1 -1
- data/lib/tr8n/tokens/hidden_token.rb +1 -1
- data/lib/tr8n/tokens/method_token.rb +1 -1
- data/lib/tr8n/tokens/transform_token.rb +1 -1
- data/lib/tr8n/version.rb +25 -1
- data/local/tr8n_server/app/models/user.rb +1 -0
- data/local/tr8n_server/config/environments/test.rb +1 -1
- data/local/tr8n_server/config/tr8n/config.yml +45 -39
- data/local/tr8n_server/config/tr8n/site/shortcuts.yml +1 -1
- data/local/tr8n_server/db/schema.rb +2 -0
- data/spec/controllers/awards_controller_spec.rb +22 -0
- data/spec/controllers/base_controller_spec.rb +6 -0
- data/spec/controllers/dashboard_controller_spec.rb +23 -0
- data/spec/controllers/forum_controller_spec.rb +23 -0
- data/spec/controllers/glossary_controller_spec.rb +22 -0
- data/spec/controllers/help_controller_spec.rb +22 -0
- data/spec/controllers/language_cases_controller_spec.rb +13 -0
- data/spec/controllers/language_controller_spec.rb +10 -0
- data/spec/controllers/phrases_controller_spec.rb +22 -0
- data/spec/controllers/translations_controller_spec.rb +23 -0
- data/spec/controllers/translator_controller_spec.rb +22 -0
- data/spec/lib/tokenized_label_spec.rb +42 -0
- data/spec/lib/tokens/data_token_spec.rb +49 -0
- data/spec/lib/tokens/decoration_token_spec.rb +49 -0
- data/spec/lib/tokens/hidden_token_spec.rb +53 -0
- data/spec/lib/tokens/method_token_spec.rb +61 -0
- data/spec/lib/tokens/transform_token_spec.rb +51 -0
- data/spec/models/tr8n/daily_language_metric_spec.rb +5 -0
- data/spec/models/tr8n/date_rule_spec.rb +5 -0
- data/spec/models/tr8n/gender_list_rule_spec.rb +5 -0
- data/spec/models/tr8n/gender_rule_spec.rb +141 -0
- data/spec/models/tr8n/glossary_spec.rb +5 -0
- data/spec/models/tr8n/ip_location_spec.rb +5 -0
- data/spec/models/tr8n/language_case_rule_spec.rb +5 -0
- data/spec/models/tr8n/language_case_spec.rb +5 -0
- data/spec/models/tr8n/language_case_value_map_spec.rb +5 -0
- data/spec/models/tr8n/language_forum_abuse_report_spec.rb +5 -0
- data/spec/models/tr8n/language_forum_message_spec.rb +5 -0
- data/spec/models/tr8n/language_forum_topic_spec.rb +5 -0
- data/spec/models/tr8n/language_metric_spec.rb +5 -0
- data/spec/models/tr8n/language_rule_spec.rb +5 -0
- data/spec/models/tr8n/language_spec.rb +79 -0
- data/spec/models/tr8n/language_user_spec.rb +5 -0
- data/spec/models/tr8n/list_rule_spec.rb +5 -0
- data/spec/models/tr8n/monthly_language_metric_spec.rb +5 -0
- data/spec/models/tr8n/numeric_rule_spec.rb +162 -0
- data/spec/models/tr8n/sync_log_spec.rb +5 -0
- data/spec/models/tr8n/total_language_metric_spec.rb +5 -0
- data/spec/models/tr8n/translation_domain_spec.rb +5 -0
- data/spec/models/tr8n/translation_key_comment_spec.rb +5 -0
- data/spec/models/tr8n/translation_key_lock_spec.rb +5 -0
- data/spec/models/tr8n/translation_key_source_spec.rb +5 -0
- data/spec/models/tr8n/translation_key_spec.rb +118 -0
- data/spec/models/tr8n/translation_source_language_spec.rb +5 -0
- data/spec/models/tr8n/translation_source_spec.rb +5 -0
- data/spec/models/tr8n/translation_spec.rb +5 -0
- data/spec/models/tr8n/translation_vote_spec.rb +5 -0
- data/spec/models/tr8n/translator_following_spec.rb +5 -0
- data/spec/models/tr8n/translator_log_spec.rb +5 -0
- data/spec/models/tr8n/translator_metric_spec.rb +5 -0
- data/spec/models/tr8n/translator_report_spec.rb +5 -0
- data/spec/models/tr8n/translator_spec.rb +140 -0
- data/spec/spec_helper.rb +26 -27
- data/tr8n.gemspec +3 -1
- metadata +173 -50
- data/local/tr8n_server/db/migrate/20110930041150_create_tr8n_tables.rb +0 -372
- data/spec/fake_app.rb +0 -50
- data/spec/lib/data_token_spec.rb +0 -26
- data/spec/lib/transform_token_spec.rb +0 -22
- data/spec/models/translation_key_spec.rb +0 -63
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', File.dirname(__FILE__))
|
|
2
|
+
|
|
3
|
+
describe Tr8n::GenderRule do
|
|
4
|
+
before :all do
|
|
5
|
+
@lang = Tr8n::Language.create(:locale => "elb", :english_name => "Elbonian")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
after :all do
|
|
9
|
+
@lang.destroy
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe 'class methods' do
|
|
13
|
+
it 'should respec configuration settings' do
|
|
14
|
+
Tr8n::Config.stub!(:rules_engine).and_return({
|
|
15
|
+
:gender_rule => {
|
|
16
|
+
token_suffixes: ["user", "actor", "target"],
|
|
17
|
+
object_method: "gender",
|
|
18
|
+
method_values: {
|
|
19
|
+
female: "f",
|
|
20
|
+
male: "m",
|
|
21
|
+
neutral: "n",
|
|
22
|
+
unknown: "u"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
Tr8n::GenderRule.dependency.should eq("gender")
|
|
28
|
+
Tr8n::GenderRule.suffixes.should eq(["user", "actor", "target"])
|
|
29
|
+
|
|
30
|
+
Tr8n::GenderRule.gender_object_value_for(:female).should eq("f")
|
|
31
|
+
Tr8n::GenderRule.gender_object_value_for(:male).should eq("m")
|
|
32
|
+
Tr8n::GenderRule.gender_object_value_for(:neutral).should eq("n")
|
|
33
|
+
Tr8n::GenderRule.gender_object_value_for(:unknown).should eq("u")
|
|
34
|
+
|
|
35
|
+
obj = mock("object_with_gender")
|
|
36
|
+
obj.should_receive(:gender).and_return("m")
|
|
37
|
+
Tr8n::GenderRule.gender_token_value(obj).should eq("m")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe 'default transform without token value' do
|
|
41
|
+
it 'should always use a musculine form' do
|
|
42
|
+
Tr8n::GenderRule.default_transform("he").should eq("he")
|
|
43
|
+
Tr8n::GenderRule.default_transform("he", "she").should eq("he")
|
|
44
|
+
Tr8n::GenderRule.default_transform("his", "her").should eq("his")
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe 'transform with a token value' do
|
|
49
|
+
it 'should return the form based on the token value' do
|
|
50
|
+
male = mock("male")
|
|
51
|
+
male.stub!(:gender).and_return("male")
|
|
52
|
+
female = mock("male")
|
|
53
|
+
female.stub!(:gender).and_return("female")
|
|
54
|
+
unknwon = mock("unknwon")
|
|
55
|
+
unknwon.stub!(:gender).and_return("unknwon")
|
|
56
|
+
|
|
57
|
+
Tr8n::GenderRule.transform(male, "registered on").should eq("registered on")
|
|
58
|
+
Tr8n::GenderRule.transform(male, "he", "she").should eq("he")
|
|
59
|
+
Tr8n::GenderRule.transform(male, "his", "her").should eq("his")
|
|
60
|
+
Tr8n::GenderRule.transform(male, "he", "she", "he/she").should eq("he")
|
|
61
|
+
|
|
62
|
+
Tr8n::GenderRule.transform(female, "registered on").should eq("registered on")
|
|
63
|
+
Tr8n::GenderRule.transform(female, "he", "she").should eq("she")
|
|
64
|
+
Tr8n::GenderRule.transform(female, "his", "her").should eq("her")
|
|
65
|
+
Tr8n::GenderRule.transform(female, "he", "she", "he/she").should eq("she")
|
|
66
|
+
|
|
67
|
+
Tr8n::GenderRule.transform(unknwon, "registered on").should eq("registered on")
|
|
68
|
+
Tr8n::GenderRule.transform(unknwon, "he", "she").should eq("he/she")
|
|
69
|
+
Tr8n::GenderRule.transform(unknwon, "his", "her").should eq("his/her")
|
|
70
|
+
Tr8n::GenderRule.transform(unknwon, "he", "she", "he/she").should eq("he/she")
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
describe 'instance methods' do
|
|
76
|
+
describe 'evaluate rule' do
|
|
77
|
+
it 'should return results based on gender' do
|
|
78
|
+
male = mock("male")
|
|
79
|
+
male.stub!(:gender).and_return("male")
|
|
80
|
+
female = mock("male")
|
|
81
|
+
female.stub!(:gender).and_return("female")
|
|
82
|
+
unknwon = mock("unknwon")
|
|
83
|
+
unknwon.stub!(:gender).and_return("unknwon")
|
|
84
|
+
|
|
85
|
+
definition = {operator: "is", value: "male"}
|
|
86
|
+
rule = Tr8n::GenderRule.create(:language => @lang, :definition => definition)
|
|
87
|
+
rule.evaluate(male).should be_true
|
|
88
|
+
rule.evaluate(female).should be_false
|
|
89
|
+
rule.evaluate(unknwon).should be_false
|
|
90
|
+
|
|
91
|
+
definition = {operator: "is_not", value: "male"}
|
|
92
|
+
rule = Tr8n::GenderRule.create(:language => @lang, :definition => definition)
|
|
93
|
+
rule.evaluate(male).should be_false
|
|
94
|
+
rule.evaluate(female).should be_true
|
|
95
|
+
rule.evaluate(unknwon).should be_true
|
|
96
|
+
|
|
97
|
+
definition = {operator: "is", value: "female"}
|
|
98
|
+
rule = Tr8n::GenderRule.create(:language => @lang, :definition => definition)
|
|
99
|
+
rule.evaluate(male).should be_false
|
|
100
|
+
rule.evaluate(female).should be_true
|
|
101
|
+
rule.evaluate(unknwon).should be_false
|
|
102
|
+
|
|
103
|
+
definition = {operator: "is_not", value: "female"}
|
|
104
|
+
rule = Tr8n::GenderRule.create(:language => @lang, :definition => definition)
|
|
105
|
+
rule.evaluate(male).should be_true
|
|
106
|
+
rule.evaluate(female).should be_false
|
|
107
|
+
rule.evaluate(unknwon).should be_true
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
describe 'hashing a rule' do
|
|
112
|
+
it 'should produce a correct hash' do
|
|
113
|
+
definition = {operator: "is", value: "male"}
|
|
114
|
+
rule = Tr8n::GenderRule.create(:language => @lang, :definition => definition)
|
|
115
|
+
rule.to_hash.should eq({:type=>"gender", :operator=>"is", :value=>"male"})
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
describe 'describing a rule' do
|
|
120
|
+
it 'should produce a correct description' do
|
|
121
|
+
definition = {operator: "is", value: "male"}
|
|
122
|
+
rule = Tr8n::GenderRule.create(:language => @lang, :definition => definition)
|
|
123
|
+
rule.description.should eq("is a male")
|
|
124
|
+
|
|
125
|
+
definition = {operator: "is", value: "unknown"}
|
|
126
|
+
rule = Tr8n::GenderRule.create(:language => @lang, :definition => definition)
|
|
127
|
+
rule.description.should eq("has an unknown gender")
|
|
128
|
+
|
|
129
|
+
definition = {operator: "is_not", value: "female"}
|
|
130
|
+
rule = Tr8n::GenderRule.create(:language => @lang, :definition => definition)
|
|
131
|
+
rule.description.should eq("is not a female")
|
|
132
|
+
|
|
133
|
+
definition = {operator: "is_not", value: "unknown"}
|
|
134
|
+
rule = Tr8n::GenderRule.create(:language => @lang, :definition => definition)
|
|
135
|
+
rule.description.should eq("does not have an unknown gender")
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', File.dirname(__FILE__))
|
|
2
|
+
|
|
3
|
+
describe Tr8n::Language do
|
|
4
|
+
describe 'cache key' do
|
|
5
|
+
it 'shold use locale' do
|
|
6
|
+
lang = Tr8n::Language.find_or_create('test', 'Test Language')
|
|
7
|
+
lang.cache_key.should eq("language_test")
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe 'finding or creating a new language' do
|
|
12
|
+
context 'none existing language' do
|
|
13
|
+
it 'should not be found' do
|
|
14
|
+
lang = Tr8n::Language.for('test')
|
|
15
|
+
lang.should be_nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should be created' do
|
|
19
|
+
lang = Tr8n::Language.for('test')
|
|
20
|
+
lang.should be_nil
|
|
21
|
+
|
|
22
|
+
lang = Tr8n::Language.find_or_create('test', 'Test Language')
|
|
23
|
+
lang.locale.should eql('test')
|
|
24
|
+
lang.english_name.should eql('Test Language')
|
|
25
|
+
|
|
26
|
+
lang = Tr8n::Language.for('test')
|
|
27
|
+
lang.should be_a(Tr8n::Language)
|
|
28
|
+
lang.english_name.should eql('Test Language')
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'existing language' do
|
|
33
|
+
it 'should be found' do
|
|
34
|
+
Tr8n::Language.create(:locale => 'test123', :english_name => 'Test Language 123')
|
|
35
|
+
lang = Tr8n::Language.for('test123')
|
|
36
|
+
lang.should be_a(Tr8n::Language)
|
|
37
|
+
lang.english_name.should eql('Test Language 123')
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
describe 'current language' do
|
|
43
|
+
before :all do
|
|
44
|
+
@lang = Tr8n::Language.find_or_create('test', 'Test Language')
|
|
45
|
+
Tr8n::Config.init(@lang.locale)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
after :all do
|
|
49
|
+
@lang.destroy
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'must be set' do
|
|
53
|
+
lang = Tr8n::Language.for('test')
|
|
54
|
+
lang.should be_a(Tr8n::Language)
|
|
55
|
+
lang.current?.should be_true
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
describe 'default language' do
|
|
60
|
+
before :all do
|
|
61
|
+
@lang = Tr8n::Language.find_or_create('test', 'Test Language')
|
|
62
|
+
Tr8n::Config.init(@lang.locale)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
after :all do
|
|
66
|
+
@lang.destroy
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'must be set' do
|
|
70
|
+
Tr8n::Config.stub(:default_locale).and_return(@lang.locale)
|
|
71
|
+
lang = Tr8n::Language.for('test')
|
|
72
|
+
lang.should be_a(Tr8n::Language)
|
|
73
|
+
lang.default?.should be_true
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
end
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', File.dirname(__FILE__))
|
|
2
|
+
|
|
3
|
+
describe Tr8n::NumericRule do
|
|
4
|
+
before :all do
|
|
5
|
+
@lang = Tr8n::Language.create(:locale => "elb", :english_name => "Elbonian")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
after :all do
|
|
9
|
+
@lang.destroy
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe 'class methods' do
|
|
13
|
+
it 'should respec configuration settings' do
|
|
14
|
+
Tr8n::Config.stub!(:rules_engine).and_return({
|
|
15
|
+
:numeric_rule => {
|
|
16
|
+
token_suffixes: ["count", "num"],
|
|
17
|
+
object_method: "to_i"
|
|
18
|
+
}
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
Tr8n::NumericRule.dependency.should eq("number")
|
|
22
|
+
Tr8n::NumericRule.suffixes.should eq(["count", "num"])
|
|
23
|
+
Tr8n::NumericRule.number_token_value(5).should eq(5)
|
|
24
|
+
|
|
25
|
+
obj = mock("numeric_object")
|
|
26
|
+
obj.should_receive(:to_i).and_return(42)
|
|
27
|
+
Tr8n::NumericRule.number_token_value(obj).should eq(42)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe 'default transform without token value' do
|
|
31
|
+
it 'should return the pluralized form of the noun' do
|
|
32
|
+
Tr8n::NumericRule.default_transform("car", "cars").should eq("cars")
|
|
33
|
+
Tr8n::NumericRule.default_transform("car").should eq("cars")
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe 'transform with a token value' do
|
|
38
|
+
it 'should return the form based on the token value' do
|
|
39
|
+
Tr8n::NumericRule.transform(1, "person", "people").should eq("person")
|
|
40
|
+
Tr8n::NumericRule.transform(2, "person", "people").should eq("people")
|
|
41
|
+
Tr8n::NumericRule.transform(2, "car").should eq("cars")
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe 'sanitize values' do
|
|
46
|
+
it 'should strip values' do
|
|
47
|
+
Tr8n::NumericRule.sanitize_values("1, 2, 3 , 4 ").should eq(["1","2","3","4"])
|
|
48
|
+
Tr8n::NumericRule.sanitize_values("1,2,3,4").should eq(["1","2","3","4"])
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe 'humanize values' do
|
|
53
|
+
it 'should strip values' do
|
|
54
|
+
Tr8n::NumericRule.humanize_values("1, 2, 3 , 4 ").should eq("1, 2, 3, 4")
|
|
55
|
+
Tr8n::NumericRule.humanize_values("1,2,3,4").should eq("1, 2, 3, 4")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
describe 'evaluating a rule fragment' do
|
|
60
|
+
it 'should return correct results' do
|
|
61
|
+
Tr8n::NumericRule.evaluate_rule_fragment(5, :is, [5]).should be_true
|
|
62
|
+
Tr8n::NumericRule.evaluate_rule_fragment(5, :is, [2,3,5]).should be_true
|
|
63
|
+
Tr8n::NumericRule.evaluate_rule_fragment(5, :is, [4]).should be_false
|
|
64
|
+
|
|
65
|
+
Tr8n::NumericRule.evaluate_rule_fragment(5, :is_not, [4]).should be_true
|
|
66
|
+
Tr8n::NumericRule.evaluate_rule_fragment(5, :is_not, [4,2,3]).should be_true
|
|
67
|
+
Tr8n::NumericRule.evaluate_rule_fragment(5, :is_not, [5]).should be_false
|
|
68
|
+
|
|
69
|
+
Tr8n::NumericRule.evaluate_rule_fragment(5, :ends_in, [5]).should be_true
|
|
70
|
+
Tr8n::NumericRule.evaluate_rule_fragment(25, :ends_in, [5]).should be_true
|
|
71
|
+
Tr8n::NumericRule.evaluate_rule_fragment(25, :ends_in, [2,3,4,5]).should be_true
|
|
72
|
+
Tr8n::NumericRule.evaluate_rule_fragment(5, :ends_in, [2]).should be_false
|
|
73
|
+
Tr8n::NumericRule.evaluate_rule_fragment(5, :ends_in, [2,3,4]).should be_false
|
|
74
|
+
|
|
75
|
+
Tr8n::NumericRule.evaluate_rule_fragment(5, :does_not_end_in, [2,3,4]).should be_true
|
|
76
|
+
Tr8n::NumericRule.evaluate_rule_fragment(25, :does_not_end_in, [2,4]).should be_true
|
|
77
|
+
Tr8n::NumericRule.evaluate_rule_fragment(25, :does_not_end_in, [2,5]).should be_false
|
|
78
|
+
Tr8n::NumericRule.evaluate_rule_fragment(25, :does_not_end_in, [5]).should be_false
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
describe 'instance methods' do
|
|
84
|
+
describe 'creating a rule' do
|
|
85
|
+
it 'should create a rule object' do
|
|
86
|
+
definition = {multipart: false, part1: "is", value1: "1"}
|
|
87
|
+
rule = Tr8n::NumericRule.create(:language => @lang, :definition => definition)
|
|
88
|
+
rule.should be_a(Tr8n::NumericRule)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
describe 'evaluating a simple rule' do
|
|
93
|
+
it 'should return correct results' do
|
|
94
|
+
definition = {multipart: false, part1: "is", value1: "1,2,3,4"}
|
|
95
|
+
rule = Tr8n::NumericRule.create(:language => @lang, :definition => definition)
|
|
96
|
+
rule.evaluate(5).should be_false
|
|
97
|
+
rule.evaluate(1).should be_true
|
|
98
|
+
|
|
99
|
+
definition = {multipart: false, part1: "is_not", value1: "2,3,4,5"}
|
|
100
|
+
rule = Tr8n::NumericRule.create(:language => @lang, :definition => definition)
|
|
101
|
+
rule.evaluate(5).should be_false
|
|
102
|
+
rule.evaluate(1).should be_true
|
|
103
|
+
|
|
104
|
+
definition = {multipart: false, part1: "ends_in", value1: "2,3,4,5"}
|
|
105
|
+
rule = Tr8n::NumericRule.create(:language => @lang, :definition => definition)
|
|
106
|
+
rule.evaluate(25).should be_true
|
|
107
|
+
rule.evaluate(1).should be_false
|
|
108
|
+
|
|
109
|
+
definition = {multipart: false, part1: "does_not_end_in", value1: "2,3,4,5"}
|
|
110
|
+
rule = Tr8n::NumericRule.create(:language => @lang, :definition => definition)
|
|
111
|
+
rule.evaluate(25).should be_false
|
|
112
|
+
rule.evaluate(1).should be_true
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
describe 'evaluating multipart rule' do
|
|
117
|
+
it 'should return correct results' do
|
|
118
|
+
definition = {multipart: true, part1: "ends_in", value1: "1", operator: "and", part2: "does_not_end_in", value2: "11"}
|
|
119
|
+
rule = Tr8n::NumericRule.create(:language => @lang, :definition => definition)
|
|
120
|
+
rule.evaluate(1).should be_true
|
|
121
|
+
rule.evaluate(21).should be_true
|
|
122
|
+
rule.evaluate(231).should be_true
|
|
123
|
+
rule.evaluate(1021).should be_true
|
|
124
|
+
rule.evaluate(2).should be_false
|
|
125
|
+
rule.evaluate(11).should be_false
|
|
126
|
+
rule.evaluate(211).should be_false
|
|
127
|
+
rule.evaluate(1011).should be_false
|
|
128
|
+
|
|
129
|
+
definition = {multipart: true, part1: "ends_in", value1: "2,3,4", operator: "and", part2: "does_not_end_in", value2: "12,13,14"}
|
|
130
|
+
rule = Tr8n::NumericRule.create(:language => @lang, :definition => definition)
|
|
131
|
+
rule.evaluate(2).should be_true
|
|
132
|
+
rule.evaluate(1023).should be_true
|
|
133
|
+
rule.evaluate(34).should be_true
|
|
134
|
+
rule.evaluate(1013).should be_false
|
|
135
|
+
rule.evaluate(14).should be_false
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
describe 'hashing a rule' do
|
|
140
|
+
it 'should produce a correct hash' do
|
|
141
|
+
definition = {multipart: true, part1: "ends_in", value1: "2,3,4", operator: "and", part2: "does_not_end_in", value2: "12,13,14"}
|
|
142
|
+
rule = Tr8n::NumericRule.create(:language => @lang, :definition => definition)
|
|
143
|
+
rule.to_hash.should eq({:type=>"number", :multipart=>true, :operator=>"and", :part1=>"ends_in",
|
|
144
|
+
:value1=>"2,3,4", :part2=>"does_not_end_in", :value2=>"12,13,14"})
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
describe 'describing a rule' do
|
|
149
|
+
it 'should produce a correct description' do
|
|
150
|
+
definition = {multipart: true, part1: "ends_in", value1: "2,3,4", operator: "and", part2: "does_not_end_in", value2: "12,13,14"}
|
|
151
|
+
rule = Tr8n::NumericRule.create(:language => @lang, :definition => definition)
|
|
152
|
+
rule.description.should eq("ends in 2, 3, 4, but not in 12, 13, 14")
|
|
153
|
+
|
|
154
|
+
definition = {multipart: false, part1: "does_not_end_in", value1: "2,3,4,5"}
|
|
155
|
+
rule = Tr8n::NumericRule.create(:language => @lang, :definition => definition)
|
|
156
|
+
rule.description.should eq("does not end in 2, 3, 4, 5")
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
end
|