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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/dependabot.yml +6 -0
  4. data/.github/workflows/test.yml +34 -25
  5. data/Changelog.md +6 -0
  6. data/Gemfile +9 -13
  7. data/README.md +21 -0
  8. data/Rakefile +24 -27
  9. data/bench.rb +30 -27
  10. data/certs/parndt.pem +25 -23
  11. data/friendly_id.gemspec +26 -29
  12. data/gemfiles/Gemfile.rails-5.2.rb +11 -16
  13. data/gemfiles/Gemfile.rails-6.0.rb +11 -16
  14. data/gemfiles/Gemfile.rails-6.1.rb +22 -0
  15. data/gemfiles/Gemfile.rails-7.0.rb +22 -0
  16. data/guide.rb +5 -5
  17. data/lib/friendly_id/base.rb +57 -60
  18. data/lib/friendly_id/candidates.rb +9 -11
  19. data/lib/friendly_id/configuration.rb +6 -7
  20. data/lib/friendly_id/finder_methods.rb +26 -11
  21. data/lib/friendly_id/finders.rb +63 -66
  22. data/lib/friendly_id/history.rb +59 -63
  23. data/lib/friendly_id/initializer.rb +4 -4
  24. data/lib/friendly_id/migration.rb +6 -6
  25. data/lib/friendly_id/object_utils.rb +2 -2
  26. data/lib/friendly_id/reserved.rb +28 -32
  27. data/lib/friendly_id/scoped.rb +97 -102
  28. data/lib/friendly_id/sequentially_slugged/calculator.rb +69 -0
  29. data/lib/friendly_id/sequentially_slugged.rb +17 -64
  30. data/lib/friendly_id/simple_i18n.rb +75 -69
  31. data/lib/friendly_id/slug.rb +1 -2
  32. data/lib/friendly_id/slug_generator.rb +1 -3
  33. data/lib/friendly_id/slugged.rb +234 -238
  34. data/lib/friendly_id/version.rb +1 -1
  35. data/lib/friendly_id.rb +41 -45
  36. data/lib/generators/friendly_id_generator.rb +9 -9
  37. data/test/base_test.rb +10 -13
  38. data/test/benchmarks/finders.rb +28 -26
  39. data/test/benchmarks/object_utils.rb +13 -13
  40. data/test/candidates_test.rb +17 -18
  41. data/test/configuration_test.rb +7 -11
  42. data/test/core_test.rb +1 -2
  43. data/test/databases.yml +4 -3
  44. data/test/finders_test.rb +52 -5
  45. data/test/generator_test.rb +16 -26
  46. data/test/helper.rb +29 -22
  47. data/test/history_test.rb +70 -74
  48. data/test/numeric_slug_test.rb +4 -4
  49. data/test/object_utils_test.rb +0 -2
  50. data/test/reserved_test.rb +9 -11
  51. data/test/schema.rb +5 -4
  52. data/test/scoped_test.rb +18 -20
  53. data/test/sequentially_slugged_test.rb +65 -50
  54. data/test/shared.rb +15 -16
  55. data/test/simple_i18n_test.rb +22 -12
  56. data/test/slugged_test.rb +102 -121
  57. data/test/sti_test.rb +19 -21
  58. data.tar.gz.sig +0 -0
  59. metadata +35 -30
  60. metadata.gz.sig +1 -1
data/test/slugged_test.rb CHANGED
@@ -2,25 +2,24 @@ require "helper"
2
2
 
3
3
  class Journalist < 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 Article < ActiveRecord::Base
9
9
  extend FriendlyId
10
- friendly_id :name, :use => :slugged
10
+ friendly_id :name, use: :slugged
11
11
  end
12
12
 
13
13
  class Novelist < ActiveRecord::Base
14
14
  extend FriendlyId
15
- friendly_id :name, :use => :slugged, :sequence_separator => '_'
15
+ friendly_id :name, use: :slugged, sequence_separator: "_"
16
16
 
