friendly_id4 4.0.0.pre → 4.0.0.pre3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,41 @@
1
+ require "rubygems"
2
+ require "bundler/setup"
3
+ require "active_record"
4
+ require "active_support"
5
+ require "friendly_id"
6
+ $VERBOSE = true
7
+
8
+ ActiveRecord::Migration.verbose = false
9
+
10
+ # Change the connection args as you see fit to test against different adapters.
11
+ ActiveRecord::Base.establish_connection \
12
+ :adapter => "sqlite3",
13
+ :database => ":memory:"
14
+
15
+ # If you want to see the ActiveRecord log, invoke the tests using `rake test LOG=true`
16
+ if ENV["LOG"]
17
+ require "logger"
18
+ ActiveRecord::Base.logger = Logger.new($stdout)
19
+ end
20
+
21
+ User, Book = ["users", "books"].map do |table_name|
22
+ ActiveRecord::Migration.create_table table_name do |t|
23
+ t.string :name
24
+ t.boolean :active
25
+ end
26
+ Class.new(ActiveRecord::Base)
27
+ end
28
+
29
+ def transaction
30
+ ActiveRecord::Base.transaction { yield ; raise ActiveRecord::Rollback }
31
+ end
32
+
33
+ def with_instance_of(*args)
34
+ klass = args.shift
35
+ args[0] ||= {:name => "a"}
36
+ transaction { yield klass.create!(*args) }
37
+ end
38
+
39
+ def migration
40
+ yield ActiveRecord::Migration
41
+ end
@@ -0,0 +1,46 @@
1
+ require File.expand_path("../helper.rb", __FILE__)
2
+ require "friendly_id/migration"
3
+
4
+ CreateFriendlyIdSlugs.up
5
+
6
+ migration do |m|
7
+ m.add_column :users, :slug, :string
8
+ end
9
+
10
+ User.send :include, FriendlyId::History
11
+ User.has_friendly_id :name
12
+
13
+ setup {User}
14
+
15
+
16
+ test "should insert record in slugs table on create" do |klass|
17
+ with_instance_of(klass) {|record| assert !record.friendly_id_slugs.empty?}
18
+ end
19
+
20
+ test "should not create new slug record if friendly_id is not changed" do |klass|
21
+ with_instance_of(klass) do |record|
22
+ record.active = true
23
+ record.save!
24
+ assert_equal 1, FriendlyIdSlug.count
25
+ end
26
+ end
27
+
28
+ test "should create new slug record when friendly_id changes" do |klass|
29
+ with_instance_of(klass) do |record|
30
+ record.name = record.name + "b"
31
+ record.save!
32
+ assert_equal 2, FriendlyIdSlug.count
33
+ end
34
+ end
35
+
36
+ test "should be findable by old slugs" do |klass|
37
+ with_instance_of(klass) do |record|
38
+ old_friendly_id = record.friendly_id
39
+ record.name = record.name + "b"
40
+ record.save!
41
+ assert found = klass.find_by_friendly_id(old_friendly_id)
42
+ assert !found.readonly?
43
+ end
44
+ end
45
+
46
+ require File.expand_path("../shared.rb", __FILE__)
@@ -0,0 +1,18 @@
1
+ require File.expand_path("../helper.rb", __FILE__)
2
+
3
+ test "strings with letters are friendly_ids" do
4
+ assert "a".friendly_id?
5
+ end
6
+
7
+ test "integers should be unfriendly ids" do
8
+ assert 1.unfriendly_id?
9
+ end
10
+
11
+ test "numeric strings are neither friendly nor unfriendly" do
12
+ assert_equal nil, "1".friendly_id?
13
+ assert_equal nil, "1".unfriendly_id?
14
+ end
15
+
16
+ test "ActiveRecord::Base instances should be unfriendly_ids" do
17
+ assert User.new.unfriendly_id?
18
+ end
@@ -1,61 +1,42 @@
1
1
  # encoding: utf-8
2
- require File.expand_path("../test_helper", __FILE__)
3
- require "friendly_id/scoped"
2
+ require File.expand_path("../helper", __FILE__)
4
3
 
5
- Restaurant = make_model("restaurants", :name) do |t|
6
- t.string :name
7
- t.string :slug
8
- t.integer :city_id
4
+ migration do |m|
5
+ m.add_column :books, :slug, :string
6
+ m.add_column :books, :user_id, :integer
9
7
  end
