friendly_id 3.3.3.0 → 4.0.0.beta7

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.
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"