cmassimo-friendly_id 3.0.4.2

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 (56) hide show
  1. data/Changelog.md +277 -0
  2. data/Contributors.md +39 -0
  3. data/Guide.md +561 -0
  4. data/LICENSE +19 -0
  5. data/README.md +83 -0
  6. data/Rakefile +66 -0
  7. data/extras/README.txt +3 -0
  8. data/extras/bench.rb +36 -0
  9. data/extras/extras.rb +38 -0
  10. data/extras/prof.rb +14 -0
  11. data/extras/template-gem.rb +26 -0
  12. data/extras/template-plugin.rb +28 -0
  13. data/generators/friendly_id/friendly_id_generator.rb +30 -0
  14. data/generators/friendly_id/templates/create_slugs.rb +18 -0
  15. data/lib/friendly_id.rb +73 -0
  16. data/lib/friendly_id/active_record.rb +52 -0
  17. data/lib/friendly_id/active_record_adapter/configuration.rb +67 -0
  18. data/lib/friendly_id/active_record_adapter/finders.rb +156 -0
  19. data/lib/friendly_id/active_record_adapter/simple_model.rb +123 -0
  20. data/lib/friendly_id/active_record_adapter/slug.rb +66 -0
  21. data/lib/friendly_id/active_record_adapter/slugged_model.rb +238 -0
  22. data/lib/friendly_id/active_record_adapter/tasks.rb +69 -0
  23. data/lib/friendly_id/configuration.rb +113 -0
  24. data/lib/friendly_id/finders.rb +109 -0
  25. data/lib/friendly_id/railtie.rb +20 -0
  26. data/lib/friendly_id/sequel.rb +5 -0
  27. data/lib/friendly_id/slug_string.rb +391 -0
  28. data/lib/friendly_id/slugged.rb +102 -0
  29. data/lib/friendly_id/status.rb +35 -0
  30. data/lib/friendly_id/test.rb +291 -0
  31. data/lib/friendly_id/version.rb +9 -0
  32. data/lib/generators/friendly_id_generator.rb +25 -0
  33. data/lib/tasks/friendly_id.rake +19 -0
  34. data/rails/init.rb +2 -0
  35. data/test/active_record_adapter/ar_test_helper.rb +119 -0
  36. data/test/active_record_adapter/basic_slugged_model_test.rb +14 -0
  37. data/test/active_record_adapter/cached_slug_test.rb +61 -0
  38. data/test/active_record_adapter/core.rb +98 -0
  39. data/test/active_record_adapter/custom_normalizer_test.rb +20 -0
  40. data/test/active_record_adapter/custom_table_name_test.rb +22 -0
  41. data/test/active_record_adapter/scoped_model_test.rb +118 -0
  42. data/test/active_record_adapter/simple_test.rb +76 -0
  43. data/test/active_record_adapter/slug_test.rb +34 -0
  44. data/test/active_record_adapter/slugged.rb +30 -0
  45. data/test/active_record_adapter/slugged_status_test.rb +25 -0
  46. data/test/active_record_adapter/sti_test.rb +22 -0
  47. data/test/active_record_adapter/support/database.jdbcsqlite3.yml +2 -0
  48. data/test/active_record_adapter/support/database.mysql.yml +4 -0
  49. data/test/active_record_adapter/support/database.postgres.yml +6 -0
  50. data/test/active_record_adapter/support/database.sqlite3.yml +2 -0
  51. data/test/active_record_adapter/support/models.rb +87 -0
  52. data/test/active_record_adapter/tasks_test.rb +82 -0
  53. data/test/friendly_id_test.rb +55 -0
  54. data/test/slug_string_test.rb +88 -0
  55. data/test/test_helper.rb +15 -0
  56. metadata +168 -0
