friendly_id 3.0.1 → 3.0.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.
- data/Changelog.md +9 -1
- data/Guide.md +20 -14
- data/Rakefile +5 -7
- data/extras/bench.rb +21 -44
- data/extras/extras.rb +13 -6
- data/lib/friendly_id/active_record_adapter/configuration.rb +0 -4
- data/lib/friendly_id/active_record_adapter/simple_model.rb +1 -1
- data/lib/friendly_id/active_record_adapter/slugged_model.rb +0 -4
- data/lib/friendly_id/configuration.rb +0 -4
- data/lib/friendly_id/slug_string.rb +104 -6
- data/lib/friendly_id/test.rb +2 -0
- data/lib/friendly_id/version.rb +1 -1
- data/test/active_record_adapter/{test_helper.rb → ar_test_helper.rb} +9 -9
- data/test/active_record_adapter/basic_slugged_model_test.rb +1 -1
- data/test/active_record_adapter/cached_slug_test.rb +1 -1
- data/test/active_record_adapter/core.rb +6 -1
- data/test/active_record_adapter/custom_normalizer_test.rb +1 -1
- data/test/active_record_adapter/custom_table_name_test.rb +1 -1
- data/test/active_record_adapter/scoped_model_test.rb +1 -1
- data/test/active_record_adapter/simple_test.rb +19 -5
- data/test/active_record_adapter/slug_test.rb +1 -1
- data/test/active_record_adapter/slugged.rb +1 -1
- data/test/active_record_adapter/slugged_status_test.rb +1 -1
- data/test/active_record_adapter/sti_test.rb +1 -1
- data/test/active_record_adapter/support/models.rb +4 -3
- data/test/active_record_adapter/tasks_test.rb +2 -2
- data/test/friendly_id_test.rb +1 -1
- data/test/slug_string_test.rb +8 -2
- data/test/test_helper.rb +3 -3
- metadata +6 -8
data/Changelog.md
CHANGED
@@ -6,6 +6,14 @@ suggestions, ideas and improvements to FriendlyId.
|
|
6
6
|
* Table of Contents
|
7
7
|
{:toc}
|
8
8
|
|
9
|
+
## 3.0.2 (2010-04-09)
|
10
|
+
|
11
|
+
* Fixed finding non-slugged models by an array of ids.
|
12
|
+
* Added backported `tidy_bytes` implementation from [utf8_utils](http://github.com/norman/utf8_utils)
|
13
|
+
* Removed dependency on Rubygems 1.3.6; this blocked deploy on Heroku (thanks Steven Noble)
|
14
|
+
* Replaced File.dirname calls with File.expand_path, which should allow compatibility with Ruby 1.9.2
|
15
|
+
* Cleanups and some improvements to tests.
|
16
|
+
|
9
17
|
## 3.0.1 (2010-03-30)
|
10
18
|
|
11
19
|
* Fixed bad path in Rails 2.x generator.
|
@@ -15,7 +23,7 @@ suggestions, ideas and improvements to FriendlyId.
|
|
15
23
|
* Rails 3 support.
|
16
24
|
* Removed features deprecated in FriendlyId 2.3.
|
17
25
|
* Fixed searching by numeric friendly_id in non-slugged models.
|
18
|
-
* Added
|
26
|
+
* Added `:allow_nil` config option (Andre Duffeck and Norman Clarke)
|
19
27
|
|
20
28
|
## 2.3.4 (2010-03-22)
|
21
29
|
|
data/Guide.md
CHANGED
@@ -517,7 +517,7 @@ any time.
|
|
517
517
|
FriendlyId uses [Bundler](http://github.com/carlhuda/bundler) to manage its gem
|
518
518
|
dependencies. To run the tests, first make sure you have bundler installed.
|
519
519
|
Then, copy Gemfile.default to Gemfile. If you wish to test against different gem
|
520
|
-
versions than the ones
|
520
|
+
versions than the ones specified in the Gemfile (for example, to test with
|
521
521
|
Postgres or MySQL rather than SQLite3, or to test against different versions of
|
522
522
|
ActiveRecord), then simply modify the Gemfile to suit your dependencies.
|
523
523
|
|
@@ -535,19 +535,25 @@ enabled. But if it is, then your patches would be very welcome!
|
|
535
535
|
|
536
536
|
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.2.0]
|
537
537
|
activerecord (2.3.5)
|
538
|
-
friendly_id (2.3.
|
538
|
+
friendly_id (2.3.2)
|
539
539
|
sqlite3 3.6.19 in-memory database
|
540
|
+
| DEFAULT | NO_SLUG | SLUG | CACHED_SLUG |
|
540
541
|
------------------------------------------------------------------------------------------------
|
541
|
-
find model
|
542
|
-
find model using array of ids
|
543
|
-
find
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
542
|
+
find model by id x1000 | 0.274 | 0.426 | 0.780 | 0.489 |
|
543
|
+
find model using array of ids x1000 | 0.517 | 0.525 | 1.692 | 0.623 |
|
544
|
+
find model using id, then to_param x1000 | 0.279 | 0.431 | 1.253 | 0.498 |
|
545
|
+
================================================================================================
|
546
|
+
Total | 1.071 | 1.382 | 3.725 | 1.610 |
|
547
|
+
|
548
|
+
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.2.0]
|
549
|
+
activerecord (3.0.0.beta1)
|
550
|
+
friendly_id (2.3.2)
|
551
|
+
sqlite3 3.6.19 in-memory database
|
552
|
+
|
553
|
+
| DEFAULT | NO_SLUG | SLUG | CACHED_SLUG |
|
553
554
|
------------------------------------------------------------------------------------------------
|
555
|
+
find model by id x1000 | 0.557 | 1.135 | 6.491 | 1.398 |
|
556
|
+
find model using array of ids x1000 | 0.862 | 0.882 | 6.152 | 1.919 |
|
557
|
+
find model using id, then to_param x1000 | 0.658 | 2.200 | 8.398 | 1.539 |
|
558
|
+
================================================================================================
|
559
|
+
Total | 2.077 | 4.217 | 21.041 | 4.856 |
|
data/Rakefile
CHANGED
@@ -4,8 +4,9 @@ require "rake/gempackagetask"
|
|
4
4
|
require "rake/rdoctask"
|
5
5
|
require "rake/clean"
|
6
6
|
|
7
|
-
|
7
|
+
task :default => :test
|
8
8
|
|
9
|
+
CLEAN << "pkg" << "doc" << "coverage" << ".yardoc"
|
9
10
|
Rake::GemPackageTask.new(eval(File.read("friendly_id.gemspec"))) { |pkg| }
|
10
11
|
Rake::RDocTask.new do |r|
|
11
12
|
r.rdoc_dir = "doc"
|
@@ -32,10 +33,7 @@ rescue LoadError
|
|
32
33
|
end
|
33
34
|
|
34
35
|
|
35
|
-
|
36
|
-
Rake::Task["test:friendly_id"].invoke
|
37
|
-
Rake::Task["test:ar"].invoke
|
38
|
-
end
|
36
|
+
Rake::TestTask.new(:test) { |t| t.pattern = "test/**/*_test.rb" }
|
39
37
|
|
40
38
|
namespace :test do
|
41
39
|
task :rails do
|
@@ -45,7 +43,7 @@ namespace :test do
|
|
45
43
|
end
|
46
44
|
Rake::TestTask.new(:friendly_id) { |t| t.pattern = "test/*_test.rb" }
|
47
45
|
Rake::TestTask.new(:ar) { |t| t.pattern = "test/active_record_adapter/*_test.rb" }
|
48
|
-
|
46
|
+
|
49
47
|
namespace :rails do
|
50
48
|
task :plugin do
|
51
49
|
rm_rf "fid"
|
@@ -65,4 +63,4 @@ task :pushdocs do
|
|
65
63
|
sh "git push origin gh-pages"
|
66
64
|
sh "git checkout #{branch}"
|
67
65
|
sh "git stash apply"
|
68
|
-
end
|
66
|
+
end
|
data/extras/bench.rb
CHANGED
@@ -1,59 +1,36 @@
|
|
1
|
-
|
2
|
-
require File.dirname(__FILE__) + '/extras'
|
1
|
+
require File.expand_path('../extras', __FILE__)
|
3
2
|
require 'rbench'
|
4
|
-
FACTOR =
|
3
|
+
FACTOR = 10
|
4
|
+
|
5
5
|
RBench.run(TIMES) do
|
6
6
|
|
7
7
|
column :times
|
8
|
-
column :
|
8
|
+
column :default
|
9
|
+
column :no_slug
|
10
|
+
column :slug
|
11
|
+
column :cached_slug
|
9
12
|
|
10
|
-
report 'find model
|
11
|
-
|
13
|
+
report 'find model by id', (TIMES * FACTOR).ceil do
|
14
|
+
default { User.find(get_id) }
|
15
|
+
no_slug { User.find(USERS.rand) }
|
16
|
+
slug { Post.find(POSTS.rand) }
|
17
|
+
cached_slug { District.find(DISTRICTS.rand) }
|
12
18
|
end
|
13
19
|
|
14
20
|
report 'find model using array of ids', (TIMES * FACTOR).ceil do
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
ar { User.find(USERS.rand) }
|
20
|
-
end
|
21
|
-
|
22
|
-
report 'find unslugged model using array of friendly ids', (TIMES * FACTOR).ceil do
|
23
|
-
ar { User.find([USERS.rand, USERS.rand]) }
|
24
|
-
end
|
25
|
-
|
26
|
-
report 'find slugged model using friendly id', (TIMES * FACTOR).ceil do
|
27
|
-
ar { Post.find(POSTS.rand) }
|
28
|
-
end
|
29
|
-
|
30
|
-
report 'find slugged model using array of friendly ids', (TIMES * FACTOR).ceil do
|
31
|
-
ar { Post.find([POSTS.rand, POSTS.rand]) }
|
32
|
-
end
|
33
|
-
|
34
|
-
report 'find cached slugged model using friendly id', (TIMES * FACTOR).ceil do
|
35
|
-
ar { District.find(DISTRICTS.rand) }
|
36
|
-
end
|
37
|
-
|
38
|
-
report 'find cached slugged model using array of friendly ids', (TIMES * FACTOR).ceil do
|
39
|
-
ar { District.find([DISTRICTS.rand, DISTRICTS.rand]) }
|
21
|
+
default { User.find(get_id(2)) }
|
22
|
+
no_slug { User.find(USERS.rand(2)) }
|
23
|
+
slug { Post.find(POSTS.rand(2)) }
|
24
|
+
cached_slug { District.find(DISTRICTS.rand(2)) }
|
40
25
|
end
|
41
26
|
|
42
27
|
report 'find model using id, then to_param', (TIMES * FACTOR).ceil do
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
ar { User.find(USERS.rand).to_param }
|
28
|
+
default { User.find(get_id).to_param }
|
29
|
+
no_slug { User.find(USERS.rand).to_param }
|
30
|
+
slug { Post.find(POSTS.rand).to_param }
|
31
|
+
cached_slug { District.find(DISTRICTS.rand).to_param }
|
48
32
|
end
|
49
33
|
|
50
|
-
report 'find slugged model using friendly id, then to_param', (TIMES * FACTOR).ceil do
|
51
|
-
ar { Post.find(POSTS.rand).to_param }
|
52
|
-
end
|
53
|
-
|
54
|
-
report 'find cached slugged model using friendly id, then to_param', (TIMES * FACTOR).ceil do
|
55
|
-
ar { District.find(DISTRICTS.rand).to_param }
|
56
|
-
end
|
57
|
-
|
58
34
|
summary 'Total'
|
35
|
+
|
59
36
|
end
|
data/extras/extras.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby -KU
|
2
2
|
require File.dirname(__FILE__) + '/../test/test_helper'
|
3
|
-
require File.dirname(__FILE__) + '/../test/active_record_adapter/
|
3
|
+
require File.dirname(__FILE__) + '/../test/active_record_adapter/ar_test_helper'
|
4
4
|
require 'ffaker'
|
5
5
|
|
6
6
|
TIMES = (ENV['N'] || 100).to_i
|
@@ -11,7 +11,7 @@ USERS = []
|
|
11
11
|
User.delete_all
|
12
12
|
Post.delete_all
|
13
13
|
District.delete_all
|
14
|
-
|
14
|
+
Slug.delete_all
|
15
15
|
|
16
16
|
100.times do
|
17
17
|
name = Faker::Name.name
|
@@ -20,12 +20,19 @@ District.delete_all
|
|
20
20
|
DISTRICTS << (District.create! :name => name).friendly_id
|
21
21
|
end
|
22
22
|
|
23
|
-
def get_id
|
24
|
-
rand(
|
23
|
+
def get_id(returns = 1)
|
24
|
+
(1..100).to_a.rand(returns)
|
25
25
|
end
|
26
26
|
|
27
27
|
class Array
|
28
|
-
def rand
|
29
|
-
|
28
|
+
def rand(returns = 1)
|
29
|
+
@return = []
|
30
|
+
returns.times do
|
31
|
+
until @return.length == returns do
|
32
|
+
val = self[Kernel.rand(length)]
|
33
|
+
@return << val unless @return.include? val
|
34
|
+
end
|
35
|
+
end
|
36
|
+
return returns == 1 ? @return.first : @return
|
30
37
|
end
|
31
38
|
end
|
@@ -33,10 +33,6 @@ module FriendlyId
|
|
33
33
|
@custom_cache_column = cache_column
|
34
34
|
end
|
35
35
|
|
36
|
-
def cache_finders?
|
37
|
-
!! cache_column
|
38
|
-
end
|
39
|
-
|
40
36
|
def child_scopes
|
41
37
|
@child_scopes ||= associated_friendly_classes.select { |klass| klass.friendly_id_config.scopes_over?(configured_class) }
|
42
38
|
end
|
@@ -24,7 +24,7 @@ module FriendlyId
|
|
24
24
|
include SimpleFinder
|
25
25
|
|
26
26
|
def find
|
27
|
-
@results = model_class.scoped(:conditions => conditions).
|
27
|
+
@results = model_class.scoped(:conditions => conditions).all(options).uniq
|
28
28
|
raise(::ActiveRecord::RecordNotFound, error_message) if @results.size != expected_size
|
29
29
|
friendly_results.each { |result| result.friendly_id_status.name = result.to_param }
|
30
30
|
@results
|
@@ -59,6 +59,42 @@ module FriendlyId
|
|
59
59
|
:spanish => Hash[209, [78, 110], 241, [110, 110]]
|
60
60
|
}
|
61
61
|
|
62
|
+
# CP-1252 decimal byte => UTF-8 approximation as an array of bytes
|
63
|
+
CP1252 = {
|
64
|
+
128 => [226, 130, 172],
|
65
|
+
129 => nil,
|
66
|
+
130 => [226, 128, 154],
|
67
|
+
131 => [198, 146],
|
68
|
+
132 => [226, 128, 158],
|
69
|
+
133 => [226, 128, 166],
|
70
|
+
134 => [226, 128, 160],
|
71
|
+
135 => [226, 128, 161],
|
72
|
+
136 => [203, 134],
|
73
|
+
137 => [226, 128, 176],
|
74
|
+
138 => [197, 160],
|
75
|
+
139 => [226, 128, 185],
|
76
|
+
140 => [197, 146],
|
77
|
+
141 => nil,
|
78
|
+
142 => [197, 189],
|
79
|
+
143 => nil,
|
80
|
+
144 => nil,
|
81
|
+
145 => [226, 128, 152],
|
82
|
+
146 => [226, 128, 153],
|
83
|
+
147 => [226, 128, 156],
|
84
|
+
148 => [226, 128, 157],
|
85
|
+
149 => [226, 128, 162],
|
86
|
+
150 => [226, 128, 147],
|
87
|
+
151 => [226, 128, 148],
|
88
|
+
152 => [203, 156],
|
89
|
+
153 => [226, 132, 162],
|
90
|
+
154 => [197, 161],
|
91
|
+
155 => [226, 128, 186],
|
92
|
+
156 => [197, 147],
|
93
|
+
157 => nil,
|
94
|
+
158 => [197, 190],
|
95
|
+
159 => [197, 184]
|
96
|
+
}
|
97
|
+
|
62
98
|
cattr_accessor :approximations
|
63
99
|
self.approximations = []
|
64
100
|
|
@@ -110,6 +146,7 @@ module FriendlyId
|
|
110
146
|
# @param string [String] The string to use as the basis of the SlugString.
|
111
147
|
def initialize(string)
|
112
148
|
super string.to_s
|
149
|
+
tidy_bytes!
|
113
150
|
end
|
114
151
|
|
115
152
|
# Approximate an ASCII string. This works only for Western strings using
|
@@ -218,10 +255,61 @@ module FriendlyId
|
|
218
255
|
with_dashes!
|
219
256
|
end
|
220
257
|
|
221
|
-
#
|
222
|
-
#
|
223
|
-
|
224
|
-
|
258
|
+
# Attempt to replace invalid UTF-8 bytes with valid ones. This method
|
259
|
+
# naively assumes if you have invalid UTF8 bytes, they are either Windows
|
260
|
+
# CP-1252 or ISO8859-1. In practice this isn't a bad assumption, but may not
|
261
|
+
# always work.
|
262
|
+
#
|
263
|
+
# Passing +true+ will forcibly tidy all bytes, assuming that the string's
|
264
|
+
# encoding is CP-1252 or ISO-8859-1.
|
265
|
+
def tidy_bytes!(force = false)
|
266
|
+
|
267
|
+
if force
|
268
|
+
@wrapped_string = @wrapped_string.unpack("C*").map do |b|
|
269
|
+
tidy_byte(b)
|
270
|
+
end.flatten.compact.pack("C*").unpack("U*").pack("U*")
|
271
|
+
end
|
272
|
+
|
273
|
+
bytes = @wrapped_string.unpack("C*")
|
274
|
+
conts_expected = 0
|
275
|
+
last_lead = 0
|
276
|
+
|
277
|
+
bytes.each_index do |i|
|
278
|
+
|
279
|
+
byte = bytes[i]
|
280
|
+
is_ascii = byte < 128
|
281
|
+
is_cont = byte > 127 && byte < 192
|
282
|
+
is_lead = byte > 191 && byte < 245
|
283
|
+
is_unused = byte > 240
|
284
|
+
is_restricted = byte > 244
|
285
|
+
|
286
|
+
# Impossible or highly unlikely byte? Clean it.
|
287
|
+
if is_unused || is_restricted
|
288
|
+
bytes[i] = tidy_byte(byte)
|
289
|
+
elsif is_cont
|
290
|
+
# Not expecting contination byte? Clean up. Otherwise, now expect one less.
|
291
|
+
conts_expected == 0 ? bytes[i] = tidy_byte(byte) : conts_expected -= 1
|
292
|
+
else
|
293
|
+
if conts_expected > 0
|
294
|
+
# Expected continuation, but got ASCII or leading? Clean backwards up to
|
295
|
+
# the leading byte.
|
296
|
+
(1..(i - last_lead)).each {|j| bytes[i - j] = tidy_byte(bytes[i - j])}
|
297
|
+
conts_expected = 0
|
298
|
+
end
|
299
|
+
if is_lead
|
300
|
+
# Final byte is leading? Clean it.
|
301
|
+
if i == bytes.length - 1
|
302
|
+
bytes[i] = tidy_byte(bytes.last)
|
303
|
+
else
|
304
|
+
# Valid leading byte? Expect continuations determined by position of
|
305
|
+
# first zero bit, with max of 3.
|
306
|
+
conts_expected = byte < 224 ? 1 : byte < 240 ? 2 : 3
|
307
|
+
last_lead = i
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
@wrapped_string = bytes.empty? ? "" : bytes.flatten.compact.pack("C*").unpack("U*").pack("U*")
|
225
313
|
end
|
226
314
|
|
227
315
|
# Delete any non-ascii characters.
|
@@ -235,6 +323,12 @@ module FriendlyId
|
|
235
323
|
end
|
236
324
|
end
|
237
325
|
|
326
|
+
# Truncate the string to +max+ length.
|
327
|
+
# @return String
|
328
|
+
def truncate!(max)
|
329
|
+
@wrapped_string = self[0...max].to_s if length > max
|
330
|
+
end
|
331
|
+
|
238
332
|
# Upper-cases the string. Note that this works for Unicode strings,
|
239
333
|
# though your milage may vary with Greek and Turkic strings.
|
240
334
|
# @return String
|
@@ -261,8 +355,8 @@ module FriendlyId
|
|
261
355
|
@wrapped_string = @wrapped_string.gsub(/[\s\-]+/u, "-")
|
262
356
|
end
|
263
357
|
|
264
|
-
%w[approximate_ascii clean downcase word_chars normalize normalize_for
|
265
|
-
truncate upcase with_dashes].each do |method|
|
358
|
+
%w[approximate_ascii clean downcase word_chars normalize normalize_for tidy_bytes
|
359
|
+
to_ascii truncate upcase with_dashes].each do |method|
|
266
360
|
class_eval(<<-EOM)
|
267
361
|
def #{method}(*args)
|
268
362
|
send_to_new_instance(:#{method}!, *args)
|
@@ -289,5 +383,9 @@ module FriendlyId
|
|
289
383
|
string
|
290
384
|
end
|
291
385
|
|
386
|
+
def tidy_byte(byte)
|
387
|
+
byte < 160 ? CP1252[byte] : byte < 192 ? [194, byte] : [195, byte - 64]
|
388
|
+
end
|
389
|
+
|
292
390
|
end
|
293
391
|
end
|
data/lib/friendly_id/test.rb
CHANGED
@@ -198,6 +198,7 @@ module FriendlyId
|
|
198
198
|
|
199
199
|
# Tests for FriendlyId::Status.
|
200
200
|
module Status
|
201
|
+
|
201
202
|
test "should default to not friendly" do
|
202
203
|
assert !status.friendly?
|
203
204
|
end
|
@@ -205,6 +206,7 @@ module FriendlyId
|
|
205
206
|
test "should default to numeric" do
|
206
207
|
assert status.numeric?
|
207
208
|
end
|
209
|
+
|
208
210
|
end
|
209
211
|
|
210
212
|
# Tests for FriendlyId::Status for a model that uses slugs.
|
data/lib/friendly_id/version.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
|
-
require File.
|
1
|
+
require File.expand_path('../../test_helper', __FILE__)
|
2
2
|
|
3
3
|
require "active_record"
|
4
4
|
require "active_support"
|
5
5
|
|
6
|
-
require File.
|
7
|
-
require File.
|
8
|
-
require File.
|
9
|
-
require File.
|
10
|
-
require File.
|
6
|
+
require File.expand_path("../../../lib/friendly_id/active_record", __FILE__)
|
7
|
+
require File.expand_path("../../../generators/friendly_id/templates/create_slugs", __FILE__)
|
8
|
+
require File.expand_path("../support/models", __FILE__)
|
9
|
+
require File.expand_path('../core', __FILE__)
|
10
|
+
require File.expand_path('../slugged', __FILE__)
|
11
|
+
|
12
|
+
local_db_settings = File.expand_path("../support/database.yml", __FILE__)
|
13
|
+
default_db_settings = File.expand_path("../support/database.sqlite3.yml", __FILE__)
|
11
14
|
|
12
|
-
local_db_settings = File.dirname(__FILE__) + "/support/database.yml"
|
13
|
-
default_db_settings = File.dirname(__FILE__) + "/support/database.sqlite3.yml"
|
14
15
|
db_settings = File.exists?(local_db_settings) ? local_db_settings : default_db_settings
|
15
16
|
ActiveRecord::Base.establish_connection(YAML::load(File.open(db_settings)))
|
16
17
|
|
@@ -32,7 +33,6 @@ end
|
|
32
33
|
|
33
34
|
# A model that specifies a custom cached slug column
|
34
35
|
class City < ActiveRecord::Base
|
35
|
-
attr_accessible :name
|
36
36
|
has_friendly_id :name, :use_slug => true, :cache_column => "my_slug"
|
37
37
|
end
|
38
38
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.
|
1
|
+
require File.expand_path("../ar_test_helper", __FILE__)
|
2
2
|
|
3
3
|
module FriendlyId
|
4
4
|
|
@@ -44,26 +44,31 @@ module FriendlyId
|
|
44
44
|
|
45
45
|
test "instances should be findable by an array of friendly_ids" do
|
46
46
|
second = klass.create!(:name => "second_instance")
|
47
|
+
third = klass.create!(:name => "third_instance")
|
47
48
|
assert_equal 2, klass.find([instance.friendly_id, second.friendly_id]).size
|
48
49
|
end
|
49
50
|
|
50
51
|
test "instances should be findable by an array of numeric ids" do
|
51
52
|
second = klass.create!(:name => "second_instance")
|
53
|
+
third = klass.create!(:name => "third_instance")
|
52
54
|
assert_equal 2, klass.find([instance.id.to_i, second.id.to_i]).size
|
53
55
|
end
|
54
56
|
|
55
57
|
test "instances should be findable by an array of numeric ids as strings" do
|
56
58
|
second = klass.create!(:name => "second_instance")
|
59
|
+
third = klass.create!(:name => "third_instance")
|
57
60
|
assert_equal 2, klass.find([instance.id.to_s, second.id.to_s]).size
|
58
61
|
end
|
59
62
|
|
60
63
|
test "instances should be findable by an array of instances" do
|
61
64
|
second = klass.create!(:name => "second_instance")
|
65
|
+
third = klass.create!(:name => "third_instance")
|
62
66
|
assert_equal 2, klass.find([instance, second]).size
|
63
67
|
end
|
64
68
|
|
65
69
|
test "instances should be findable by an array of mixed types" do
|
66
70
|
second = klass.create!(:name => "second_instance")
|
71
|
+
third = klass.create!(:name => "third_instance")
|
67
72
|
assert_equal 2, klass.find([instance.friendly_id, second]).size
|
68
73
|
end
|
69
74
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.
|
1
|
+
require File.expand_path('../ar_test_helper', __FILE__)
|
2
2
|
|
3
3
|
module FriendlyId
|
4
4
|
module Test
|
@@ -21,11 +21,12 @@ module FriendlyId
|
|
21
21
|
|
22
22
|
class StatusTest < ::Test::Unit::TestCase
|
23
23
|
|
24
|
-
include FriendlyId::Test::Generic
|
25
|
-
include FriendlyId::Test::Simple
|
26
|
-
include FriendlyId::Test::ActiveRecordAdapter::Core
|
27
24
|
include SimpleTest
|
28
25
|
|
26
|
+
def setup
|
27
|
+
User.delete_all
|
28
|
+
end
|
29
|
+
|
29
30
|
test "should default to not friendly" do
|
30
31
|
assert !status.friendly?
|
31
32
|
end
|
@@ -51,8 +52,21 @@ module FriendlyId
|
|
51
52
|
end
|
52
53
|
|
53
54
|
class BasicTest < ::Test::Unit::TestCase
|
54
|
-
include
|
55
|
+
include FriendlyId::Test::Generic
|
56
|
+
include FriendlyId::Test::Simple
|
57
|
+
include FriendlyId::Test::ActiveRecordAdapter::Core
|
55
58
|
include SimpleTest
|
59
|
+
|
60
|
+
test "status should be friendly when found using friendly id" do
|
61
|
+
record = klass.send(find_method, instance.friendly_id)
|
62
|
+
assert record.friendly_id_status.friendly?
|
63
|
+
end
|
64
|
+
|
65
|
+
test "status should not be friendly when found using numeric id" do
|
66
|
+
record = klass.send(find_method, instance.id)
|
67
|
+
assert !record.friendly_id_status.friendly?
|
68
|
+
end
|
69
|
+
|
56
70
|
end
|
57
71
|
|
58
72
|
end
|
@@ -20,8 +20,9 @@ class CreateSupportModels < ActiveRecord::Migration
|
|
20
20
|
t.string :name
|
21
21
|
t.string :my_slug
|
22
22
|
t.integer :population
|
23
|
-
t.index :my_slug, :unique => true
|
24
23
|
end
|
24
|
+
add_index :cities, :my_slug, :unique => true
|
25
|
+
|
25
26
|
|
26
27
|
create_table :countries do |t|
|
27
28
|
t.string :name
|
@@ -31,8 +32,8 @@ class CreateSupportModels < ActiveRecord::Migration
|
|
31
32
|
t.string :name
|
32
33
|
t.string :note
|
33
34
|
t.string :cached_slug
|
34
|
-
t.index :cached_slug, :unique => true
|
35
35
|
end
|
36
|
+
add_index :districts, :cached_slug, :unique => true
|
36
37
|
|
37
38
|
create_table :events do |t|
|
38
39
|
t.string :name
|
@@ -67,8 +68,8 @@ class CreateSupportModels < ActiveRecord::Migration
|
|
67
68
|
|
68
69
|
create_table :users do |t|
|
69
70
|
t.string :name
|
70
|
-
t.index :name, :unique => true
|
71
71
|
end
|
72
|
+
add_index :users, :name, :unique => true
|
72
73
|
|
73
74
|
end
|
74
75
|
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require File.
|
1
|
+
require File.expand_path('../ar_test_helper', __FILE__)
|
2
|
+
require File.expand_path('../../../lib/friendly_id/active_record_adapter/tasks', __FILE__)
|
3
3
|
|
4
4
|
class TasksTest < Test::Unit::TestCase
|
5
5
|
|
data/test/friendly_id_test.rb
CHANGED
data/test/slug_string_test.rb
CHANGED
@@ -73,8 +73,14 @@ module FriendlyId
|
|
73
73
|
assert_equal "検-索", SlugString.new("検 索").with_dashes
|
74
74
|
end
|
75
75
|
|
76
|
-
test "
|
77
|
-
|
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
|
+
|
78
84
|
end
|
79
85
|
|
80
86
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
$KCODE = "UTF8" if RUBY_VERSION < "1.9"
|
2
2
|
$VERBOSE = false
|
3
3
|
begin
|
4
|
-
require File.
|
4
|
+
require File.expand_path('../../.bundle/environment', __FILE__)
|
5
5
|
rescue LoadError
|
6
6
|
# Fall back on doing an unlocked resolve at runtime.
|
7
7
|
require "rubygems"
|
@@ -11,5 +11,5 @@ end
|
|
11
11
|
require "test/unit"
|
12
12
|
require "mocha"
|
13
13
|
require "active_support"
|
14
|
-
require File.
|
15
|
-
require File.
|
14
|
+
require File.expand_path("../../lib/friendly_id", __FILE__)
|
15
|
+
require File.expand_path("../../lib/friendly_id/test", __FILE__)
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 3
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 3.0.
|
8
|
+
- 2
|
9
|
+
version: 3.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Norman Clarke
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-
|
19
|
+
date: 2010-04-09 00:00:00 -03:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -85,6 +85,7 @@ files:
|
|
85
85
|
- rails/init.rb
|
86
86
|
- generators/friendly_id/friendly_id_generator.rb
|
87
87
|
- generators/friendly_id/templates/create_slugs.rb
|
88
|
+
- test/active_record_adapter/ar_test_helper.rb
|
88
89
|
- test/active_record_adapter/basic_slugged_model_test.rb
|
89
90
|
- test/active_record_adapter/cached_slug_test.rb
|
90
91
|
- test/active_record_adapter/core.rb
|
@@ -102,7 +103,6 @@ files:
|
|
102
103
|
- test/active_record_adapter/support/database.sqlite3.yml
|
103
104
|
- test/active_record_adapter/support/models.rb
|
104
105
|
- test/active_record_adapter/tasks_test.rb
|
105
|
-
- test/active_record_adapter/test_helper.rb
|
106
106
|
- test/friendly_id_test.rb
|
107
107
|
- test/slug_string_test.rb
|
108
108
|
- test/test_helper.rb
|
@@ -133,10 +133,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
133
|
- - ">="
|
134
134
|
- !ruby/object:Gem::Version
|
135
135
|
segments:
|
136
|
-
-
|
137
|
-
|
138
|
-
- 6
|
139
|
-
version: 1.3.6
|
136
|
+
- 0
|
137
|
+
version: "0"
|
140
138
|
requirements: []
|
141
139
|
|
142
140
|
rubyforge_project: friendly-id
|