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