17
17
  def normalize_friendly_id(string)
18
- super.gsub("-", "_")
18
+ super.tr("-", "_")
19
19
  end
20
20
  end
21
21
 
22
22
  class SluggedTest < TestCaseClass
23
-
24
23
  include FriendlyId::Test
25
24
  include FriendlyId::Test::Shared::Core
26
25
  include FriendlyId::Test::Shared::Slugged
@@ -33,13 +32,13 @@ class SluggedTest < TestCaseClass
33
32
  model_class = Class.new(ActiveRecord::Base) do
34
33
  self.table_name = "articles"
35
34
  extend FriendlyId
36
- friendly_id :name, :use => :slugged
37
- validates_length_of :slug, :maximum => 1
35
+ friendly_id :name, use: :slugged
36
+ validates_length_of :slug, maximum: 1
38
37
  def self.name
39
38
  "Article"
40
39
  end
41
40
  end
42
- instance = model_class.new :name => "hello"
41
+ instance = model_class.new name: "hello"
43
42
  refute instance.valid?
44
43
  end
45
44
 
@@ -55,21 +54,21 @@ class SluggedTest < TestCaseClass
55
54
  model_class = Class.new(ActiveRecord::Base) do
56
55
  self.table_name = "journalists"
57
56
  extend FriendlyId
58
- friendly_id :name, :use => :slugged
57
+ friendly_id :name, use: :slugged
59
58
  validates_uniqueness_of :slug_en
60
59
  def self.name
61
60
  "Journalist"
62
61
  end
63
62
  end
64
63
  transaction do
65
- instance = model_class.create! :name => "hello", :slug_en => "hello"
66
- instance2 = model_class.create :name => "hello", :slug_en => "hello"
64
+ instance = model_class.create! name: "hello", slug_en: "hello"
65
+ instance2 = model_class.create name: "hello", slug_en: "hello"
67
66
  assert instance.valid?
68
67
  refute instance2.valid?
69
68
  end
70
69
  end
71
70
 
72
- test 'should allow a record to reuse its own slug' do
71
+ test "should allow a record to reuse its own slug" do
73
72
  with_instance_of(model_class) do |record|
74
73
  old_id = record.friendly_id
75
74
  record.slug = nil
@@ -95,7 +94,7 @@ class SluggedTest < TestCaseClass
95
94
  test "should set slug on create if unrelated validations fail" do
96
95
  klass = Class.new model_class do
97
96
  validates_presence_of :active
98
- friendly_id :name, :use => :slugged
97
+ friendly_id :name, use: :slugged
99
98
 
100
99
  def self.name
101
100
  "Journalist"
@@ -103,18 +102,18 @@ class SluggedTest < TestCaseClass
103
102
  end
104
103
 
105
104
  transaction do
106
- instance = klass.new :name => 'foo'
105
+ instance = klass.new name: "foo"
107
106
  refute instance.save
108
107
  refute instance.valid?
109
- assert_equal 'foo', instance.slug
108
+ assert_equal "foo", instance.slug
110
109
  end
111
110
  end
112
111
 
113
112
  test "should not set slug on create if slug validation fails" do
114
113
  klass = Class.new model_class do
115
114
  validates_presence_of :active
116
- validates_length_of :slug, :minimum => 2
117
- friendly_id :name, :use => :slugged
115
+ validates_length_of :slug, minimum: 2
116
+ friendly_id :name, use: :slugged
118
117
 
119
118
  def self.name
120
119
  "Journalist"
@@ -122,7 +121,7 @@ class SluggedTest < TestCaseClass
122
121
  end
123
122
 
124
123
  transaction do
125
- instance = klass.new :name => 'x'
124
+ instance = klass.new name: "x"
126
125
  refute instance.save
127
126
  refute instance.valid?
128
127
  assert_nil instance.slug
