friendly_id 3.3.3.0 → 4.0.0.beta7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/.gitignore +11 -0
  2. data/.travis.yml +24 -0
  3. data/.yardopts +4 -0
  4. data/Changelog.md +9 -10
  5. data/README.md +39 -48
  6. data/Rakefile +56 -58
  7. data/WhatsNew.md +95 -0
  8. data/bench.rb +63 -0
  9. data/friendly_id.gemspec +40 -0
  10. data/gemfiles/Gemfile.rails-3.0.rb +18 -0
  11. data/gemfiles/Gemfile.rails-3.0.rb.lock +52 -0
  12. data/gemfiles/Gemfile.rails-3.1.rb +18 -0
  13. data/gemfiles/Gemfile.rails-3.1.rb.lock +57 -0
  14. data/lib/friendly_id.rb +126 -80
  15. data/lib/friendly_id/active_record_adapter/relation.rb +10 -2
  16. data/lib/friendly_id/active_record_adapter/slugged_model.rb +3 -9
  17. data/lib/friendly_id/base.rb +132 -0
  18. data/lib/friendly_id/configuration.rb +65 -152
  19. data/lib/friendly_id/finder_methods.rb +20 -0
  20. data/lib/friendly_id/history.rb +88 -0
  21. data/lib/friendly_id/migration.rb +18 -0
  22. data/lib/friendly_id/model.rb +22 -0
  23. data/lib/friendly_id/object_utils.rb +40 -0
  24. data/lib/friendly_id/reserved.rb +46 -0
  25. data/lib/friendly_id/scoped.rb +131 -0
  26. data/lib/friendly_id/slug.rb +9 -0
  27. data/lib/friendly_id/slug_sequencer.rb +82 -0
  28. data/lib/friendly_id/slugged.rb +191 -76
  29. data/lib/friendly_id/version.rb +2 -2
  30. data/test/base_test.rb +54 -0
  31. data/test/configuration_test.rb +27 -0
  32. data/test/core_test.rb +30 -0
  33. data/test/databases.yml +19 -0
  34. data/test/helper.rb +88 -0
  35. data/test/history_test.rb +55 -0
  36. data/test/object_utils_test.rb +26 -0
  37. data/test/reserved_test.rb +26 -0
  38. data/test/schema.rb +59 -0
  39. data/test/scoped_test.rb +57 -0
  40. data/test/shared.rb +118 -0
  41. data/test/slugged_test.rb +83 -0
  42. data/test/sti_test.rb +48 -0
  43. metadata +110 -102
  44. data/Contributors.md +0 -46
  45. data/Guide.md +0 -626
  46. data/extras/README.txt +0 -3
  47. data/extras/bench.rb +0 -40
  48. data/extras/extras.rb +0 -38
  49. data/extras/prof.rb +0 -19
  50. data/extras/template-gem.rb +0 -26
  51. data/extras/template-plugin.rb +0 -28
  52. data/generators/friendly_id/friendly_id_generator.rb +0 -30
  53. data/generators/friendly_id/templates/create_slugs.rb +0 -18
  54. data/lib/tasks/friendly_id.rake +0 -19
  55. data/rails/init.rb +0 -2
  56. data/test/active_record_adapter/ar_test_helper.rb +0 -149
  57. data/test/active_record_adapter/basic_slugged_model_test.rb +0 -14
  58. data/test/active_record_adapter/cached_slug_test.rb +0 -76
  59. data/test/active_record_adapter/core.rb +0 -138
  60. data/test/active_record_adapter/custom_normalizer_test.rb +0 -20
  61. data/test/active_record_adapter/custom_table_name_test.rb +0 -22
  62. data/test/active_record_adapter/default_scope_test.rb +0 -30
  63. data/test/active_record_adapter/optimistic_locking_test.rb +0 -18
  64. data/test/active_record_adapter/scoped_model_test.rb +0 -129
  65. data/test/active_record_adapter/simple_test.rb +0 -76
  66. data/test/active_record_adapter/slug_test.rb +0 -34
  67. data/test/active_record_adapter/slugged.rb +0 -33
  68. data/test/active_record_adapter/slugged_status_test.rb +0 -28
  69. data/test/active_record_adapter/sti_test.rb +0 -22
  70. data/test/active_record_adapter/support/database.jdbcsqlite3.yml +0 -2
  71. data/test/active_record_adapter/support/database.mysql.yml +0 -4
  72. data/test/active_record_adapter/support/database.mysql2.yml +0 -4
  73. data/test/active_record_adapter/support/database.postgres.yml +0 -6
  74. data/test/active_record_adapter/support/database.sqlite3.yml +0 -2
  75. data/test/active_record_adapter/support/models.rb +0 -104
  76. data/test/active_record_adapter/tasks_test.rb +0 -82
  77. data/test/compatibility/ancestry/Gemfile.lock +0 -34
  78. data/test/friendly_id_test.rb +0 -96
  79. data/test/test_helper.rb +0 -13
