friendly_id 1.9.9 → 2.0.0
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.tar.gz.sig +0 -0
- data/History.txt +5 -4
- data/Manifest.txt +1 -10
- data/README.rdoc +13 -8
- data/Rakefile +5 -3
- data/friendly_id.gemspec +3 -3
- data/lib/friendly_id.rb +15 -8
- data/lib/friendly_id/helpers.rb +13 -0
- data/lib/friendly_id/non_sluggable_class_methods.rb +14 -15
- data/lib/friendly_id/slug.rb +2 -3
- data/lib/friendly_id/sluggable_class_methods.rb +3 -9
- data/lib/friendly_id/sluggable_instance_methods.rb +18 -18
- data/lib/friendly_id/version.rb +3 -3
- data/lib/tasks/friendly_id.rake +1 -1
- data/test/fixtures/posts.yml +5 -1
- data/test/fixtures/slugs.yml +8 -0
- data/test/non_slugged_test.rb +29 -7
- data/test/sluggable_test.rb +4 -0
- metadata +16 -14
- metadata.gz.sig +0 -0
- data/coverage/index.html +0 -409
- data/coverage/lib-friendly_id-non_sluggable_class_methods_rb.html +0 -646
- data/coverage/lib-friendly_id-non_sluggable_instance_methods_rb.html +0 -638
- data/coverage/lib-friendly_id-shoulda_macros_rb.html +0 -641
- data/coverage/lib-friendly_id-sluggable_class_methods_rb.html +0 -714
- data/coverage/lib-friendly_id-sluggable_instance_methods_rb.html +0 -710
- data/coverage/lib-friendly_id-string_helpers_rb.html +0 -685
- data/coverage/lib-friendly_id_rb.html +0 -665
- data/coverage/lib-slug_rb.html +0 -695
- data/coverage/rails-init_rb.html +0 -606
data/coverage/lib-slug_rb.html
DELETED
@@ -1,695 +0,0 @@
|
|
1
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
-
<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'><head><title>lib/slug.rb - C0 code coverage information</title>
|
3
|
-
<style type='text/css'>body { background-color: rgb(240, 240, 245); }</style>
|
4
|
-
<style type='text/css'>span.cross-ref-title {
|
5
|
-
font-size: 140%;
|
6
|
-
}
|
7
|
-
span.cross-ref a {
|
8
|
-
text-decoration: none;
|
9
|
-
}
|
10
|
-
span.cross-ref {
|
11
|
-
background-color:#f3f7fa;
|
12
|
-
border: 1px dashed #333;
|
13
|
-
margin: 1em;
|
14
|
-
padding: 0.5em;
|
15
|
-
overflow: hidden;
|
16
|
-
}
|
17
|
-
a.crossref-toggle {
|
18
|
-
text-decoration: none;
|
19
|
-
}
|
20
|
-
span.marked0 {
|
21
|
-
background-color: rgb(185, 210, 200);
|
22
|
-
display: block;
|
23
|
-
}
|
24
|
-
span.marked1 {
|
25
|
-
background-color: rgb(190, 215, 205);
|
26
|
-
display: block;
|
27
|
-
}
|
28
|
-
span.inferred0 {
|
29
|
-
background-color: rgb(255, 255, 240);
|
30
|
-
display: block;
|
31
|
-
}
|
32
|
-
span.inferred1 {
|
33
|
-
background-color: rgb(255, 255, 240);
|
34
|
-
display: block;
|
35
|
-
}
|
36
|
-
span.uncovered0 {
|
37
|
-
background-color: rgb(225, 110, 110);
|
38
|
-
display: block;
|
39
|
-
}
|
40
|
-
span.uncovered1 {
|
41
|
-
background-color: rgb(235, 120, 120);
|
42
|
-
display: block;
|
43
|
-
}
|
44
|
-
span.overview {
|
45
|
-
border-bottom: 8px solid black;
|
46
|
-
}
|
47
|
-
div.overview {
|
48
|
-
border-bottom: 8px solid black;
|
49
|
-
}
|
50
|
-
body {
|
51
|
-
font-family: verdana, arial, helvetica;
|
52
|
-
}
|
53
|
-
div.footer {
|
54
|
-
font-size: 68%;
|
55
|
-
margin-top: 1.5em;
|
56
|
-
}
|
57
|
-
h1, h2, h3, h4, h5, h6 {
|
58
|
-
margin-bottom: 0.5em;
|
59
|
-
}
|
60
|
-
h5 {
|
61
|
-
margin-top: 0.5em;
|
62
|
-
}
|
63
|
-
.hidden {
|
64
|
-
display: none;
|
65
|
-
}
|
66
|
-
div.separator {
|
67
|
-
height: 10px;
|
68
|
-
}
|
69
|
-
/* Commented out for better readability, esp. on IE */
|
70
|
-
/*
|
71
|
-
table tr td, table tr th {
|
72
|
-
font-size: 68%;
|
73
|
-
}
|
74
|
-
td.value table tr td {
|
75
|
-
font-size: 11px;
|
76
|
-
}
|
77
|
-
*/
|
78
|
-
table.percent_graph {
|
79
|
-
height: 12px;
|
80
|
-
border: #808080 1px solid;
|
81
|
-
empty-cells: show;
|
82
|
-
}
|
83
|
-
table.percent_graph td.covered {
|
84
|
-
height: 10px;
|
85
|
-
background: #00f000;
|
86
|
-
}
|
87
|
-
table.percent_graph td.uncovered {
|
88
|
-
height: 10px;
|
89
|
-
background: #e00000;
|
90
|
-
}
|
91
|
-
table.percent_graph td.NA {
|
92
|
-
height: 10px;
|
93
|
-
background: #eaeaea;
|
94
|
-
}
|
95
|
-
table.report {
|
96
|
-
border-collapse: collapse;
|
97
|
-
width: 100%;
|
98
|
-
}
|
99
|
-
table.report td.heading {
|
100
|
-
background: #dcecff;
|
101
|
-
border: #d0d0d0 1px solid;
|
102
|
-
font-weight: bold;
|
103
|
-
text-align: center;
|
104
|
-
}
|
105
|
-
table.report td.heading:hover {
|
106
|
-
background: #c0ffc0;
|
107
|
-
}
|
108
|
-
table.report td.text {
|
109
|
-
border: #d0d0d0 1px solid;
|
110
|
-
}
|
111
|
-
table.report td.value,
|
112
|
-
table.report td.lines_total,
|
113
|
-
table.report td.lines_code {
|
114
|
-
text-align: right;
|
115
|
-
border: #d0d0d0 1px solid;
|
116
|
-
}
|
117
|
-
table.report tr.light {
|
118
|
-
background-color: rgb(240, 240, 245);
|
119
|
-
}
|
120
|
-
table.report tr.dark {
|
121
|
-
background-color: rgb(230, 230, 235);
|
122
|
-
}
|
123
|
-
</style>
|
124
|
-
<script type='text/javascript'>
|
125
|
-
// <![CDATA[
|
126
|
-
function toggleCode( id ) {
|
127
|
-
if ( document.getElementById )
|
128
|
-
elem = document.getElementById( id );
|
129
|
-
else if ( document.all )
|
130
|
-
elem = eval( "document.all." + id );
|
131
|
-
else
|
132
|
-
return false;
|
133
|
-
|
134
|
-
elemStyle = elem.style;
|
135
|
-
|
136
|
-
if ( elemStyle.display != "block" ) {
|
137
|
-
elemStyle.display = "block"
|
138
|
-
} else {
|
139
|
-
elemStyle.display = "none"
|
140
|
-
}
|
141
|
-
|
142
|
-
return true;
|
143
|
-
}
|
144
|
-
|
145
|
-
// Make cross-references hidden by default
|
146
|
-
document.writeln( "<style type=\"text/css\">span.cross-ref { display: none }</style>" )
|
147
|
-
// ]]>
|
148
|
-
</script>
|
149
|
-
<style type='text/css'>span.run0 {
|
150
|
-
background-color: rgb(178, 204, 255);
|
151
|
-
display: block;
|
152
|
-
}
|
153
|
-
span.run1 {
|
154
|
-
background-color: rgb(178, 206, 255);
|
155
|
-
display: block;
|
156
|
-
}
|
157
|
-
span.run2 {
|
158
|
-
background-color: rgb(178, 209, 255);
|
159
|
-
display: block;
|
160
|
-
}
|
161
|
-
span.run3 {
|
162
|
-
background-color: rgb(178, 211, 255);
|
163
|
-
display: block;
|
164
|
-
}
|
165
|
-
span.run4 {
|
166
|
-
background-color: rgb(178, 214, 255);
|
167
|
-
display: block;
|
168
|
-
}
|
169
|
-
span.run5 {
|
170
|
-
background-color: rgb(178, 218, 255);
|
171
|
-
display: block;
|
172
|
-
}
|
173
|
-
span.run6 {
|
174
|
-
background-color: rgb(178, 220, 255);
|
175
|
-
display: block;
|
176
|
-
}
|
177
|
-
span.run7 {
|
178
|
-
background-color: rgb(178, 223, 255);
|
179
|
-
display: block;
|
180
|
-
}
|
181
|
-
span.run8 {
|
182
|
-
background-color: rgb(178, 225, 255);
|
183
|
-
display: block;
|
184
|
-
}
|
185
|
-
span.run9 {
|
186
|
-
background-color: rgb(178, 228, 255);
|
187
|
-
display: block;
|
188
|
-
}
|
189
|
-
span.run10 {
|
190
|
-
background-color: rgb(178, 232, 255);
|
191
|
-
display: block;
|
192
|
-
}
|
193
|
-
span.run11 {
|
194
|
-
background-color: rgb(178, 234, 255);
|
195
|
-
display: block;
|
196
|
-
}
|
197
|
-
span.run12 {
|
198
|
-
background-color: rgb(178, 237, 255);
|
199
|
-
display: block;
|
200
|
-
}
|
201
|
-
span.run13 {
|
202
|
-
background-color: rgb(178, 239, 255);
|
203
|
-
display: block;
|
204
|
-
}
|
205
|
-
span.run14 {
|
206
|
-
background-color: rgb(178, 242, 255);
|
207
|
-
display: block;
|
208
|
-
}
|
209
|
-
span.run15 {
|
210
|
-
background-color: rgb(178, 246, 255);
|
211
|
-
display: block;
|
212
|
-
}
|
213
|
-
span.run16 {
|
214
|
-
background-color: rgb(178, 248, 255);
|
215
|
-
display: block;
|
216
|
-
}
|
217
|
-
span.run17 {
|
218
|
-
background-color: rgb(178, 251, 255);
|
219
|
-
display: block;
|
220
|
-
}
|
221
|
-
span.run18 {
|
222
|
-
background-color: rgb(178, 253, 255);
|
223
|
-
display: block;
|
224
|
-
}
|
225
|
-
span.run19 {
|
226
|
-
background-color: rgb(178, 255, 253);
|
227
|
-
display: block;
|
228
|
-
}
|
229
|
-
span.run20 {
|
230
|
-
background-color: rgb(178, 255, 249);
|
231
|
-
display: block;
|
232
|
-
}
|
233
|
-
span.run21 {
|
234
|
-
background-color: rgb(178, 255, 247);
|
235
|
-
display: block;
|
236
|
-
}
|
237
|
-
span.run22 {
|
238
|
-
background-color: rgb(178, 255, 244);
|
239
|
-
display: block;
|
240
|
-
}
|
241
|
-
span.run23 {
|
242
|
-
background-color: rgb(178, 255, 242);
|
243
|
-
display: block;
|
244
|
-
}
|
245
|
-
span.run24 {
|
246
|
-
background-color: rgb(178, 255, 239);
|
247
|
-
display: block;
|
248
|
-
}
|
249
|
-
span.run25 {
|
250
|
-
background-color: rgb(178, 255, 235);
|
251
|
-
display: block;
|
252
|
-
}
|
253
|
-
span.run26 {
|
254
|
-
background-color: rgb(178, 255, 233);
|
255
|
-
display: block;
|
256
|
-
}
|
257
|
-
span.run27 {
|
258
|
-
background-color: rgb(178, 255, 230);
|
259
|
-
display: block;
|
260
|
-
}
|
261
|
-
span.run28 {
|
262
|
-
background-color: rgb(178, 255, 228);
|
263
|
-
display: block;
|
264
|
-
}
|
265
|
-
span.run29 {
|
266
|
-
background-color: rgb(178, 255, 225);
|
267
|
-
display: block;
|
268
|
-
}
|
269
|
-
span.run30 {
|
270
|
-
background-color: rgb(178, 255, 221);
|
271
|
-
display: block;
|
272
|
-
}
|
273
|
-
span.run31 {
|
274
|
-
background-color: rgb(178, 255, 219);
|
275
|
-
display: block;
|
276
|
-
}
|
277
|
-
span.run32 {
|
278
|
-
background-color: rgb(178, 255, 216);
|
279
|
-
display: block;
|
280
|
-
}
|
281
|
-
span.run33 {
|
282
|
-
background-color: rgb(178, 255, 214);
|
283
|
-
display: block;
|
284
|
-
}
|
285
|
-
span.run34 {
|
286
|
-
background-color: rgb(178, 255, 211);
|
287
|
-
display: block;
|
288
|
-
}
|
289
|
-
span.run35 {
|
290
|
-
background-color: rgb(178, 255, 207);
|
291
|
-
display: block;
|
292
|
-
}
|
293
|
-
span.run36 {
|
294
|
-
background-color: rgb(178, 255, 205);
|
295
|
-
display: block;
|
296
|
-
}
|
297
|
-
span.run37 {
|
298
|
-
background-color: rgb(178, 255, 202);
|
299
|
-
display: block;
|
300
|
-
}
|
301
|
-
span.run38 {
|
302
|
-
background-color: rgb(178, 255, 200);
|
303
|
-
display: block;
|
304
|
-
}
|
305
|
-
span.run39 {
|
306
|
-
background-color: rgb(178, 255, 197);
|
307
|
-
display: block;
|
308
|
-
}
|
309
|
-
span.run40 {
|
310
|
-
background-color: rgb(178, 255, 193);
|
311
|
-
display: block;
|
312
|
-
}
|
313
|
-
span.run41 {
|
314
|
-
background-color: rgb(178, 255, 191);
|
315
|
-
display: block;
|
316
|
-
}
|
317
|
-
span.run42 {
|
318
|
-
background-color: rgb(178, 255, 188);
|
319
|
-
display: block;
|
320
|
-
}
|
321
|
-
span.run43 {
|
322
|
-
background-color: rgb(178, 255, 186);
|
323
|
-
display: block;
|
324
|
-
}
|
325
|
-
span.run44 {
|
326
|
-
background-color: rgb(178, 255, 183);
|
327
|
-
display: block;
|
328
|
-
}
|
329
|
-
span.run45 {
|
330
|
-
background-color: rgb(178, 255, 179);
|
331
|
-
display: block;
|
332
|
-
}
|
333
|
-
span.run46 {
|
334
|
-
background-color: rgb(179, 255, 178);
|
335
|
-
display: block;
|
336
|
-
}
|
337
|
-
span.run47 {
|
338
|
-
background-color: rgb(182, 255, 178);
|
339
|
-
display: block;
|
340
|
-
}
|
341
|
-
span.run48 {
|
342
|
-
background-color: rgb(184, 255, 178);
|
343
|
-
display: block;
|
344
|
-
}
|
345
|
-
span.run49 {
|
346
|
-
background-color: rgb(187, 255, 178);
|
347
|
-
display: block;
|
348
|
-
}
|
349
|
-
span.run50 {
|
350
|
-
background-color: rgb(191, 255, 178);
|
351
|
-
display: block;
|
352
|
-
}
|
353
|
-
span.run51 {
|
354
|
-
background-color: rgb(193, 255, 178);
|
355
|
-
display: block;
|
356
|
-
}
|
357
|
-
span.run52 {
|
358
|
-
background-color: rgb(196, 255, 178);
|
359
|
-
display: block;
|
360
|
-
}
|
361
|
-
span.run53 {
|
362
|
-
background-color: rgb(198, 255, 178);
|
363
|
-
display: block;
|
364
|
-
}
|
365
|
-
span.run54 {
|
366
|
-
background-color: rgb(201, 255, 178);
|
367
|
-
display: block;
|
368
|
-
}
|
369
|
-
span.run55 {
|
370
|
-
background-color: rgb(205, 255, 178);
|
371
|
-
display: block;
|
372
|
-
}
|
373
|
-
span.run56 {
|
374
|
-
background-color: rgb(207, 255, 178);
|
375
|
-
display: block;
|
376
|
-
}
|
377
|
-
span.run57 {
|
378
|
-
background-color: rgb(210, 255, 178);
|
379
|
-
display: block;
|
380
|
-
}
|
381
|
-
span.run58 {
|
382
|
-
background-color: rgb(212, 255, 178);
|
383
|
-
display: block;
|
384
|
-
}
|
385
|
-
span.run59 {
|
386
|
-
background-color: rgb(215, 255, 178);
|
387
|
-
display: block;
|
388
|
-
}
|
389
|
-
span.run60 {
|
390
|
-
background-color: rgb(219, 255, 178);
|
391
|
-
display: block;
|
392
|
-
}
|
393
|
-
span.run61 {
|
394
|
-
background-color: rgb(221, 255, 178);
|
395
|
-
display: block;
|
396
|
-
}
|
397
|
-
span.run62 {
|
398
|
-
background-color: rgb(224, 255, 178);
|
399
|
-
display: block;
|
400
|
-
}
|
401
|
-
span.run63 {
|
402
|
-
background-color: rgb(226, 255, 178);
|
403
|
-
display: block;
|
404
|
-
}
|
405
|
-
span.run64 {
|
406
|
-
background-color: rgb(229, 255, 178);
|
407
|
-
display: block;
|
408
|
-
}
|
409
|
-
span.run65 {
|
410
|
-
background-color: rgb(233, 255, 178);
|
411
|
-
display: block;
|
412
|
-
}
|
413
|
-
span.run66 {
|
414
|
-
background-color: rgb(235, 255, 178);
|
415
|
-
display: block;
|
416
|
-
}
|
417
|
-
span.run67 {
|
418
|
-
background-color: rgb(238, 255, 178);
|
419
|
-
display: block;
|
420
|
-
}
|
421
|
-
span.run68 {
|
422
|
-
background-color: rgb(240, 255, 178);
|
423
|
-
display: block;
|
424
|
-
}
|
425
|
-
span.run69 {
|
426
|
-
background-color: rgb(243, 255, 178);
|
427
|
-
display: block;
|
428
|
-
}
|
429
|
-
span.run70 {
|
430
|
-
background-color: rgb(247, 255, 178);
|
431
|
-
display: block;
|
432
|
-
}
|
433
|
-
span.run71 {
|
434
|
-
background-color: rgb(249, 255, 178);
|
435
|
-
display: block;
|
436
|
-
}
|
437
|
-
span.run72 {
|
438
|
-
background-color: rgb(252, 255, 178);
|
439
|
-
display: block;
|
440
|
-
}
|
441
|
-
span.run73 {
|
442
|
-
background-color: rgb(255, 255, 178);
|
443
|
-
display: block;
|
444
|
-
}
|
445
|
-
span.run74 {
|
446
|
-
background-color: rgb(255, 252, 178);
|
447
|
-
display: block;
|
448
|
-
}
|
449
|
-
span.run75 {
|
450
|
-
background-color: rgb(255, 248, 178);
|
451
|
-
display: block;
|
452
|
-
}
|
453
|
-
span.run76 {
|
454
|
-
background-color: rgb(255, 246, 178);
|
455
|
-
display: block;
|
456
|
-
}
|
457
|
-
span.run77 {
|
458
|
-
background-color: rgb(255, 243, 178);
|
459
|
-
display: block;
|
460
|
-
}
|
461
|
-
span.run78 {
|
462
|
-
background-color: rgb(255, 240, 178);
|
463
|
-
display: block;
|
464
|
-
}
|
465
|
-
span.run79 {
|
466
|
-
background-color: rgb(255, 238, 178);
|
467
|
-
display: block;
|
468
|
-
}
|
469
|
-
span.run80 {
|
470
|
-
background-color: rgb(255, 234, 178);
|
471
|
-
display: block;
|
472
|
-
}
|
473
|
-
span.run81 {
|
474
|
-
background-color: rgb(255, 232, 178);
|
475
|
-
display: block;
|
476
|
-
}
|
477
|
-
span.run82 {
|
478
|
-
background-color: rgb(255, 229, 178);
|
479
|
-
display: block;
|
480
|
-
}
|
481
|
-
span.run83 {
|
482
|
-
background-color: rgb(255, 226, 178);
|
483
|
-
display: block;
|
484
|
-
}
|
485
|
-
span.run84 {
|
486
|
-
background-color: rgb(255, 224, 178);
|
487
|
-
display: block;
|
488
|
-
}
|
489
|
-
span.run85 {
|
490
|
-
background-color: rgb(255, 220, 178);
|
491
|
-
display: block;
|
492
|
-
}
|
493
|
-
span.run86 {
|
494
|
-
background-color: rgb(255, 218, 178);
|
495
|
-
display: block;
|
496
|
-
}
|
497
|
-
span.run87 {
|
498
|
-
background-color: rgb(255, 215, 178);
|
499
|
-
display: block;
|
500
|
-
}
|
501
|
-
span.run88 {
|
502
|
-
background-color: rgb(255, 212, 178);
|
503
|
-
display: block;
|
504
|
-
}
|
505
|
-
span.run89 {
|
506
|
-
background-color: rgb(255, 210, 178);
|
507
|
-
display: block;
|
508
|
-
}
|
509
|
-
span.run90 {
|
510
|
-
background-color: rgb(255, 206, 178);
|
511
|
-
display: block;
|
512
|
-
}
|
513
|
-
span.run91 {
|
514
|
-
background-color: rgb(255, 204, 178);
|
515
|
-
display: block;
|
516
|
-
}
|
517
|
-
span.run92 {
|
518
|
-
background-color: rgb(255, 201, 178);
|
519
|
-
display: block;
|
520
|
-
}
|
521
|
-
span.run93 {
|
522
|
-
background-color: rgb(255, 198, 178);
|
523
|
-
display: block;
|
524
|
-
}
|
525
|
-
span.run94 {
|
526
|
-
background-color: rgb(255, 196, 178);
|
527
|
-
display: block;
|
528
|
-
}
|
529
|
-
span.run95 {
|
530
|
-
background-color: rgb(255, 192, 178);
|
531
|
-
display: block;
|
532
|
-
}
|
533
|
-
span.run96 {
|
534
|
-
background-color: rgb(255, 189, 178);
|
535
|
-
display: block;
|
536
|
-
}
|
537
|
-
span.run97 {
|
538
|
-
background-color: rgb(255, 187, 178);
|
539
|
-
display: block;
|
540
|
-
}
|
541
|
-
span.run98 {
|
542
|
-
background-color: rgb(255, 184, 178);
|
543
|
-
display: block;
|
544
|
-
}
|
545
|
-
span.run99 {
|
546
|
-
background-color: rgb(255, 182, 178);
|
547
|
-
display: block;
|
548
|
-
}
|
549
|
-
span.run100 {
|
550
|
-
background-color: rgb(255, 178, 178);
|
551
|
-
display: block;
|
552
|
-
}
|
553
|
-
</style>
|
554
|
-
</head>
|
555
|
-
<body><h3>C0 code coverage information</h3>
|
556
|
-
<p>Generated on Tue Dec 16 16:57:16 -0200 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.3</a>
|
557
|
-
</p>
|
558
|
-
<hr/>
|
559
|
-
<pre><span class='marked0'>Code reported as executed by Ruby looks like this...
|
560
|
-
</span><span class='marked1'>and this: this line is also marked as covered.
|
561
|
-
</span><span class='inferred0'>Lines considered as run by rcov, but not reported by Ruby, look like this,
|
562
|
-
</span><span class='inferred1'>and this: these lines were inferred by rcov (using simple heuristics).
|
563
|
-
</span><span class='uncovered0'>Finally, here's a line marked as not executed.
|
564
|
-
</span></pre>
|
565
|
-
<table class='report'><thead><tr><td class='heading'>Name</td>
|
566
|
-
<td class='heading'>Total lines</td>
|
567
|
-
<td class='heading'>Lines of code</td>
|
568
|
-
<td class='heading'>Total coverage</td>
|
569
|
-
<td class='heading'>Code coverage</td>
|
570
|
-
</tr>
|
571
|
-
</thead>
|
572
|
-
<tbody><tr class='light'><td><a href='lib-slug_rb.html'>lib/slug.rb</a>
|
573
|
-
</td>
|
574
|
-
<td class='lines_total'><tt>90</tt>
|
575
|
-
</td>
|
576
|
-
<td class='lines_code'><tt>54</tt>
|
577
|
-
</td>
|
578
|
-
<td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>95.6%</tt>
|
579
|
-
</td>
|
580
|
-
<td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='96'/>
|
581
|
-
<td class='uncovered' width='4'/>
|
582
|
-
</tr>
|
583
|
-
</table>
|
584
|
-
</td>
|
585
|
-
</tr>
|
586
|
-
</table>
|
587
|
-
</td>
|
588
|
-
<td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>92.6%</tt>
|
589
|
-
</td>
|
590
|
-
<td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='93'/>
|
591
|
-
<td class='uncovered' width='7'/>
|
592
|
-
</tr>
|
593
|
-
</table>
|
594
|
-
</td>
|
595
|
-
</tr>
|
596
|
-
</table>
|
597
|
-
</td>
|
598
|
-
</tr>
|
599
|
-
</tbody>
|
600
|
-
</table>
|
601
|
-
<pre><span class="inferred1"><a name="line1"></a> 1 # A Slug is a unique, human-friendly identifier for an ActiveRecord.
|
602
|
-
</span><span class="marked0"><a name="line2"></a> 2 class Slug < ActiveRecord::Base
|
603
|
-
</span><span class="inferred1"><a name="line3"></a> 3
|
604
|
-
</span><span class="marked0"><a name="line4"></a> 4 belongs_to :sluggable, :polymorphic => true
|
605
|
-
</span><span class="marked1"><a name="line5"></a> 5 validates_uniqueness_of :name, :scope => [:sluggable_type, :scope, :sequence]
|
606
|
-
</span><span class="marked0"><a name="line6"></a> 6 before_create :set_sequence
|
607
|
-
</span><span class="marked1"><a name="line7"></a> 7 before_save :check_for_blank_name
|
608
|
-
</span><span class="inferred0"><a name="line8"></a> 8
|
609
|
-
</span><span class="marked1"><a name="line9"></a> 9 class << self
|
610
|
-
</span><span class="inferred0"><a name="line10"></a>10
|
611
|
-
</span><span class="inferred1"><a name="line11"></a>11 # Sanitizes and dasherizes string to make it safe for URL's.
|
612
|
-
</span><span class="inferred0"><a name="line12"></a>12 #
|
613
|
-
</span><span class="inferred1"><a name="line13"></a>13 # Example:
|
614
|
-
</span><span class="inferred0"><a name="line14"></a>14 #
|
615
|
-
</span><span class="inferred1"><a name="line15"></a>15 # slug.normalize('This... is an example!') # => "this-is-an-example"
|
616
|
-
</span><span class="inferred0"><a name="line16"></a>16 #
|
617
|
-
</span><span class="inferred1"><a name="line17"></a>17 # Note that Rails 2.2.x offers a parameterize method for this. It's not
|
618
|
-
</span><span class="inferred0"><a name="line18"></a>18 # used here because it assumes you want to strip away accented characters,
|
619
|
-
</span><span class="inferred1"><a name="line19"></a>19 # and this may not always be your desire.
|
620
|
-
</span><span class="inferred0"><a name="line20"></a>20 #
|
621
|
-
</span><span class="inferred1"><a name="line21"></a>21 # At the time of writing, it also handles several characters incorrectly,
|
622
|
-
</span><span class="inferred0"><a name="line22"></a>22 # for instance replacing Icelandic's "thorn" character with "y" rather
|
623
|
-
</span><span class="inferred1"><a name="line23"></a>23 # than "d." This might be pedantic, but I don't want to piss off the
|
624
|
-
</span><span class="inferred0"><a name="line24"></a>24 # Vikings. The last time anyone pissed them off, they uleashed a wave of
|
625
|
-
</span><span class="inferred1"><a name="line25"></a>25 # terror in Europe unlike anything ever seen before or after. I'm not
|
626
|
-
</span><span class="inferred0"><a name="line26"></a>26 # taking any chances.
|
627
|
-
</span><span class="marked1"><a name="line27"></a>27 def normalize(slug_text)
|
628
|
-
</span><span class="marked0"><a name="line28"></a>28 return "" if slug_text.blank?
|
629
|
-
</span><span class="marked1"><a name="line29"></a>29 slug_text.
|
630
|
-
</span><span class="marked0"><a name="line30"></a>30 send(chars_func).
|
631
|
-
</span><span class="inferred1"><a name="line31"></a>31 # For some reason Spanish ¡ and ¿ are not detected as non-word
|
632
|
-
</span><span class="inferred0"><a name="line32"></a>32 # characters. Bug in Ruby?
|
633
|
-
</span><span class="inferred1"><a name="line33"></a>33 normalize.gsub(/[\W|¡|¿]/u, ' ').
|
634
|
-
</span><span class="inferred0"><a name="line34"></a>34 strip.
|
635
|
-
</span><span class="inferred1"><a name="line35"></a>35 gsub(/\s+/u, '-').
|
636
|
-
</span><span class="inferred0"><a name="line36"></a>36 gsub(/-\z/u, '').
|
637
|
-
</span><span class="inferred1"><a name="line37"></a>37 downcase.
|
638
|
-
</span><span class="inferred0"><a name="line38"></a>38 to_s
|
639
|
-
</span><span class="inferred1"><a name="line39"></a>39 end
|
640
|
-
</span><span class="inferred0"><a name="line40"></a>40
|
641
|
-
</span><span class="marked1"><a name="line41"></a>41 def parse(friendly_id)
|
642
|
-
</span><span class="marked0"><a name="line42"></a>42 name, sequence = friendly_id.split(/--/)
|
643
|
-
</span><span class="marked1"><a name="line43"></a>43 sequence ||= "1"
|
644
|
-
</span><span class="marked0"><a name="line44"></a>44 return name, sequence
|
645
|
-
</span><span class="inferred1"><a name="line45"></a>45 end
|
646
|
-
</span><span class="inferred0"><a name="line46"></a>46
|
647
|
-
</span><span class="inferred1"><a name="line47"></a>47 # Remove diacritics (accents, umlauts, etc.) from the string.
|
648
|
-
</span><span class="marked0"><a name="line48"></a>48 def strip_diacritics(string)
|
649
|
-
</span><span class="marked1"><a name="line49"></a>49 require 'unicode'
|
650
|
-
</span><span class="marked0"><a name="line50"></a>50 Unicode::normalize_KD(string).unpack('U*').select { |cp|
|
651
|
-
</span><span class="marked1"><a name="line51"></a>51 cp < 0x300 || cp > 0x036F
|
652
|
-
</span><span class="uncovered0"><a name="line52"></a>52 }.pack('U*')
|
653
|
-
</span><span class="uncovered1"><a name="line53"></a>53 end
|
654
|
-
</span><span class="inferred0"><a name="line54"></a>54
|
655
|
-
</span><span class="marked1"><a name="line55"></a>55 private
|
656
|
-
</span><span class="inferred0"><a name="line56"></a>56
|
657
|
-
</span><span class="marked1"><a name="line57"></a>57 def chars_func
|
658
|
-
</span><span class="marked0"><a name="line58"></a>58 Rails.version =~ /2.2.[\d]*/ ? :mb_chars : :chars
|
659
|
-
</span><span class="uncovered1"><a name="line59"></a>59 rescue NoMethodError
|
660
|
-
</span><span class="uncovered0"><a name="line60"></a>60 :chars
|
661
|
-
</span><span class="marked1"><a name="line61"></a>61 end
|
662
|
-
</span><span class="inferred0"><a name="line62"></a>62
|
663
|
-
</span><span class="inferred1"><a name="line63"></a>63 end
|
664
|
-
</span><span class="inferred0"><a name="line64"></a>64
|
665
|
-
</span><span class="inferred1"><a name="line65"></a>65 # Whether or not this slug is the most recent of its owner's slugs.
|
666
|
-
</span><span class="marked0"><a name="line66"></a>66 def is_most_recent?
|
667
|
-
</span><span class="marked1"><a name="line67"></a>67 sluggable.slug == self
|
668
|
-
</span><span class="marked0"><a name="line68"></a>68 end
|
669
|
-
</span><span class="inferred1"><a name="line69"></a>69
|
670
|
-
</span><span class="marked0"><a name="line70"></a>70 def to_friendly_id
|
671
|
-
</span><span class="marked1"><a name="line71"></a>71 sequence > 1 ? "#{name}--#{sequence}" : name
|
672
|
-
</span><span class="marked0"><a name="line72"></a>72 end
|
673
|
-
</span><span class="inferred1"><a name="line73"></a>73
|
674
|
-
</span><span class="marked0"><a name="line74"></a>74 protected
|
675
|
-
</span><span class="inferred1"><a name="line75"></a>75
|
676
|
-
</span><span class="inferred0"><a name="line76"></a>76 # Raise a FriendlyId::SlugGenerationError if the slug name is blank.
|
677
|
-
</span><span class="marked1"><a name="line77"></a>77 def check_for_blank_name #:nodoc:#
|
678
|
-
</span><span class="marked0"><a name="line78"></a>78 if name.blank?
|
679
|
-
</span><span class="marked1"><a name="line79"></a>79 raise FriendlyId::SlugGenerationError.new("The slug text is blank.")
|
680
|
-
</span><span class="inferred0"><a name="line80"></a>80 end
|
681
|
-
</span><span class="marked1"><a name="line81"></a>81 end
|
682
|
-
</span><span class="inferred0"><a name="line82"></a>82
|
683
|
-
</span><span class="marked1"><a name="line83"></a>83 def set_sequence
|
684
|
-
</span><span class="marked0"><a name="line84"></a>84 last = Slug.find(:first, :conditions => { :name => name, :scope => scope,
|
685
|
-
</span><span class="marked1"><a name="line85"></a>85 :sluggable_type => sluggable_type}, :order => "sequence DESC",
|
686
|
-
</span><span class="inferred0"><a name="line86"></a>86 :select => 'sequence')
|
687
|
-
</span><span class="marked1"><a name="line87"></a>87 self.sequence = last.sequence + 1 if last
|
688
|
-
</span><span class="inferred0"><a name="line88"></a>88 end
|
689
|
-
</span><span class="inferred1"><a name="line89"></a>89
|
690
|
-
</span><span class="marked0"><a name="line90"></a>90 end
|
691
|
-
</span></pre><hr/>
|
692
|
-
<p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a>
|
693
|
-
version 0.8.1.3.</p>
|
694
|
-
</body>
|
695
|
-
</html>
|