friendly_id4 4.0.0.beta1

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.
@@ -0,0 +1,46 @@
1
+ require File.expand_path("../helper.rb", __FILE__)
2
+
3
+ class Manual < ActiveRecord::Base
4
+ include FriendlyId::History
5
+ has_friendly_id :name
6
+ end
7
+
8
+ class HistoryTest < MiniTest::Unit::TestCase
9
+
10
+ include FriendlyId::Test
11
+ include FriendlyId::Test::Shared
12
+
13
+ def klass
14
+ Manual
15
+ end
16
+
17
+ test "should insert record in slugs table on create" do
18
+ with_instance_of(klass) {|record| assert !record.friendly_id_slugs.empty?}
19
+ end
20
+
21
+ test "should not create new slug record if friendly_id is not changed" do
22
+ with_instance_of(klass) do |record|
23
+ record.active = true
24
+ record.save!
25
+ assert_equal 1, FriendlyIdSlug.count
26
+ end
27
+ end
28
+
29
+ test "should create new slug record when friendly_id changes" do
30
+ with_instance_of(klass) do |record|
31
+ record.name = record.name + "b"
32
+ record.save!
33
+ assert_equal 2, FriendlyIdSlug.count
34
+ end
35
+ end
36
+
37
+ test "should be findable by old slugs" do
38
+ with_instance_of(klass) do |record|
39
+ old_friendly_id = record.friendly_id
40
+ record.name = record.name + "b"
41
+ record.save!
42
+ assert found = klass.find_by_friendly_id(old_friendly_id)
43
+ assert !found.readonly?
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path("../helper.rb", __FILE__)
2
+
3
+
4
+ class ObjectUtilsTest < MiniTest::Unit::TestCase
5
+
6
+ include FriendlyId::Test
7
+
8
+ test "strings with letters are friendly_ids" do
9
+ assert "a".friendly_id?
10
+ end
11
+
12
+ test "integers should be unfriendly ids" do
13
+ assert 1.unfriendly_id?
14
+ end
15
+
16
+ test "numeric strings are neither friendly nor unfriendly" do
17
+ assert_equal nil, "1".friendly_id?
18
+ assert_equal nil, "1".unfriendly_id?
19
+ end
20
+
21
+ test "ActiveRecord::Base instances should be unfriendly_ids" do
22
+ klass = Class.new(ActiveRecord::Base)
23
+ klass.table_name = "authors"
24
+ assert klass.new.unfriendly_id?
25
+ end
26
+ end
@@ -0,0 +1,53 @@
1
+ require "friendly_id/migration"
2
+
3
+ module FriendlyId
4
+ module Test
5
+ class Schema < ActiveRecord::Migration
6
+ class << self
7
+ def down
8
+ CreateFriendlyIdSlugs.down
9
+ tables.each do |name|
10
+ drop_table name
11
+ end
12
+ end
13
+
14
+ def up
15
+ CreateFriendlyIdSlugs.up
16
+
17
+ tables.each do |table_name|
18
+ create_table table_name do |t|
19
+ t.string :name
20
+ t.boolean :active
21
+ end
22
+ end
23
+
24
+ slugged_tables.each do |table_name|
25
+ add_column table_name, :slug, :string
26
+ add_index table_name, :slug, :unique => true
27
+ end
28
+
29
+ # This will be used to test scopes
30
+ add_column :novels, :novelist_id, :integer
31
+ remove_index :novels, :slug
32
+
33
+ # This will be used to test column name quoting
34
+ add_column :journalists, "strange name", :string
35
+ end
36
+
37
+ private
38
+
39
+ def slugged_tables
40
+ ["journalists", "articles", "novelists", "novels", "manuals"]
41
+ end
42
+
43
+ def simple_tables
44
+ ["authors", "books"]
45
+ end
46
+
47
+ def tables
48
+ simple_tables + slugged_tables
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,49 @@
1
+ require File.expand_path("../helper", __FILE__)
2
+
3
+ class Novelist < ActiveRecord::Base
4
+ include FriendlyId::Slugged
5
+ has_friendly_id :name
6
+ end
7
+
8
+ class Novel < ActiveRecord::Base
9
+ include FriendlyId::Scoped
10
+ belongs_to :novelist
11
+ has_friendly_id :name, :scope => :novelist
12
+ end
13
+
14
+ class ScopedTest < MiniTest::Unit::TestCase
15
+
16
+ include FriendlyId::Test
17
+ include FriendlyId::Test::Shared
18
+
19
+ def klass
20
+ Novel
21
+ end
22
+
23
+ test "should detect scope column from belongs_to relation" do
24
+ assert_equal "novelist_id", Novel.friendly_id_config.scope_column
25
+ end
26
+
27
+ test "should detect scope column from explicit column name" do
28
+ klass = Class.new(ActiveRecord::Base)
29
+ klass.has_friendly_id :empty, :scope => :dummy
30
+ assert_equal "dummy", klass.friendly_id_config.scope_column
31
+ end
32
+
33
+ test "should allow duplicate slugs outside scope" do
34
+ transaction do
35
+ novel1 = Novel.create! :name => "a", :novelist => Novelist.create!(:name => "a")
36
+ novel2 = Novel.create! :name => "a", :novelist => Novelist.create!(:name => "b")
37
+ assert_equal novel1.friendly_id, novel2.friendly_id
38
+ end
39
+ end
40
+
41
+ test "should not allow duplicate slugs inside scope" do
42
+ with_instance_of Novelist do |novelist|
43
+ novel1 = Novel.create! :name => "a", :novelist => novelist
44
+ novel2 = Novel.create! :name => "a", :novelist => novelist
45
+ assert novel1.friendly_id != novel2.friendly_id
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,76 @@
1
+ module FriendlyId
2
+ module Test
3
+ module Shared
4
+
5
+ test "finds should respect conditions" do
6
+ with_instance_of(klass) do |record|
7
+ assert_raises(ActiveRecord::RecordNotFound) do
8
+ klass.where("1 = 2").find record.friendly_id
9
+ end
10
+ end
11
+ end
12
+
13
+ test "should be findable by friendly id" do
14
+ with_instance_of(klass) {|record| assert klass.find record.friendly_id}
15
+ end
16
+
17
+ test "should be findable by id as integer" do
18
+ with_instance_of(klass) {|record| assert klass.find record.id.to_i}
19
+ end
20
+
21
+ test "should be findable by id as string" do
22
+ with_instance_of(klass) {|record| assert klass.find record.id.to_s}
23
+ end
24
+
25
+ test "should be findable by numeric friendly_id" do
26
+ with_instance_of(klass, :name => "206") {|record| assert klass.find record.friendly_id}
27
+ end
28
+
29
+ test "to_param should return the friendly_id" do
30
+ with_instance_of(klass) {|record| assert_equal record.friendly_id, record.to_param}
31
+ end
32
+
33
+ test "should be findable by themselves" do
34
+ with_instance_of(klass) {|record| assert_equal record, klass.find(record)}
35
+ end
36
+
37
+ test "updating record's other values should not change the friendly_id" do
38
+ with_instance_of klass do |record|
39
+ old = record.friendly_id
40
+ record.update_attributes! :active => false
41
+ assert klass.find old
42
+ end
43
+ end
44
+
45
+ test "instances found by a single id should not be read-only" do
46
+ with_instance_of(klass) {|record| assert !klass.find(record.friendly_id).readonly?}
47
+ end
48
+
49
+ test "failing finds with unfriendly_id should raise errors normally" do
50
+ assert_raises(ActiveRecord::RecordNotFound) {klass.find 0}
51
+ end
52
+
53
+ test "should return numeric id if the friendly_id is nil" do
54
+ with_instance_of(klass) do |record|
55
+ record.expects(:friendly_id).returns(nil)
56
+ assert_equal record.id.to_s, record.to_param
57
+ end
58
+ end
59
+
60
+ test "should return numeric id if the friendly_id is an empty string" do
61
+ with_instance_of(klass) do |record|
62
+ record.expects(:friendly_id).returns("")
63
+ assert_equal record.id.to_s, record.to_param
64
+ end
65
+ end
66
+
67
+ test "should return numeric id if the friendly_id is blank" do
68
+ with_instance_of(klass) do |record|
69
+ record.expects(:friendly_id).returns(" ")
70
+ assert_equal record.id.to_s, record.to_param
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+
@@ -0,0 +1,111 @@
1
+ require File.expand_path("../helper.rb", __FILE__)
2
+
3
+ Journalist, Article = 2.times.map do
4
+ Class.new(ActiveRecord::Base) do
5
+ include FriendlyId::Slugged
6
+ has_friendly_id :name
7
+ end
8
+ end
9
+
10
+ class SluggedTest < MiniTest::Unit::TestCase
11
+
12
+ include FriendlyId::Test
13
+ include FriendlyId::Test::Shared
14
+
15
+ def klass
16
+ Journalist
17
+ end
18
+
19
+ test "configuration should have a sequence_separator" do
20
+ assert !klass.friendly_id_config.sequence_separator.empty?
21
+ end
22
+
23
+ test "should make a new slug if the friendly_id method value has changed" do
24
+ with_instance_of klass do |record|
25
+ record.name = "Changed Value"
26
+ record.save!
27
+ assert_equal "changed-value", record.slug
28
+ end
29
+ end
30
+
31
+ test "should increment the slug sequence for duplicate friendly ids" do
32
+ with_instance_of klass do |record|
33
+ record2 = klass.create! :name => record.name
34
+ assert record2.friendly_id.match(/2\z/)
35
+ end
36
+ end
37
+
38
+ test "should not add slug sequence on update after other conflicting slugs were added" do
39
+ with_instance_of klass do |record|
40
+ old = record.friendly_id
41
+ record2 = klass.create! :name => record.name
42
+ record.save!
43
+ record.reload
44
+ assert_equal old, record.to_param
45
+ end
46
+ end
47
+ end
48
+
49
+ class SlugSequencerTest < MiniTest::Unit::TestCase
50
+
51
+ include FriendlyId::Test
52
+
53
+ test "should quote column names" do
54
+ klass = Class.new(ActiveRecord::Base)
55
+ klass.table_name = "journalists"
56
+ klass.send :include, FriendlyId::Slugged
57
+ klass.has_friendly_id :name, :slug_column => "strange name"
58
+ begin
59
+ with_instance_of(klass) {|record| assert klass.find(record.friendly_id)}
60
+ rescue ActiveRecord::StatementInvalid
61
+ flunk "column name was not quoted"
62
+ end
63
+ end
64
+ end
65
+
66
+ class SlugSeparatorTest < MiniTest::Unit::TestCase
67
+
68
+ include FriendlyId::Test
69
+
70
+ class Journalist < ActiveRecord::Base
71
+ include FriendlyId::Slugged
72
+ has_friendly_id :name, :sequence_separator => ":"
73
+ end
74
+
75
+ def klass
76
+ Journalist
77
+ end
78
+
79
+ test "should increment sequence with configured sequence separator" do
80
+ with_instance_of klass do |record|
81
+ record2 = klass.create! :name => record.name
82
+ assert record2.friendly_id.match(/:2\z/)
83
+ end
84
+ end
85
+
86
+ test "should detect when a sequenced slug has changed" do
87
+ with_instance_of klass do |record|
88
+ record2 = klass.create! :name => record.name
89
+ assert !record2.slug_sequencer.slug_changed?
90
+ record2.name = "hello world"
91
+ assert record2.slug_sequencer.slug_changed?
92
+ end
93
+ end
94
+ end
95
+
96
+ class SluggedRegressionsTest < MiniTest::Unit::TestCase
97
+ include FriendlyId::Test
98
+
99
+ def klass
100
+ Journalist
101
+ end
102
+
103
+ test "should increment the slug sequence for duplicate friendly ids beyond 10" do
104
+ with_instance_of klass do |record|
105
+ (2..12).each do |i|
106
+ r = klass.create! :name => record.name
107
+ assert r.friendly_id.match(/#{i}\z/)
108
+ end
109
+ end
110
+ end
111
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: friendly_id4
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: 6
5
+ version: 4.0.0.beta1
6
+ platform: ruby
7
+ authors:
8
+ - Norman Clarke
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-07-14 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: activerecord
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: "3.0"
24
+ type: :development
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: sqlite3
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: "1.3"
35
+ type: :development
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: cutest
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.1.2
46
+ type: :development
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: ffaker
50
+ prerelease: false
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
+ name: maruku
61
+ prerelease: false
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ type: :development
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: yard
72
+ prerelease: false
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ type: :development
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
82
+ name: mocha
83
+ prerelease: false
84
+ requirement: &id007 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ type: :development
91
+ version_requirements: *id007
92
+ description: " FriendlyId is the \"Swiss Army bulldozer\" of slugging and permalink plugins\n for Ruby on Rails. It allows you to create pretty URL's and work with\n human-friendly strings as if they were numeric ids for ActiveRecord models.\n"
93
+ email:
94
+ - norman@njclarke.com
95
+ executables: []
96
+
97
+ extensions: []
98
+
99
+ extra_rdoc_files: []
100
+
101
+ files:
102
+ - .gitignore
103
+ - Gemfile
104
+ - Guide.md
105
+ - README.md
106
+ - Rakefile
107
+ - WhatsNew.md
108
+ - bench.rb
109
+ - friendly_id.gemspec
110
+ - lib/friendly_id.rb
111
+ - lib/friendly_id/base.rb
112
+ - lib/friendly_id/configuration.rb
113
+ - lib/friendly_id/finder_methods.rb
114
+ - lib/friendly_id/history.rb
115
+ - lib/friendly_id/migration.rb
116
+ - lib/friendly_id/model.rb
117
+ - lib/friendly_id/object_utils.rb
118
+ - lib/friendly_id/scoped.rb
119
+ - lib/friendly_id/slug.rb
120
+ - lib/friendly_id/slug_sequencer.rb
121
+ - lib/friendly_id/slugged.rb
122
+ - lib/friendly_id/version.rb
123
+ - lib/generators/friendly_id_generator.rb
124
+ - test/config/mysql.yml
125
+ - test/config/postgres.yml
126
+ - test/config/sqlite3.yml
127
+ - test/core_test.rb
128
+ - test/helper.rb
129
+ - test/history_test.rb
130
+ - test/object_utils_test.rb
131
+ - test/schema.rb
132
+ - test/scoped_test.rb
133
+ - test/shared.rb
134
+ - test/slugged_test.rb
135
+ homepage: http://norman.github.com/friendly_id
136
+ licenses: []
137
+
138
+ post_install_message:
139
+ rdoc_options: []
140
+
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: "0"
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ">"
153
+ - !ruby/object:Gem::Version
154
+ version: 1.3.1
155
+ requirements: []
156
+
157
+ rubyforge_project: friendly_id
158
+ rubygems_version: 1.8.5
159
+ signing_key:
160
+ specification_version: 3
161
+ summary: A comprehensive slugging and pretty-URL plugin.
162
+ test_files: []
163
+