@@ -131,10 +130,10 @@ class SluggedTest < TestCaseClass
131
130
 
132
131
  test "should set slug on create if unrelated validations fail with custom slug_column" do
133
132
  klass = Class.new(ActiveRecord::Base) do
134
- self.table_name = 'authors'
133
+ self.table_name = "authors"
135
134
  extend FriendlyId
136
135
  validates_presence_of :active
137
- friendly_id :name, :use => :slugged, :slug_column => :subdomain
136
+ friendly_id :name, use: :slugged, slug_column: :subdomain
138
137
 
139
138
  def self.name
140
139
  "Author"
@@ -142,19 +141,19 @@ class SluggedTest < TestCaseClass
142
141
  end
143
142
 
144
143
  transaction do
145
- instance = klass.new :name => 'foo'
144
+ instance = klass.new name: "foo"
146
145
  refute instance.save
147
146
  refute instance.valid?
148
- assert_equal 'foo', instance.subdomain
147
+ assert_equal "foo", instance.subdomain
149
148
  end
150
149
  end
151
150
 
152
151
  test "should not set slug on create if custom slug column validations fail" do
153
152
  klass = Class.new(ActiveRecord::Base) do
154
- self.table_name = 'authors'
153
+ self.table_name = "authors"
155
154
  extend FriendlyId
156
- validates_length_of :subdomain, :minimum => 2
157
- friendly_id :name, :use => :slugged, :slug_column => :subdomain
155
+ validates_length_of :subdomain, minimum: 2
156
+ friendly_id :name, use: :slugged, slug_column: :subdomain
158
157
 
159
158
  def self.name
160
159
  "Author"
@@ -162,7 +161,7 @@ class SluggedTest < TestCaseClass
162
161
  end
163
162
 
164
163
  transaction do
165
- instance = klass.new :name => 'x'
164
+ instance = klass.new name: "x"
166
165
  refute instance.save
167
166
  refute instance.valid?
168
167
  assert_nil instance.subdomain
@@ -172,7 +171,7 @@ class SluggedTest < TestCaseClass
172
171
  test "should keep new slug on save if unrelated validations fail" do
173
172
  klass = Class.new model_class do
174
173
  validates_presence_of :active
175
- friendly_id :name, :use => :slugged
174
+ friendly_id :name, use: :slugged
176
175
 
177
176
  def self.name
178
177
  "Journalist"
@@ -180,22 +179,22 @@ class SluggedTest < TestCaseClass
180
179
  end
181
180
 
182
181
  transaction do
183
- instance = klass.new :name => 'foo', :active => true
182
+ instance = klass.new name: "foo", active: true
184
183
  assert instance.save
185
184
  assert instance.valid?
186
- instance.name = 'foobar'
185
+ instance.name = "foobar"
187
186
  instance.slug = nil
188
187
  instance.active = nil
189
188
  refute instance.save
190
189
  refute instance.valid?
191
- assert_equal 'foobar', instance.slug
190
+ assert_equal "foobar", instance.slug
192
191
  end
193
192
  end
194
193
 
195
194
  test "should not update slug on save if slug validations fail" do
196
195
  klass = Class.new model_class do
197
- validates_length_of :slug, :minimum => 2
198
- friendly_id :name, :use => :slugged
196
+ validates_length_of :slug, minimum: 2
197
+ friendly_id :name, use: :slugged
199
198
 
200
199
  def self.name
201
200
  "Journalist"
@@ -203,20 +202,19 @@ class SluggedTest < TestCaseClass
203
202
  end
204
203
 
205
204
  transaction do
206
- instance = klass.new :name => 'foo', :active => true
205
+ instance = klass.new name: "foo", active: true
207
206
  assert instance.save
208
207
  assert instance.valid?
209
- instance.name = 'x'
208
+ instance.name = "x"
210
209
  instance.slug = nil
211
210
  instance.active = nil
212
211
  refute instance.save
