friendly_id 5.2.4 → 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.
Files changed (68) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/FUNDING.yml +1 -0
  4. data/.github/dependabot.yml +6 -0
  5. data/.github/stale.yml +17 -0
  6. data/.github/workflows/test.yml +58 -0
  7. data/Changelog.md +41 -0
  8. data/Gemfile +10 -11
  9. data/README.md +42 -15
  10. data/Rakefile +24 -27
  11. data/bench.rb +30 -27
  12. data/certs/parndt.pem +27 -0
  13. data/friendly_id.gemspec +28 -27
  14. data/gemfiles/Gemfile.rails-5.2.rb +11 -16
  15. data/gemfiles/Gemfile.rails-6.0.rb +22 -0
  16. data/gemfiles/Gemfile.rails-6.1.rb +22 -0
  17. data/gemfiles/Gemfile.rails-7.0.rb +22 -0
  18. data/guide.rb +5 -5
  19. data/lib/friendly_id/base.rb +61 -68
  20. data/lib/friendly_id/candidates.rb +9 -11
  21. data/lib/friendly_id/configuration.rb +8 -8
  22. data/lib/friendly_id/finder_methods.rb +72 -13
  23. data/lib/friendly_id/finders.rb +64 -67
  24. data/lib/friendly_id/history.rb +72 -66
  25. data/lib/friendly_id/initializer.rb +5 -5
  26. data/lib/friendly_id/migration.rb +10 -11
  27. data/lib/friendly_id/object_utils.rb +2 -2
  28. data/lib/friendly_id/reserved.rb +28 -32
  29. data/lib/friendly_id/scoped.rb +105 -103
  30. data/lib/friendly_id/sequentially_slugged/calculator.rb +69 -0
  31. data/lib/friendly_id/sequentially_slugged.rb +21 -58
  32. data/lib/friendly_id/simple_i18n.rb +75 -69
  33. data/lib/friendly_id/slug.rb +1 -2
  34. data/lib/friendly_id/slug_generator.rb +1 -3
  35. data/lib/friendly_id/slugged.rb +236 -239
  36. data/lib/friendly_id/version.rb +1 -1
  37. data/lib/friendly_id.rb +41 -45
  38. data/lib/generators/friendly_id_generator.rb +9 -9
  39. data/test/base_test.rb +10 -13
  40. data/test/benchmarks/finders.rb +28 -26
  41. data/test/benchmarks/object_utils.rb +13 -13
  42. data/test/candidates_test.rb +17 -18
  43. data/test/configuration_test.rb +7 -11
  44. data/test/core_test.rb +1 -2
  45. data/test/databases.yml +7 -4
  46. data/test/finders_test.rb +52 -5
  47. data/test/generator_test.rb +16 -26
  48. data/test/helper.rb +33 -20
  49. data/test/history_test.rb +116 -72
  50. data/test/numeric_slug_test.rb +31 -0
  51. data/test/object_utils_test.rb +0 -2
  52. data/test/reserved_test.rb +9 -11
  53. data/test/schema.rb +5 -4
  54. data/test/scoped_test.rb +26 -15
  55. data/test/sequentially_slugged_test.rb +107 -33
  56. data/test/shared.rb +17 -18
  57. data/test/simple_i18n_test.rb +23 -13
  58. data/test/slugged_test.rb +254 -78
  59. data/test/sti_test.rb +19 -21
  60. data.tar.gz.sig +0 -0
  61. metadata +49 -19
  62. metadata.gz.sig +1 -0
  63. data/.travis.yml +0 -57
  64. data/gemfiles/Gemfile.rails-4.0.rb +0 -30
  65. data/gemfiles/Gemfile.rails-4.1.rb +0 -29
  66. data/gemfiles/Gemfile.rails-4.2.rb +0 -28
  67. data/gemfiles/Gemfile.rails-5.0.rb +0 -28
  68. data/gemfiles/Gemfile.rails-5.1.rb +0 -27
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, :use => :slugged
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, :use => :scoped, :scope => [:publisher, :novelist]
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, :use => :scoped, :scope => :dummy
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! :name => "a", :novelist => Novelist.create!(:name => "a")
48
- novel2 = Novel.create! :name => "a", :novelist => Novelist.create!(:name => "b")
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! :name => "a", :novelist => novelist
56
- novel2 = Novel.create! :name => "a", :novelist => novelist
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! :name => "a"
64
- publisher = Publisher.create! :name => "b"
65
- novel1 = Novel.create! :name => "c", :novelist => novelist, :publisher => publisher
66
- novel2 = Novel.create! :name => "c", :novelist => novelist, :publisher => Publisher.create(:name => "d")
67
- novel3 = Novel.create! :name => "c", :novelist => Novelist.create(:name => "e"), :publisher => publisher
68
- novel4 = Novel.create! :name => "c", :novelist => novelist, :publisher => publisher
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 'should allow a record to reuse its own slug' do
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
@@ -81,4 +80,16 @@ class ScopedTest < TestCaseClass
81
80
  end
