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/helper.rb CHANGED
@@ -1,21 +1,21 @@
1
1
  require "bundler/setup"
2
2
 
3
- if ENV['COVERALLS'] || ENV['COVERAGE']
4
- require 'simplecov'
5
- if ENV['COVERALLS']
6
- require 'coveralls'
3
+ if ENV["COVERALLS"] || ENV["COVERAGE"]
4
+ require "simplecov"
5
+ if ENV["COVERALLS"]
6
+ require "coveralls"
7
7
  SimpleCov.formatter = Coveralls::SimpleCov::Formatter
8
8
  end
9
9
  SimpleCov.start do
10
- add_filter 'test'
11
- add_filter 'friendly_id/migration'
10
+ add_filter "test"
11
+ add_filter "friendly_id/migration"
12
12
  end
13
13
  end
14
14
 
15
15
  begin
16
- require 'minitest'
16
+ require "minitest"
17
17
  rescue LoadError
18
- require 'minitest/unit'
18
+ require "minitest/unit"
19
19
  end
20
20
 
21
21
  begin
@@ -24,10 +24,10 @@ rescue NameError
24
24
  TestCaseClass = MiniTest::Unit::TestCase
25
25
  end
26
26
 
27
- require "mocha/setup"
27
+ require "mocha/minitest"
28
28
  require "active_record"
29
- require 'active_support/core_ext/time/conversions'
30
- require 'erb'
29
+ require "active_support/core_ext/time/conversions"
30
+ require "erb"
31
31
 
32
32
  I18n.enforce_available_locales = false
33
33
 
@@ -39,29 +39,32 @@ if ENV["LOG"]
39
39
  ActiveRecord::Base.logger = Logger.new($stdout)
40
40
  end
41
41
 
42
- if ActiveSupport::VERSION::STRING >= '4.2'
42
+ if ActiveSupport::VERSION::STRING >= "4.2"
43
43
  ActiveSupport.test_order = :random
44
44
  end
45
45
 
46
46
  module FriendlyId
47
47
  module Test
48
-
49
48
  def self.included(base)
50
49
  if Minitest.respond_to?(:autorun)
51
50
  Minitest.autorun
52
51
  else
53
- require 'minitest/autorun'
52
+ require "minitest/autorun"
54
53
  end
55
54
  rescue LoadError
56
55
  end
57
56
 
58
57
  def transaction
59
- ActiveRecord::Base.transaction { yield ; raise ActiveRecord::Rollback }
58
+ ActiveRecord::Base.transaction do
59
+ yield
60
+
61
+ raise ActiveRecord::Rollback
62
+ end
60
63
  end
61
64
 
62
65
  def with_instance_of(*args)
63
66
  model_class = args.shift
64
- args[0] ||= {:name => "a b c"}
67
+ args[0] ||= {name: "a b c"}
65
68
  transaction { yield model_class.create!(*args) }
66
69
  end
67
70
 
@@ -70,7 +73,11 @@ module FriendlyId
70
73
 
71
74
  def connect
72
75
  version = ActiveRecord::VERSION::STRING
73
- engine = RUBY_ENGINE rescue "ruby"
76
+ engine = begin
77
+ RUBY_ENGINE
78
+ rescue
79
+ "ruby"
80
+ end
74
81
 
75
82
  ActiveRecord::Base.establish_connection config[driver]
76
83
  message = "Using #{engine} #{RUBY_VERSION} AR #{version} with #{driver}"
@@ -86,7 +93,7 @@ module FriendlyId
86
93
  end
87
94
 
88
95
  def config