213
- assert_equal 'foo', instance.slug
212
+ assert_equal "foo", instance.slug
214
213
  end
215
214
  end
216
215
  end
217
216
 
218
217
  class SlugGeneratorTest < TestCaseClass
219
-
220
218
  include FriendlyId::Test
221
219
 
222
220
  def model_class
@@ -232,11 +230,11 @@ class SlugGeneratorTest < TestCaseClass
232
230
  # self.abstract_class = true
233
231
  self.table_name = "journalists"
234
232
  extend FriendlyId
235
- friendly_id :name, :use => :slugged, :slug_column => "strange name"
233
+ friendly_id :name, use: :slugged, slug_column: "strange name"
236
234
  end
237
235
 
238
236
  begin
239
- with_instance_of(model_class) {|record| assert model_class.friendly.find(record.friendly_id)}
237
+ with_instance_of(model_class) { |record| assert model_class.friendly.find(record.friendly_id) }
240
238
  rescue ActiveRecord::StatementInvalid
241
239
  flunk "column name was not quoted"
242
240
  end
@@ -244,9 +242,9 @@ class SlugGeneratorTest < TestCaseClass
244
242
 
245
243
  test "should not resequence lower sequences on update" do
246
244
  transaction do
247
- m1 = model_class.create! :name => "a b c d"
245
+ m1 = model_class.create! name: "a b c d"
248
246
  assert_equal "a-b-c-d", m1.slug
249
- model_class.create! :name => "a b c d"
247
+ model_class.create! name: "a b c d"
250
248
  m1 = model_class.friendly.find(m1.id)
251
249
  m1.save!
252
250
  assert_equal "a-b-c-d", m1.slug
@@ -255,37 +253,35 @@ class SlugGeneratorTest < TestCaseClass
255
253
 
256
254
  test "should correctly sequence slugs that end with numbers" do
257
255
  transaction do
258
- record1 = model_class.create! :name => "Peugeot 206"
256
+ record1 = model_class.create! name: "Peugeot 206"
259
257
  assert_equal "peugeot-206", record1.slug
260
- record2 = model_class.create! :name => "Peugeot 206"
261
- assert_match(/\Apeugeot-206-([a-z0-9]+\-){4}[a-z0-9]+\z/, record2.slug)
258
+ record2 = model_class.create! name: "Peugeot 206"
259
+ assert_match(/\Apeugeot-206-([a-z0-9]+-){4}[a-z0-9]+\z/, record2.slug)
262
260
  end
263
261
  end
264
262
 
265
263
  test "should correctly sequence slugs with underscores" do
266
264
  transaction do
267
- Novelist.create! :name => 'wordsfail, buildings tumble'
268
- record2 = Novelist.create! :name => 'word fail'
269
- assert_equal 'word_fail', record2.slug
265
+ Novelist.create! name: "wordsfail, buildings tumble"
266
+ record2 = Novelist.create! name: "word fail"
267
+ assert_equal "word_fail", record2.slug
270
268
  end
271
269
  end
272
270
 
273
271
  test "should correctly sequence numeric slugs" do
274
272
  transaction do
275
- n2 = 2.times.map {Article.create :name => '123'}.last
273
+ n2 = 2.times.map { Article.create name: "123" }.last
276
274
  assert_match(/\A123-.*/, n2.friendly_id)
277
275
  end
278
276
  end
279
-
280
277
  end
281
278
 
282
279
  class SlugSeparatorTest < TestCaseClass
283
-
284
280
  include FriendlyId::Test
285
281
 
286
282
  class Journalist < ActiveRecord::Base
287
283
  extend FriendlyId
288
- friendly_id :name, :use => :slugged, :sequence_separator => ":"
284
+ friendly_id :name, use: :slugged, sequence_separator: ":"
289
285
  end
290
286
 
291
287
  def model_class
@@ -294,7 +290,7 @@ class SlugSeparatorTest < TestCaseClass
294
290
 