82
81
  end
83
82
 
83
+ test "should generate new slug when scope changes" do
84
+ transaction do
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")
89
+ assert_equal novel1.friendly_id, novel2.friendly_id
90
+ novel2.publisher = publisher
91
+ novel2.save!
92
+ assert novel2.friendly_id != novel1.friendly_id
93
+ end
94
+ end
84
95
  end
@@ -1,8 +1,8 @@
1
- require 'helper'
1
+ require "helper"
2
2
 
3
3
  class Article < ActiveRecord::Base
4
4
  extend FriendlyId
5
- friendly_id :name, :use => :sequentially_slugged
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! :name => "Some news" }
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!(:name => 'A thing')
27
- record_2 = model_class.create!(:name => 'A thing')
28
- record_3 = model_class.create!(:name => 'A thing')
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 'a-thing', record_1.slug
31
- assert_equal 'a-thing-2', record_2.slug
32
- assert_equal 'a-thing-3', record_3.slug
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!(:name => 'A thing')
36
+ record_4 = model_class.create!(name: "A thing")
37
37
 
38
- assert_equal 'a-thing-4', record_4.slug
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, :use => :sequentially_slugged, :slug_column => "strange 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: "Julian Assange"
51
- record_2 = model_class.create! name: "Julian Assange"
50
+ record_1 = model_class.create! name: "Lois Lane"
51
+ record_2 = model_class.create! name: "Lois Lane"
52
52
 
53
- assert_equal 'julian-assange', record_1.attributes["strange name"]
54
- assert_equal 'julian-assange-2', record_2.attributes["strange name"]
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! :name => "Peugeuot 206"
60
+ record1 = model_class.create! name: "Peugeuot 206"
61
61
  assert_equal "peugeuot-206", record1.slug