@@ -1,33 +0,0 @@
1
- require File.expand_path("../ar_test_helper", __FILE__)
2
-
3
- module FriendlyId
4
- module Test
5
- module ActiveRecordAdapter
6
- module Slugged
7
-
8
- test "should allow eager loading of slugs" do
9
- assert_nothing_raised do
10
- klass.find(instance.friendly_id, :include => :slugs)
11
- end
12
-
13
- assert_nothing_raised do
14
- klass.find(instance.friendly_id, :include => :slug)
15
- end
16
- end
17
-
18
- def klass
19
- Post
20
- end
21
-
22
- def other_class
23
- District
24
- end
25
-
26
- def instance
27
- @instance ||= klass.create! :name => "hello world"
28
- end
29
-
30
- end
31
- end
32
- end
33
- end
@@ -1,28 +0,0 @@
1
- require File.expand_path("../ar_test_helper", __FILE__)
2
-
3
-
4
- module FriendlyId
5
- module Test
6
- module ActiveRecordAdapter
7
-
8
- class StatusTest < ::Test::Unit::TestCase
9
-
10
- include FriendlyId::Test::Status
11
- include FriendlyId::Test::SluggedStatus
12
-
13
- def klass
14
- Post
15
- end
16
-
17
- def instance
18
- @instance ||= klass.create! :name => "hello world"
19
- end
20
-
21
- def find_method
22
- :find
23
- end
24
-
25
- end
26
- end
27
- end
28
- end
@@ -1,22 +0,0 @@
1
- require File.expand_path('../ar_test_helper', __FILE__)
2
-
3
- module FriendlyId
4
- module Test
5
- module ActiveRecordAdapter
6
-
7
- class StiTest < ::Test::Unit::TestCase
8
-
9
- include FriendlyId::Test::Generic
10
- include FriendlyId::Test::Slugged
11
- include FriendlyId::Test::ActiveRecordAdapter::Slugged
12
- include FriendlyId::Test::ActiveRecordAdapter::Core
13
-
14
- def klass
15
- Novel
16
- end
17
-
18
- end
19
-
20
- end
21
- end
22
- end
@@ -1,2 +0,0 @@
1
- adapter: jdbcsqlite3
2
- database: ":memory:"
@@ -1,4 +0,0 @@
1
- adapter: mysql
2
- database: friendly_id_test
3
- username: root
4
- hostname: 127.0.0.1
@@ -1,4 +0,0 @@
1
- adapter: mysql2
2
- database: friendly_id_test
3
- username: root
4
- hostname: 127.0.0.1
@@ -1,6 +0,0 @@
1
- adapter: postgresql
2
- host: localhost
3
- port: 5432
4
- username: postgres
5
- database: friendly_id_test
6
- encoding: utf8
@@ -1,2 +0,0 @@
1
- adapter: sqlite3
2
- database: ":memory:"
@@ -1,104 +0,0 @@
1
- class CreateSupportModels < ActiveRecord::Migration
2
- def self.up
3
-
4
- create_table :authors do |t|
5
- t.string :name
6
- end
7
-
8
- create_table :blocks do |t|
9
- t.string :name
10
- t.string :note
11
- end
12
-
13
- create_table :books do |t|
14
- t.string :name
15
- t.string :type
16
- t.string :note
17
- end
18
-
19
- create_table :cities do |t|
20
- t.string :name
21
- t.string :my_slug
22
- t.integer :population
23
- end
24
- add_index :cities, :my_slug, :unique => true
25
-
26
- create_table :regions do |t|
27
- t.string :name
28
- t.string :cached_slug
29
- t.string :note
30
- t.integer :lock_version, :null => false, :default => 0
31
- end
32
- add_index :regions, :cached_slug, :unique => true
33
-
34
- create_table :countries do |t|
35
- t.string :name
36
- end
37
-
38
- create_table :districts do |t|
39
- t.string :name
40
- t.string :note
41
- t.string :cached_slug
42
- end
43
- add_index :districts, :cached_slug, :unique => true
44
-
45
- create_table :events do |t|
46
- t.string :name
47
- t.datetime :event_date
48
- end
49
-
50
- create_table :houses do |t|
51
- t.string :name
52
- t.integer :user_id
53
- end
54
-
55
- create_table :legacy_table do |t|
56
- t.string :name
57
- t.string :note
58
- end
59
-
60
- create_table :people do |t|
61
- t.string :name
62
- t.string :note
63
- end
64
-
65
- create_table :posts do |t|
66
- t.string :name
67
- t.boolean :published
68
- t.string :note
69
- end
70
-
71
- create_table :residents do |t|
72
- t.string :name
73
- t.integer :country_id
74
- end
75
-
76
- create_table :tourists do |t|
77
- t.string :name
78
- t.integer :country_id
79
- t.string :cached_slug
80
- end
81
-
82
- create_table :users do |t|
83
- t.string :name
84
- end
85
- add_index :users, :name, :unique => true
86
-
87
- create_table :sites do |t|
88
- t.string :name
89
- t.integer :owner_id
90
- t.string :owner_type
91
- end
92
-
93
- create_table :companies do |t|
94
- t.string :name
95
- end
96
-
97
- create_table :unfriendlies do |t|
98
- t.string :name
99
- end
100
- end
101
-
102
- def self.down
103
- end
104
- end
@@ -1,82 +0,0 @@
1
- require "friendly_id/active_record_adapter/tasks"
2
- require File.expand_path('../ar_test_helper', __FILE__)
3
-
4
- class TasksTest < Test::Unit::TestCase
5
-
6
- def teardown
7
- ENV["MODEL"] = nil
8
- [City, District, Post, Slug].map(&:delete_all)
9
- end
10
-
11
- test "should make slugs" do
12
- City.create! :name => "Nairobi"
13
- City.create! :name => "Buenos Aires"
14
- Slug.delete_all
15
- ENV["MODEL"] = "City"
16
- FriendlyId::TaskRunner.new.make_slugs
17
- assert_equal 2, Slug.count
18
- end
19
-
20
- test "should admit lower case, plural model names" do
21
- ENV["MODEL"] = "cities"
22
- assert_equal City, FriendlyId::TaskRunner.new.klass
23
- end
24
-
25
- test "make_slugs should raise error if no model given" do
26
- assert_raise(RuntimeError) { FriendlyId::TaskRunner.new.make_slugs }
27
- end
28
-
29
- test "make_slugs should raise error if class doesn't use FriendlyId" do
30
- ENV["MODEL"] = "String"
31
- assert_raise(RuntimeError) { FriendlyId::TaskRunner.new.make_slugs }
32
- end
33
-
34
- test"delete_slugs delete only slugs for the specified model" do
35
- Post.create! :name => "Slugs Considered Harmful"
36
- City.create! :name => "Buenos Aires"
37
- ENV["MODEL"] = "city"
38
- FriendlyId::TaskRunner.new.delete_slugs
39
- assert_equal 1, Slug.count
40
- end
41
-
42
- test "delete_slugs should set the cached_slug column to NULL" do
43
- ENV["MODEL"] = "district"
44
- District.create! :name => "Garment"
45
- FriendlyId::TaskRunner.new.delete_slugs
46
- assert_nil District.first.cached_slug
47
- end
48
-
49
-
50
- test "delete_old_slugs should delete slugs older than 45 days by default" do
51
- set_up_old_slugs
52
- FriendlyId::TaskRunner.new.delete_old_slugs
53
- assert_equal 2, Slug.count
54
- end
55
-
56
- test "delete_old_slugs should respect the days argument" do
57
- set_up_old_slugs
58
- ENV["DAYS"] = "100"
59
- FriendlyId::TaskRunner.new.delete_old_slugs
60
- assert_equal 3, Slug.count
61
- end
62
-
63
- test "delete_old_slugs should respect the class argument" do
64
- set_up_old_slugs
65
- ENV["MODEL"] = "post"
66
- FriendlyId::TaskRunner.new.delete_old_slugs
67
- assert_equal 3, Slug.count
68
- end
69
-
70
- private
71
-
72
- def set_up_old_slugs
73
- Post.create! :name => "Slugs Considered Harmful"
74
- city = City.create! :name => "Buenos Aires"
75
- City.connection.execute "UPDATE slugs SET created_at = '%s' WHERE id = %d" % [
76
- 45.days.ago.strftime("%Y-%m-%d"), city.slug.id
77
- ]
78
- city.update_attributes :name => "Ciudad de Buenos Aires"
79
- assert_equal 3, Slug.count
80
- end
81
-
82
- end
@@ -1,34 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- activemodel (3.0.10)
5
- activesupport (= 3.0.10)
6
- builder (~> 2.1.2)
7
- i18n (~> 0.5.0)
8
- activerecord (3.0.10)
9
- activemodel (= 3.0.10)
10
- activesupport (= 3.0.10)
11
- arel (~> 2.0.10)
12
- tzinfo (~> 0.3.23)
13
- activesupport (3.0.10)
14
- ancestry (1.2.4)
15
- activerecord (>= 2.2.2)
16
- arel (2.0.10)
17
- builder (2.1.2)
18
- i18n (0.5.0)
19
- minitest (2.4.0)
20
- mocha (0.9.12)
21
- rake (0.9.2)
22
- sqlite3 (1.3.4)
23
- tzinfo (0.3.29)
24
-
25
- PLATFORMS
26
- ruby
27
-
28
- DEPENDENCIES
29
- activerecord (= 3.0.10)
30
- ancestry
31
- minitest (~> 2.4.0)
32
- mocha (~> 0.9.12)
33
- rake
34
- sqlite3 (~> 1.3.4)
@@ -1,96 +0,0 @@
1
- # encoding: utf-8
2
- require File.expand_path('../test_helper', __FILE__)
3
-
4
- module FriendlyId
5
- module Test
6
-
7
- class ConfigurationTest < ::Test::Unit::TestCase
8
- test "should validate sequence separator name" do
9
- ["-", " ", "\n", "\t"].each do |string|
10
- assert_raise ArgumentError do
11
- Configuration.new(NilClass, :hello, :sequence_separator => string)
12
- end
13
- end
14
- end
15
-
16
- test "should validate cached slug name" do
17
- ["slug", "slugs", " "].each do |string|
18
- assert_raise ArgumentError do
19
- Configuration.new(NilClass, :hello, :cache_column => string)
20
- end
21
- end
22
- end
23
- end
24
-
25
- class SlugStringTest < ::Test::Unit::TestCase
26
- test "should not transliterate by default" do
27
- s = SlugString.new("über")
28
- assert_equal "über", s.normalize_for!(Configuration.new(nil, :name))
29
- end
30
-
31
- test "should transliterate if specified" do
32
- s = SlugString.new("über")
33
- options = {:approximate_ascii => true}
34
- assert_equal "uber", s.normalize_for!(Configuration.new(nil, :name, options))
35
- end
36
-
37
- test "should strip non-ascii if specified" do
38
- s = SlugString.new("über")
39
- options = {:strip_non_ascii => true}
40
- assert_equal "ber", s.normalize_for!(Configuration.new(nil, :name, options))
41
- end
42
-
43
- test "should use transliterations if given" do
44
- s = SlugString.new("über")
45
- options = {:approximate_ascii => true, :ascii_approximation_options => :german}
46
- assert_equal "ueber", s.normalize_for!(Configuration.new(nil, :name, options))
47
- end
48
- end
49
-
50
- class FriendlyIdTest < ::Test::Unit::TestCase
51
- test "should parse a friendly_id name and sequence" do
52
- assert_equal ["test", 2], "test--2".parse_friendly_id
53
- end
54
-
55
- test "should parse a friendly_id name and a double digit sequence" do
56
- assert_equal ["test", 12], "test--12".parse_friendly_id
57
- end
58
-
59
- test "should parse with a default sequence of 1" do
60
- assert_equal ["test", 1], "test".parse_friendly_id
61
- end
62
-
63
- test "should be parseable with a custom separator" do
64
- assert_equal ["test", 2], "test:2".parse_friendly_id(":")
65
- end
66
-
67
- test "should be parseable with a custom separator and a double digit sequence" do
68
- assert_equal ["test", 12], "test:12".parse_friendly_id(":")
69
- end
70
-
71
- test "should parse when default sequence separator occurs in friendly_id name" do
72
- assert_equal ["test--test", 2], "test--test--2".parse_friendly_id
73
- end
74
-
75
- test "should parse when custom sequence separator occurs in friendly_id name" do
76
- assert_equal ["test:test", 2], "test:test:2".parse_friendly_id(":")
77
- end
78
-
79
- test "should parse when sequence separator and number occur in friendly_id name" do
80
- assert_equal ["test--2--test", 1], "test--2--test".parse_friendly_id
81
- end
82
-
83
- test "should parse when sequence separator, number and sequence occur in friendly_id name" do
84
- assert_equal ["test--2--test", 2], "test--2--test--2".parse_friendly_id
85
- end
86
-
87
- test "should parse when double digit sequence separator, number and sequence occur in friendly_id name" do
88
- assert_equal ["test--2--test", 12], "test--2--test--12".parse_friendly_id
89
- end
90
-
91
- test "should parse with a separator and no sequence" do
92
- assert_equal ["test", 1], "test--".parse_friendly_id
93
- end
94
- end
95
- end
96
- end
data/test/test_helper.rb DELETED
@@ -1,13 +0,0 @@
1
- $:.unshift File.expand_path("../lib", File.dirname(__FILE__))
2
- $:.unshift File.expand_path(File.dirname(__FILE__))
3
- $:.uniq!
4
-
5
- $KCODE = "UTF8" if RUBY_VERSION < "1.9"
6
- $VERBOSE = false
7
- require "rubygems"
8
- require "bundler/setup"
9
- require "test/unit"
10
- require "mocha"
11
- require "active_support"
12
- require "friendly_id"
13
- require "friendly_id/test"