friendly_id 5.2.1 → 5.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 67c7eb649e6e0fa756ebcfdbae36f276d7bc6adc
4
- data.tar.gz: '093984f88a0e674471260a9989673190d48c5b22'
3
+ metadata.gz: 5e2080c5099215c8dafa04072948b2ac30907bb8
4
+ data.tar.gz: bee56373516dd5ed394d7de3bc554a08560d5433
5
5
  SHA512:
6
- metadata.gz: 9039e1625fed0fcc1001b9b0b97cf51f6205aa103211e137ca4db834aa75f18c37a98a54e3030f42d8bb0f83489683d1fec8dce6cc2650d763ee4fb0b5e4c033
7
- data.tar.gz: 120aa54db11b436a357122cfd0a53c39bba48c4724d89ce100e5a6dbf8dbec1db6955ebd3c2b118e8c0366505732b8c4e12100e44b40b9fc422904b30a48d29b
6
+ metadata.gz: 015d359758f15798d9f51ff5cd22462510a48e523fa4b3c0c4a7a8aefd8b370039dce2bc78484a54d05be82e0b7b57284d4763d943eaec35c1418fb5b23cc2ba
7
+ data.tar.gz: 66ebbb5b6f6345c6beb0d5c4668ba61d5f9e26b2cff24ab8c8591ed36489559584f24fb00ef41b52aefc568ebc5fd121a200d89db8a04948a23a06aa100cb758
@@ -2,10 +2,10 @@ language: ruby
2
2
  cache: bundler
3
3
 
4
4
  rvm:
5
+ - 2.4.0
5
6
  - 2.3.0
6
7
  - 2.2.0
7
8
  - 2.1.0
8
- - 2.0.0
9
9
  - jruby-9.0.4.0
10
10
 
11
11
  env:
@@ -18,20 +18,19 @@ gemfile:
18
18
  - gemfiles/Gemfile.rails-4.2.rb
19
19
  - gemfiles/Gemfile.rails-5.0.rb
20
20
 
21
+ before_install:
22
+ - gem update bundler
23
+
21
24
  matrix:
22
- allow_failures:
23
- - rvm: jruby-19mode
24
- gemfile: gemfiles/Gemfile.rails-4.2.rb
25
- env: DB=postgres
26
- - rvm: jruby-9.0.4.0
27
- gemfile: gemfiles/Gemfile.rails-5.0.rb
28
25
  exclude:
29
- - rvm: 2.0.0
30
- gemfile: gemfiles/Gemfile.rails-5.0.rb
31
26
  - rvm: 2.1.0
32
27
  gemfile: gemfiles/Gemfile.rails-5.0.rb
33
28
  - rvm: 2.2.0
34
29
  gemfile: gemfiles/Gemfile.rails-5.0.rb
30
+ - rvm: 2.4.0
31
+ gemfile: gemfiles/Gemfile.rails-4.0.rb
32
+ - rvm: 2.4.0
33
+ gemfile: gemfiles/Gemfile.rails-4.1.rb
35
34
 
36
35
  sudo: false
37
36
 