@@ -0,0 +1,30 @@
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
+ end
13
+
14
+ def klass
15
+ Post
16
+ end
17
+
18
+ def other_class
19
+ District
20
+ end
21
+
22
+ def instance
23
+ @instance ||= klass.create! :name => "hello world"
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,25 @@
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
+ end
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,22 @@
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
@@ -0,0 +1,2 @@
1
+ adapter: jdbcsqlite3
2
+ database: ":memory:"
@@ -0,0 +1,4 @@
1
+ adapter: mysql
2
+ database: friendly_id_test
3
+ username: root
4
+ hostname: 127.0.0.1
@@ -0,0 +1,6 @@
1
+ adapter: postgresql
2
+ host: localhost
3
+ port: 5432
4
+ username: postgres
5
+ database: friendly_id_test
6
+ encoding: utf8
@@ -0,0 +1,2 @@
1
+ adapter: sqlite3
2
+ database: ":memory:"
@@ -0,0 +1,87 @@
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
+
27
+ create_table :countries do |t|
28
+ t.string :name
29
+ end
30
+
31
+ create_table :districts do |t|
32
+ t.string :name
33
+ t.string :note
34
+ t.string :cached_slug
35
+ end
36
+ add_index :districts, :cached_slug, :unique => true
37
+
38
+ create_table :events do |t|
39
+ t.string :name
40
+ t.datetime :event_date
41
+ end
42
+
43
+ create_table :houses do |t|
44
+ t.string :name
45
+ t.integer :user_id
46
+ end
47
+
48
+ create_table :legacy_table do |t|
49
+ t.string :name
50
+ t.string :note
51
+ end
52
+
53
+ create_table :people do |t|
54
+ t.string :name
55
+ t.string :note
56
+ end
57
+
58
+ create_table :posts do |t|
59
+ t.string :name
60
+ t.boolean :published
61
+ t.string :note
62
+ end
63
+
64
+ create_table :residents do |t|
65
+ t.string :name
66
+ t.integer :country_id
67
+ end
68
+
69
+ create_table :users do |t|
70
+ t.string :name
71
+ end
72
+ add_index :users, :name, :unique => true
73
+
74
+ create_table :sites do |t|
75
+ t.string :name
76
+ t.integer :owner_id
77
+ t.string :owner_type
78
+ end
79
+
80
+ create_table :companies do |t|
81
+ t.string :name
82
+ end
83
+ end
84
+
85
+ def self.down
86
+ end
87
+ end
@@ -0,0 +1,82 @@
1
+ require File.expand_path('../ar_test_helper', __FILE__)
2
+ require File.expand_path('../../../lib/friendly_id/active_record_adapter/tasks', __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
@@ -0,0 +1,55 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ module FriendlyId
4
+
5
+ module Test
6
+
7
+ class FriendlyIdTest < ::Test::Unit::TestCase
8
+
9
+ test "should parse a friendly_id name and sequence" do
10
+ assert_equal ["test", "2"], "test--2".parse_friendly_id
11
+ end
12
+
13
+ test "should parse a friendly_id name and a double digit sequence" do
14
+ assert_equal ["test", "12"], "test--12".parse_friendly_id
15
+ end
16
+
17
+ test "should parse with a default sequence of 1" do
18
+ assert_equal ["test", "1"], "test".parse_friendly_id
19
+ end
20
+
21
+ test "should be parseable with a custom separator" do
22
+ assert_equal ["test", "2"], "test:2".parse_friendly_id(":")
23
+ end
24
+
25
+ test "should be parseable with a custom separator and a double digit sequence" do
26
+ assert_equal ["test", "12"], "test:12".parse_friendly_id(":")
27
+ end
28
+
29
+ test "should parse when default sequence separator occurs in friendly_id name" do
30
+ assert_equal ["test--test", "2"], "test--test--2".parse_friendly_id
31
+ end
32
+
33
+ test "should parse when custom sequence separator occurs in friendly_id name" do
34
+ assert_equal ["test:test", "2"], "test:test:2".parse_friendly_id(":")
35
+ end
36
+
37
+ test "should parse when sequence separator and number occur in friendly_id name" do
38
+ assert_equal ["test--2--test", "1"], "test--2--test".parse_friendly_id
39
+ end
40
+
41
+ test "should parse when sequence separator, number and sequence occur in friendly_id name" do
42
+ assert_equal ["test--2--test", "2"], "test--2--test--2".parse_friendly_id
43
+ end
44
+
45
+ test "should parse when double digit sequence separator, number and sequence occur in friendly_id name" do
46
+ assert_equal ["test--2--test", "12"], "test--2--test--12".parse_friendly_id
47
+ end
48
+
49
+ test "should parse with a separator and no sequence" do
50
+ assert_equal ["test", "1"], "test--".parse_friendly_id
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,88 @@
1
+ # encoding: utf-8
2
+ require(File.dirname(__FILE__) + "/test_helper")
3
+
4
+ module FriendlyId
5
+ module Test
6
+
7
+ class SlugStringTest < ::Test::Unit::TestCase
8
+
9
+ test "should approximate ascii" do
10
+ # create string with range of Unicode"s western characters with
11
+ # diacritics, excluding the division and multiplication signs which for
12
+ # some reason or other are floating in the middle of all the letters.
13
+ s = SlugString.new((0xC0..0x17E).to_a.reject {|c| [0xD7, 0xF7].include? c}.pack("U*"))
14
+ output = s.approximate_ascii
15
+ assert(output.length > s.length)
16
+ assert_match output, /^[a-zA-Z']*$/
17
+ end
18
+
19
+ test "should strip non-word chars" do
20
+ s = SlugString.new "¡feliz año!"
21
+ assert_equal "feliz año", s.word_chars
22
+ end
23
+
24
+ test "should lowercase strings" do
25
+ assert_equal "feliz año", SlugString.new("FELIZ AÑO").downcase
26
+ end
27
+
28
+ test "should uppercase strings" do
29
+ assert_equal "FELIZ AÑO", SlugString.new("feliz año").upcase
30
+ end
31
+
32
+ test "should replace whitespace with dashes" do
33
+ assert_equal "a-b", SlugString.new("a b").clean.with_dashes
34
+ end
35
+
36
+ test "should replace multiple spaces with 1 dash" do
37
+ assert_equal "a-b", SlugString.new("a b").clean.with_dashes
38
+ end
39
+
40
+ test "should replace multiple dashes with 1 dash" do
41
+ assert_equal "male-female", SlugString.new("male - female").with_dashes
42
+ end
43
+
44
+ test "should strip trailing space" do
45
+ assert_equal "ab", SlugString.new("ab ").clean
46
+ end
47
+
48
+ test "should strip leading space" do
49
+ assert_equal "ab", SlugString.new(" ab").clean
50
+ end
51
+
52
+ test "should strip trailing slashes" do
53
+ assert_equal "ab", SlugString.new("ab-").clean
54
+ end
55
+
56
+ test "should strip leading slashes" do
57
+ assert_equal "ab", SlugString.new("-ab").clean
58
+ end
59
+
60
+ test "should not modify valid name strings" do
61
+ assert_equal "a-b-c-d", SlugString.new("a-b-c-d").clean
62
+ end
63
+
64
+ test "should do special approximations for German" do
65
+ assert_equal "Juergen", SlugString.new("Jürgen").approximate_ascii(:german)
66
+ end
67
+
68
+ test "should do special approximations for Spanish" do
69
+ assert_equal "anno", SlugString.new("año").approximate_ascii(:spanish)
70
+ end
71
+
72
+ test "should work with non roman chars" do
73
+ assert_equal "検-索", SlugString.new("検 索").with_dashes
74
+ end
75
+
76
+ test "should work with invalid UTF-8 strings" do
77
+ %w[approximate_ascii clean downcase word_chars normalize to_ascii upcase with_dashes].each do |method|
78
+ string = SlugString.new("\x93abc")
79
+ assert_nothing_raised do
80
+ method == "truncate" ? string.send(method, 32) : string.send(method)
81
+ end
82
+ end
83
+
84
+ end
85
+
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,15 @@
1
+ $KCODE = "UTF8" if RUBY_VERSION < "1.9"
2
+ $VERBOSE = false
3
+ begin
4
+ require File.expand_path('../../.bundle/environment', __FILE__)
5
+ rescue LoadError
6
+ # Fall back on doing an unlocked resolve at runtime.
7
+ require "rubygems"
8
+ require "bundler"
9
+ Bundler.setup
10
+ end
11
+ require "test/unit"
12
+ require "mocha"
13
+ require "active_support"
14
+ require File.expand_path("../../lib/friendly_id", __FILE__)
15
+ require File.expand_path("../../lib/friendly_id/test", __FILE__)
metadata ADDED
@@ -0,0 +1,168 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cmassimo-friendly_id
3
+ version: !ruby/object:Gem::Version
4
+ hash: 107
5
+ prerelease: false
6
+ segments:
7
+ - 3
8
+ - 0
9
+ - 4
10
+ - 2
11
+ version: 3.0.4.2
12
+ platform: ruby
13
+ authors:
14
+ - Norman Clarke
15
+ - Adrian Mugnolo
16
+ - Emilio Tagua
17
+ autorequire:
18
+ bindir: bin
19
+ cert_chain: []
20
+
21
+ date: 2010-06-14 00:00:00 +02:00
22
+ default_executable:
23
+ dependencies:
24
+ - !ruby/object:Gem::Dependency
25
+ name: activerecord
26
+ prerelease: false
27
+ requirement: &id001 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ hash: 7
33
+ segments:
34
+ - 2
35
+ - 2
36
+ version: "2.2"
37
+ type: :runtime
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ name: activesupport
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ hash: 7
48
+ segments:
49
+ - 2
50
+ - 2
51
+ version: "2.2"
52
+ type: :runtime
53
+ version_requirements: *id002
54
+ description: " FriendlyId is the \"Swiss Army bulldozer\" of slugging and permalink plugins\n for Ruby on Rails. It allows you to create pretty URL\xE2\x80\x99s and work with\n human-friendly strings as if they were numeric ids for ActiveRecord models.\n\
55
+ \t\t-- Forked by cmassimo see http://github.com/cmassimo/friendly_id for further details\n"
56
+ email:
57
+ - norman@njclarke.com
58
+ - adrian@mugnolo.com
59
+ - miloops@gmail.com
60
+ executables: []
61
+
62
+ extensions: []
63
+
64
+ extra_rdoc_files: []
65
+
66
+ files:
67
+ - lib/friendly_id/active_record.rb
68
+ - lib/friendly_id/active_record_adapter/configuration.rb
69
+ - lib/friendly_id/active_record_adapter/finders.rb
70
+ - lib/friendly_id/active_record_adapter/simple_model.rb
71
+ - lib/friendly_id/active_record_adapter/slug.rb
72
+ - lib/friendly_id/active_record_adapter/slugged_model.rb
73
+ - lib/friendly_id/active_record_adapter/tasks.rb
74
+ - lib/friendly_id/configuration.rb
75
+ - lib/friendly_id/finders.rb
76
+ - lib/friendly_id/railtie.rb
77
+ - lib/friendly_id/sequel.rb
78
+ - lib/friendly_id/slug_string.rb
79
+ - lib/friendly_id/slugged.rb
80
+ - lib/friendly_id/status.rb
81
+ - lib/friendly_id/test.rb
82
+ - lib/friendly_id/version.rb
83
+ - lib/friendly_id.rb
84
+ - lib/generators/friendly_id_generator.rb
85
+ - lib/tasks/friendly_id.rake
86
+ - Changelog.md
87
+ - Contributors.md
88
+ - Guide.md
89
+ - README.md
90
+ - LICENSE
91
+ - Rakefile
92
+ - rails/init.rb
93
+ - generators/friendly_id/friendly_id_generator.rb
94
+ - generators/friendly_id/templates/create_slugs.rb
95
+ - test/active_record_adapter/ar_test_helper.rb
96
+ - test/active_record_adapter/basic_slugged_model_test.rb
97
+ - test/active_record_adapter/cached_slug_test.rb
98
+ - test/active_record_adapter/core.rb
99
+ - test/active_record_adapter/custom_normalizer_test.rb
100
+ - test/active_record_adapter/custom_table_name_test.rb
101
+ - test/active_record_adapter/scoped_model_test.rb
102
+ - test/active_record_adapter/simple_test.rb
103
+ - test/active_record_adapter/slug_test.rb
104
+ - test/active_record_adapter/slugged.rb
105
+ - test/active_record_adapter/slugged_status_test.rb
106
+ - test/active_record_adapter/sti_test.rb
107
+ - test/active_record_adapter/support/database.jdbcsqlite3.yml
108
+ - test/active_record_adapter/support/database.mysql.yml
109
+ - test/active_record_adapter/support/database.postgres.yml
110
+ - test/active_record_adapter/support/database.sqlite3.yml
111
+ - test/active_record_adapter/support/models.rb
112
+ - test/active_record_adapter/tasks_test.rb
113
+ - test/friendly_id_test.rb
114
+ - test/slug_string_test.rb
115
+ - test/test_helper.rb
116
+ - extras/bench.rb
117
+ - extras/extras.rb
118
+ - extras/prof.rb
119
+ - extras/README.txt
120
+ - extras/template-gem.rb
121
+ - extras/template-plugin.rb
122
+ has_rdoc: true
123
+ homepage: http://norman.github.com/friendly_id
124
+ licenses: []
125
+
126
+ post_install_message:
127
+ rdoc_options: []
128
+
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ hash: 3
137
+ segments:
138
+ - 0
139
+ version: "0"
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ hash: 3
146
+ segments:
147
+ - 0
148
+ version: "0"
149
+ requirements: []
150
+
151
+ rubyforge_project: cmassimo-friendly-id
152
+ rubygems_version: 1.3.7
153
+ signing_key:
154
+ specification_version: 3
155
+ summary: A comprehensive slugging and pretty-URL plugin.
156
+ test_files:
157
+ - test/active_record_adapter/basic_slugged_model_test.rb
158
+ - test/active_record_adapter/cached_slug_test.rb
159
+ - test/active_record_adapter/custom_normalizer_test.rb
160
+ - test/active_record_adapter/custom_table_name_test.rb
161
+ - test/active_record_adapter/scoped_model_test.rb
162
+ - test/active_record_adapter/simple_test.rb
163
+ - test/active_record_adapter/slug_test.rb
164
+ - test/active_record_adapter/slugged_status_test.rb
165
+ - test/active_record_adapter/sti_test.rb
166
+ - test/active_record_adapter/tasks_test.rb
167
+ - test/friendly_id_test.rb
168
+ - test/slug_string_test.rb