10
8
 
11
- City = make_model("cities", :name) do |t|
12
- t.string :name
13
- t.string :slug
14
- end
15
-
16
- Restaurant.belongs_to :city
17
- City.has_many :restaurants
18
- City.send :include, FriendlyId::Slugged
19
- Restaurant.send :include, FriendlyId::Scoped
20
- Restaurant.has_friendly_id :name, :scope => :city
21
-
22
- class ScopedTest < Test::Unit::TestCase
9
+ User.has_many :books
10
+ Book.belongs_to :user
11
+ Book.send :include, FriendlyId::Scoped
12
+ Book.has_friendly_id :name, :scope => :user
23
13
 
24
- def setup
25
- Restaurant.delete_all
26
- City.delete_all
27
- end
28
-
29
- test "should detect scope column from belongs_to relation" do
30
- assert_equal "city_id", Restaurant.friendly_id_config.scope_column
31
- end
14
+ test "should detect scope column from belongs_to relation" do
15
+ assert_equal "user_id", Book.friendly_id_config.scope_column
16
+ end
32
17
 
33
- test "should detect scope column from explicit column name" do
34
- klass = Class.new(ActiveRecord::Base)
35
- klass.has_friendly_id :empty, :scope => :dummy
36
- assert_equal "dummy", klass.friendly_id_config.scope_column
37
- end
18
+ test "should detect scope column from explicit column name" do
19
+ klass = Class.new(ActiveRecord::Base)
20
+ klass.has_friendly_id :empty, :scope => :dummy
21
+ assert_equal "dummy", klass.friendly_id_config.scope_column
22
+ end
38
23
 
39
- test "should allow duplicate slugs outside scope" do
40
- c1 = City.create! :name => "Nuñez"
41
- c2 = City.create! :name => "Las Cañitas"
42
- r1 = Restaurant.create! :name => "La Guitarrita", :city => c1
43
- r2 = Restaurant.create! :name => "La Guitarrita", :city => c2
44
- assert_equal r1.friendly_id, r2.friendly_id
24
+ test "should allow duplicate slugs outside scope" do
25
+ transaction do
26
+ book1 = Book.create! :name => "a", :user => User.create!(:name => "a")
27
+ book2 = Book.create! :name => "a", :user => User.create!(:name => "b")
28
+ assert_equal book1.friendly_id, book2.friendly_id
45
29
  end
30
+ end
46
31
 
47
- test "should not allow duplicate slugs inside scope" do
48
- c1 = City.create! :name => "Nuñez"
49
- r1 = Restaurant.create! :name => "La Guitarrita", :city => c1
50
- r2 = Restaurant.create! :name => "La Guitarrita", :city => c1
51
- assert_not_equal "la-guitarrita", r2.friendly_id
32
+ test "should not allow duplicate slugs inside scope" do
33
+ with_instance_of User do |user|
34
+ book1 = Book.create! :name => "a", :user => user
35
+ book2 = Book.create! :name => "a", :user => user
36
+ assert book1.friendly_id != book2.friendly_id
52
37
  end
38
+ end
53
39
 
54
- test "updating record's other values should not change the friendly_id" do
55
- city = City.create! :name => "Nuñez"
56
- old = city.friendly_id
57
- city.save!
58
- assert_equal old, city.friendly_id
59
- end
40
+ setup { Book }
60
41
 
