friendly_id 5.4.2 → 5.5.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/test.yml +34 -25
- data/Changelog.md +6 -0
- data/Gemfile +9 -13
- data/README.md +21 -0
- data/Rakefile +24 -27
- data/bench.rb +30 -27
- data/certs/parndt.pem +25 -23
- data/friendly_id.gemspec +26 -29
- data/gemfiles/Gemfile.rails-5.2.rb +11 -16
- data/gemfiles/Gemfile.rails-6.0.rb +11 -16
- data/gemfiles/Gemfile.rails-6.1.rb +22 -0
- data/gemfiles/Gemfile.rails-7.0.rb +22 -0
- data/guide.rb +5 -5
- data/lib/friendly_id/base.rb +57 -60
- data/lib/friendly_id/candidates.rb +9 -11
- data/lib/friendly_id/configuration.rb +6 -7
- data/lib/friendly_id/finder_methods.rb +26 -11
- data/lib/friendly_id/finders.rb +63 -66
- data/lib/friendly_id/history.rb +59 -63
- data/lib/friendly_id/initializer.rb +4 -4
- data/lib/friendly_id/migration.rb +6 -6
- data/lib/friendly_id/object_utils.rb +2 -2
- data/lib/friendly_id/reserved.rb +28 -32
- data/lib/friendly_id/scoped.rb +97 -102
- data/lib/friendly_id/sequentially_slugged/calculator.rb +69 -0
- data/lib/friendly_id/sequentially_slugged.rb +17 -64
- data/lib/friendly_id/simple_i18n.rb +75 -69
- data/lib/friendly_id/slug.rb +1 -2
- data/lib/friendly_id/slug_generator.rb +1 -3
- data/lib/friendly_id/slugged.rb +234 -238
- data/lib/friendly_id/version.rb +1 -1
- data/lib/friendly_id.rb +41 -45
- data/lib/generators/friendly_id_generator.rb +9 -9
- data/test/base_test.rb +10 -13
- data/test/benchmarks/finders.rb +28 -26
- data/test/benchmarks/object_utils.rb +13 -13
- data/test/candidates_test.rb +17 -18
- data/test/configuration_test.rb +7 -11
- data/test/core_test.rb +1 -2
- data/test/databases.yml +4 -3
- data/test/finders_test.rb +52 -5
- data/test/generator_test.rb +16 -26
- data/test/helper.rb +29 -22
- data/test/history_test.rb +70 -74
- data/test/numeric_slug_test.rb +4 -4
- data/test/object_utils_test.rb +0 -2
- data/test/reserved_test.rb +9 -11
- data/test/schema.rb +5 -4
- data/test/scoped_test.rb +18 -20
- data/test/sequentially_slugged_test.rb +65 -50
- data/test/shared.rb +15 -16
- data/test/simple_i18n_test.rb +22 -12
- data/test/slugged_test.rb +102 -121
- data/test/sti_test.rb +19 -21
- data.tar.gz.sig +0 -0
- metadata +35 -30
- metadata.gz.sig +1 -1
data/test/scoped_test.rb
CHANGED
@@ -2,14 +2,14 @@ require "helper"
|
|
2
2
|
|
3
3
|
class Novelist < ActiveRecord::Base
|
4
4
|
extend FriendlyId
|
5
|
-
friendly_id :name, :
|
5
|
+
friendly_id :name, use: :slugged
|
6
6
|
end
|
7
7
|
|
8
8
|
class Novel < ActiveRecord::Base
|
9
9
|
extend FriendlyId
|
10
10
|
belongs_to :novelist
|
11
11
|
belongs_to :publisher
|
12
|
-
friendly_id :name, :
|
12
|
+
friendly_id :name, use: :scoped, scope: [:publisher, :novelist]
|
13
13
|
|
14
14
|
def should_generate_new_friendly_id?
|
15
15
|
new_record? || super
|
@@ -21,7 +21,6 @@ class Publisher < ActiveRecord::Base
|
|
21
21
|
end
|
22
22
|
|
23
23
|
class ScopedTest < TestCaseClass
|
24
|
-
|
25
24
|
include FriendlyId::Test
|
26
25
|
include FriendlyId::Test::Shared::Core
|
27
26
|
|
@@ -37,42 +36,42 @@ class ScopedTest < TestCaseClass
|
|
37
36
|
model_class = Class.new(ActiveRecord::Base) do
|
38
37
|
self.abstract_class = true
|
39
38
|
extend FriendlyId
|
40
|
-
friendly_id :empty, :
|
39
|
+
friendly_id :empty, use: :scoped, scope: :dummy
|
41
40
|
end
|
42
41
|
assert_equal ["dummy"], model_class.friendly_id_config.scope_columns
|
43
42
|
end
|
44
43
|
|
45
44
|
test "should allow duplicate slugs outside scope" do
|
46
45
|
transaction do
|
47
|
-
novel1 = Novel.create! :
|
48
|
-
novel2 = Novel.create! :
|
46
|
+
novel1 = Novel.create! name: "a", novelist: Novelist.create!(name: "a")
|
47
|
+
novel2 = Novel.create! name: "a", novelist: Novelist.create!(name: "b")
|
49
48
|
assert_equal novel1.friendly_id, novel2.friendly_id
|
50
49
|
end
|
51
50
|
end
|
52
51
|
|
53
52
|
test "should not allow duplicate slugs inside scope" do
|
54
53
|
with_instance_of Novelist do |novelist|
|
55
|
-
novel1 = Novel.create! :
|
56
|
-
novel2 = Novel.create! :
|
54
|
+
novel1 = Novel.create! name: "a", novelist: novelist
|
55
|
+
novel2 = Novel.create! name: "a", novelist: novelist
|
57
56
|
assert novel1.friendly_id != novel2.friendly_id
|
58
57
|
end
|
59
58
|
end
|
60
59
|
|
61
60
|
test "should apply scope with multiple columns" do
|
62
61
|
transaction do
|
63
|
-
novelist = Novelist.create! :
|
64
|
-
publisher = Publisher.create! :
|
65
|
-
novel1 = Novel.create! :
|
66
|
-
novel2 = Novel.create! :
|
67
|
-
novel3 = Novel.create! :
|
68
|
-
novel4 = Novel.create! :
|
62
|
+
novelist = Novelist.create! name: "a"
|
63
|
+
publisher = Publisher.create! name: "b"
|
64
|
+
novel1 = Novel.create! name: "c", novelist: novelist, publisher: publisher
|
65
|
+
novel2 = Novel.create! name: "c", novelist: novelist, publisher: Publisher.create(name: "d")
|
66
|
+
novel3 = Novel.create! name: "c", novelist: Novelist.create(name: "e"), publisher: publisher
|
67
|
+
novel4 = Novel.create! name: "c", novelist: novelist, publisher: publisher
|
69
68
|
assert_equal novel1.friendly_id, novel2.friendly_id
|
70
69
|
assert_equal novel2.friendly_id, novel3.friendly_id
|
71
70
|
assert novel3.friendly_id != novel4.friendly_id
|
72
71
|
end
|
73
72
|
end
|
74
73
|
|
75
|
-
test
|
74
|
+
test "should allow a record to reuse its own slug" do
|
76
75
|
with_instance_of(model_class) do |record|
|
77
76
|
old_id = record.friendly_id
|
78
77
|
record.slug = nil
|
@@ -83,15 +82,14 @@ class ScopedTest < TestCaseClass
|
|
83
82
|
|
84
83
|
test "should generate new slug when scope changes" do
|
85
84
|
transaction do
|
86
|
-
novelist = Novelist.create! :
|
87
|
-
publisher = Publisher.create! :
|
88
|
-
novel1 = Novel.create! :
|
89
|
-
novel2 = Novel.create! :
|
85
|
+
novelist = Novelist.create! name: "a"
|
86
|
+
publisher = Publisher.create! name: "b"
|
87
|
+
novel1 = Novel.create! name: "c", novelist: novelist, publisher: publisher
|
88
|
+
novel2 = Novel.create! name: "c", novelist: novelist, publisher: Publisher.create(name: "d")
|
90
89
|
assert_equal novel1.friendly_id, novel2.friendly_id
|
91
90
|
novel2.publisher = publisher
|
92
91
|
novel2.save!
|
93
92
|
assert novel2.friendly_id != novel1.friendly_id
|
94
93
|
end
|
95
94
|
end
|
96
|
-
|
97
95
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
class Article < ActiveRecord::Base
|
4
4
|
extend FriendlyId
|
5
|
-
friendly_id :name, :
|
5
|
+
friendly_id :name, use: :sequentially_slugged
|
6
6
|
end
|
7
7
|
|
8
8
|
class SequentiallySluggedTest < TestCaseClass
|
@@ -15,27 +15,27 @@ class SequentiallySluggedTest < TestCaseClass
|
|
15
15
|
|
16
16
|
test "should generate numerically sequential slugs" do
|
17
17
|
transaction do
|
18
|
-
records = 12.times.map { model_class.create! :
|
18
|
+
records = 12.times.map { model_class.create! name: "Some news" }
|
19
19
|
assert_equal "some-news", records[0].slug
|
20
|
-
(1...12).each {|i| assert_equal "some-news-#{i + 1}", records[i].slug}
|
20
|
+
(1...12).each { |i| assert_equal "some-news-#{i + 1}", records[i].slug }
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
test "should cope when slugs are missing from the sequence" do
|
25
25
|
transaction do
|
26
|
-
record_1 = model_class.create!(:
|
27
|
-
record_2 = model_class.create!(:
|
28
|
-
record_3 = model_class.create!(:
|
26
|
+
record_1 = model_class.create!(name: "A thing")
|
27
|
+
record_2 = model_class.create!(name: "A thing")
|
28
|
+
record_3 = model_class.create!(name: "A thing")
|
29
29
|
|
30
|
-
assert_equal
|
31
|
-
assert_equal
|
32
|
-
assert_equal
|
30
|
+
assert_equal "a-thing", record_1.slug
|
31
|
+
assert_equal "a-thing-2", record_2.slug
|
32
|
+
assert_equal "a-thing-3", record_3.slug
|
33
33
|
|
34
34
|
record_2.destroy
|
35
35
|
|
36
|
-
record_4 = model_class.create!(:
|
36
|
+
record_4 = model_class.create!(name: "A thing")
|
37
37
|
|
38
|
-
assert_equal
|
38
|
+
assert_equal "a-thing-4", record_4.slug
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -43,32 +43,32 @@ class SequentiallySluggedTest < TestCaseClass
|
|
43
43
|
model_class = Class.new(ActiveRecord::Base) do
|
44
44
|
self.table_name = "journalists"
|
45
45
|
extend FriendlyId
|
46
|
-
friendly_id :name, :
|
46
|
+
friendly_id :name, use: :sequentially_slugged, slug_column: "strange name"
|
47
47
|
end
|
48
48
|
|
49
49
|
transaction do
|
50
|
-
record_1 = model_class.create! name: "
|
51
|
-
record_2 = model_class.create! name: "
|
50
|
+
record_1 = model_class.create! name: "Lois Lane"
|
51
|
+
record_2 = model_class.create! name: "Lois Lane"
|
52
52
|
|
53
|
-
assert_equal
|
54
|
-
assert_equal
|
53
|
+
assert_equal "lois-lane", record_1.attributes["strange name"]
|
54
|
+
assert_equal "lois-lane-2", record_2.attributes["strange name"]
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
58
|
test "should correctly sequence slugs that end in a number" do
|
59
59
|
transaction do
|
60
|
-
record1 = model_class.create! :
|
60
|
+
record1 = model_class.create! name: "Peugeuot 206"
|
61
61
|
assert_equal "peugeuot-206", record1.slug
|
62
|
-
record2 = model_class.create! :
|
62
|
+
record2 = model_class.create! name: "Peugeuot 206"
|
63
63
|
assert_equal "peugeuot-206-2", record2.slug
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
67
|
test "should correctly sequence slugs that begin with a number" do
|
68
68
|
transaction do
|
69
|
-
record1 = model_class.create! :
|
69
|
+
record1 = model_class.create! name: "2010 to 2015 Records"
|
70
70
|
assert_equal "2010-to-2015-records", record1.slug
|
71
|
-
record2 = model_class.create! :
|
71
|
+
record2 = model_class.create! name: "2010 to 2015 Records"
|
72
72
|
assert_equal "2010-to-2015-records-2", record2.slug
|
73
73
|
end
|
74
74
|
end
|
@@ -77,15 +77,15 @@ class SequentiallySluggedTest < TestCaseClass
|
|
77
77
|
model_class = Class.new(ActiveRecord::Base) do
|
78
78
|
self.table_name = "novelists"
|
79
79
|
extend FriendlyId
|
80
|
-
friendly_id :name, :
|
80
|
+
friendly_id :name, use: :sequentially_slugged, sequence_separator: ":"
|
81
81
|
end
|
82
82
|
|
83
83
|
transaction do
|
84
84
|
record_1 = model_class.create! name: "Julian Barnes"
|
85
85
|
record_2 = model_class.create! name: "Julian Barnes"
|
86
86
|
|
87
|
-
assert_equal
|
88
|
-
assert_equal
|
87
|
+
assert_equal "julian-barnes", record_1.slug
|
88
|
+
assert_equal "julian-barnes:2", record_2.slug
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
@@ -93,20 +93,20 @@ class SequentiallySluggedTest < TestCaseClass
|
|
93
93
|
model_class = Class.new(ActiveRecord::Base) do
|
94
94
|
self.table_name = "cities"
|
95
95
|
extend FriendlyId
|
96
|
-
friendly_id :slug_candidates, :
|
96
|
+
friendly_id :slug_candidates, use: [:sequentially_slugged]
|
97
97
|
|
98
98
|
def slug_candidates
|
99
99
|
[name, [name, code]]
|
100
100
|
end
|
101
101
|
end
|
102
102
|
transaction do
|
103
|
-
record = model_class.create!(:
|
103
|
+
record = model_class.create!(name: nil, code: nil)
|
104
104
|
assert_nil record.slug
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|
108
108
|
test "should not generate a slug when the sluggable attribute is blank" do
|
109
|
-
record = model_class.create!(:
|
109
|
+
record = model_class.create!(name: "")
|
110
110
|
assert_nil record.slug
|
111
111
|
end
|
112
112
|
end
|
@@ -117,7 +117,12 @@ class SequentiallySluggedTestWithHistory < TestCaseClass
|
|
117
117
|
|
118
118
|
class Article < ActiveRecord::Base
|
119
119
|
extend FriendlyId
|
120
|
-
friendly_id :name, :
|
120
|
+
friendly_id :name, use: [:sequentially_slugged, :history]
|
121
|
+
end
|
122
|
+
|
123
|
+
Journalist = Class.new(ActiveRecord::Base) do
|
124
|
+
extend FriendlyId
|
125
|
+
friendly_id :name, use: [:sequentially_slugged, :history], slug_column: "strange name"
|
121
126
|
end
|
122
127
|
|
123
128
|
def model_class
|
@@ -126,36 +131,46 @@ class SequentiallySluggedTestWithHistory < TestCaseClass
|
|
126
131
|
|
127
132
|
test "should work with regeneration with history when slug already exists" do
|
128
133
|
transaction do
|
129
|
-
record1 = model_class.create! :
|
130
|
-
record2 = model_class.create! :
|
131
|
-
assert_equal
|
132
|
-
assert_equal
|
134
|
+
record1 = model_class.create! name: "Test name"
|
135
|
+
record2 = model_class.create! name: "Another test name"
|
136
|
+
assert_equal "test-name", record1.slug
|
137
|
+
assert_equal "another-test-name", record2.slug
|
133
138
|
|
134
139
|
record2.name = "Test name"
|
135
140
|
record2.slug = nil
|
136
141
|
record2.save!
|
137
|
-
assert_equal
|
142
|
+
assert_equal "test-name-2", record2.slug
|
138
143
|
end
|
139
144
|
end
|
140
145
|
|
141
146
|
test "should work with regeneration with history when 2 slugs already exists and the second is changed" do
|
142
147
|
transaction do
|
143
|
-
record1 = model_class.create! :
|
144
|
-
record2 = model_class.create! :
|
145
|
-
record3 = model_class.create! :
|
146
|
-
assert_equal
|
147
|
-
assert_equal
|
148
|
-
assert_equal
|
148
|
+
record1 = model_class.create! name: "Test name"
|
149
|
+
record2 = model_class.create! name: "Test name"
|
150
|
+
record3 = model_class.create! name: "Another test name"
|
151
|
+
assert_equal "test-name", record1.slug
|
152
|
+
assert_equal "test-name-2", record2.slug
|
153
|
+
assert_equal "another-test-name", record3.slug
|
149
154
|
|
150
155
|
record2.name = "One more test name"
|
151
156
|
record2.slug = nil
|
152
157
|
record2.save!
|
153
|
-
assert_equal
|
158
|
+
assert_equal "one-more-test-name", record2.slug
|
154
159
|
|
155
160
|
record3.name = "Test name"
|
156
161
|
record3.slug = nil
|
157
162
|
record3.save!
|
158
|
-
assert_equal
|
163
|
+
assert_equal "test-name-3", record3.slug
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
test "should cope with strange column names" do
|
168
|
+
transaction do
|
169
|
+
record_1 = Journalist.create! name: "Lois Lane"
|
170
|
+
record_2 = Journalist.create! name: "Lois Lane"
|
171
|
+
|
172
|
+
assert_equal "lois-lane", record_1.attributes["strange name"]
|
173
|
+
assert_equal "lois-lane-2", record_2.attributes["strange name"]
|
159
174
|
end
|
160
175
|
end
|
161
176
|
end
|
@@ -167,7 +182,7 @@ end
|
|
167
182
|
class Restaurant < ActiveRecord::Base
|
168
183
|
extend FriendlyId
|
169
184
|
belongs_to :city
|
170
|
-
friendly_id :name, :
|
185
|
+
friendly_id :name, use: [:sequentially_slugged, :scoped, :history], scope: :city
|
171
186
|
end
|
172
187
|
|
173
188
|
class SequentiallySluggedTestWithScopedHistory < TestCaseClass
|
@@ -181,19 +196,19 @@ class SequentiallySluggedTestWithScopedHistory < TestCaseClass
|
|
181
196
|
test "should work with regeneration with scoped history" do
|
182
197
|
transaction do
|
183
198
|
city1 = City.create!
|
184
|
-
|
185
|
-
record1 = model_class.create! :
|
186
|
-
record2 = model_class.create! :
|
199
|
+
City.create!
|
200
|
+
record1 = model_class.create! name: "Test name", city: city1
|
201
|
+
record2 = model_class.create! name: "Test name", city: city1
|
187
202
|
|
188
|
-
assert_equal
|
189
|
-
assert_equal
|
203
|
+
assert_equal "test-name", record1.slug
|
204
|
+
assert_equal "test-name-2", record2.slug
|
190
205
|
|
191
|
-
record2.name =
|
206
|
+
record2.name = "Another test name"
|
192
207
|
record2.slug = nil
|
193
208
|
record2.save!
|
194
209
|
|
195
|
-
record3 = model_class.create! :
|
196
|
-
assert_equal
|
210
|
+
record3 = model_class.create! name: "Test name", city: city1
|
211
|
+
assert_equal "test-name-3", record3.slug
|
197
212
|
end
|
198
213
|
end
|
199
214
|
end
|
data/test/shared.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module FriendlyId
|
2
2
|
module Test
|
3
3
|
module Shared
|
4
|
-
|
5
4
|
module Slugged
|
6
5
|
test "configuration should have a sequence_separator" do
|
7
6
|
assert !model_class.friendly_id_config.sequence_separator.empty?
|
@@ -18,15 +17,15 @@ module FriendlyId
|
|
18
17
|
|
19
18
|
test "should add a UUID for duplicate friendly ids" do
|
20
19
|
with_instance_of model_class do |record|
|
21
|
-
record2 = model_class.create! :
|
22
|
-
assert record2.friendly_id.match(/([0-9a-z]
|
20
|
+
record2 = model_class.create! name: record.name
|
21
|
+
assert record2.friendly_id.match(/([0-9a-z]+-){4}[0-9a-z]+\z/)
|
23
22
|
end
|
24
23
|
end
|
25
24
|
|
26
25
|
test "should not add slug sequence on update after other conflicting slugs were added" do
|
27
26
|
with_instance_of model_class do |record|
|
28
27
|
old = record.friendly_id
|
29
|
-
model_class.create! :
|
28
|
+
model_class.create! name: record.name
|
30
29
|
record.save!
|
31
30
|
record.reload
|
32
31
|
assert_equal old, record.to_param
|
@@ -35,7 +34,7 @@ module FriendlyId
|
|
35
34
|
|
36
35
|
test "should not change the sequence on save" do
|
37
36
|
with_instance_of model_class do |record|
|
38
|
-
record2 = model_class.create! :
|
37
|
+
record2 = model_class.create! name: record.name
|
39
38
|
friendly_id = record2.friendly_id
|
40
39
|
record2.active = !record2.active
|
41
40
|
record2.save!
|
@@ -64,7 +63,7 @@ module FriendlyId
|
|
64
63
|
with_instance_of my_model_class do |record|
|
65
64
|
record.update my_model_class.friendly_id_config.slug_column => nil
|
66
65
|
record = my_model_class.friendly.find(record.id)
|
67
|
-
record.class.validate
|
66
|
+
record.class.validate proc { errors.add(:name, "FAIL") }
|
68
67
|
record.save
|
69
68
|
assert_equal record.to_param, record.friendly_id
|
70
69
|
end
|
@@ -84,7 +83,7 @@ module FriendlyId
|
|
84
83
|
end
|
85
84
|
|
86
85
|
test "should be findable by friendly id" do
|
87
|
-
with_instance_of(model_class) {|record| assert model_class.friendly.find record.friendly_id}
|
86
|
+
with_instance_of(model_class) { |record| assert model_class.friendly.find record.friendly_id }
|
88
87
|
end
|
89
88
|
|
90
89
|
test "should exist? by friendly id" do
|
@@ -92,19 +91,19 @@ module FriendlyId
|
|
92
91
|
assert model_class.friendly.exists? record.id
|
93
92
|
assert model_class.friendly.exists? record.id.to_s
|
94
93
|
assert model_class.friendly.exists? record.friendly_id
|
95
|
-
assert model_class.friendly.exists?({:
|
96
|
-
assert model_class.friendly.exists?([
|
94
|
+
assert model_class.friendly.exists?({id: record.id})
|
95
|
+
assert model_class.friendly.exists?(["id = ?", record.id])
|
97
96
|
assert !model_class.friendly.exists?(record.friendly_id + "-hello")
|
98
97
|
assert !model_class.friendly.exists?(0)
|
99
98
|
end
|
100
99
|
end
|
101
100
|
|
102
101
|
test "should be findable by id as integer" do
|
103
|
-
with_instance_of(model_class) {|record| assert model_class.friendly.find record.id.to_i}
|
102
|
+
with_instance_of(model_class) { |record| assert model_class.friendly.find record.id.to_i }
|
104
103
|
end
|
105
104
|
|
106
105
|
test "should be findable by id as string" do
|
107
|
-
with_instance_of(model_class) {|record| assert model_class.friendly.find record.id.to_s}
|
106
|
+
with_instance_of(model_class) { |record| assert model_class.friendly.find record.id.to_s }
|
108
107
|
end
|
109
108
|
|
110
109
|
test "should treat numeric part of string as an integer id" do
|
@@ -116,16 +115,16 @@ module FriendlyId
|
|
116
115
|
end
|
117
116
|
|
118
117
|
test "should be findable by numeric friendly_id" do
|
119
|
-
with_instance_of(model_class, :
|
118
|
+
with_instance_of(model_class, name: "206") { |record| assert model_class.friendly.find record.friendly_id }
|
120
119
|
end
|
121
120
|
|
122
121
|
test "to_param should return the friendly_id" do
|
123
|
-
with_instance_of(model_class) {|record| assert_equal record.friendly_id, record.to_param}
|
122
|
+
with_instance_of(model_class) { |record| assert_equal record.friendly_id, record.to_param }
|
124
123
|
end
|
125
124
|
|
126
125
|
if ActiveRecord::VERSION::MAJOR == 4 && ActiveRecord::VERSION::MINOR < 2
|
127
126
|
test "should be findable by themselves" do
|
128
|
-
with_instance_of(model_class) {|record| assert_equal record, model_class.friendly.find(record)}
|
127
|
+
with_instance_of(model_class) { |record| assert_equal record, model_class.friendly.find(record) }
|
129
128
|
end
|
130
129
|
end
|
131
130
|
|
@@ -138,11 +137,11 @@ module FriendlyId
|
|
138
137
|
end
|
139
138
|
|
140
139
|
test "instances found by a single id should not be read-only" do
|
141
|
-
with_instance_of(model_class) {|record| assert !model_class.friendly.find(record.friendly_id).readonly?}
|
140
|
+
with_instance_of(model_class) { |record| assert !model_class.friendly.find(record.friendly_id).readonly? }
|
142
141
|
end
|
143
142
|
|
144
143
|
test "failing finds with unfriendly_id should raise errors normally" do
|
145
|
-
assert_raises(ActiveRecord::RecordNotFound) {model_class.friendly.find 0}
|
144
|
+
assert_raises(ActiveRecord::RecordNotFound) { model_class.friendly.find 0 }
|
146
145
|
end
|
147
146
|
|
148
147
|
test "should return numeric id if the friendly_id is nil" do
|
data/test/simple_i18n_test.rb
CHANGED
@@ -5,7 +5,7 @@ class SimpleI18nTest < TestCaseClass
|
|
5
5
|
|
6
6
|
class Journalist < ActiveRecord::Base
|
7
7
|
extend FriendlyId
|
8
|
-
friendly_id :name, :
|
8
|
+
friendly_id :name, use: :simple_i18n
|
9
9
|
end
|
10
10
|
|
11
11
|
def setup
|
@@ -13,8 +13,9 @@ class SimpleI18nTest < TestCaseClass
|
|
13
13
|
end
|
14
14
|
|
15
15
|
test "friendly_id should return the current locale's slug" do
|
16
|
-
journalist = Journalist.new(:
|
16
|
+
journalist = Journalist.new(name: "John Doe")
|
17
17
|
journalist.slug_es = "juan-fulano"
|
18
|
+
journalist.slug_fr_ca = "jean-dupont"
|
18
19
|
journalist.valid?
|
19
20
|
I18n.with_locale(I18n.default_locale) do
|
20
21
|
assert_equal "john-doe", journalist.friendly_id
|
@@ -22,17 +23,20 @@ class SimpleI18nTest < TestCaseClass
|
|
22
23
|
I18n.with_locale(:es) do
|
23
24
|
assert_equal "juan-fulano", journalist.friendly_id
|
24
25
|
end
|
26
|
+
I18n.with_locale(:"fr-CA") do
|
27
|
+
assert_equal "jean-dupont", journalist.friendly_id
|
28
|
+
end
|
25
29
|
end
|
26
30
|
|
27
31
|
test "should create record with slug in column for the current locale" do
|
28
32
|
I18n.with_locale(I18n.default_locale) do
|
29
|
-
journalist = Journalist.new(:
|
33
|
+
journalist = Journalist.new(name: "John Doe")
|
30
34
|
journalist.valid?
|
31
35
|
assert_equal "john-doe", journalist.slug_en
|
32
36
|
assert_nil journalist.slug_es
|
33
37
|
end
|
34
38
|
I18n.with_locale(:es) do
|
35
|
-
journalist = Journalist.new(:
|
39
|
+
journalist = Journalist.new(name: "John Doe")
|
36
40
|
journalist.valid?
|
37
41
|
assert_equal "john-doe", journalist.slug_es
|
38
42
|
assert_nil journalist.slug_en
|
@@ -41,7 +45,7 @@ class SimpleI18nTest < TestCaseClass
|
|
41
45
|
|
42
46
|
test "to_param should return the numeric id when there's no slug for the current locale" do
|
43
47
|
transaction do
|
44
|
-
journalist = Journalist.new(:
|
48
|
+
journalist = Journalist.new(name: "Juan Fulano")
|
45
49
|
I18n.with_locale(:es) do
|
46
50
|
journalist.save!
|
47
51
|
assert_equal "juan-fulano", journalist.to_param
|
@@ -52,7 +56,7 @@ class SimpleI18nTest < TestCaseClass
|
|
52
56
|
|
53
57
|
test "should set friendly id for locale" do
|
54
58
|
transaction do
|
55
|
-
journalist = Journalist.create!(:
|
59
|
+
journalist = Journalist.create!(name: "John Smith")
|
56
60
|
journalist.set_friendly_id("Juan Fulano", :es)
|
57
61
|
journalist.save!
|
58
62
|
assert_equal "juan-fulano", journalist.slug_es
|
@@ -65,7 +69,7 @@ class SimpleI18nTest < TestCaseClass
|
|
65
69
|
test "set friendly_id should fall back default locale when none is given" do
|
66
70
|
transaction do
|
67
71
|
journalist = I18n.with_locale(:es) do
|
68
|
-
Journalist.create!(:
|
72
|
+
Journalist.create!(name: "Juan Fulano")
|
69
73
|
end
|
70
74
|
journalist.set_friendly_id("John Doe")
|
71
75
|
journalist.save!
|
@@ -75,9 +79,9 @@ class SimpleI18nTest < TestCaseClass
|
|
75
79
|
|
76
80
|
test "should sequence localized slugs" do
|
77
81
|
transaction do
|
78
|
-
journalist = Journalist.create!(:
|
82
|
+
journalist = Journalist.create!(name: "John Smith")
|
79
83
|
I18n.with_locale(:es) do
|
80
|
-
Journalist.create!(:
|
84
|
+
Journalist.create!(name: "Juan Fulano")
|
81
85
|
end
|
82
86
|
journalist.set_friendly_id("Juan Fulano", :es)
|
83
87
|
journalist.save!
|
@@ -93,12 +97,12 @@ class SimpleI18nTest < TestCaseClass
|
|
93
97
|
|
94
98
|
test "should not overwrite other locale's slugs on update" do
|
95
99
|
transaction do
|
96
|
-
journalist = Journalist.create!(:
|
100
|
+
journalist = Journalist.create!(name: "John Smith")
|
97
101
|
journalist.set_friendly_id("Juan Fulano", :es)
|
98
102
|
journalist.save!
|
99
103
|
assert_equal "john-smith", journalist.to_param
|
100
104
|
journalist.slug = nil
|
101
|
-
journalist.update :
|
105
|
+
journalist.update name: "Johnny Smith"
|
102
106
|
assert_equal "johnny-smith", journalist.to_param
|
103
107
|
I18n.with_locale(:es) do
|
104
108
|
assert_equal "juan-fulano", journalist.to_param
|
@@ -114,11 +118,17 @@ class SimpleI18nTest < TestCaseClass
|
|
114
118
|
end
|
115
119
|
end
|
116
120
|
|
121
|
+
test "should add locale to slug column for a locale with a region subtag" do
|
122
|
+
I18n.with_locale :"fr-CA" do
|
123
|
+
assert_equal "slug_fr_ca", Journalist.friendly_id_config.slug_column
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
117
127
|
test "should add locale to non-default slug column and non-default locale" do
|
118
128
|
model_class = Class.new(ActiveRecord::Base) do
|
119
129
|
self.abstract_class = true
|
120
130
|
extend FriendlyId
|
121
|
-
friendly_id :name, :
|
131
|
+
friendly_id :name, use: :simple_i18n, slug_column: :foo
|
122
132
|
end
|
123
133
|
I18n.with_locale :es do
|
124
134
|
assert_equal "foo_es", model_class.friendly_id_config.slug_column
|