friendly_id 5.0.5 → 5.1.0.beta.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8e06bb63996e0c196fdc9b046374456806184bec
4
- data.tar.gz: 51da9c8b121bd5a6ced25d80ca159c3eb2e993d9
3
+ metadata.gz: 4f6c2b8454c78ef4f095d0bdc7f1541c59a2a975
4
+ data.tar.gz: bdd5bc1adf9f8aeb697587994b488bb863323b62
5
5
  SHA512:
6
- metadata.gz: 71d163c9f61753d7a9333885de13623458e2f41ab00aa0b26d29c772ad796678e50efb27c0026e584300453391302d5eeec6bfe2cb6e3258a4162df02791d70e
7
- data.tar.gz: 87b4bccf78201f7c6bf16b596e4ac77f7d34e494e8ebef11e8189f5da13af61b754b8341caff647f528d0f1b5ac7a336284d9f74f47965eb8d05f7797f5c93f0
6
+ metadata.gz: 5dfeb116b0f1a3dc381fb4ca22c6280f32a3989c3e0b93658b362512ea1670ba2dfc97f27689d8eb2c419da9b07386f1b9ff3297916a2809ef643ba725523a81
7
+ data.tar.gz: 89d1b972eaa26c8cacae62df4e709a4cba87aebfd3fc19c9a1bd7c3c4c97e179486289294c54209ff63b660db1543d12cba8ed0f304f279c7d6a30f7e2faad3f
data/Changelog.md CHANGED
@@ -3,7 +3,7 @@
3
3
  We would like to think our many {file:Contributors contributors} for
4
4
  suggestions, ideas and improvements to FriendlyId.
5
5
 
6
- ## 5.1.0 (2015-01-15)
6
+ ## 5.1.0 (NOT RELEASED YET)
7
7
 
