snusnu-dm-is-localizable 0.0.5
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/.document +5 -0
- data/.gitignore +23 -0
- data/CHANGELOG +183 -0
- data/LICENSE +20 -0
- data/README.textile +177 -0
- data/Rakefile +77 -0
- data/TODO +2 -0
- data/VERSION +1 -0
- data/dm-is-localizable.gemspec +82 -0
- data/features/dm-is-localizable.feature +9 -0
- data/features/step_definitions/dm-is-localizable_steps.rb +0 -0
- data/features/support/env.rb +4 -0
- data/lib/dm-is-localizable.rb +8 -0
- data/lib/dm-is-localizable/is/localizable.rb +89 -0
- data/lib/dm-is-localizable/storage/language.rb +15 -0
- data/lib/dm-is-localizable/storage/translation.rb +18 -0
- data/spec/fixtures/item.rb +12 -0
- data/spec/lib/rspec_tmbundle_support.rb +35 -0
- data/spec/shared/shared_examples_spec.rb +70 -0
- data/spec/spec.opts +2 -0
- data/spec/spec_helper.rb +81 -0
- data/spec/unit/auto_migrate_spec.rb +13 -0
- data/spec/unit/class_level_api_spec.rb +159 -0
- data/spec/unit/instance_level_api_spec.rb +156 -0
- data/spec/unit/is_localizable_spec.rb +28 -0
- data/spec/unit/language_spec.rb +64 -0
- data/spec/unit/translation_spec.rb +16 -0
- data/tasks/changelog.rb +18 -0
- data/tasks/whitespace.rb +4 -0
- metadata +120 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "DataMapper.auto_migrate!" do
|
4
|
+
|
5
|
+
it "should allow to automigrate the resource to be translated" do
|
6
|
+
lambda { Item.auto_migrate! }.should_not raise_error
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should allow to automigrate the resource where translations will be stored" do
|
10
|
+
lambda { ItemTranslation.auto_migrate! }.should_not raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../shared/shared_examples_spec')
|
3
|
+
|
4
|
+
describe "class level API:" do
|
5
|
+
|
6
|
+
describe "translation_class" do
|
7
|
+
|
8
|
+
it "should follow naming conventions" do
|
9
|
+
Item.translation_class.should == ItemTranslation
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "available_languages" do
|
15
|
+
|
16
|
+
before :each do
|
17
|
+
@item = Item.create
|
18
|
+
@provider = Item
|
19
|
+
end
|
20
|
+
|
21
|
+
it_should_behave_like "all available_languages providers"
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "nr_of_available_languages" do
|
26
|
+
|
27
|
+
describe "with 0 items" do
|
28
|
+
|
29
|
+
it "should return 0" do
|
30
|
+
Item.nr_of_available_languages.should == 0
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "with 1 item" do
|
36
|
+
|
37
|
+
before :each do
|
38
|
+
@l1 = Language.create :code => 'en-US', :name => 'English'
|
39
|
+
@l2 = Language.create :code => 'de-AT', :name => 'Deutsch'
|
40
|
+
@i1 = Item.create
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "and 0 translations" do
|
44
|
+
|
45
|
+
it "should return 0" do
|
46
|
+
Item.nr_of_available_languages == 0
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "and 1 translation" do
|
52
|
+
|
53
|
+
it "should return 1" do
|
54
|
+
ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
|
55
|
+
Item.nr_of_available_languages == 1
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "and 2 translations" do
|
61
|
+
|
62
|
+
it "should return 2" do
|
63
|
+
ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
|
64
|
+
ItemTranslation.create :item => @i1, :language => @l2, :name => 'Book', :desc => 'Literature'
|
65
|
+
Item.nr_of_available_languages == 2
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
describe "translations_complete?" do
|
76
|
+
|
77
|
+
describe "with 0 items" do
|
78
|
+
|
79
|
+
it "should return true" do
|
80
|
+
Item.translations_complete?.should be_true
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "with 1 item" do
|
86
|
+
|
87
|
+
before :each do
|
88
|
+
@i1 = Item.create
|
89
|
+
@provider = Item
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "and 0 translations" do
|
93
|
+
|
94
|
+
it "should return true" do
|
95
|
+
Item.translations_complete?.should be_true
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
describe "and 1 translation" do
|
101
|
+
|
102
|
+
it "should return true" do
|
103
|
+
l = Language.create :code => 'en-US', :name => 'English'
|
104
|
+
ItemTranslation.create :item => @i1, :language => l, :name => 'Book', :desc => 'Literature'
|
105
|
+
Item.translations_complete?.should be_true
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "and more than 1 translation" do
|
111
|
+
|
112
|
+
it "should return true" do
|
113
|
+
l1 = Language.create :code => 'en-US', :name => 'English'
|
114
|
+
l2 = Language.create :code => 'de-AT', :name => 'Deutsch'
|
115
|
+
ItemTranslation.create :item => @i1, :language => l1, :name => 'Book', :desc => 'Literature'
|
116
|
+
ItemTranslation.create :item => @i1, :language => l2, :name => 'Buch', :desc => 'Literatur'
|
117
|
+
Item.translations_complete?.should be_true
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
describe "with 2 items" do
|
125
|
+
|
126
|
+
before :each do
|
127
|
+
@l1 = Language.create :code => 'en-US', :name => 'English'
|
128
|
+
@l2 = Language.create :code => 'de-AT', :name => 'Deutsch'
|
129
|
+
@i1 = Item.create
|
130
|
+
@i2 = Item.create
|
131
|
+
end
|
132
|
+
|
133
|
+
describe "and not all items are translated" do
|
134
|
+
|
135
|
+
it "should return false" do
|
136
|
+
ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
|
137
|
+
ItemTranslation.create :item => @i1, :language => @l2, :name => 'Buch', :desc => 'Literatur'
|
138
|
+
Item.translations_complete?.should be_false
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
describe "and all items are translated" do
|
144
|
+
|
145
|
+
it "should return true" do
|
146
|
+
ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
|
147
|
+
ItemTranslation.create :item => @i1, :language => @l2, :name => 'Buch', :desc => 'Literatur'
|
148
|
+
ItemTranslation.create :item => @i2, :language => @l1, :name => 'Hook', :desc => 'Tool'
|
149
|
+
ItemTranslation.create :item => @i2, :language => @l2, :name => 'Haken', :desc => 'Werkzeug'
|
150
|
+
Item.translations_complete?.should be_true
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../shared/shared_examples_spec')
|
3
|
+
|
4
|
+
|
5
|
+
describe "instance level API:" do
|
6
|
+
|
7
|
+
it "should create a one_to_many association that follows naming conventions" do
|
8
|
+
Item.new.should respond_to :item_translations
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should add a translations alias to the one_to_many association" do
|
12
|
+
Item.new.should respond_to :translations
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should create a many_to_many association to languages" do
|
16
|
+
Item.new.should respond_to :languages
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "available_languages" do
|
20
|
+
|
21
|
+
before :each do
|
22
|
+
@item = Item.create
|
23
|
+
@provider = @item
|
24
|
+
end
|
25
|
+
|
26
|
+
it_should_behave_like "all available_languages providers"
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
describe "nr_of_available_languages" do
|
32
|
+
|
33
|
+
before :each do
|
34
|
+
@l1 = Language.create :code => 'en-US', :name => 'English'
|
35
|
+
@l2 = Language.create :code => 'de-AT', :name => 'Deutsch'
|
36
|
+
@i1 = Item.create
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "with 0 translations" do
|
40
|
+
|
41
|
+
it "should return 0" do
|
42
|
+
@i1.nr_of_available_languages.should == 0
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "with 1 translation" do
|
48
|
+
|
49
|
+
it "should return 1" do
|
50
|
+
ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
|
51
|
+
@i1.nr_of_available_languages == 1
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "with 2 translations in 1 language" do
|
57
|
+
|
58
|
+
it "should return 1" do
|
59
|
+
ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
|
60
|
+
ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
|
61
|
+
@i1.nr_of_available_languages == 1
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "with 2 translations in 2 language" do
|
67
|
+
|
68
|
+
it "should return 2" do
|
69
|
+
ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
|
70
|
+
ItemTranslation.create :item => @i1, :language => @l2, :name => 'Book', :desc => 'Literature'
|
71
|
+
@i1.nr_of_available_languages == 2
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
describe "translations_complete?" do
|
80
|
+
|
81
|
+
describe "with 1 item" do
|
82
|
+
|
83
|
+
before :each do
|
84
|
+
@i1 = Item.create
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "and 0 translations" do
|
88
|
+
|
89
|
+
it "should return true" do
|
90
|
+
@i1.translations_complete?.should be_true
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "and 1 translation" do
|
96
|
+
|
97
|
+
it "should return true" do
|
98
|
+
l = Language.create :code => 'en-US', :name => 'English'
|
99
|
+
ItemTranslation.create :item => @i1, :language => l, :name => 'Book', :desc => 'Literature'
|
100
|
+
@i1.translations_complete?.should be_true
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "and more than 1 translation" do
|
106
|
+
|
107
|
+
it "should return true" do
|
108
|
+
l1 = Language.create :code => 'en-US', :name => 'English'
|
109
|
+
l2 = Language.create :code => 'de-AT', :name => 'Deutsch'
|
110
|
+
ItemTranslation.create :item => @i1, :language => l1, :name => 'Book', :desc => 'Literature'
|
111
|
+
ItemTranslation.create :item => @i1, :language => l2, :name => 'Buch', :desc => 'Literatur'
|
112
|
+
@i1.translations_complete?.should be_true
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "with 2 items" do
|
120
|
+
|
121
|
+
before :each do
|
122
|
+
@l1 = Language.create :code => 'en-US', :name => 'English'
|
123
|
+
@l2 = Language.create :code => 'de-AT', :name => 'Deutsch'
|
124
|
+
@i1 = Item.create
|
125
|
+
@i2 = Item.create
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "both having 1 translation into different languages" do
|
129
|
+
|
130
|
+
it "should return false" do
|
131
|
+
ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
|
132
|
+
ItemTranslation.create :item => @i2, :language => @l2, :name => 'Buch', :desc => 'Literatur'
|
133
|
+
@i1.translations_complete?.should be_false
|
134
|
+
@i2.translations_complete?.should be_false
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "both having 1 translation into all different languages" do
|
140
|
+
|
141
|
+
it "should return true" do
|
142
|
+
ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
|
143
|
+
ItemTranslation.create :item => @i1, :language => @l2, :name => 'Buch', :desc => 'Literatur'
|
144
|
+
ItemTranslation.create :item => @i2, :language => @l1, :name => 'Hook', :desc => 'Tool'
|
145
|
+
ItemTranslation.create :item => @i2, :language => @l2, :name => 'Haken', :desc => 'Werkzeug'
|
146
|
+
@i1.translations_complete?.should be_true
|
147
|
+
@i2.translations_complete?.should be_true
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "is_localizable with no options" do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@i = Item.create
|
7
|
+
@l = Language.create :code => 'en', :name => 'English'
|
8
|
+
@t = ItemTranslation.new :item => @i, :language => @l
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should belong_to a resource" do
|
12
|
+
@t.respond_to?(:item).should == true
|
13
|
+
@t.item.should be_instance_of(Item)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should belong_to a language" do
|
17
|
+
@t.respond_to?(:language).should == true
|
18
|
+
@t.language.should be_instance_of(Language)
|
19
|
+
@t.language.code.should == 'en'
|
20
|
+
@t.language.name.should == 'English'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should store properties defined inside the block in the translations resource" do
|
24
|
+
@t.respond_to?(:name).should == true
|
25
|
+
@t.respond_to?(:desc).should == true
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "Language" do
|
4
|
+
|
5
|
+
describe "with valid attributes" do
|
6
|
+
|
7
|
+
it "should be valid" do
|
8
|
+
Language.new(:code => "en-US", :name => "English").should be_valid
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should store unique locale string codes" do
|
12
|
+
Language.create(:code => "en-US", :name => "English").should_not be_new_record
|
13
|
+
Language.create(:code => "en-US", :name => "English").should be_new_record
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "with incomplete attributes" do
|
19
|
+
|
20
|
+
before :each do
|
21
|
+
@l = Language.new
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should require a code" do
|
25
|
+
@l.name = "English"
|
26
|
+
@l.should_not be_valid
|
27
|
+
@l.errors.size.should == 1
|
28
|
+
@l.errors.on(:code).should_not be_empty
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should require a name" do
|
32
|
+
@l.code = "en-US"
|
33
|
+
@l.should_not be_valid
|
34
|
+
@l.errors.size.should == 1
|
35
|
+
@l.errors.on(:name).should_not be_empty
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "with invalid attributes" do
|
41
|
+
|
42
|
+
it "should not accept invalid locale strings" do
|
43
|
+
Language.new(:code => 'foo', :name => "English").should_not be_valid
|
44
|
+
Language.new(:code => 'foo-bar', :name => "English").should_not be_valid
|
45
|
+
Language.new(:code => 'foo-BAR', :name => "English").should_not be_valid
|
46
|
+
Language.new(:code => 'FOO-bar', :name => "English").should_not be_valid
|
47
|
+
Language.new(:code => 'FOO-BAR', :name => "English").should_not be_valid
|
48
|
+
Language.new(:code => 'en-us', :name => "English").should_not be_valid
|
49
|
+
Language.new(:code => 'EN-us', :name => "English").should_not be_valid
|
50
|
+
Language.new(:code => 'EN-US', :name => "English").should_not be_valid
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should only allow unique locale string codes" do
|
54
|
+
l1 = Language.create(:code => 'en-US', :name => "English")
|
55
|
+
l1.should_not be_new_record
|
56
|
+
l2 = Language.create(:code => 'en-US', :name => "English")
|
57
|
+
l2.should be_new_record
|
58
|
+
l2.errors.on(:code).should_not be_empty
|
59
|
+
l2.errors.size.should == 1
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe "the remixed translation resource" do
|
4
|
+
|
5
|
+
it "should store unique languages for every resource to translate" do
|
6
|
+
l = Language.create :code => 'en-US', :name => 'English'
|
7
|
+
i = Item.create
|
8
|
+
t1 = ItemTranslation.create(:item => i, :language => l)
|
9
|
+
t1.should_not be_new_record
|
10
|
+
t2 = ItemTranslation.create(:item => i, :language => l)
|
11
|
+
t2.should be_new_record
|
12
|
+
t2.errors.should_not be_empty
|
13
|
+
t2.errors.size.should == 1
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/tasks/changelog.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
desc 'update changelog'
|
2
|
+
task :changelog do
|
3
|
+
File.open('CHANGELOG', 'w+') do |changelog|
|
4
|
+
`git log -z --abbrev-commit`.split("\0").each do |commit|
|
5
|
+
next if commit =~ /^Merge: \d*/
|
6
|
+
ref, author, time, _, title, _, message = commit.split("\n", 7)
|
7
|
+
ref = ref[/commit ([0-9a-f]+)/, 1]
|
8
|
+
author = author[/Author: (.*)/, 1].strip
|
9
|
+
time = Time.parse(time[/Date: (.*)/, 1]).utc
|
10
|
+
title.strip!
|
11
|
+
|
12
|
+
changelog.puts "[#{ref} | #{time}] #{author}"
|
13
|
+
changelog.puts '', " * #{title}"
|
14
|
+
changelog.puts '', message.rstrip if message
|
15
|
+
changelog.puts
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|