295
291
  test "should sequence with configured sequence separator" do
296
292
  with_instance_of model_class do |record|
297
- record2 = model_class.create! :name => record.name
293
+ record2 = model_class.create! name: record.name
298
294
  assert record2.friendly_id.match(/:.*\z/)
299
295
  end
300
296
  end
@@ -310,34 +306,32 @@ class SlugSeparatorTest < TestCaseClass
310
306
  model_class = Class.new(ActiveRecord::Base) do
311
307
  self.table_name = "journalists"
312
308
  extend FriendlyId
313
- friendly_id :name, :use => :slugged, :sequence_separator => '-'
309
+ friendly_id :name, use: :slugged, sequence_separator: "-"
314
310
  def self.name
315
311
  "Journalist"
316
312
  end
317
313
  end
318
314
  transaction do
319
- record1 = model_class.create! :name => "Peugeot 206"
315
+ record1 = model_class.create! name: "Peugeot 206"
320
316
  assert_equal "peugeot-206", record1.slug
321
- record2 = model_class.create! :name => "Peugeot 206"
322
- assert_match(/\Apeugeot-206-([a-z0-9]+\-){4}[a-z0-9]+\z/, record2.slug)
317
+ record2 = model_class.create! name: "Peugeot 206"
318
+ assert_match(/\Apeugeot-206-([a-z0-9]+-){4}[a-z0-9]+\z/, record2.slug)
323
319
  end
324
320
  end
325
321
 
326
322
  test "should sequence blank slugs without a separator" do
327
- with_instance_of model_class, :name => "" do |record|
328
- assert_match(/\A([a-z0-9]+\-){4}[a-z0-9]+\z/, record.slug)
323
+ with_instance_of model_class, name: "" do |record|
324
+ assert_match(/\A([a-z0-9]+-){4}[a-z0-9]+\z/, record.slug)
329
325
  end
330
326
  end
331
-
332
327
  end
333
328
 
334
329
  class SlugLimitTest < TestCaseClass
335
-
336
330
  include FriendlyId::Test
337
331
 
338
332
  class Journalist < ActiveRecord::Base
339
333
  extend FriendlyId
340
- friendly_id :name, :use => :slugged, :slug_limit => 40
334
+ friendly_id :name, use: :slugged, slug_limit: 40
341
335
  end
342
336
 
343
337
  def model_class
@@ -346,48 +340,45 @@ class SlugLimitTest < TestCaseClass
346
340
 
347
341
  test "should limit slug size" do
348
342
  transaction do
349
- m1 = model_class.create! :name => 'a' * 50
350
- assert_equal m1.slug, 'a' * 40
351
- m2 = model_class.create! :name => m1.name
343
+ m1 = model_class.create! name: "a" * 50
344
+ assert_equal m1.slug, "a" * 40
345
+ m2 = model_class.create! name: m1.name
352
346
  m2.save!
353
347
  # "aaa-<uid>"
354
- assert_match(/\Aa{3}\-/, m2.slug)
348
+ assert_match(/\Aa{3}-/, m2.slug)
355
349
  end
356
350
  end
357
351
  end
358
352
 
359
353
  class DefaultScopeTest < TestCaseClass
360
-
361
354
  include FriendlyId::Test
362
355
 
363
356
  class Journalist < ActiveRecord::Base
364
357
  extend FriendlyId
365
- friendly_id :name, :use => :slugged
366
- default_scope -> { where(:active => true).order('id ASC') }
358
+ friendly_id :name, use: :slugged
359
+ default_scope -> { where(active: true).order("id ASC") }
367
360
  end
368
361
 
369
362
  test "friendly_id should correctly sequence a default_scoped ordered table" do
370
363
  transaction do
371
- 3.times { assert Journalist.create :name => "a", :active => true }
364
+ 3.times { assert Journalist.create name: "a", active: true }
372
365
  end