8
8
  * FriendlyId will no longer allow blank strings as slugs ([#571](https://github.com/norman/friendly_id/pull/571)).
9
9
  * FriendlyId will now try to use the first non-reserved candidate as its
@@ -11,10 +11,6 @@ suggestions, ideas and improvements to FriendlyId.
11
11
  * Fix order dependence bug between history and scoped modules ([#588](https://github.com/norman/friendly_id/pull/588)).
12
12
  * Fix "friendly" finds on Rails 4.2 ([#607](https://github.com/norman/friendly_id/issues/607)).
13
13
 
14
- ## 5.0.5 (2015-01-15)
15
-
16
- * Backported bugfixes and Rails 4.2 support from 5.1.0.
17
-
18
14
  ## 5.0.4 (2014-05-29)
19
15
 
20
16
  * Bug fix for call to removed `primary` method on Edge Rails. ([#557](https://github.com/norman/friendly_id/pull/557)).
data/README.md CHANGED
@@ -38,6 +38,8 @@ versioning, i18n, scoped slugs, reserved words, and custom slug generators.
38
38
 
39
39
  ### What Changed in Version 5.1
40
40
 
41
+ _NOTE: 5.1 is the latest beta version and will be released soon._
42
+
41
43
  5.1 is a bugfix release, but bumps the minor version because some applications may be dependent
42
44
  on the previously buggy behavior. The changes include:
43
45
 
@@ -14,12 +14,16 @@ module FriendlyId
14
14
  end
15
15
 
16
16
  # Visits each candidate, calls it, passes it to `normalize_friendly_id` and
17
- # yields the wanted slug candidates.
17
+ # yields any wanted and unreserved slug candidates.
18
18
  def each(*args, &block)
19
- @candidates.map do |candidate|
20
- slug = @object.normalize_friendly_id(candidate.map(&:call).join(' '))
21
- yield slug if wanted?(slug)
19
+ pre_candidates = @candidates.map do |candidate|
20
+ @object.normalize_friendly_id(candidate.map(&:call).join(' '))
21
+ end.select {|x| wanted?(x)}
22
+
23
+ unless pre_candidates.all? {|x| reserved?(x)}
24
+ pre_candidates.reject! {|x| reserved?(x)}
22
25
  end
26
+ pre_candidates.each {|x| yield x}
23
27
  end
24
28
 
25
29
  private
@@ -44,7 +48,16 @@ module FriendlyId
44
48
  end
45
49
 
46
50
  def wanted?(slug)
47
- !slug.blank?
51
+ slug.present?
52
+ end
53
+
54
+ private
55
+
56
+ def reserved?(slug)
57
+ config = @object.friendly_id_config
58
+ return false unless config.uses? ::FriendlyId::Reserved
59
+ return false unless config.reserved_words
60
+ config.reserved_words.include?(slug)
48
61
  end
49
62
  end
50
63
  end
@@ -251,9 +251,9 @@ Github issue](https://github.com/norman/friendly_id/issues/185) for discussion.
251
251
  # Process the given value to make it suitable for use as a slug.
252
252
  #
253
253
  # This method is not intended to be invoked directly; FriendlyId uses it
254
- # internally to process strings into slugs.
254
+ # internaly to process strings into slugs.
255
255
  #
256
- # However, if FriendlyId's default slug generation doesn't suit your needs,
256
+ # However, if FriendlyId's default slug generation doesn't suite your needs,
257
257
  # you can override this method in your model class to control exactly how
258
258
  # slugs are generated.
259
259
  #
@@ -1,3 +1,3 @@
1
1
  module FriendlyId
2
- VERSION = "5.0.5"
2
+ VERSION = "5.1.0.beta.1"
3
3
  end
@@ -0,0 +1,117 @@
1
+ require "helper"
2
+
3
+ class CandidatesTest < Minitest::Test
4
+
5
+ include FriendlyId::Test
6
+
7
+ class City < ActiveRecord::Base
8
+ extend FriendlyId
9
+ friendly_id :slug_candidates, use: :slugged
10
+ alias_attribute :slug_candidates, :name
11
+ end
12
+
13
+ def model_class
14
+ City
15
+ end
16
+
17
+ def with_instances_of(klass = model_class, &block)
18
+ transaction do
19
+ city1 = klass.create! :name => "New York", :code => "JFK"
20
+ city2 = klass.create! :name => "New York", :code => "EWR"
21
+ yield city1, city2
22
+ end
23
+ end
24
+ alias_method :with_instances, :with_instances_of
25
+
26
+ test "resolves conflict with candidate" do
27
+ with_instances do |city1, city2|
28
+ assert_equal "new-york", city1.slug
29
+ assert_match(/\Anew-york-([a-z0-9]+\-){4}[a-z0-9]+\z/, city2.slug)
30
+ end
31
+ end
32
+
33
+ test "accepts candidate as symbol" do
34
+ klass = Class.new model_class do
35
+ def slug_candidates
36
+ :name
37
+ end
38
+ end
39
+ with_instances_of klass do |_, city|
40
+ assert_match(/\Anew-york-([a-z0-9]+\-){4}[a-z0-9]+\z/, city.slug)
41
+ end
42
+ end
43
+
44
+ test "accepts multiple candidates" do
45
+ klass = Class.new model_class do
46
+ def slug_candidates
47
+ [name, code]
48
+ end
49
+ end
50
+ with_instances_of klass do |_, city|
51
+ assert_equal "ewr", city.slug
52
+ end
53
+ end
54
+
55
+ test "ignores blank candidate" do
56
+ klass = Class.new model_class do
57
+ def slug_candidates
58
+ [name, ""]
59
+ end
60
+ end
61
+ with_instances_of klass do |_, city|
62
+ assert_match(/\Anew-york-([a-z0-9]+\-){4}[a-z0-9]+\z/, city.slug)
63
+ end
64
+ end
65
+
66
+ test "ignores nil candidate" do
67
+ klass = Class.new model_class do
68
+ def slug_candidates
69
+ [name, nil]
70
+ end
71
+ end
72
+ with_instances_of klass do |_, city|
73
+ assert_match(/\Anew-york-([a-z0-9]+\-){4}[a-z0-9]+\z/, city.slug)
74
+ end
75
+ end
76
+
77
+ test "accepts candidate with nested array" do
78
+ klass = Class.new model_class do
79
+ def slug_candidates
80
+ [name, [name, code]]
81
+ end
82
+ end
83
+ with_instances_of klass do |_, city|
84
+ assert_equal "new-york-ewr", city.slug
85
+ end
86
+ end
87
+
88
+ test "accepts candidate with lambda" do
89
+ klass = Class.new City do
90
+ def slug_candidates
91
+ [name, [name, ->{ rand 1000 }]]
92
+ end
93
+ end
94
+ with_instances_of klass do |_, city|
95
+ assert_match(/\Anew-york-\d{,3}\z/, city.friendly_id)
96
+ end
97
+ end
98
+
99
+ test "accepts candidate with object" do
100
+ klass = Class.new City do
101
+ class Airport
102
+ def initialize(code)
103
+ @code = code
104
+ end
105
+ attr_reader :code
106
+ alias_method :to_s, :code
107
+ end
108
+ def slug_candidates
109
+ [name, [name, Airport.new(code)]]
110
+ end
111
+ end
112
+ with_instances_of klass do |_, city|
113
+ assert_equal "new-york-ewr", city.friendly_id
114
+ end
115
+ end
116
+
117
+ end
@@ -6,13 +6,17 @@ class ReservedTest < Minitest::Test
6
6
 
7
7
  class Journalist < ActiveRecord::Base
8
8
  extend FriendlyId
9
- friendly_id :name, :use => [:slugged, :reserved], :reserved_words => %w(new edit)
9
+ friendly_id :slug_candidates, :use => [:slugged, :reserved], :reserved_words => %w(new edit)
10
10
 
11
11
  after_validation :move_friendly_id_error_to_name
12
12
 
13
13
  def move_friendly_id_error_to_name
14
14
  errors.add :name, *errors.delete(:friendly_id) if errors[:friendly_id].present?
15
15
  end
16
+
17
+ def slug_candidates
18
+ name
19
+ end
16
20
  end
17
21
 
18
22
  def model_class
@@ -37,4 +41,25 @@ class ReservedTest < Minitest::Test
37
41
  end
38
42
  end
39
43
 
44
+ test "should reject reserved candidates" do
45
+ transaction do
46
+ record = model_class.new(:name => 'new')
47
+ def record.slug_candidates
48
+ [:name, "foo"]
49
+ end
50
+ record.save!
51
+ assert_equal "foo", record.friendly_id
52
+ end
53
+ end
54
+
55
+ test "should be invalid if all candidates are reserved" do
56
+ transaction do
57
+ record = model_class.new(:name => 'new')
58
+ def record.slug_candidates
59
+ ["edit", "new"]
60
+ end
61
+ assert_raises(ActiveRecord::RecordInvalid) {record.save!}
62
+ end
63
+ end
64
+
40
65
  end
data/test/schema.rb CHANGED
@@ -64,13 +64,16 @@ module FriendlyId
64
64
  # Used to test :scoped and :history together
65
65
  add_column :restaurants, :city_id, :integer
66
66
 
67
+ # Used to test candidates
68
+ add_column :cities, :code, :string, :limit => 3
69
+
67
70
  @done = true
68
71
  end
69
72
 
70
73
  private
71
74
 
72
75
  def slugged_tables
73
- %w[journalists articles novelists novels manuals]
76
+ %w[journalists articles novelists novels manuals cities]
74
77
  end
75
78
 
76
79
  def tables_with_uuid_primary_key
@@ -82,7 +85,7 @@ module FriendlyId
82
85
  end
83
86
 
84
87
  def simple_tables
85
- %w[authors books publishers cities]
88
+ %w[authors books publishers]
86
89
  end
87
90
 
88
91
  def tables
data/test/shared.rb CHANGED
@@ -69,7 +69,6 @@ module FriendlyId
69
69
  assert_equal record.to_param, record.friendly_id
70
70
  end
71
71
  end
72
-
73
72
  end
74
73
 
75
74
  module Core
@@ -181,4 +180,3 @@ module FriendlyId
181
180
  end
182
181
  end
183
182
  end
184
-
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.0.5
4
+ version: 5.1.0.beta.1
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: 2015-01-16 00:00:00.000000000 Z
12
+ date: 2014-12-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -184,6 +184,7 @@ files:
184
184
  - lib/friendly_id/version.rb
185
185
  - lib/generators/friendly_id_generator.rb
186
186
  - test/base_test.rb
187
+ - test/candidates_test.rb
187
188
  - test/configuration_test.rb
188
189
  - test/core_test.rb
189
190
  - test/databases.yml
@@ -214,9 +215,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
214
215
  version: 1.9.3
215
216
  required_rubygems_version: !ruby/object:Gem::Requirement
216
217
  requirements:
217
- - - ">="
218
+ - - ">"
218
219
  - !ruby/object:Gem::Version
219
- version: '0'
220
+ version: 1.3.1
220
221
  requirements: []
221
222
  rubyforge_project: friendly_id
222
223
  rubygems_version: 2.4.4