62
- record2 = model_class.create! :name => "Peugeuot 206"
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! :name => "2010 to 2015 Records"
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! :name => "2010 to 2015 Records"
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, :use => :sequentially_slugged, :sequence_separator => ':'
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 'julian-barnes', record_1.slug
88
- assert_equal 'julian-barnes:2', record_2.slug
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, :use => [ :sequentially_slugged ]
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!(:name => nil, :code => nil)
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!(:name => '')
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, :use => [:sequentially_slugged, :history]
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,15 +131,84 @@ 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! :name => "Test name"
130
- record2 = model_class.create! :name => "Another test name"
131
- assert_equal 'test-name', record1.slug
132
- assert_equal 'another-test-name', record2.slug
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 'test-name-2', record2.slug
142
+ assert_equal "test-name-2", record2.slug
143
+ end
144
+ end
145
+
146
+ test "should work with regeneration with history when 2 slugs already exists and the second is changed" do
147
+ transaction do
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
154
+
155
+ record2.name = "One more test name"
156
+ record2.slug = nil
157
+ record2.save!
158
+ assert_equal "one-more-test-name", record2.slug
159
+
160
+ record3.name = "Test name"
161
+ record3.slug = nil
162
+ record3.save!
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"]
174
+ end
175
+ end
176
+ end
177
+
178
+ class City < ActiveRecord::Base
179
+ has_many :restaurants
180
+ end
181
+
182
+ class Restaurant < ActiveRecord::Base
183
+ extend FriendlyId
184
+ belongs_to :city
185
+ friendly_id :name, use: [:sequentially_slugged, :scoped, :history], scope: :city
186
+ end
187
+
188
+ class SequentiallySluggedTestWithScopedHistory < TestCaseClass
189
+ include FriendlyId::Test
190
+ include FriendlyId::Test::Shared::Core
191
+
192
+ def model_class
193
+ Restaurant
194
+ end
195
+
196
+ test "should work with regeneration with scoped history" do
197
+ transaction do
198
+ city1 = City.create!
199
+ City.create!
200
+ record1 = model_class.create! name: "Test name", city: city1
201
+ record2 = model_class.create! name: "Test name", city: city1
202
+
203
+ assert_equal "test-name", record1.slug
204
+ assert_equal "test-name-2", record2.slug
205
+
206
+ record2.name = "Another test name"
207
+ record2.slug = nil
208
+ record2.save!
209
+
210
+ record3 = model_class.create! name: "Test name", city: city1
211
+ assert_equal "test-name-3", record3.slug
138
212
  end
139
213
  end
140
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! :name => record.name
22
- assert record2.friendly_id.match(/([0-9a-z]+\-){4}[0-9a-z]+\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! :name => record.name
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! :name => record.name
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!
@@ -62,9 +61,9 @@ module FriendlyId
62
61
  my_model_class = Class.new(model_class)
63
62
  self.class.const_set("Foo", my_model_class)
64
63
  with_instance_of my_model_class do |record|
65
- record.update_attributes my_model_class.friendly_id_config.slug_column => nil
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 Proc.new {errors.add(:name, "FAIL")}
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?({:id => record.id})
96
- assert model_class.friendly.exists?(['id = ?', record.id])
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,33 +115,33 @@ module FriendlyId
116
115
  end
117
116
 
118
117
  test "should be findable by numeric friendly_id" do
119
- with_instance_of(model_class, :name => "206") {|record| assert model_class.friendly.find record.friendly_id}
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
 
132
131
  test "updating record's other values should not change the friendly_id" do
133
132
  with_instance_of model_class do |record|
134
133
  old = record.friendly_id
135
- record.update_attributes! :active => false
134
+ record.update! active: false
136
135
  assert model_class.friendly.find old
137
136
  end
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
@@ -5,7 +5,7 @@ class SimpleI18nTest < TestCaseClass
5
5
 
6
6
  class Journalist < ActiveRecord::Base
7
7
  extend FriendlyId
8
- friendly_id :name, :use => :simple_i18n
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(:name => "John Doe")
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(:name => "John Doe")
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(:name => "John Doe")
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(:name => "Juan Fulano")
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!(:name => "John Smith")
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!(:name => "Juan Fulano")
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!(:name => "John Smith")
82
+ journalist = Journalist.create!(name: "John Smith")
79
83
  I18n.with_locale(:es) do
80
- Journalist.create!(:name => "Juan Fulano")
84
+ Journalist.create!(name: "Juan Fulano")
81
85
  end
82
86
  journalist.set_friendly_id("Juan Fulano", :es)
83
87
  journalist.save!
@@ -91,14 +95,14 @@ class SimpleI18nTest < TestCaseClass
91
95
  class RegressionTest < TestCaseClass
92
96
  include FriendlyId::Test
93
97
 
94
- test "should not overwrite other locale's slugs on update_attributes" do
98
+ test "should not overwrite other locale's slugs on update" do
95
99
  transaction do
96
- journalist = Journalist.create!(:name => "John Smith")
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_attributes :name => "Johnny Smith"
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, :use => :simple_i18n, :slug_column => :foo
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