373
366
  end
374
367
 
375
368
  test "friendly_id should correctly sequence a default_scoped scoped table" do
376
369
  transaction do
377
- assert Journalist.create :name => "a", :active => false
378
- assert Journalist.create :name => "a", :active => true
370
+ assert Journalist.create name: "a", active: false
371
+ assert Journalist.create name: "a", active: true
379
372
  end
380
373
  end
381
-
382
374
  end
383
375
 
384
376
  class UuidAsPrimaryKeyFindTest < TestCaseClass
385
-
386
377
  include FriendlyId::Test
387
378
 
388
379
  class MenuItem < ActiveRecord::Base
389
380
  extend FriendlyId
390
- friendly_id :name, :use => :slugged
381
+ friendly_id :name, use: :slugged
391
382
  before_create :init_primary_key
392
383
 
393
384
  def self.primary_key
@@ -400,6 +391,7 @@ class UuidAsPrimaryKeyFindTest < TestCaseClass
400
391
  end
401
392
 
402
393
  private
394
+
403
395
  def init_primary_key
404
396
  self.uuid_key = SecureRandom.uuid
405
397
  end
@@ -427,46 +419,40 @@ class UuidAsPrimaryKeyFindTest < TestCaseClass
427
419
  end
428
420
  end
429
421
  end
430
-
431
422
  end
432
423
 
433
424
  class UnderscoreAsSequenceSeparatorRegressionTest < TestCaseClass
434
-
435
425
  include FriendlyId::Test
436
426
 
437
427
  class Manual < ActiveRecord::Base
438
428
  extend FriendlyId
439
- friendly_id :name, :use => :slugged, :sequence_separator => "_"
429
+ friendly_id :name, use: :slugged, sequence_separator: "_"
440
430
  end
441
431
 
442
432
  test "should not create duplicate slugs" do
443
433
  3.times do
444
434
  transaction do
445
- begin
446
- assert Manual.create! :name => "foo"
447
- rescue
448
- flunk "Tried to insert duplicate slug"
449
- end
435
+ assert Manual.create! name: "foo"
436
+ rescue
437
+ flunk "Tried to insert duplicate slug"
450
438
  end
451
439
  end
452
440
  end
453
-
454
441
  end
455
442
 
456
443
  # https://github.com/norman/friendly_id/issues/148
457
444
  class FailedValidationAfterUpdateRegressionTest < TestCaseClass
458
-
459
445
  include FriendlyId::Test
460
446
 
461
447
  class Journalist < ActiveRecord::Base
462
448
  extend FriendlyId
463
- friendly_id :name, :use => :slugged
449
+ friendly_id :name, use: :slugged
464
450
  validates_presence_of :slug_de
465
451
  end
466
452
 
467
453
  test "to_param should return the unchanged value if the slug changes before validation fails" do
468
454
  transaction do
469
- journalist = Journalist.create! :name => "Joseph Pulitzer", :slug_de => "value"
455
+ journalist = Journalist.create! name: "Joseph Pulitzer", slug_de: "value"
470
456
  assert_equal "joseph-pulitzer", journalist.to_param
471
457
  assert journalist.valid?
472
458
  assert journalist.persisted?
@@ -476,49 +462,45 @@ class FailedValidationAfterUpdateRegressionTest < TestCaseClass
476
462
  assert_equal "joseph-pulitzer", journalist.to_param
477
463
  end
478
464
  end
479
-
480
465
  end
481
466
 
482
467
  # https://github.com/norman/friendly_id/issues/947
483
468
  class GeneratingSlugWithValidationSkippedTest < TestCaseClass
484
-
485
469
  include FriendlyId::Test
486
470
 
487
471
  class Journalist < ActiveRecord::Base
488
472
  extend FriendlyId
489
- friendly_id :name, :use => :slugged
473
+ friendly_id :name, use: :slugged
490
474
  end
491
475
 