@@ -3,6 +3,12 @@
3
3
  We would like to think our many [contributors](https://github.com/norman/friendly_id/graphs/contributors) for
4
4
  suggestions, ideas and improvements to FriendlyId.
5
5
 
6
+ ## 5.2.2 (2017-09-13)
7
+
8
+ * Prevent warning on db:migrate in Rails 5.1 ([#826](https://github.com/norman/friendly_id/pull/826)).
9
+ * Allow to set size limit for slug ([#809](https://github.com/norman/friendly_id/pull/809)).
10
+ * Update specs and drop support for ruby 2.0.0 ([#824](https://github.com/norman/friendly_id/pull/824)).
11
+
6
12
  ## 5.2.1 (2017-04-09)
7
13
 
8
14
  * Change ActiveRecord::Base to ApplicationRecord ([#782](https://github.com/norman/friendly_id/pull/782)).
data/README.md CHANGED
@@ -174,6 +174,11 @@ gem 'friendly_id', '~> 5.1.0' # Note: You MUST use 5.0.0 or greater for Rails 4.
174
174
  ```
175
175
  ```shell
176
176
  rails generate friendly_id
177
+ ```
178
+ >Temp solution for Rails 5.1+ : Before running the migration, go into the generated migration file and specify the Rails version:
179
+ `class CreateFriendlyIdSlugs < ActiveRecord::Migration[5.1]`
180
+ ```
181
+ ```shell
177
182
  rails generate scaffold user name:string slug:string:uniq
178
183
  rake db:migrate
179
184
  ```
@@ -9,8 +9,8 @@ gem 'i18n', '~> 0.7.0'
9
9
  # Database Configuration
10
10
  group :development, :test do
11
11
  platforms :jruby do
12
- gem 'activerecord-jdbcmysql-adapter', '~> 1.3.14'
13
- gem 'activerecord-jdbcpostgresql-adapter', '~> 1.3.14'
12
+ gem 'activerecord-jdbcmysql-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter.git', branch: 'rails-5'
13
+ gem 'activerecord-jdbcpostgresql-adapter', git: 'https://github.com/jruby/activerecord-jdbc-adapter.git', branch: 'rails-5'
14
14
  gem 'kramdown'
15
15
  end
16
16
 
@@ -178,6 +178,9 @@ often better and easier to use {FriendlyId::Slugged slugs}.
178
178
  # Configures the name of the column where FriendlyId will store the slug.
179
179
  # Defaults to `:slug`.
180
180
  #
181
+ # @option options [Integer] :slug_limit Available when using `:slugged`.
182
+ # Configures the limit of the slug. This option has no default value.
183
+ #
181
184
  # @option options [Symbol] :slug_generator_class Available when using `:slugged`.
182
185
  # Sets the class used to generate unique slugs. You should not specify this
183
186
  # unless you're doing some extensive hacking on FriendlyId. Defaults to
@@ -43,7 +43,10 @@ module FriendlyId
43
43
  private
44
44
 
45
45
  def potential_primary_key?(id)
46
- case primary_key_type
46
+ key_type = primary_key_type
47
+ # Hook for "ActiveModel::Type::Integer" instance.
48
+ key_type = key_type.type if key_type.respond_to?(:type)
49
+ case key_type
47
50
  when :integer
48
51
  Integer(id, 10) rescue false
49
52
  when :uuid
@@ -52,6 +52,10 @@ FriendlyId.defaults do |config|
52
52
  #
53
53
  # config.slug_column = 'slug'
54
54
  #
55
+ # By default, slug has no size limit, but you can change it if you wish.
56
+ #
57
+ # config.slug_limit = 255
58
+ #
55
59
  # When FriendlyId can not generate a unique ID from your base method, it appends
56
60
  # a UUID, separated by a single dash. You can configure the character used as the
57
61
  # separator. If you're upgrading from FriendlyId 4, you may wish to replace this
@@ -288,7 +288,9 @@ Github issue](https://github.com/norman/friendly_id/issues/185) for discussion.
288
288
  # @param [#to_s] value The value used as the basis of the slug.
289
289
  # @return The candidate slug text, without a sequence.
290
290
  def normalize_friendly_id(value)
291
- value.to_s.parameterize
291
+ value = value.to_s.parameterize
292
+ value = value[0...friendly_id_config.slug_limit] if friendly_id_config.slug_limit
293
+ value
292
294
  end
293
295
 
294
296
  # Whether to generate a new slug.
@@ -299,10 +301,56 @@ Github issue](https://github.com/norman/friendly_id/issues/185) for discussion.
299
301
  send(friendly_id_config.slug_column).nil? && !send(friendly_id_config.base).nil?
300
302
  end
301
303
 
304
+ # Public: Resolve conflicts.
305
+ #
306
+ # This method adds UUID to first candidate and truncates (if `slug_limit` is set).
307
+ #
308
+ # Examples:
309
+ #
310
+ # resolve_friendly_id_conflict(['12345'])
311
+ # # => '12345-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
312
+ #
313
+ # FriendlyId.defaults { |config| config.slug_limit = 40 }
314
+ # resolve_friendly_id_conflict(['12345'])
315
+ # # => '123-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
316
+ #
317
+ # candidates - the Array with candidates.
318
+ #
319
+ # Returns the String with new slug.
302
320
  def resolve_friendly_id_conflict(candidates)
303
- [candidates.first, SecureRandom.uuid].compact.join(friendly_id_config.sequence_separator)
321
+ uuid = SecureRandom.uuid
322
+ [
323
+ apply_slug_limit(candidates.first, uuid),
324
+ uuid
325
+ ].compact.join(friendly_id_config.sequence_separator)
304
326
  end
305
327
 
328
+ # Private: Apply slug limit to candidate.
329
+ #
330
+ # candidate - the String with candidate.
331
+ # uuid - the String with UUID.
332
+ #
333
+ # Return the String with truncated candidate.
334
+ def apply_slug_limit(candidate, uuid)
335
+ return candidate unless candidate && friendly_id_config.slug_limit
336
+
337
+ candidate[0...candidate_limit(uuid)]
338
+ end
339
+ private :apply_slug_limit
340
+
341
+ # Private: Get max length of candidate.
342
+ #
343
+ # uuid - the String with UUID.
344
+ #
345
+ # Returns the Integer with max length.
346
+ def candidate_limit(uuid)
347
+ [
348
+ friendly_id_config.slug_limit - uuid.size - friendly_id_config.sequence_separator.size,
349
+ 0
350
+ ].max
351
+ end
352
+ private :candidate_limit
353
+
306
354
  # Sets the slug.
307
355
  def set_slug(normalized_slug = nil)
308
356
  if should_generate_new_friendly_id?
@@ -334,11 +382,11 @@ Github issue](https://github.com/norman/friendly_id/issues/185) for discussion.
334
382
  end
335
383
  private :unset_slug_if_invalid
336
384
 
337
- # This module adds the `:slug_column`, and `:sequence_separator`, and
338
- # `:slug_generator_class` configuration options to
385
+ # This module adds the `:slug_column`, and `:slug_limit`, and `:sequence_separator`,
386
+ # and `:slug_generator_class` configuration options to
339
387
  # {FriendlyId::Configuration FriendlyId::Configuration}.
340
388
  module Configuration
341
- attr_writer :slug_column, :sequence_separator
389
+ attr_writer :slug_column, :slug_limit, :sequence_separator
342
390
  attr_accessor :slug_generator_class
343
391
 
344
392
  # Makes FriendlyId use the slug column for querying.
@@ -361,6 +409,11 @@ Github issue](https://github.com/norman/friendly_id/issues/185) for discussion.
361
409
  def slug_column
362
410
  @slug_column ||= defaults[:slug_column]
363
411
  end
412
+
413
+ # The limit that will be used for slug.
414
+ def slug_limit
415
+ @slug_limit ||= defaults[:slug_limit]
416
+ end
364
417
  end
365
418
  end
366
419
  end
@@ -1,3 +1,3 @@
1
1
  module FriendlyId
2
- VERSION = "5.2.1"
2
+ VERSION = '5.2.2'.freeze
3
3
  end
@@ -34,7 +34,7 @@ module FriendlyId
34
34
 
35
35
  slugged_tables.each do |table_name|
36
36
  add_column table_name, :slug, :string
37
- add_index table_name, :slug, :unique => true
37
+ add_index table_name, :slug, :unique => true if 'novels' != table_name
38
38
  end
39
39
 
40
40
  scoped_tables.each do |table_name|
@@ -44,7 +44,6 @@ module FriendlyId
44
44
  # This will be used to test scopes
45
45
  add_column :novels, :novelist_id, :integer
46
46
  add_column :novels, :publisher_id, :integer
47
- remove_index :novels, :slug
48
47
  add_index :novels, [:slug, :publisher_id, :novelist_id], :unique => true
49
48
 
50
49
  # This will be used to test column name quoting
@@ -271,6 +271,31 @@ class SlugSeparatorTest < TestCaseClass
271
271
 
272
272
  end
273
273
 
274
+ class SlugLimitTest < TestCaseClass
275
+
276
+ include FriendlyId::Test
277
+
278
+ class Journalist < ActiveRecord::Base
279
+ extend FriendlyId
280
+ friendly_id :name, :use => :slugged, :slug_limit => 40
281
+ end
282
+
283
+ def model_class
284
+ Journalist
285
+ end
286
+
287
+ test "should limit slug size" do
288
+ transaction do
289
+ m1 = model_class.create! :name => 'a' * 50
290
+ assert_equal m1.slug, 'a' * 40
291
+ m2 = model_class.create! :name => m1.name
292
+ m2.save!
293
+ # "aaa-<uid>"
294
+ assert_match(/\Aa{3}\-/, m2.slug)
295
+ end
296
+ end
297
+ end
298
+
274
299
  class DefaultScopeTest < TestCaseClass
275
300
 
276
301
  include FriendlyId::Test
@@ -424,4 +449,4 @@ class ConfigurableRoutesTest < TestCaseClass
424
449
  assert_equal novel.id.to_s, novel.to_param
425
450
  end
426
451
  end
427
- end
452
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: friendly_id
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.1
4
+ version: 5.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Norman Clarke
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-04-09 00:00:00.000000000 Z
12
+ date: 2017-09-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -225,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
225
  version: '0'
226
226
  requirements: []
227
227
  rubyforge_project: friendly_id
228
- rubygems_version: 2.5.2
228
+ rubygems_version: 2.6.13
229
229
  signing_key:
230
230
  specification_version: 4
231
231
  summary: A comprehensive slugging and pretty-URL plugin.