89
- @config ||= YAML::load(
96
+ @config ||= YAML.safe_load(
90
97
  ERB.new(
91
98
  File.read(File.expand_path("../databases.yml", __FILE__))
92
99
  ).result
@@ -94,9 +101,9 @@ module FriendlyId
94
101
  end
95
102
 
96
103
  def driver
97
- _driver = ENV.fetch('DB', 'sqlite3').downcase
98
- _driver = "postgres" if %w(postgresql pg).include?(_driver)
99
- _driver
104
+ db_driver = ENV.fetch("DB", "sqlite3").downcase
105
+ db_driver = "postgres" if %w[postgresql pg].include?(db_driver)
106
+ db_driver
100
107
  end
101
108
 
102
109
  def in_memory?
@@ -115,4 +122,4 @@ end
115
122
  require "schema"
116
123
  require "shared"
117
124
  FriendlyId::Test::Database.connect
118
- at_exit {ActiveRecord::Base.connection.disconnect!}
125
+ at_exit { ActiveRecord::Base.connection.disconnect! }
data/test/history_test.rb CHANGED
@@ -1,13 +1,12 @@
1
1
  require "helper"
2
2
 
3
3
  class HistoryTest < TestCaseClass
4
-
5
4
  include FriendlyId::Test
6
5
  include FriendlyId::Test::Shared::Core
7
6
 
8
7
  class Manual < ActiveRecord::Base
9
8
  extend FriendlyId
10
- friendly_id :name, :use => [:slugged, :history]
9
+ friendly_id :name, use: [:slugged, :history]
11
10
  end
12
11
 
13
12
  def model_class
@@ -15,7 +14,7 @@ class HistoryTest < TestCaseClass
15
14
  end
16
15
 
17
16
  test "should insert record in slugs table on create" do
18
- with_instance_of(model_class) {|record| assert record.slugs.any?}
17
+ with_instance_of(model_class) { |record| assert record.slugs.any? }
19
18
  end
20
19
 
21
20
  test "should not create new slug record if friendly_id is not changed" do
@@ -52,8 +51,9 @@ class HistoryTest < TestCaseClass
52
51
 
53
52
  test "should create slug records on each change" do
54
53
  transaction do
55
- record = model_class.create! :name => "hello"
54
+ model_class.create! name: "hello"
56
55
  assert_equal 1, FriendlyId::Slug.count
56
+
57
57
  record = model_class.friendly.find("hello")
58
58
  record.name = "hello again"
59
59
  record.slug = nil
@@ -65,7 +65,7 @@ class HistoryTest < TestCaseClass
65
65
  test "should not be read only when found by slug" do
66
66
  with_instance_of(model_class) do |record|
67
67
  refute model_class.friendly.find(record.friendly_id).readonly?
68
- assert record.update name: 'foo'
68
+ assert record.update name: "foo"
69
69
  end
70
70
  end
71
71
 
@@ -80,21 +80,21 @@ class HistoryTest < TestCaseClass
80
80
 
81
81
  test "should handle renames" do
82
82
  with_instance_of(model_class) do |record|
83
- record.name = 'x'
83
+ record.name = "x"
84
84
  record.slug = nil
85
85
  assert record.save
86
- record.name = 'y'
86
+ record.name = "y"
87
87
  record.slug = nil
88
88
  assert record.save
89
- record.name = 'x'
89
+ record.name = "x"
90
90
  record.slug = nil
91
91
  assert record.save
92
92
  end
93
93
  end
94
94
 
95
- test 'should maintain history even if current slug is not the most recent one' do
95
+ test "should maintain history even if current slug is not the most recent one" do
96
96
  with_instance_of(model_class) do |record|
97
- record.name = 'current'
97
+ record.name = "current"
98
98
  assert record.save
99
99
 
100
100
  # this feels like a hack. only thing i can get to work with the HistoryTestWithSti
@@ -103,8 +103,8 @@ class HistoryTest < TestCaseClass
103
103
  # create several slugs for record
104
104
  # current slug does not have max id
105
105
  FriendlyId::Slug.delete_all
106
- FriendlyId::Slug.create(sluggable_type: sluggable_type, sluggable_id: record.id, slug: 'current')
107
- FriendlyId::Slug.create(sluggable_type: sluggable_type, sluggable_id: record.id, slug: 'outdated')
106
+ FriendlyId::Slug.create(sluggable_type: sluggable_type, sluggable_id: record.id, slug: "current")
107
+ FriendlyId::Slug.create(sluggable_type: sluggable_type, sluggable_id: record.id, slug: "outdated")
108
108
 
109
109
  record.reload
110
110
  record.slug = nil
@@ -116,24 +116,24 @@ class HistoryTest < TestCaseClass
116
116
 
117
117
  test "should not create new slugs that match old slugs" do
118
118
  transaction do
119
- first_record = model_class.create! :name => "foo"
119
+ first_record = model_class.create! name: "foo"
120
120
  first_record.name = "bar"
121
121
  first_record.save!
122
- second_record = model_class.create! :name => "foo"
122
+ second_record = model_class.create! name: "foo"
123
123
  assert second_record.slug != "foo"
124
124
  assert_match(/foo-.+/, second_record.slug)
125
125
  end
126
126
  end
127
127
 
128
- test 'should not fail when updating historic slugs' do
128
+ test "should not fail when updating historic slugs" do
129
129
  transaction do
130
- first_record = model_class.create! :name => "foo"
131
- second_record = model_class.create! :name => 'another'
130
+ first_record = model_class.create! name: "foo"
131
+ second_record = model_class.create! name: "another"
132
132
 
133
- second_record.update :name => 'foo', :slug => nil
133
+ second_record.update name: "foo", slug: nil
134
134
  assert_match(/foo-.*/, second_record.slug)
135
135
 
136
- first_record.update :name => 'another', :slug => nil
136
+ first_record.update name: "another", slug: nil
137
137
  assert_match(/another-.*/, first_record.slug)
138
138
  end
139
139
  end
@@ -144,25 +144,23 @@ class HistoryTest < TestCaseClass
144
144
  second_record = model_class.create! name: "bar"
145
145
 
146
146
  first_record.update! slug: "not_foo"
147
- second_record.update! slug: "foo" #now both records have used foo; second_record most recently
147
+ second_record.update! slug: "foo" # now both records have used foo; second_record most recently
148
148
  second_record.update! slug: "not_bar"
149
149
 
150
150
  assert_equal model_class.friendly.find("foo"), second_record
151
151
  end
152
152
  end
153
153
 
154
- test 'should name table according to prefix and suffix' do
154
+ test "should name table according to prefix and suffix" do
155
155
  transaction do
156
- begin
157
- prefix = "prefix_"
158
- without_prefix = FriendlyId::Slug.table_name
159
- ActiveRecord::Base.table_name_prefix = prefix
160
- FriendlyId::Slug.reset_table_name
161
- assert_equal prefix + without_prefix, FriendlyId::Slug.table_name
162
- ensure
163
- ActiveRecord::Base.table_name_prefix = ""
164
- FriendlyId::Slug.table_name = without_prefix
165
- end
156
+ prefix = "prefix_"
157
+ without_prefix = FriendlyId::Slug.table_name
158
+ ActiveRecord::Base.table_name_prefix = prefix
159
+ FriendlyId::Slug.reset_table_name
160
+ assert_equal prefix + without_prefix, FriendlyId::Slug.table_name
161
+ ensure
162
+ ActiveRecord::Base.table_name_prefix = ""
163
+ FriendlyId::Slug.table_name = without_prefix
166
164
  end
167
165
  end
168
166
  end
@@ -170,7 +168,7 @@ end
170
168
  class HistoryTestWithAutomaticSlugRegeneration < HistoryTest
171
169
  class Manual < ActiveRecord::Base
172
170
  extend FriendlyId
173
- friendly_id :name, :use => [:slugged, :history]
171
+ friendly_id :name, use: [:slugged, :history]
174
172
 
175
173
  def should_generate_new_friendly_id?
176
174
  slug.blank? or name_changed?
@@ -181,62 +179,61 @@ class HistoryTestWithAutomaticSlugRegeneration < HistoryTest
181
179
  Manual
182
180
  end
183
181
 
184
- test 'should allow reversion back to a previously used slug' do
185
- with_instance_of(model_class, name: 'foo') do |record|
186
- record.name = 'bar'
182
+ test "should allow reversion back to a previously used slug" do
183
+ with_instance_of(model_class, name: "foo") do |record|
184
+ record.name = "bar"
187
185
  record.save!
188
- assert_equal 'bar', record.friendly_id
189
- record.name = 'foo'
186
+ assert_equal "bar", record.friendly_id
187
+ record.name = "foo"
190
188
  record.save!
191
- assert_equal 'foo', record.friendly_id
189
+ assert_equal "foo", record.friendly_id
192
190
  end
193
191
  end
194
192
  end
195
193
 
196
194
  class DependentDestroyTest < TestCaseClass
197
-
198
195
  include FriendlyId::Test
199
196
 
200
197
  class FalseManual < ActiveRecord::Base
201
- self.table_name = 'manuals'
198
+ self.table_name = "manuals"
202
199
 
203
200
  extend FriendlyId
204
- friendly_id :name, :use => :history, :dependent => false
201
+ friendly_id :name, use: :history, dependent: false
205
202
  end
206
203
 
207
204
  class DefaultManual < ActiveRecord::Base
208
- self.table_name = 'manuals'
205
+ self.table_name = "manuals"
209
206
 
210
207
  extend FriendlyId
211
- friendly_id :name, :use => :history
208
+ friendly_id :name, use: :history
212
209
  end
213
210
 
214
- test 'should allow disabling of dependent destroy' do
211
+ test "should allow disabling of dependent destroy" do
215
212
  transaction do
216
- assert FriendlyId::Slug.find_by_slug('foo').nil?
217
- l = FalseManual.create! :name => 'foo'
218
- assert FriendlyId::Slug.find_by_slug('foo').present?
213
+ assert FriendlyId::Slug.find_by_slug("foo").nil?
214
+ l = FalseManual.create! name: "foo"
215
+ assert FriendlyId::Slug.find_by_slug("foo").present?
219
216
  l.destroy
220
- assert FriendlyId::Slug.find_by_slug('foo').present?
217
+ assert FriendlyId::Slug.find_by_slug("foo").present?
221
218
  end
222
219
  end
223
220
 
224
- test 'should dependently destroy by default' do
221
+ test "should dependently destroy by default" do
225
222
  transaction do
226
- assert FriendlyId::Slug.find_by_slug('baz').nil?
227
- l = DefaultManual.create! :name => 'baz'
228
- assert FriendlyId::Slug.find_by_slug('baz').present?
223
+ assert FriendlyId::Slug.find_by_slug("baz").nil?
224
+ l = DefaultManual.create! name: "baz"
225
+ assert FriendlyId::Slug.find_by_slug("baz").present?
229
226
  l.destroy
230
- assert FriendlyId::Slug.find_by_slug('baz').nil?
227
+ assert FriendlyId::Slug.find_by_slug("baz").nil?
231
228
  end
232
229
  end
233
230
  end
234
231
 
235
- if ActiveRecord::VERSION::STRING >= '5.0'
232
+ if ActiveRecord::VERSION::STRING >= "5.0"
236
233
  class HistoryTestWithParanoidDeletes < HistoryTest
237
234
  class ParanoidRecord < ActiveRecord::Base
238
235
  extend FriendlyId
239
- friendly_id :name, :use => :history, :dependent => false
236
+ friendly_id :name, use: :history, dependent: false
240
237
 
241
238
  default_scope { where(deleted_at: nil) }
242
239
  end
@@ -245,19 +242,19 @@ if ActiveRecord::VERSION::STRING >= '5.0'
245
242
  ParanoidRecord
246
243
  end
247
244
 
248
- test 'slug should have a sluggable even when soft deleted by a library' do
245
+ test "slug should have a sluggable even when soft deleted by a library" do
249
246
  transaction do
250
- assert FriendlyId::Slug.find_by_slug('paranoid').nil?
251
- record = model_class.create(name: 'paranoid')
252
- assert FriendlyId::Slug.find_by_slug('paranoid').present?
247
+ assert FriendlyId::Slug.find_by_slug("paranoid").nil?
248
+ record = model_class.create(name: "paranoid")
249
+ assert FriendlyId::Slug.find_by_slug("paranoid").present?
253
250
 
254
251
  record.update deleted_at: Time.now
255
252
 
256
- orphan_slug = FriendlyId::Slug.find_by_slug('paranoid')
257
- assert orphan_slug.present?, 'Orphaned slug should exist'
253
+ orphan_slug = FriendlyId::Slug.find_by_slug("paranoid")
254
+ assert orphan_slug.present?, "Orphaned slug should exist"
258
255
 
259
256
  assert orphan_slug.valid?, "Errors: #{orphan_slug.errors.full_messages}"
260
- assert orphan_slug.sluggable.present?, 'Orphaned slug should still find corresponding paranoid sluggable'
257
+ assert orphan_slug.sluggable.present?, "Orphaned slug should still find corresponding paranoid sluggable"
261
258
  end
262
259
  end
263
260
  end
@@ -266,7 +263,7 @@ end
266
263
  class HistoryTestWithSti < HistoryTest
267
264
  class Journalist < ActiveRecord::Base
268
265
  extend FriendlyId
269
- friendly_id :name, :use => [:slugged, :history]
266
+ friendly_id :name, use: [:slugged, :history]
270
267
  end
271
268
 
272
269
  class Editorialist < Journalist
@@ -280,16 +277,15 @@ end
280
277
  class HistoryTestWithFriendlyFinders < HistoryTest
281
278
  class Journalist < ActiveRecord::Base
282
279
  extend FriendlyId
283
- friendly_id :name, :use => [:slugged, :finders, :history]
280
+ friendly_id :name, use: [:slugged, :finders, :history]
284
281
  end
285
282
 
286
283
  class Restaurant < ActiveRecord::Base
287
284
  extend FriendlyId
288
285
  belongs_to :city
289
- friendly_id :name, :use => [:slugged, :history, :finders]
286
+ friendly_id :name, use: [:slugged, :history, :finders]
290
287
  end
291
288
 
292
-
293
289
  test "should be findable by old slugs" do
294
290
  [Journalist, Restaurant].each do |model_class|
295
291
  with_instance_of(model_class) do |record|
@@ -318,7 +314,7 @@ class HistoryTestWithFindersBeforeHistory < HistoryTest
318
314
 
319
315
  belongs_to :novelist
320
316
 
321
- friendly_id :name, :use => [:finders, :history]
317
+ friendly_id :name, use: [:finders, :history]
322
318
 
323
319
  def should_generate_new_friendly_id?
324
320
  slug.blank? || name_changed?
@@ -327,8 +323,8 @@ class HistoryTestWithFindersBeforeHistory < HistoryTest
327
323
 
328
324
  test "should be findable by old slug through has_many association" do
329
325
  transaction do
330
- novelist = Novelist.create!(:name => "Stephen King")
331
- novel = novelist.novels.create(:name => "Rita Hayworth and Shawshank Redemption")
326
+ novelist = Novelist.create!(name: "Stephen King")
327
+ novel = novelist.novels.create(name: "Rita Hayworth and Shawshank Redemption")
332
328
  slug = novel.slug
333
329
  novel.name = "Shawshank Redemption"
334
330
  novel.save!
@@ -345,7 +341,7 @@ end
345
341
  class Restaurant < ActiveRecord::Base
346
342
  extend FriendlyId
347
343
  belongs_to :city
348
- friendly_id :name, :use => [:scoped, :history], :scope => :city
344
+ friendly_id :name, use: [:scoped, :history], scope: :city
349
345
  end
350
346
 
351
347
  class ScopedHistoryTest < TestCaseClass
@@ -389,10 +385,10 @@ class ScopedHistoryTest < TestCaseClass
389
385
  record.slug = nil
390
386
  record.save!
391
387
 
392
- second_record = model_class.create! :city => city, :name => 'x'
388
+ second_record = model_class.create! city: city, name: "x"
393
389
  assert_match(/x-.+/, second_record.friendly_id)
394
390
 
395
- third_record = model_class.create! :city => city, :name => 'y'
391
+ third_record = model_class.create! city: city, name: "y"
396
392
  assert_match(/y-.+/, third_record.friendly_id)
397
393
  end
398
394
  end
@@ -429,8 +425,8 @@ class ScopedHistoryTest < TestCaseClass
429
425
  transaction do
430
426
  city = City.create!
431
427
  second_city = City.create!
432
- record = model_class.create! :city => city, :name => 'x'
433
- second_record = model_class.create! :city => second_city, :name => 'x'
428
+ record = model_class.create! city: city, name: "x"
429
+ second_record = model_class.create! city: second_city, name: "x"
434
430
 
435
431
  assert_equal record.slug, second_record.slug
436
432
  end
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require "helper"
2
2
 
3
3
  class NumericSlugTest < TestCaseClass
4
4
  include FriendlyId::Test
@@ -10,21 +10,21 @@ class NumericSlugTest < TestCaseClass
10
10
 
11
11
  test "should generate numeric slugs" do
12
12
  transaction do
13
- record = model_class.create! :name => "123"
13
+ record = model_class.create! name: "123"
14
14
  assert_equal "123", record.slug
15
15
  end
16
16
  end
17
17
 
18
18
  test "should find by numeric slug" do
19
19
  transaction do
20
- record = model_class.create! :name => "123"
20
+ record = model_class.create! name: "123"
21
21
  assert_equal model_class.friendly.find("123").id, record.id
22
22
  end
23
23
  end
24
24
 
25
25
  test "should exist? by numeric slug" do
26
26
  transaction do
27
- record = model_class.create! :name => "123"
27
+ model_class.create! name: "123"
28
28
  assert model_class.friendly.exists?("123")
29
29
  end
30
30
  end
@@ -1,8 +1,6 @@
1
1
  require "helper"
2
2
 
3
-
4
3
  class ObjectUtilsTest < TestCaseClass
5
-
6
4
  include FriendlyId::Test
7
5
 
8
6
  test "strings with letters are friendly_ids" do
@@ -1,12 +1,11 @@
1
1
  require "helper"
2
2
 
3
3
  class ReservedTest < TestCaseClass
4
-
5
4
  include FriendlyId::Test
6
5
 
7
6
  class Journalist < ActiveRecord::Base
8
7
  extend FriendlyId
9
- friendly_id :slug_candidates, :use => [:slugged, :reserved], :reserved_words => %w(new edit)
8
+ friendly_id :slug_candidates, use: [:slugged, :reserved], reserved_words: %w[new edit]
10
9
 
11
10
  after_validation :move_friendly_id_error_to_name
12
11
 
@@ -24,9 +23,9 @@ class ReservedTest < TestCaseClass
24
23
  end
25
24
 
26
25
  test "should reserve words" do
27
- %w(new edit NEW Edit).each do |word|
26
+ %w[new edit NEW Edit].each do |word|
28
27
  transaction do
29
- assert_raises(ActiveRecord::RecordInvalid) {model_class.create! :name => word}
28
+ assert_raises(ActiveRecord::RecordInvalid) { model_class.create! name: word }
30
29
  end
31
30
  end
32
31
  end
@@ -43,7 +42,7 @@ class ReservedTest < TestCaseClass
43
42
 
44
43
  test "should reject reserved candidates" do
45
44
  transaction do
46
- record = model_class.new(:name => 'new')
45
+ record = model_class.new(name: "new")
47
46
  def record.slug_candidates
48
47
  [:name, "foo"]
49
48
  end
@@ -54,22 +53,21 @@ class ReservedTest < TestCaseClass
54
53
 
55
54
  test "should be invalid if all candidates are reserved" do
56
55
  transaction do
57
- record = model_class.new(:name => 'new')
56
+ record = model_class.new(name: "new")
58
57
  def record.slug_candidates
59
58
  ["edit", "new"]
60
59
  end
61
- assert_raises(ActiveRecord::RecordInvalid) {record.save!}
60
+ assert_raises(ActiveRecord::RecordInvalid) { record.save! }
62
61
  end
63
62
  end
64
63
 
65
64
  test "should optionally treat reserved words as conflict" do
66
65
  klass = Class.new(model_class) do
67
- friendly_id :slug_candidates, :use => [:slugged, :reserved], :reserved_words => %w(new edit), :treat_reserved_as_conflict => true
66
+ friendly_id :slug_candidates, use: [:slugged, :reserved], reserved_words: %w[new edit], treat_reserved_as_conflict: true
68
67
  end
69
68
 
70
- with_instance_of(klass, name: 'new') do |record|
71
- assert_match(/new-([0-9a-z]+\-){4}[0-9a-z]+\z/, record.slug)
69
+ with_instance_of(klass, name: "new") do |record|
70
+ assert_match(/new-([0-9a-z]+-){4}[0-9a-z]+\z/, record.slug)
72
71
  end
73
72
  end
74
-
75
73
  end
data/test/schema.rb CHANGED
@@ -25,7 +25,7 @@ module FriendlyId
25
25
 
26
26
  tables.each do |table_name|
27
27
  create_table table_name do |t|
28
- t.string :name
28
+ t.string :name
29
29
  t.boolean :active
30
30
  end
31
31
  end
@@ -41,7 +41,7 @@ module FriendlyId
41
41
 
42
42
  slugged_tables.each do |table_name|
43
43
  add_column table_name, :slug, :string
44
- add_index table_name, :slug, :unique => true if 'novels' != table_name
44
+ add_index table_name, :slug, unique: true if table_name != "novels"
45
45
  end
46
46
 
47
47
  scoped_tables.each do |table_name|
@@ -57,7 +57,7 @@ module FriendlyId
57
57
  # This will be used to test scopes
58
58
  add_column :novels, :novelist_id, :integer
59
59
  add_column :novels, :publisher_id, :integer
60
- add_index :novels, [:slug, :publisher_id, :novelist_id], :unique => true
60
+ add_index :novels, [:slug, :publisher_id, :novelist_id], unique: true
61
61
 
62
62
  # This will be used to test column name quoting
63
63
  add_column :journalists, "strange name", :string
@@ -69,6 +69,7 @@ module FriendlyId
69
69
  add_column :journalists, "slug_en", :string
70
70
  add_column :journalists, "slug_es", :string
71
71
  add_column :journalists, "slug_de", :string
72
+ add_column :journalists, "slug_fr_ca", :string
72
73
 
73
74
  # This will be used to test relationships
74
75
  add_column :books, :author_id, :integer
@@ -77,7 +78,7 @@ module FriendlyId
77
78
  add_column :restaurants, :city_id, :integer
78
79
 
79
80
  # Used to test candidates
80
- add_column :cities, :code, :string, :limit => 3
81
+ add_column :cities, :code, :string, limit: 3
81
82
 
82
83
  # Used as a non-default slug_column
83
84
  add_column :authors, :subdomain, :string