492
476
  test "should generate slug when skipping validation" do
493
477
  transaction do
494
478
  m1 = Journalist.new
495
- m1.name = 'Bob Timesletter'
479
+ m1.name = "Bob Timesletter"
496
480
  m1.save(validate: false)
497
- assert_equal 'bob-timesletter', m1.slug
481
+ assert_equal "bob-timesletter", m1.slug
498
482
  end
499
483
  end
500
484
 
501
485
  test "should generate slug when #valid? called" do
502
486
  transaction do
503
487
  m1 = Journalist.new
504
- m1.name = 'Bob Timesletter'
488
+ m1.name = "Bob Timesletter"
505
489
  m1.valid?
506
490
  m1.save(validate: false)
507
- assert_equal 'bob-timesletter', m1.slug
491
+ assert_equal "bob-timesletter", m1.slug
508
492
  end
509
493
  end
510
-
511
494
  end
512
495
 
513
496
  class ToParamTest < TestCaseClass
514
-
515
497
  include FriendlyId::Test
516
498
 
517
499
  class Journalist < ActiveRecord::Base
518
500
  extend FriendlyId
519
501
  validates_presence_of :active
520
- validates_length_of :slug, :minimum => 2
521
- friendly_id :name, :use => :slugged
502
+ validates_length_of :slug, minimum: 2
503
+ friendly_id :name, use: :slugged
522
504
 
523
505
  attr_accessor :to_param_in_callback
524
506
 
@@ -532,86 +514,85 @@ class ToParamTest < TestCaseClass
532
514
  end
533
515
 
534
516
  test "to_param should return original slug if record failed validation" do
535
- journalist = Journalist.new :name => 'Clark Kent', :active => nil
517
+ journalist = Journalist.new name: "Clark Kent", active: nil
536
518
  refute journalist.save
537
- assert_equal 'clark-kent', journalist.to_param
519
+ assert_equal "clark-kent", journalist.to_param
538
520
  end
539
521
 
540
522
  test "to_param should clear slug attributes if slug attribute fails validation" do
541
- journalist = Journalist.new :name => 'x', :active => true
523
+ journalist = Journalist.new name: "x", active: true
542
524
  refute journalist.save
543
525
  assert_nil journalist.to_param
544
526
  end
545
527
 
546
528
  test "to_param should clear slug attribute if slug attribute fails validation and unrelated validation fails" do
547
- journalist = Journalist.new :name => 'x', :active => nil
529
+ journalist = Journalist.new name: "x", active: nil
548
530
  refute journalist.save
549
531
  assert_nil journalist.to_param
550
532
  end
551
533
 
552
534
  test "to_param should use slugged attribute if record saved successfully" do
553
535
  transaction do
554
- journalist = Journalist.new :name => 'Clark Kent', :active => true
536
+ journalist = Journalist.new name: "Clark Kent", active: true
555
537
  assert journalist.save
556
- assert_equal 'clark-kent', journalist.to_param
538
+ assert_equal "clark-kent", journalist.to_param
557
539
  end
558
540
  end
559
541
 
560
542
  test "to_param should use new slug if existing record changes but fails to save" do
561
543
  transaction do
562
- journalist = Journalist.new :name => 'Clark Kent', :active => true
544
+ journalist = Journalist.new name: "Clark Kent", active: true
563
545
  assert journalist.save
564
- journalist.name = 'Superman'
546
+ journalist.name = "Superman"
565
547
  journalist.slug = nil
566
548
  journalist.active = nil
567
549
  refute journalist.save
568
- assert_equal 'superman', journalist.to_param
550
+ assert_equal "superman", journalist.to_param
569
551
  end
570
552
  end
571
553
 
572
554
  test "to_param should use original slug if new slug attribute is not valid" do
573
555
  transaction do
574
- journalist = Journalist.new :name => 'Clark Kent', :active => true
556
+ journalist = Journalist.new name: "Clark Kent", active: true
575
557
  assert journalist.save