61
- end
42
+ require File.expand_path("../shared.rb", __FILE__)
@@ -0,0 +1,47 @@
1
+ test "finds should respect conditions" do |klass|
2
+ with_instance_of(klass) do |record|
3
+ assert_raise(ActiveRecord::RecordNotFound) do
4
+ klass.where("1 = 2").find record.friendly_id
5
+ end
6
+ end
7
+ end
8
+
9
+ test "should be findable by friendly id" do |klass|
10
+ with_instance_of(klass) {|record| assert klass.find record.friendly_id}
11
+ end
12
+
13
+ test "should be findable by id as integer" do |klass|
14
+ with_instance_of(klass) {|record| assert klass.find record.id.to_i}
15
+ end
16
+
17
+ test "should be findable by id as string" do |klass|
18
+ with_instance_of(klass) {|record| assert klass.find record.id.to_s}
19
+ end
20
+
21
+ test "should be findable by numeric friendly_id" do |klass|
22
+ with_instance_of(klass, :name => "206") {|record| assert klass.find record.friendly_id}
23
+ end
24
+
25
+ test "to_param should return the friendly_id" do |klass|
26
+ with_instance_of(klass) {|record| assert_equal record.friendly_id, record.to_param}
27
+ end
28
+
29
+ test "should be findable by themselves" do |klass|
30
+ with_instance_of(klass) {|record| assert_equal record, klass.find(record)}
31
+ end
32
+
33
+ test "updating record's other values should not change the friendly_id" do |klass|
34
+ with_instance_of klass do |record|
35
+ old = record.friendly_id
36
+ record.update_attributes! :active => false
37
+ assert klass.find old
38
+ end
39
+ end
40
+
41
+ test "instances found by a single id should not be read-only" do |klass|
42
+ with_instance_of(klass) {|record| assert !klass.find(record.friendly_id).readonly?}
43
+ end
44
+
45
+ test "failing finds with unfriendly_id should raise errors normally" do |klass|
46
+ assert_raise(ActiveRecord::RecordNotFound) {klass.find 0}
47
+ end
@@ -1,64 +1,43 @@
1
- require File.expand_path("../test_helper", __FILE__)
2
- require "friendly_id/slugged"
1
+ require File.expand_path("../helper.rb", __FILE__)
3
2
 
4
- class SluggedTest < Test::Unit::TestCase
5
-
6
- include FriendlyId::Test::Generic
7
-
8
- def instance(name = "user")
9
- @instance ||= klass.create!(:name => name)
10
- end
11
-
12
- def klass
13
- return @@klass if defined?(@@klass)
14
- @@klass = make_model("slugged_model", :name) do |t|
15
- t.string :name, :unique => true
16
- t.string :slug, :unique => true
17
- t.boolean :active, :default => true
18
- end
19
- @@klass.send :include, FriendlyId::Slugged
20
- @@klass
3
+ [User, Book].map do |klass|
4
+ migration do |m|
5
+ m.add_column klass.table_name, :slug, :string
6
+ m.add_index klass.table_name, :slug, :unique => true
21
7
  end
8
+ klass.send :include, FriendlyId::Slugged
9
+ klass.has_friendly_id :name
10
+ end
22
11
 
23
- def other_class
24
- return @@other_class if defined?(@@other_class)
25
- @@other_class = make_model("other_slugged_model", :name) do |t|
26
- t.string :name, :unique => true
27
- t.string :slug, :unique => true
28
- t.boolean :active, :default => true
29
- end
30
- @@other_class.send :include, FriendlyId::Slugged
31
- @@other_class
32
- end
12
+ setup { User }
33
13
 
34
- def setup
35
- klass.delete_all
36
- other_class.delete_all
37
- end
14
+ require File.expand_path("../shared.rb", __FILE__)
38
15
 
39
- test "configuration should have a sequence_separator" do
40
- assert_not_nil klass.friendly_id_config.sequence_separator
41
- end
16
+ test "configuration should have a sequence_separator" do |klass|
17
+ assert !klass.friendly_id_config.sequence_separator.empty?
18
+ end
42
19
 
43
- test "should make a new slug if the friendly_id method value has changed" do
44
- instance.name = "Changed Value"
45
- instance.save!
46
- assert_equal "changed-value", instance.slug
20
+ test "should make a new slug if the friendly_id method value has changed" do |klass|
21
+ with_instance_of klass do |record|
22
+ record.name = "Changed Value"
23
+ record.save!
24
+ assert_equal "changed-value", record.slug
47
25
  end
26
+ end
48
27
 
49
- test "should increment the slug sequence for duplicate friendly ids" do
50
- instance2 = klass.create! :name => instance.name
51
- assert_match(/2\z/, instance2.friendly_id)
52
- instance3 = klass.create! :name => instance.name
53
- assert_match(/3\z/, instance3.friendly_id)
28
+ test "should increment the slug sequence for duplicate friendly ids" do |klass|
29
+ with_instance_of klass do |record|
30
+ record2 = klass.create! :name => record.name
31
+ assert record2.friendly_id.match(/2\z/)
54
32
  end
33
+ end
55
34
 
