mnin-stringex 1.1.1

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 (193) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +76 -0
  3. data/Rakefile +257 -0
  4. data/init.rb +1 -0
  5. data/lib/lucky_sneaks/acts_as_url.rb +90 -0
  6. data/lib/lucky_sneaks/string_extensions.rb +198 -0
  7. data/lib/lucky_sneaks/unidecoder.rb +61 -0
  8. data/lib/lucky_sneaks/unidecoder_data/x00.yml +257 -0
  9. data/lib/lucky_sneaks/unidecoder_data/x01.yml +257 -0
  10. data/lib/lucky_sneaks/unidecoder_data/x02.yml +256 -0
  11. data/lib/lucky_sneaks/unidecoder_data/x03.yml +256 -0
  12. data/lib/lucky_sneaks/unidecoder_data/x04.yml +256 -0
  13. data/lib/lucky_sneaks/unidecoder_data/x05.yml +256 -0
  14. data/lib/lucky_sneaks/unidecoder_data/x06.yml +256 -0
  15. data/lib/lucky_sneaks/unidecoder_data/x07.yml +256 -0
  16. data/lib/lucky_sneaks/unidecoder_data/x09.yml +256 -0
  17. data/lib/lucky_sneaks/unidecoder_data/x0a.yml +256 -0
  18. data/lib/lucky_sneaks/unidecoder_data/x0b.yml +256 -0
  19. data/lib/lucky_sneaks/unidecoder_data/x0c.yml +256 -0
  20. data/lib/lucky_sneaks/unidecoder_data/x0d.yml +256 -0
  21. data/lib/lucky_sneaks/unidecoder_data/x0e.yml +256 -0
  22. data/lib/lucky_sneaks/unidecoder_data/x0f.yml +256 -0
  23. data/lib/lucky_sneaks/unidecoder_data/x10.yml +256 -0
  24. data/lib/lucky_sneaks/unidecoder_data/x11.yml +256 -0
  25. data/lib/lucky_sneaks/unidecoder_data/x12.yml +257 -0
  26. data/lib/lucky_sneaks/unidecoder_data/x13.yml +256 -0
  27. data/lib/lucky_sneaks/unidecoder_data/x14.yml +257 -0
  28. data/lib/lucky_sneaks/unidecoder_data/x15.yml +257 -0
  29. data/lib/lucky_sneaks/unidecoder_data/x16.yml +256 -0
  30. data/lib/lucky_sneaks/unidecoder_data/x17.yml +256 -0
  31. data/lib/lucky_sneaks/unidecoder_data/x18.yml +256 -0
  32. data/lib/lucky_sneaks/unidecoder_data/x1e.yml +256 -0
  33. data/lib/lucky_sneaks/unidecoder_data/x1f.yml +256 -0
  34. data/lib/lucky_sneaks/unidecoder_data/x20.yml +256 -0
  35. data/lib/lucky_sneaks/unidecoder_data/x21.yml +256 -0
  36. data/lib/lucky_sneaks/unidecoder_data/x22.yml +256 -0
  37. data/lib/lucky_sneaks/unidecoder_data/x23.yml +256 -0
  38. data/lib/lucky_sneaks/unidecoder_data/x24.yml +256 -0
  39. data/lib/lucky_sneaks/unidecoder_data/x25.yml +256 -0
  40. data/lib/lucky_sneaks/unidecoder_data/x26.yml +256 -0
  41. data/lib/lucky_sneaks/unidecoder_data/x27.yml +256 -0
  42. data/lib/lucky_sneaks/unidecoder_data/x28.yml +257 -0
  43. data/lib/lucky_sneaks/unidecoder_data/x2e.yml +256 -0
  44. data/lib/lucky_sneaks/unidecoder_data/x2f.yml +256 -0
  45. data/lib/lucky_sneaks/unidecoder_data/x30.yml +256 -0
  46. data/lib/lucky_sneaks/unidecoder_data/x31.yml +256 -0
  47. data/lib/lucky_sneaks/unidecoder_data/x32.yml +256 -0
  48. data/lib/lucky_sneaks/unidecoder_data/x33.yml +256 -0
  49. data/lib/lucky_sneaks/unidecoder_data/x4d.yml +256 -0
  50. data/lib/lucky_sneaks/unidecoder_data/x4e.yml +257 -0
  51. data/lib/lucky_sneaks/unidecoder_data/x4f.yml +257 -0
  52. data/lib/lucky_sneaks/unidecoder_data/x50.yml +257 -0
  53. data/lib/lucky_sneaks/unidecoder_data/x51.yml +257 -0
  54. data/lib/lucky_sneaks/unidecoder_data/x52.yml +257 -0
  55. data/lib/lucky_sneaks/unidecoder_data/x53.yml +257 -0
  56. data/lib/lucky_sneaks/unidecoder_data/x54.yml +257 -0
  57. data/lib/lucky_sneaks/unidecoder_data/x55.yml +257 -0
  58. data/lib/lucky_sneaks/unidecoder_data/x56.yml +257 -0
  59. data/lib/lucky_sneaks/unidecoder_data/x57.yml +257 -0
  60. data/lib/lucky_sneaks/unidecoder_data/x58.yml +257 -0
  61. data/lib/lucky_sneaks/unidecoder_data/x59.yml +257 -0
  62. data/lib/lucky_sneaks/unidecoder_data/x5a.yml +257 -0
  63. data/lib/lucky_sneaks/unidecoder_data/x5b.yml +257 -0
  64. data/lib/lucky_sneaks/unidecoder_data/x5c.yml +257 -0
  65. data/lib/lucky_sneaks/unidecoder_data/x5d.yml +257 -0
  66. data/lib/lucky_sneaks/unidecoder_data/x5e.yml +257 -0
  67. data/lib/lucky_sneaks/unidecoder_data/x5f.yml +257 -0
  68. data/lib/lucky_sneaks/unidecoder_data/x60.yml +257 -0
  69. data/lib/lucky_sneaks/unidecoder_data/x61.yml +257 -0
  70. data/lib/lucky_sneaks/unidecoder_data/x62.yml +257 -0
  71. data/lib/lucky_sneaks/unidecoder_data/x63.yml +257 -0
  72. data/lib/lucky_sneaks/unidecoder_data/x64.yml +257 -0
  73. data/lib/lucky_sneaks/unidecoder_data/x65.yml +257 -0
  74. data/lib/lucky_sneaks/unidecoder_data/x66.yml +257 -0
  75. data/lib/lucky_sneaks/unidecoder_data/x67.yml +257 -0
  76. data/lib/lucky_sneaks/unidecoder_data/x68.yml +257 -0
  77. data/lib/lucky_sneaks/unidecoder_data/x69.yml +257 -0
  78. data/lib/lucky_sneaks/unidecoder_data/x6a.yml +257 -0
  79. data/lib/lucky_sneaks/unidecoder_data/x6b.yml +257 -0
  80. data/lib/lucky_sneaks/unidecoder_data/x6c.yml +257 -0
  81. data/lib/lucky_sneaks/unidecoder_data/x6d.yml +257 -0
  82. data/lib/lucky_sneaks/unidecoder_data/x6e.yml +257 -0
  83. data/lib/lucky_sneaks/unidecoder_data/x6f.yml +257 -0
  84. data/lib/lucky_sneaks/unidecoder_data/x70.yml +257 -0
  85. data/lib/lucky_sneaks/unidecoder_data/x71.yml +257 -0
  86. data/lib/lucky_sneaks/unidecoder_data/x72.yml +257 -0
  87. data/lib/lucky_sneaks/unidecoder_data/x73.yml +257 -0
  88. data/lib/lucky_sneaks/unidecoder_data/x74.yml +257 -0
  89. data/lib/lucky_sneaks/unidecoder_data/x75.yml +257 -0
  90. data/lib/lucky_sneaks/unidecoder_data/x76.yml +257 -0
  91. data/lib/lucky_sneaks/unidecoder_data/x77.yml +257 -0
  92. data/lib/lucky_sneaks/unidecoder_data/x78.yml +257 -0
  93. data/lib/lucky_sneaks/unidecoder_data/x79.yml +257 -0
  94. data/lib/lucky_sneaks/unidecoder_data/x7a.yml +257 -0
  95. data/lib/lucky_sneaks/unidecoder_data/x7b.yml +257 -0
  96. data/lib/lucky_sneaks/unidecoder_data/x7c.yml +257 -0
  97. data/lib/lucky_sneaks/unidecoder_data/x7d.yml +257 -0
  98. data/lib/lucky_sneaks/unidecoder_data/x7e.yml +257 -0
  99. data/lib/lucky_sneaks/unidecoder_data/x7f.yml +257 -0
  100. data/lib/lucky_sneaks/unidecoder_data/x80.yml +257 -0
  101. data/lib/lucky_sneaks/unidecoder_data/x81.yml +257 -0
  102. data/lib/lucky_sneaks/unidecoder_data/x82.yml +257 -0
  103. data/lib/lucky_sneaks/unidecoder_data/x83.yml +257 -0
  104. data/lib/lucky_sneaks/unidecoder_data/x84.yml +257 -0
  105. data/lib/lucky_sneaks/unidecoder_data/x85.yml +257 -0
  106. data/lib/lucky_sneaks/unidecoder_data/x86.yml +257 -0
  107. data/lib/lucky_sneaks/unidecoder_data/x87.yml +257 -0
  108. data/lib/lucky_sneaks/unidecoder_data/x88.yml +257 -0
  109. data/lib/lucky_sneaks/unidecoder_data/x89.yml +257 -0
  110. data/lib/lucky_sneaks/unidecoder_data/x8a.yml +257 -0
  111. data/lib/lucky_sneaks/unidecoder_data/x8b.yml +257 -0
  112. data/lib/lucky_sneaks/unidecoder_data/x8c.yml +257 -0
  113. data/lib/lucky_sneaks/unidecoder_data/x8d.yml +257 -0
  114. data/lib/lucky_sneaks/unidecoder_data/x8e.yml +257 -0
  115. data/lib/lucky_sneaks/unidecoder_data/x8f.yml +257 -0
  116. data/lib/lucky_sneaks/unidecoder_data/x90.yml +257 -0
  117. data/lib/lucky_sneaks/unidecoder_data/x91.yml +257 -0
  118. data/lib/lucky_sneaks/unidecoder_data/x92.yml +257 -0
  119. data/lib/lucky_sneaks/unidecoder_data/x93.yml +257 -0
  120. data/lib/lucky_sneaks/unidecoder_data/x94.yml +257 -0
  121. data/lib/lucky_sneaks/unidecoder_data/x95.yml +257 -0
  122. data/lib/lucky_sneaks/unidecoder_data/x96.yml +257 -0
  123. data/lib/lucky_sneaks/unidecoder_data/x97.yml +257 -0
  124. data/lib/lucky_sneaks/unidecoder_data/x98.yml +257 -0
  125. data/lib/lucky_sneaks/unidecoder_data/x99.yml +257 -0
  126. data/lib/lucky_sneaks/unidecoder_data/x9a.yml +257 -0
  127. data/lib/lucky_sneaks/unidecoder_data/x9b.yml +257 -0
  128. data/lib/lucky_sneaks/unidecoder_data/x9c.yml +257 -0
  129. data/lib/lucky_sneaks/unidecoder_data/x9d.yml +257 -0
  130. data/lib/lucky_sneaks/unidecoder_data/x9e.yml +257 -0
  131. data/lib/lucky_sneaks/unidecoder_data/x9f.yml +256 -0
  132. data/lib/lucky_sneaks/unidecoder_data/xa0.yml +257 -0
  133. data/lib/lucky_sneaks/unidecoder_data/xa1.yml +257 -0
  134. data/lib/lucky_sneaks/unidecoder_data/xa2.yml +257 -0
  135. data/lib/lucky_sneaks/unidecoder_data/xa3.yml +257 -0
  136. data/lib/lucky_sneaks/unidecoder_data/xa4.yml +256 -0
  137. data/lib/lucky_sneaks/unidecoder_data/xac.yml +257 -0
  138. data/lib/lucky_sneaks/unidecoder_data/xad.yml +257 -0
  139. data/lib/lucky_sneaks/unidecoder_data/xae.yml +257 -0
  140. data/lib/lucky_sneaks/unidecoder_data/xaf.yml +257 -0
  141. data/lib/lucky_sneaks/unidecoder_data/xb0.yml +257 -0
  142. data/lib/lucky_sneaks/unidecoder_data/xb1.yml +257 -0
  143. data/lib/lucky_sneaks/unidecoder_data/xb2.yml +257 -0
  144. data/lib/lucky_sneaks/unidecoder_data/xb3.yml +257 -0
  145. data/lib/lucky_sneaks/unidecoder_data/xb4.yml +257 -0
  146. data/lib/lucky_sneaks/unidecoder_data/xb5.yml +257 -0
  147. data/lib/lucky_sneaks/unidecoder_data/xb6.yml +257 -0
  148. data/lib/lucky_sneaks/unidecoder_data/xb7.yml +257 -0
  149. data/lib/lucky_sneaks/unidecoder_data/xb8.yml +257 -0
  150. data/lib/lucky_sneaks/unidecoder_data/xb9.yml +257 -0
  151. data/lib/lucky_sneaks/unidecoder_data/xba.yml +257 -0
  152. data/lib/lucky_sneaks/unidecoder_data/xbb.yml +257 -0
  153. data/lib/lucky_sneaks/unidecoder_data/xbc.yml +257 -0
  154. data/lib/lucky_sneaks/unidecoder_data/xbd.yml +257 -0
  155. data/lib/lucky_sneaks/unidecoder_data/xbe.yml +257 -0
  156. data/lib/lucky_sneaks/unidecoder_data/xbf.yml +257 -0
  157. data/lib/lucky_sneaks/unidecoder_data/xc0.yml +257 -0
  158. data/lib/lucky_sneaks/unidecoder_data/xc1.yml +257 -0
  159. data/lib/lucky_sneaks/unidecoder_data/xc2.yml +257 -0
  160. data/lib/lucky_sneaks/unidecoder_data/xc3.yml +257 -0
  161. data/lib/lucky_sneaks/unidecoder_data/xc4.yml +257 -0
  162. data/lib/lucky_sneaks/unidecoder_data/xc5.yml +257 -0
  163. data/lib/lucky_sneaks/unidecoder_data/xc6.yml +257 -0
  164. data/lib/lucky_sneaks/unidecoder_data/xc7.yml +257 -0
  165. data/lib/lucky_sneaks/unidecoder_data/xc8.yml +257 -0
  166. data/lib/lucky_sneaks/unidecoder_data/xc9.yml +257 -0
  167. data/lib/lucky_sneaks/unidecoder_data/xca.yml +257 -0
  168. data/lib/lucky_sneaks/unidecoder_data/xcb.yml +257 -0
  169. data/lib/lucky_sneaks/unidecoder_data/xcc.yml +257 -0
  170. data/lib/lucky_sneaks/unidecoder_data/xcd.yml +257 -0
  171. data/lib/lucky_sneaks/unidecoder_data/xce.yml +257 -0
  172. data/lib/lucky_sneaks/unidecoder_data/xcf.yml +257 -0
  173. data/lib/lucky_sneaks/unidecoder_data/xd0.yml +257 -0
  174. data/lib/lucky_sneaks/unidecoder_data/xd1.yml +257 -0
  175. data/lib/lucky_sneaks/unidecoder_data/xd2.yml +257 -0
  176. data/lib/lucky_sneaks/unidecoder_data/xd3.yml +257 -0
  177. data/lib/lucky_sneaks/unidecoder_data/xd4.yml +257 -0
  178. data/lib/lucky_sneaks/unidecoder_data/xd5.yml +257 -0
  179. data/lib/lucky_sneaks/unidecoder_data/xd6.yml +257 -0
  180. data/lib/lucky_sneaks/unidecoder_data/xd7.yml +256 -0
  181. data/lib/lucky_sneaks/unidecoder_data/xf9.yml +257 -0
  182. data/lib/lucky_sneaks/unidecoder_data/xfa.yml +256 -0
  183. data/lib/lucky_sneaks/unidecoder_data/xfb.yml +257 -0
  184. data/lib/lucky_sneaks/unidecoder_data/xfc.yml +257 -0
  185. data/lib/lucky_sneaks/unidecoder_data/xfd.yml +256 -0
  186. data/lib/lucky_sneaks/unidecoder_data/xfe.yml +257 -0
  187. data/lib/lucky_sneaks/unidecoder_data/xff.yml +257 -0
  188. data/lib/stringex.rb +9 -0
  189. data/stringex.gemspec +231 -0
  190. data/test/acts_as_url_test.rb +206 -0
  191. data/test/string_extensions_test.rb +160 -0
  192. data/test/unidecoder_test.rb +92 -0
  193. metadata +251 -0