576
- journalist.name = 'x'
558
+ journalist.name = "x"
577
559
  journalist.slug = nil
578
560
  journalist.active = nil
579
561
  refute journalist.save
580
- assert_equal 'clark-kent', journalist.to_param
562
+ assert_equal "clark-kent", journalist.to_param
581
563
  end
582
564
  end
583
565
 
584
566
  test "to_param should use new slug if existing record changes successfully" do
585
567
  transaction do
586
- journalist = Journalist.new :name => 'Clark Kent', :active => true
568
+ journalist = Journalist.new name: "Clark Kent", active: true
587
569
  assert journalist.save
588
- journalist.name = 'Superman'
570
+ journalist.name = "Superman"
589
571
  journalist.slug = nil
590
572
  assert journalist.save
591
- assert_equal 'superman', journalist.to_param
573
+ assert_equal "superman", journalist.to_param
592
574
  end
593
575
  end
594
576
 
595
577
  test "to_param should use new slug within callbacks if new record is saved successfully" do
596
578
  transaction do
597
- journalist = Journalist.new :name => 'Clark Kent', :active => true
579
+ journalist = Journalist.new name: "Clark Kent", active: true
598
580
  assert journalist.save
599
- assert_equal 'clark-kent', journalist.to_param_in_callback, "value of to_param in callback should use the new slug value"
581
+ assert_equal "clark-kent", journalist.to_param_in_callback, "value of to_param in callback should use the new slug value"
600
582
  end
601
583
  end
602
584
 
603
585
  test "to_param should use new slug within callbacks if existing record changes successfully" do
604
586
  transaction do
605
- journalist = Journalist.new :name => 'Clark Kent', :active => true
587
+ journalist = Journalist.new name: "Clark Kent", active: true
606
588
  assert journalist.save
607
589
  assert journalist.valid?
608
- journalist.name = 'Superman'
590
+ journalist.name = "Superman"
609
591
  journalist.slug = nil
610
592
  assert journalist.save, "save should be successful"
611
- assert_equal 'superman', journalist.to_param_in_callback, "value of to_param in callback should use the new slug value"
593
+ assert_equal "superman", journalist.to_param_in_callback, "value of to_param in callback should use the new slug value"
612
594
  end
613
595
  end
614
-
615
596
  end
616
597
 
617
598
  class ConfigurableRoutesTest < TestCaseClass
@@ -620,18 +601,18 @@ class ConfigurableRoutesTest < TestCaseClass
620
601
  class Article < ActiveRecord::Base
621
602
  extend FriendlyId
622
603
 
623
- friendly_id :name, :use => :slugged, :routes => :friendly
604
+ friendly_id :name, use: :slugged, routes: :friendly
624
605
  end
625
606
 
626
607
  class Novel < ActiveRecord::Base
627
608
  extend FriendlyId
628
609
 
629
- friendly_id :name, :use => :slugged, :routes => :default
610
+ friendly_id :name, use: :slugged, routes: :default
630
611
  end
631
612
 
632
613
  test "to_param should return a friendly id when the routes option is set to :friendly" do
633
614
  transaction do
634
- article = Article.create! :name => "Titanic Hits; Iceberg Sinks"
615
+ article = Article.create! name: "Titanic Hits; Iceberg Sinks"
635
616
 
636
617
  assert_equal "titanic-hits-iceberg-sinks", article.to_param
637
618
  end
@@ -639,7 +620,7 @@ class ConfigurableRoutesTest < TestCaseClass
639
620
 
640
621
  test "to_param should return the id when the routes option is set to anything but friendly" do
641
622
  transaction do
642
- novel = Novel.create! :name => "Don Quixote"
623
+ novel = Novel.create! name: "Don Quixote"
643
624
 
644
625
  assert_equal novel.id.to_s, novel.to_param
645
626
  end