56
- test "should not add slug sequence on update after other conflicting slugs were added" do
57
- old = instance.friendly_id
58
- instance2 = klass.create! :name => instance.name
59
- instance.save!
60
- instance.reload
61
- assert_equal old, instance.to_param
35
+ test "should not add slug sequence on update after other conflicting slugs were added" do |klass|
36
+ with_instance_of klass do |record|
37
+ old = record.friendly_id
38
+ record2 = klass.create! :name => record.name
39
+ record.save!
40
+ record.reload
41
+ assert_equal old, record.to_param
62
42
  end
63
-
64
43
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: friendly_id4
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 6
5
- version: 4.0.0.pre
5
+ version: 4.0.0.pre3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Norman Clarke
@@ -10,8 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-06-08 00:00:00 -03:00
14
- default_executable:
13
+ date: 2011-06-25 00:00:00 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: activerecord
@@ -25,29 +24,52 @@ dependencies:
25
24
  type: :development
26
25
  version_requirements: *id001
27
26
  - !ruby/object:Gem::Dependency
28
- name: mocha
27
+ name: sqlite3
29
28
  prerelease: false
30
29
  requirement: &id002 !ruby/object:Gem::Requirement
31
30
  none: false
32
31
  requirements:
33
32
  - - ~>
34
33
  - !ruby/object:Gem::Version
35
- version: "0.9"
34
+ version: "1.3"
36
35
  type: :development
37
36
  version_requirements: *id002
38
37
  - !ruby/object:Gem::Dependency
39
- name: sqlite3
38
+ name: cutest
40
39
  prerelease: false
41
40
  requirement: &id003 !ruby/object:Gem::Requirement
42
41
  none: false
43
42
  requirements:
44
43
  - - ~>
45
44
  - !ruby/object:Gem::Version
46
- version: "1.3"
45
+ version: 1.1.2
47
46
  type: :development
48
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: yard
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
49
70
  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"
50
- email: norman@njclarke.com
71
+ email:
72
+ - norman@njclarke.com
51
73
  executables: []
52
74
 
53
75
  extensions: []
@@ -55,20 +77,34 @@ extensions: []
55
77
  extra_rdoc_files: []
56
78
 
57
79
  files:
80
+ - .gitignore
81
+ - ABOUT.md
82
+ - Guide.md
83
+ - README.md
84
+ - Rakefile
85
+ - bench.rb
86
+ - friendly_id.gemspec
87
+ - lib/friendly_id.rb
88
+ - lib/friendly_id/base.rb
89
+ - lib/friendly_id/configuration.rb
90
+ - lib/friendly_id/finder_methods.rb
91
+ - lib/friendly_id/history.rb
92
+ - lib/friendly_id/migration.rb
93
+ - lib/friendly_id/model.rb
94
+ - lib/friendly_id/object_utils.rb
58
95
  - lib/friendly_id/scoped.rb
96
+ - lib/friendly_id/slug_sequencer.rb
59
97
  - lib/friendly_id/slugged.rb
60
- - lib/friendly_id/test/generic.rb
61
- - lib/friendly_id/test.rb
62
98
  - lib/friendly_id/version.rb
63
- - lib/friendly_id.rb
64
- - README.md
65
- - Rakefile
99
+ - lib/generators/friendly_id_generator.rb
66
100
  - test/core_test.rb
101
+ - test/helper.rb
102
+ - test/history_test.rb
103
+ - test/object_utils_test.rb
67
104
  - test/scoped_test.rb
105
+ - test/shared.rb
68
106
  - test/slugged_test.rb
69
- - test/test_helper.rb
70
- has_rdoc: true
71
- homepage: http://norman.github.com/friendly_id_4
107
+ homepage: http://norman.github.com/friendly_id
72
108
  licenses: []
73
109
 
74
110
  post_install_message:
@@ -90,12 +126,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
126
  version: 1.3.1
91
127
  requirements: []
92
128
 
93
- rubyforge_project: friendly-id
94
- rubygems_version: 1.6.1
129
+ rubyforge_project: friendly_id
130
+ rubygems_version: 1.8.5
95
131
  signing_key:
96
132
  specification_version: 3
97
133
  summary: A comprehensive slugging and pretty-URL plugin.
98
- test_files:
99
- - test/core_test.rb
100
- - test/scoped_test.rb
101
- - test/slugged_test.rb
134
+ test_files: []
135
+