@@ -0,0 +1,9 @@
1
+ require 'lucky_sneaks/string_extensions'
2
+ require 'lucky_sneaks/unidecoder'
3
+
4
+ String.send :include, LuckySneaks::StringExtensions
5
+
6
+ if defined?(ActiveRecord)
7
+ require 'lucky_sneaks/acts_as_url'
8
+ ActiveRecord::Base.send :include, LuckySneaks::ActsAsUrl
9
+ end
@@ -0,0 +1,231 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{mnin-stringex}
8
+ s.version = "1.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Russell Norris", 'Martin Wilhelmi']
12
+ s.date = %q{2010-01-14}
13
+ s.description = %q{Some [hopefully] useful extensions to Ruby’s String class. Stringex is made up of three libraries: ActsAsUrl [permalink solution with better character translation], Unidecoder [Unicode to Ascii transliteration], and StringExtensions [miscellaneous helper methods for the String class].}
14
+ s.email = %q{rsl@luckysneaks.com}
15
+ s.extra_rdoc_files = [
16
+ "MIT-LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ "MIT-LICENSE",
21
+ "README.rdoc",
22
+ "Rakefile",
23
+ "init.rb",
24
+ "lib/lucky_sneaks/acts_as_url.rb",
25
+ "lib/lucky_sneaks/string_extensions.rb",
26
+ "lib/lucky_sneaks/unidecoder.rb",
27
+ "lib/lucky_sneaks/unidecoder_data/x00.yml",
28
+ "lib/lucky_sneaks/unidecoder_data/x01.yml",
29
+ "lib/lucky_sneaks/unidecoder_data/x02.yml",
30
+ "lib/lucky_sneaks/unidecoder_data/x03.yml",
31
+ "lib/lucky_sneaks/unidecoder_data/x04.yml",
32
+ "lib/lucky_sneaks/unidecoder_data/x05.yml",
33
+ "lib/lucky_sneaks/unidecoder_data/x06.yml",
34
+ "lib/lucky_sneaks/unidecoder_data/x07.yml",
35
+ "lib/lucky_sneaks/unidecoder_data/x09.yml",
36
+ "lib/lucky_sneaks/unidecoder_data/x0a.yml",
37
+ "lib/lucky_sneaks/unidecoder_data/x0b.yml",
38
+ "lib/lucky_sneaks/unidecoder_data/x0c.yml",
39
+ "lib/lucky_sneaks/unidecoder_data/x0d.yml",
40
+ "lib/lucky_sneaks/unidecoder_data/x0e.yml",
41
+ "lib/lucky_sneaks/unidecoder_data/x0f.yml",
42
+ "lib/lucky_sneaks/unidecoder_data/x10.yml",
43
+ "lib/lucky_sneaks/unidecoder_data/x11.yml",
44
+ "lib/lucky_sneaks/unidecoder_data/x12.yml",
45
+ "lib/lucky_sneaks/unidecoder_data/x13.yml",
46
+ "lib/lucky_sneaks/unidecoder_data/x14.yml",
47
+ "lib/lucky_sneaks/unidecoder_data/x15.yml",
48
+ "lib/lucky_sneaks/unidecoder_data/x16.yml",
49
+ "lib/lucky_sneaks/unidecoder_data/x17.yml",
50
+ "lib/lucky_sneaks/unidecoder_data/x18.yml",
51
+ "lib/lucky_sneaks/unidecoder_data/x1e.yml",
52
+ "lib/lucky_sneaks/unidecoder_data/x1f.yml",
53
+ "lib/lucky_sneaks/unidecoder_data/x20.yml",
54
+ "lib/lucky_sneaks/unidecoder_data/x21.yml",
55
+ "lib/lucky_sneaks/unidecoder_data/x22.yml",
56
+ "lib/lucky_sneaks/unidecoder_data/x23.yml",
57
+ "lib/lucky_sneaks/unidecoder_data/x24.yml",
58
+ "lib/lucky_sneaks/unidecoder_data/x25.yml",
59
+ "lib/lucky_sneaks/unidecoder_data/x26.yml",
60
+ "lib/lucky_sneaks/unidecoder_data/x27.yml",
61
+ "lib/lucky_sneaks/unidecoder_data/x28.yml",
62
+ "lib/lucky_sneaks/unidecoder_data/x2e.yml",
63
+ "lib/lucky_sneaks/unidecoder_data/x2f.yml",
64
+ "lib/lucky_sneaks/unidecoder_data/x30.yml",
65
+ "lib/lucky_sneaks/unidecoder_data/x31.yml",
66
+ "lib/lucky_sneaks/unidecoder_data/x32.yml",
67
+ "lib/lucky_sneaks/unidecoder_data/x33.yml",
68
+ "lib/lucky_sneaks/unidecoder_data/x4d.yml",
69
+ "lib/lucky_sneaks/unidecoder_data/x4e.yml",
70
+ "lib/lucky_sneaks/unidecoder_data/x4f.yml",
71
+ "lib/lucky_sneaks/unidecoder_data/x50.yml",
72
+ "lib/lucky_sneaks/unidecoder_data/x51.yml",
73
+ "lib/lucky_sneaks/unidecoder_data/x52.yml",
74
+ "lib/lucky_sneaks/unidecoder_data/x53.yml",
75
+ "lib/lucky_sneaks/unidecoder_data/x54.yml",
76
+ "lib/lucky_sneaks/unidecoder_data/x55.yml",
77
+ "lib/lucky_sneaks/unidecoder_data/x56.yml",
78
+ "lib/lucky_sneaks/unidecoder_data/x57.yml",
79
+ "lib/lucky_sneaks/unidecoder_data/x58.yml",
80
+ "lib/lucky_sneaks/unidecoder_data/x59.yml",
81
+ "lib/lucky_sneaks/unidecoder_data/x5a.yml",
82
+ "lib/lucky_sneaks/unidecoder_data/x5b.yml",
83
+ "lib/lucky_sneaks/unidecoder_data/x5c.yml",
84
+ "lib/lucky_sneaks/unidecoder_data/x5d.yml",
85
+ "lib/lucky_sneaks/unidecoder_data/x5e.yml",
86
+ "lib/lucky_sneaks/unidecoder_data/x5f.yml",
87
+ "lib/lucky_sneaks/unidecoder_data/x60.yml",
88
+ "lib/lucky_sneaks/unidecoder_data/x61.yml",
89
+ "lib/lucky_sneaks/unidecoder_data/x62.yml",
90
+ "lib/lucky_sneaks/unidecoder_data/x63.yml",
91
+ "lib/lucky_sneaks/unidecoder_data/x64.yml",
92
+ "lib/lucky_sneaks/unidecoder_data/x65.yml",
93
+ "lib/lucky_sneaks/unidecoder_data/x66.yml",
94
+ "lib/lucky_sneaks/unidecoder_data/x67.yml",
95
+ "lib/lucky_sneaks/unidecoder_data/x68.yml",
96
+ "lib/lucky_sneaks/unidecoder_data/x69.yml",
97
+ "lib/lucky_sneaks/unidecoder_data/x6a.yml",
98
+ "lib/lucky_sneaks/unidecoder_data/x6b.yml",
99
+ "lib/lucky_sneaks/unidecoder_data/x6c.yml",
100
+ "lib/lucky_sneaks/unidecoder_data/x6d.yml",
101
+ "lib/lucky_sneaks/unidecoder_data/x6e.yml",
102
+ "lib/lucky_sneaks/unidecoder_data/x6f.yml",
103
+ "lib/lucky_sneaks/unidecoder_data/x70.yml",
104
+ "lib/lucky_sneaks/unidecoder_data/x71.yml",
105
+ "lib/lucky_sneaks/unidecoder_data/x72.yml",
106
+ "lib/lucky_sneaks/unidecoder_data/x73.yml",
107
+ "lib/lucky_sneaks/unidecoder_data/x74.yml",
108
+ "lib/lucky_sneaks/unidecoder_data/x75.yml",
109
+ "lib/lucky_sneaks/unidecoder_data/x76.yml",
110
+ "lib/lucky_sneaks/unidecoder_data/x77.yml",
111
+ "lib/lucky_sneaks/unidecoder_data/x78.yml",
112
+ "lib/lucky_sneaks/unidecoder_data/x79.yml",
113
+ "lib/lucky_sneaks/unidecoder_data/x7a.yml",
114
+ "lib/lucky_sneaks/unidecoder_data/x7b.yml",
115
+ "lib/lucky_sneaks/unidecoder_data/x7c.yml",
116
+ "lib/lucky_sneaks/unidecoder_data/x7d.yml",
117
+ "lib/lucky_sneaks/unidecoder_data/x7e.yml",
118
+ "lib/lucky_sneaks/unidecoder_data/x7f.yml",
119
+ "lib/lucky_sneaks/unidecoder_data/x80.yml",
120
+ "lib/lucky_sneaks/unidecoder_data/x81.yml",
121
+ "lib/lucky_sneaks/unidecoder_data/x82.yml",
122
+ "lib/lucky_sneaks/unidecoder_data/x83.yml",
123
+ "lib/lucky_sneaks/unidecoder_data/x84.yml",
124
+ "lib/lucky_sneaks/unidecoder_data/x85.yml",
125
+ "lib/lucky_sneaks/unidecoder_data/x86.yml",
126
+ "lib/lucky_sneaks/unidecoder_data/x87.yml",
127
+ "lib/lucky_sneaks/unidecoder_data/x88.yml",
128
+ "lib/lucky_sneaks/unidecoder_data/x89.yml",
129
+ "lib/lucky_sneaks/unidecoder_data/x8a.yml",
130
+ "lib/lucky_sneaks/unidecoder_data/x8b.yml",
131
+ "lib/lucky_sneaks/unidecoder_data/x8c.yml",
132
+ "lib/lucky_sneaks/unidecoder_data/x8d.yml",
133
+ "lib/lucky_sneaks/unidecoder_data/x8e.yml",
134
+ "lib/lucky_sneaks/unidecoder_data/x8f.yml",
135
+ "lib/lucky_sneaks/unidecoder_data/x90.yml",
136
+ "lib/lucky_sneaks/unidecoder_data/x91.yml",
137
+ "lib/lucky_sneaks/unidecoder_data/x92.yml",
138
+ "lib/lucky_sneaks/unidecoder_data/x93.yml",
139
+ "lib/lucky_sneaks/unidecoder_data/x94.yml",
140
+ "lib/lucky_sneaks/unidecoder_data/x95.yml",
141
+ "lib/lucky_sneaks/unidecoder_data/x96.yml",
142
+ "lib/lucky_sneaks/unidecoder_data/x97.yml",
143
+ "lib/lucky_sneaks/unidecoder_data/x98.yml",
144
+ "lib/lucky_sneaks/unidecoder_data/x99.yml",
145
+ "lib/lucky_sneaks/unidecoder_data/x9a.yml",
146
+ "lib/lucky_sneaks/unidecoder_data/x9b.yml",
147
+ "lib/lucky_sneaks/unidecoder_data/x9c.yml",
148
+ "lib/lucky_sneaks/unidecoder_data/x9d.yml",
149
+ "lib/lucky_sneaks/unidecoder_data/x9e.yml",
150
+ "lib/lucky_sneaks/unidecoder_data/x9f.yml",
151
+ "lib/lucky_sneaks/unidecoder_data/xa0.yml",
152
+ "lib/lucky_sneaks/unidecoder_data/xa1.yml",
153
+ "lib/lucky_sneaks/unidecoder_data/xa2.yml",
154
+ "lib/lucky_sneaks/unidecoder_data/xa3.yml",
155
+ "lib/lucky_sneaks/unidecoder_data/xa4.yml",
156
+ "lib/lucky_sneaks/unidecoder_data/xac.yml",
157
+ "lib/lucky_sneaks/unidecoder_data/xad.yml",
158
+ "lib/lucky_sneaks/unidecoder_data/xae.yml",
159
+ "lib/lucky_sneaks/unidecoder_data/xaf.yml",
160
+ "lib/lucky_sneaks/unidecoder_data/xb0.yml",
161
+ "lib/lucky_sneaks/unidecoder_data/xb1.yml",
162
+ "lib/lucky_sneaks/unidecoder_data/xb2.yml",
163
+ "lib/lucky_sneaks/unidecoder_data/xb3.yml",
164
+ "lib/lucky_sneaks/unidecoder_data/xb4.yml",
165
+ "lib/lucky_sneaks/unidecoder_data/xb5.yml",
166
+ "lib/lucky_sneaks/unidecoder_data/xb6.yml",
167
+ "lib/lucky_sneaks/unidecoder_data/xb7.yml",
168
+ "lib/lucky_sneaks/unidecoder_data/xb8.yml",
169
+ "lib/lucky_sneaks/unidecoder_data/xb9.yml",
170
+ "lib/lucky_sneaks/unidecoder_data/xba.yml",
171
+ "lib/lucky_sneaks/unidecoder_data/xbb.yml",
172
+ "lib/lucky_sneaks/unidecoder_data/xbc.yml",
173
+ "lib/lucky_sneaks/unidecoder_data/xbd.yml",
174
+ "lib/lucky_sneaks/unidecoder_data/xbe.yml",
175
+ "lib/lucky_sneaks/unidecoder_data/xbf.yml",
176
+ "lib/lucky_sneaks/unidecoder_data/xc0.yml",
177
+ "lib/lucky_sneaks/unidecoder_data/xc1.yml",
178
+ "lib/lucky_sneaks/unidecoder_data/xc2.yml",
179
+ "lib/lucky_sneaks/unidecoder_data/xc3.yml",
180
+ "lib/lucky_sneaks/unidecoder_data/xc4.yml",
181
+ "lib/lucky_sneaks/unidecoder_data/xc5.yml",
182
+ "lib/lucky_sneaks/unidecoder_data/xc6.yml",
183
+ "lib/lucky_sneaks/unidecoder_data/xc7.yml",
184
+ "lib/lucky_sneaks/unidecoder_data/xc8.yml",
185
+ "lib/lucky_sneaks/unidecoder_data/xc9.yml",
186
+ "lib/lucky_sneaks/unidecoder_data/xca.yml",
187
+ "lib/lucky_sneaks/unidecoder_data/xcb.yml",
188
+ "lib/lucky_sneaks/unidecoder_data/xcc.yml",
189
+ "lib/lucky_sneaks/unidecoder_data/xcd.yml",
190
+ "lib/lucky_sneaks/unidecoder_data/xce.yml",
191
+ "lib/lucky_sneaks/unidecoder_data/xcf.yml",
192
+ "lib/lucky_sneaks/unidecoder_data/xd0.yml",
193
+ "lib/lucky_sneaks/unidecoder_data/xd1.yml",
194
+ "lib/lucky_sneaks/unidecoder_data/xd2.yml",
195
+ "lib/lucky_sneaks/unidecoder_data/xd3.yml",
196
+ "lib/lucky_sneaks/unidecoder_data/xd4.yml",
197
+ "lib/lucky_sneaks/unidecoder_data/xd5.yml",
198
+ "lib/lucky_sneaks/unidecoder_data/xd6.yml",
199
+ "lib/lucky_sneaks/unidecoder_data/xd7.yml",
200
+ "lib/lucky_sneaks/unidecoder_data/xf9.yml",
201
+ "lib/lucky_sneaks/unidecoder_data/xfa.yml",
202
+ "lib/lucky_sneaks/unidecoder_data/xfb.yml",
203
+ "lib/lucky_sneaks/unidecoder_data/xfc.yml",
204
+ "lib/lucky_sneaks/unidecoder_data/xfd.yml",
205
+ "lib/lucky_sneaks/unidecoder_data/xfe.yml",
206
+ "lib/lucky_sneaks/unidecoder_data/xff.yml",
207
+ "lib/stringex.rb",
208
+ "stringex.gemspec"
209
+ ]
210
+ s.homepage = %q{http://github.com/mnin/stringex}
211
+ s.rdoc_options = ["--main", "README.rdoc", "--charset", "utf-8", "--line-numbers"]
212
+ s.require_paths = ["lib"]
213
+ s.rubyforge_project = %q{stringex}
214
+ s.rubygems_version = %q{1.3.5}
215
+ s.summary = %q{Some [hopefully] useful extensions to Ruby’s String class}
216
+ s.test_files = [
217
+ "test/acts_as_url_test.rb",
218
+ "test/string_extensions_test.rb",
219
+ "test/unidecoder_test.rb"
220
+ ]
221
+
222
+ if s.respond_to? :specification_version then
223
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
224
+ s.specification_version = 3
225
+
226
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
227
+ else
228
+ end
229
+ else
230
+ end
231
+ end
@@ -0,0 +1,206 @@
1
+ require 'test/unit'
2
+
3
+ begin
4
+ require File.dirname(__FILE__) + '/../../../config/environment'
5
+ rescue LoadError
6
+ require 'rubygems'
7
+ gem 'activerecord'
8
+ require 'active_record'
9
+
10
+ RAILS_ROOT = File.dirname(__FILE__)
11
+ $: << File.join(File.dirname(__FILE__), '../lib')
12
+ end
13
+
14
+ require File.join(File.dirname(__FILE__), '../init')
15
+
16
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => "acts_as_url.sqlite3")
17
+
18
+ ActiveRecord::Migration.verbose = false
19
+ ActiveRecord::Schema.define(:version => 1) do
20
+ create_table :documents, :force => true do |t|
21
+ t.string :title, :url, :other
22
+ end
23
+
24
+ create_table :updateuments, :force => true do |t|
25
+ t.string :title, :url, :other
26
+ end
27
+
28
+ create_table :mocuments, :force => true do |t|
29
+ t.string :title, :url, :other
30
+ end
31
+
32
+ create_table :permuments, :force => true do |t|
33
+ t.string :title, :permalink, :other
34
+ end
35
+
36
+ create_table :procuments, :force => true do |t|
37
+ t.string :title, :url, :other
38
+ end
39
+
40
+ create_table :blankuments, :force => true do |t|
41
+ t.string :title, :url, :other
42
+ end
43
+
44
+ create_table :duplicateuments, :force => true do |t|
45
+ t.string :title, :url, :other
46
+ end
47
+ end
48
+ ActiveRecord::Migration.verbose = true
49
+
50
+ class Document < ActiveRecord::Base
51
+ acts_as_url :title
52
+ end
53
+
54
+ class Updateument < ActiveRecord::Base
55
+ acts_as_url :title, :sync_url => true
56
+ end
57
+
58
+ class Mocument < ActiveRecord::Base
59
+ acts_as_url :title, :scope => :other, :sync_url => true
60
+ end
61
+
62
+ class Permument < ActiveRecord::Base
63
+ acts_as_url :title, :url_attribute => :permalink
64
+ end
65
+
66
+ class Procument < ActiveRecord::Base
67
+ acts_as_url :non_attribute_method
68
+
69
+ def non_attribute_method
70
+ "#{title} got massaged"
71
+ end
72
+ end
73
+
74
+ class Blankument < ActiveRecord::Base
75
+ acts_as_url :title, :only_when_blank => true
76
+ end
77
+
78
+ class Duplicateument < ActiveRecord::Base
79
+ acts_as_url :title, :duplicate_count_separator => "---"
80
+ end
81
+
82
+ class ActsAsUrlTest < Test::Unit::TestCase
83
+ def test_should_create_url
84
+ @doc = Document.create(:title => "Let's Make a Test Title, <em>Okay</em>?")
85
+ assert_equal "lets-make-a-test-title-okay", @doc.url
86
+ end
87
+
88
+ def test_should_create_unique_url
89
+ @doc = Document.create!(:title => "Unique")
90
+ @other_doc = Document.create!(:title => "Unique")
91
+ assert_equal "unique-1", @other_doc.url
92
+ end
93
+
94
+ def test_should_not_succ_on_repeated_saves
95
+ @doc = Document.new(:title => "Continuous or Constant")
96
+ 5.times do
97
+ @doc.save!
98
+ assert_equal "continuous-or-constant", @doc.url
99
+ end
100
+ end
101
+
102
+ def test_should_create_unique_url_and_not_clobber_if_another_exists
103
+ @doc = Updateument.create!(:title => "Unique")
104
+ @other_doc = Updateument.create!(:title => "Unique")
105
+ @doc.update_attributes :other => "foo"
106
+
107
+ @doc2 = Document.create!(:title => "twonique")
108
+ @other_doc2 = Document.create!(:title => "twonique")
109
+ @doc2.update_attributes(:other => "foo")
110
+
111
+ assert_equal "unique", @doc.url
112
+ assert_equal "foo", @doc.other
113
+ assert_equal "unique-1", @other_doc.url
114
+
115
+ assert_equal "twonique", @doc2.url
116
+ assert_equal "foo", @doc2.other
117
+ assert_equal "twonique-1", @other_doc2.url
118
+ end
119
+
120
+ def test_should_create_unique_url_when_partial_url_already_exists
121
+ @doc = Document.create!(:title => "House Farms")
122
+ @other_doc = Document.create!(:title => "House Farm")
123
+
124
+ assert_equal "house-farms", @doc.url
125
+ assert_equal "house-farm", @other_doc.url
126
+ end
127
+
128
+ def test_should_scope_uniqueness
129
+ @moc = Mocument.create!(:title => "Mocumentary", :other => "I dunno why but I don't care if I'm unique")
130
+ @other_moc = Mocument.create!(:title => "Mocumentary")
131
+ assert_equal @moc.url, @other_moc.url
132
+ end
133
+
134
+ def test_should_still_create_unique_if_in_same_scope
135
+ @moc = Mocument.create!(:title => "Mocumentary", :other => "Suddenly, I care if I'm unique")
136
+ @other_moc = Mocument.create!(:title => "Mocumentary", :other => "Suddenly, I care if I'm unique")
137
+ assert_not_equal @moc.url, @other_moc.url
138
+ end
139
+
140
+ def test_should_use_alternate_field_name
141
+ @perm = Permument.create!(:title => "Anything at This Point")
142
+ assert_equal "anything-at-this-point", @perm.permalink
143
+ end
144
+
145
+ def test_should_not_update_url_by_default
146
+ @doc = Document.create!(:title => "Stable as Stone")
147
+ @original_url = @doc.url
148
+ @doc.update_attributes :title => "New Unstable Madness"
149
+ assert_equal @original_url, @doc.url
150
+ end
151
+
152
+ def test_should_update_url_if_asked
153
+ @moc = Mocument.create!(:title => "Original")
154
+ @original_url = @moc.url
155
+ @moc.update_attributes :title => "New and Improved"
156
+ assert_not_equal @original_url, @moc.url
157
+ end
158
+
159
+ def test_should_update_url_only_when_blank_if_asked
160
+ @original_url = 'the-url-of-concrete'
161
+ @blank = Blankument.create!(:title => "Stable as Stone", :url => @original_url)
162
+ assert_equal @original_url, @blank.url
163
+ @blank = Blankument.create!(:title => "Stable as Stone")
164
+ assert_equal 'stable-as-stone', @blank.url
165
+ end
166
+
167
+ def test_should_mass_initialize_urls
168
+ @doc_1 = Document.create!(:title => "Initial")
169
+ @doc_2 = Document.create!(:title => "Subsequent")
170
+ @doc_1.update_attribute :url, nil
171
+ @doc_2.update_attribute :url, nil
172
+ assert_nil @doc_1.url
173
+ assert_nil @doc_2.url
174
+ Document.initialize_urls
175
+ @doc_1.reload
176
+ @doc_2.reload
177
+ assert_equal "initial", @doc_1.url
178
+ assert_equal "subsequent", @doc_2.url
179
+ end
180
+
181
+ def test_should_mass_initialize_urls_with_custom_url_attribute
182
+ @doc_1 = Permument.create!(:title => "Initial")
183
+ @doc_2 = Permument.create!(:title => "Subsequent")
184
+ @doc_1.update_attribute :permalink, nil
185
+ @doc_2.update_attribute :permalink, nil
186
+ assert_nil @doc_1.permalink
187
+ assert_nil @doc_2.permalink
188
+ Permument.initialize_urls
189
+ @doc_1.reload
190
+ @doc_2.reload
191
+ assert_equal "initial", @doc_1.permalink
192
+ assert_equal "subsequent", @doc_2.permalink
193
+ end
194
+
195
+ def test_should_utilize_block_if_given
196
+ @doc = Procument.create!(:title => "Title String")
197
+ assert_equal "title-string-got-massaged", @doc.url
198
+ end
199
+
200
+ def test_should_create_unique_with_custom_duplicate_count_separator
201
+ @doc = Duplicateument.create!(:title => "Unique")
202
+ @other_doc = Duplicateument.create!(:title => "Unique")
203
+ assert_equal "unique", @doc.url
204
+ assert_equal "unique---1", @other_doc.url
205
+ end
206
+ end
@@ -0,0 +1,160 @@
1
+ # coding: utf-8
2
+
3
+ require "test/unit"
4
+
5
+ $: << File.join(File.dirname(__FILE__), '../lib')
6
+ require File.join(File.dirname(__FILE__), "../init")
7
+
8
+ class StringExtensionsTest < Test::Unit::TestCase
9
+ def test_to_html
10
+ require "rubygems"
11
+ require "RedCloth"
12
+ {
13
+ "h1. A Solution" => "<h1>A Solution</h1>",
14
+ "I hated wrapping textilize around a string.\n\nIt always felt dirty." =>
15
+ "<p>I hated wrapping textilize around a string.</p>\n<p>It always felt dirty.</p>",
16
+ "I think _this_ is awesome" => "<p>I think <em>this</em> is awesome</p>",
17
+ "Um... _*really*_, man" => "<p>Um&#8230; <em><strong>really</strong></em>, man</p>"
18
+ }.each do |plain, html|
19
+ assert_equal html, plain.to_html
20
+ end
21
+ rescue LoadError
22
+ puts "\n>> Could not load RedCloth. String#to_html was not tested.\n>> Please gem install RedCloth if you'd like to use this functionality."
23
+ end
24
+
25
+ def test_to_html_lite
26
+ require "rubygems"
27
+ require "RedCloth"
28
+ {
29
+ "I have no pee on me" => "I have no pee on me",
30
+ "But I _do_ get Textile!" => "But I <em>do</em> get Textile!"
31
+ }.each do |plain, html|
32
+ assert_equal html, plain.to_html(:lite)
33
+ end
34
+ rescue LoadError
35
+ puts "\n>> Could not load RedCloth. String#to_html (with :lite argument) was not tested.\n>> Please gem install RedCloth if you'd like to use this functionality."
36
+ end
37
+
38
+ def test_to_url
39
+ {
40
+ "<p>This has 100% too much <em>formatting</em></p>" =>
41
+ "this-has-100-percent-too-much-formatting",
42
+ "Tea &amp; crumpets &amp; <strong>cr&ecirc;pes</strong> for me!" =>
43
+ "tea-and-crumpets-and-crepes-for-me",
44
+ "The Suspense... Is... Killing Me" =>
45
+ "the-suspense-dot-dot-dot-is-dot-dot-dot-killing-me",
46
+ "How to use attr_accessible and attr_protected" =>
47
+ "how-to-use-attr-accessible-and-attr-protected",
48
+ "I'm just making sure there's nothing wrong with things!" =>
49
+ "im-just-making-sure-theres-nothing-wrong-with-things",
50
+ "Umlaute hätten wir außerdem gern deutsch übersetzt." =>
51
+ "umlaute-haetten-wir-ausserdem-gern-deutsch-uebersetzt"
52
+ }.each do |html, plain|
53
+ assert_equal plain, html.to_url
54
+ end
55
+ end
56
+
57
+ def test_remove_formatting
58
+ {
59
+ "<p>This has 100% too much <em>formatting</em></p>" =>
60
+ "This has 100 percent too much formatting",
61
+ "Tea &amp; crumpets &amp; <strong>cr&ecirc;pes</strong> for me!" =>
62
+ "Tea and crumpets and crepes for me"
63
+ }.each do |html, plain|
64
+ assert_equal plain, html.remove_formatting
65
+ end
66
+ end
67
+
68
+ def test_strip_html_tags
69
+ {
70
+ "<h1><em>This</em> is good but <strong>that</strong> is better</h1>" =>
71
+ "This is good but that is better",
72
+ "<p>This is invalid XHTML but valid HTML, right?" =>
73
+ "This is invalid XHTML but valid HTML, right?",
74
+ "<p class='foo'>Everything goes!</p>" => "Everything goes!",
75
+ "<ol>This is completely invalid and just plain wrong</p>" =>
76
+ "This is completely invalid and just plain wrong"
77
+ }.each do |html, plain|
78
+ assert_equal plain, html.strip_html_tags
79
+ end
80
+ end
81
+
82
+ def test_convert_accented_entities
83
+ {
84
+ "&aring;" => "a",
85
+ "&egrave;" => "e",
86
+ "&icirc;" => "i",
87
+ "&Oslash;" => "O",
88
+ "&uuml;" => "u",
89
+ "&Ntilde;" => "N",
90
+ "&ccedil;" => "c"
91
+ }.each do |entitied, plain|
92
+ assert_equal plain, entitied.convert_accented_entities
93
+ end
94
+ end
95
+
96
+ def test_convert_german_umlauts
97
+ {
98
+ "Ä" => "ae",
99
+ "Ö" => "oe",
100
+ "Ü" => "ue",
101
+ "ä" => "ae",
102
+ "ö" => "oe",
103
+ "ü" => "ue",
104
+ "ß" => "ss"
105
+ }.each do |entitied, plain|
106
+ assert_equal plain, entitied.convert_german_umlauts
107
+ end
108
+ end
109
+
110
+ def test_convert_misc_entities
111
+ {
112
+ "America&#8482;" => "America(tm)",
113
+ "Tea &amp; Sympathy" => "Tea and Sympathy",
114
+ "To be continued&#8230;" => "To be continued...",
115
+ "Foo&nbsp;Bar" => "Foo Bar",
116
+ "100&#163;" => "100 pound",
117
+ "&frac12; a dollar" => "half a dollar",
118
+ "35&deg;" => "35 degrees"
119
+ }.each do |entitied, plain|
120
+ assert_equal plain, entitied.convert_misc_entities
121
+ end
122
+ end
123
+
124
+ def test_convert_misc_characters
125
+ {
126
+ "Foo & bar make foobar" => "Foo and bar make foobar",
127
+ "Breakdown #9" => "Breakdown number 9",
128
+ "foo@bar.com" => "foo at bar dot com",
129
+ "100% of yr love" => "100 percent of yr love",
130
+ "Kisses are $3.25 each" => "Kisses are 3 dollars 25 cents each",
131
+ "That CD is £3.25 plus tax" => "That CD is 3 pounds 25 pence plus tax",
132
+ "This CD is ¥1000 instead" => "This CD is 1000 yen instead"
133
+ }.each do |misc, plain|
134
+ assert_equal plain, misc.convert_misc_characters
135
+ end
136
+ end
137
+
138
+ def test_replace_whitespace
139
+ {
140
+ "this has too much space" => "this has too much space",
141
+ "\t\tThis is merely formatted with superfluous whitespace\n" =>
142
+ " This is merely formatted with superfluous whitespace "
143
+ }.each do |whitespaced, plain|
144
+ assert_equal plain, whitespaced.replace_whitespace
145
+ end
146
+
147
+ assert_equal "now-with-more-hyphens", "now with more hyphens".replace_whitespace("-")
148
+ end
149
+
150
+ def test_collapse
151
+ {
152
+ "too much space" => "too much space",
153
+ " at the beginning" => "at the beginning"
154
+ }.each do |uncollapsed, plain|
155
+ assert_equal plain, uncollapsed.collapse
156
+ end
157
+
158
+ assert_equal "now-with-hyphens", "----now---------with-hyphens--------".collapse("-")
159
+ end
160
+ end