mini-pro-pkg 0.0.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 (255) hide show
  1. checksums.yaml +7 -0
  2. data/mini-pro-pkg.gemspec +12 -0
  3. data/stringex-2.8.6/Gemfile +51 -0
  4. data/stringex-2.8.6/MIT-LICENSE +20 -0
  5. data/stringex-2.8.6/README.md +162 -0
  6. data/stringex-2.8.6/Rakefile +57 -0
  7. data/stringex-2.8.6/VERSION +1 -0
  8. data/stringex-2.8.6/init.rb +3 -0
  9. data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/active_record.rb +23 -0
  10. data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/base.rb +240 -0
  11. data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/data_mapper.rb +61 -0
  12. data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/mongoid.rb +37 -0
  13. data/stringex-2.8.6/lib/stringex/acts_as_url/adapter.rb +26 -0
  14. data/stringex-2.8.6/lib/stringex/acts_as_url.rb +107 -0
  15. data/stringex-2.8.6/lib/stringex/configuration/acts_as_url.rb +50 -0
  16. data/stringex-2.8.6/lib/stringex/configuration/base.rb +58 -0
  17. data/stringex-2.8.6/lib/stringex/configuration/configurator.rb +25 -0
  18. data/stringex-2.8.6/lib/stringex/configuration/string_extensions.rb +20 -0
  19. data/stringex-2.8.6/lib/stringex/configuration.rb +4 -0
  20. data/stringex-2.8.6/lib/stringex/configuration_lite.rb +3 -0
  21. data/stringex-2.8.6/lib/stringex/core_ext.rb +10 -0
  22. data/stringex-2.8.6/lib/stringex/localization/backend/base.rb +13 -0
  23. data/stringex-2.8.6/lib/stringex/localization/backend/i18n.rb +86 -0
  24. data/stringex-2.8.6/lib/stringex/localization/backend/internal.rb +47 -0
  25. data/stringex-2.8.6/lib/stringex/localization/conversion_expressions.rb +154 -0
  26. data/stringex-2.8.6/lib/stringex/localization/converter.rb +129 -0
  27. data/stringex-2.8.6/lib/stringex/localization/default_conversions.rb +89 -0
  28. data/stringex-2.8.6/lib/stringex/localization.rb +112 -0
  29. data/stringex-2.8.6/lib/stringex/rails/railtie.rb +10 -0
  30. data/stringex-2.8.6/lib/stringex/string_extensions.rb +228 -0
  31. data/stringex-2.8.6/lib/stringex/unidecoder.rb +82 -0
  32. data/stringex-2.8.6/lib/stringex/unidecoder_data/x00.yml +257 -0
  33. data/stringex-2.8.6/lib/stringex/unidecoder_data/x01.yml +257 -0
  34. data/stringex-2.8.6/lib/stringex/unidecoder_data/x02.yml +256 -0
  35. data/stringex-2.8.6/lib/stringex/unidecoder_data/x03.yml +256 -0
  36. data/stringex-2.8.6/lib/stringex/unidecoder_data/x04.yml +256 -0
  37. data/stringex-2.8.6/lib/stringex/unidecoder_data/x05.yml +256 -0
  38. data/stringex-2.8.6/lib/stringex/unidecoder_data/x06.yml +256 -0
  39. data/stringex-2.8.6/lib/stringex/unidecoder_data/x07.yml +256 -0
  40. data/stringex-2.8.6/lib/stringex/unidecoder_data/x09.yml +256 -0
  41. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0a.yml +256 -0
  42. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0b.yml +256 -0
  43. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0c.yml +256 -0
  44. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0d.yml +256 -0
  45. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0e.yml +256 -0
  46. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0f.yml +256 -0
  47. data/stringex-2.8.6/lib/stringex/unidecoder_data/x10.yml +256 -0
  48. data/stringex-2.8.6/lib/stringex/unidecoder_data/x11.yml +256 -0
  49. data/stringex-2.8.6/lib/stringex/unidecoder_data/x12.yml +257 -0
  50. data/stringex-2.8.6/lib/stringex/unidecoder_data/x13.yml +256 -0
  51. data/stringex-2.8.6/lib/stringex/unidecoder_data/x14.yml +257 -0
  52. data/stringex-2.8.6/lib/stringex/unidecoder_data/x15.yml +257 -0
  53. data/stringex-2.8.6/lib/stringex/unidecoder_data/x16.yml +256 -0
  54. data/stringex-2.8.6/lib/stringex/unidecoder_data/x17.yml +256 -0
  55. data/stringex-2.8.6/lib/stringex/unidecoder_data/x18.yml +256 -0
  56. data/stringex-2.8.6/lib/stringex/unidecoder_data/x1e.yml +256 -0
  57. data/stringex-2.8.6/lib/stringex/unidecoder_data/x1f.yml +256 -0
  58. data/stringex-2.8.6/lib/stringex/unidecoder_data/x20.yml +256 -0
  59. data/stringex-2.8.6/lib/stringex/unidecoder_data/x21.yml +256 -0
  60. data/stringex-2.8.6/lib/stringex/unidecoder_data/x22.yml +256 -0
  61. data/stringex-2.8.6/lib/stringex/unidecoder_data/x23.yml +256 -0
  62. data/stringex-2.8.6/lib/stringex/unidecoder_data/x24.yml +256 -0
  63. data/stringex-2.8.6/lib/stringex/unidecoder_data/x25.yml +256 -0
  64. data/stringex-2.8.6/lib/stringex/unidecoder_data/x26.yml +256 -0
  65. data/stringex-2.8.6/lib/stringex/unidecoder_data/x27.yml +256 -0
  66. data/stringex-2.8.6/lib/stringex/unidecoder_data/x28.yml +257 -0
  67. data/stringex-2.8.6/lib/stringex/unidecoder_data/x2e.yml +256 -0
  68. data/stringex-2.8.6/lib/stringex/unidecoder_data/x2f.yml +256 -0
  69. data/stringex-2.8.6/lib/stringex/unidecoder_data/x30.yml +256 -0
  70. data/stringex-2.8.6/lib/stringex/unidecoder_data/x31.yml +256 -0
  71. data/stringex-2.8.6/lib/stringex/unidecoder_data/x32.yml +256 -0
  72. data/stringex-2.8.6/lib/stringex/unidecoder_data/x33.yml +256 -0
  73. data/stringex-2.8.6/lib/stringex/unidecoder_data/x4d.yml +256 -0
  74. data/stringex-2.8.6/lib/stringex/unidecoder_data/x4e.yml +257 -0
  75. data/stringex-2.8.6/lib/stringex/unidecoder_data/x4f.yml +257 -0
  76. data/stringex-2.8.6/lib/stringex/unidecoder_data/x50.yml +257 -0
  77. data/stringex-2.8.6/lib/stringex/unidecoder_data/x51.yml +257 -0
  78. data/stringex-2.8.6/lib/stringex/unidecoder_data/x52.yml +257 -0
  79. data/stringex-2.8.6/lib/stringex/unidecoder_data/x53.yml +257 -0
  80. data/stringex-2.8.6/lib/stringex/unidecoder_data/x54.yml +257 -0
  81. data/stringex-2.8.6/lib/stringex/unidecoder_data/x55.yml +257 -0
  82. data/stringex-2.8.6/lib/stringex/unidecoder_data/x56.yml +257 -0
  83. data/stringex-2.8.6/lib/stringex/unidecoder_data/x57.yml +257 -0
  84. data/stringex-2.8.6/lib/stringex/unidecoder_data/x58.yml +257 -0
  85. data/stringex-2.8.6/lib/stringex/unidecoder_data/x59.yml +257 -0
  86. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5a.yml +257 -0
  87. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5b.yml +257 -0
  88. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5c.yml +257 -0
  89. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5d.yml +257 -0
  90. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5e.yml +257 -0
  91. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5f.yml +257 -0
  92. data/stringex-2.8.6/lib/stringex/unidecoder_data/x60.yml +257 -0
  93. data/stringex-2.8.6/lib/stringex/unidecoder_data/x61.yml +257 -0
  94. data/stringex-2.8.6/lib/stringex/unidecoder_data/x62.yml +257 -0
  95. data/stringex-2.8.6/lib/stringex/unidecoder_data/x63.yml +257 -0
  96. data/stringex-2.8.6/lib/stringex/unidecoder_data/x64.yml +257 -0
  97. data/stringex-2.8.6/lib/stringex/unidecoder_data/x65.yml +257 -0
  98. data/stringex-2.8.6/lib/stringex/unidecoder_data/x66.yml +257 -0
  99. data/stringex-2.8.6/lib/stringex/unidecoder_data/x67.yml +257 -0
  100. data/stringex-2.8.6/lib/stringex/unidecoder_data/x68.yml +257 -0
  101. data/stringex-2.8.6/lib/stringex/unidecoder_data/x69.yml +257 -0
  102. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6a.yml +257 -0
  103. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6b.yml +257 -0
  104. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6c.yml +257 -0
  105. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6d.yml +257 -0
  106. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6e.yml +257 -0
  107. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6f.yml +257 -0
  108. data/stringex-2.8.6/lib/stringex/unidecoder_data/x70.yml +257 -0
  109. data/stringex-2.8.6/lib/stringex/unidecoder_data/x71.yml +257 -0
  110. data/stringex-2.8.6/lib/stringex/unidecoder_data/x72.yml +257 -0
  111. data/stringex-2.8.6/lib/stringex/unidecoder_data/x73.yml +257 -0
  112. data/stringex-2.8.6/lib/stringex/unidecoder_data/x74.yml +257 -0
  113. data/stringex-2.8.6/lib/stringex/unidecoder_data/x75.yml +257 -0
  114. data/stringex-2.8.6/lib/stringex/unidecoder_data/x76.yml +257 -0
  115. data/stringex-2.8.6/lib/stringex/unidecoder_data/x77.yml +257 -0
  116. data/stringex-2.8.6/lib/stringex/unidecoder_data/x78.yml +257 -0
  117. data/stringex-2.8.6/lib/stringex/unidecoder_data/x79.yml +257 -0
  118. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7a.yml +257 -0
  119. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7b.yml +257 -0
  120. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7c.yml +257 -0
  121. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7d.yml +257 -0
  122. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7e.yml +257 -0
  123. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7f.yml +257 -0
  124. data/stringex-2.8.6/lib/stringex/unidecoder_data/x80.yml +257 -0
  125. data/stringex-2.8.6/lib/stringex/unidecoder_data/x81.yml +257 -0
  126. data/stringex-2.8.6/lib/stringex/unidecoder_data/x82.yml +257 -0
  127. data/stringex-2.8.6/lib/stringex/unidecoder_data/x83.yml +257 -0
  128. data/stringex-2.8.6/lib/stringex/unidecoder_data/x84.yml +257 -0
  129. data/stringex-2.8.6/lib/stringex/unidecoder_data/x85.yml +257 -0
  130. data/stringex-2.8.6/lib/stringex/unidecoder_data/x86.yml +257 -0
  131. data/stringex-2.8.6/lib/stringex/unidecoder_data/x87.yml +257 -0
  132. data/stringex-2.8.6/lib/stringex/unidecoder_data/x88.yml +257 -0
  133. data/stringex-2.8.6/lib/stringex/unidecoder_data/x89.yml +257 -0
  134. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8a.yml +257 -0
  135. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8b.yml +257 -0
  136. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8c.yml +257 -0
  137. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8d.yml +257 -0
  138. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8e.yml +257 -0
  139. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8f.yml +257 -0
  140. data/stringex-2.8.6/lib/stringex/unidecoder_data/x90.yml +257 -0
  141. data/stringex-2.8.6/lib/stringex/unidecoder_data/x91.yml +257 -0
  142. data/stringex-2.8.6/lib/stringex/unidecoder_data/x92.yml +257 -0
  143. data/stringex-2.8.6/lib/stringex/unidecoder_data/x93.yml +257 -0
  144. data/stringex-2.8.6/lib/stringex/unidecoder_data/x94.yml +257 -0
  145. data/stringex-2.8.6/lib/stringex/unidecoder_data/x95.yml +257 -0
  146. data/stringex-2.8.6/lib/stringex/unidecoder_data/x96.yml +257 -0
  147. data/stringex-2.8.6/lib/stringex/unidecoder_data/x97.yml +257 -0
  148. data/stringex-2.8.6/lib/stringex/unidecoder_data/x98.yml +257 -0
  149. data/stringex-2.8.6/lib/stringex/unidecoder_data/x99.yml +257 -0
  150. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9a.yml +257 -0
  151. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9b.yml +257 -0
  152. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9c.yml +257 -0
  153. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9d.yml +257 -0
  154. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9e.yml +257 -0
  155. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9f.yml +256 -0
  156. data/stringex-2.8.6/lib/stringex/unidecoder_data/xa0.yml +257 -0
  157. data/stringex-2.8.6/lib/stringex/unidecoder_data/xa1.yml +257 -0
  158. data/stringex-2.8.6/lib/stringex/unidecoder_data/xa2.yml +257 -0
  159. data/stringex-2.8.6/lib/stringex/unidecoder_data/xa3.yml +257 -0
  160. data/stringex-2.8.6/lib/stringex/unidecoder_data/xa4.yml +256 -0
  161. data/stringex-2.8.6/lib/stringex/unidecoder_data/xac.yml +257 -0
  162. data/stringex-2.8.6/lib/stringex/unidecoder_data/xad.yml +257 -0
  163. data/stringex-2.8.6/lib/stringex/unidecoder_data/xae.yml +257 -0
  164. data/stringex-2.8.6/lib/stringex/unidecoder_data/xaf.yml +257 -0
  165. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb0.yml +257 -0
  166. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb1.yml +257 -0
  167. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb2.yml +257 -0
  168. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb3.yml +257 -0
  169. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb4.yml +257 -0
  170. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb5.yml +257 -0
  171. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb6.yml +257 -0
  172. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb7.yml +257 -0
  173. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb8.yml +257 -0
  174. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb9.yml +257 -0
  175. data/stringex-2.8.6/lib/stringex/unidecoder_data/xba.yml +257 -0
  176. data/stringex-2.8.6/lib/stringex/unidecoder_data/xbb.yml +257 -0
  177. data/stringex-2.8.6/lib/stringex/unidecoder_data/xbc.yml +257 -0
  178. data/stringex-2.8.6/lib/stringex/unidecoder_data/xbd.yml +257 -0
  179. data/stringex-2.8.6/lib/stringex/unidecoder_data/xbe.yml +257 -0
  180. data/stringex-2.8.6/lib/stringex/unidecoder_data/xbf.yml +257 -0
  181. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc0.yml +257 -0
  182. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc1.yml +257 -0
  183. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc2.yml +257 -0
  184. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc3.yml +257 -0
  185. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc4.yml +257 -0
  186. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc5.yml +257 -0
  187. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc6.yml +257 -0
  188. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc7.yml +257 -0
  189. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc8.yml +257 -0
  190. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc9.yml +257 -0
  191. data/stringex-2.8.6/lib/stringex/unidecoder_data/xca.yml +257 -0
  192. data/stringex-2.8.6/lib/stringex/unidecoder_data/xcb.yml +257 -0
  193. data/stringex-2.8.6/lib/stringex/unidecoder_data/xcc.yml +257 -0
  194. data/stringex-2.8.6/lib/stringex/unidecoder_data/xcd.yml +257 -0
  195. data/stringex-2.8.6/lib/stringex/unidecoder_data/xce.yml +257 -0
  196. data/stringex-2.8.6/lib/stringex/unidecoder_data/xcf.yml +257 -0
  197. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd0.yml +257 -0
  198. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd1.yml +257 -0
  199. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd2.yml +257 -0
  200. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd3.yml +257 -0
  201. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd4.yml +257 -0
  202. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd5.yml +257 -0
  203. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd6.yml +257 -0
  204. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd7.yml +256 -0
  205. data/stringex-2.8.6/lib/stringex/unidecoder_data/xf9.yml +257 -0
  206. data/stringex-2.8.6/lib/stringex/unidecoder_data/xfa.yml +256 -0
  207. data/stringex-2.8.6/lib/stringex/unidecoder_data/xfb.yml +257 -0
  208. data/stringex-2.8.6/lib/stringex/unidecoder_data/xfc.yml +257 -0
  209. data/stringex-2.8.6/lib/stringex/unidecoder_data/xfd.yml +256 -0
  210. data/stringex-2.8.6/lib/stringex/unidecoder_data/xfe.yml +257 -0
  211. data/stringex-2.8.6/lib/stringex/unidecoder_data/xff.yml +257 -0
  212. data/stringex-2.8.6/lib/stringex/version.rb +8 -0
  213. data/stringex-2.8.6/lib/stringex.rb +17 -0
  214. data/stringex-2.8.6/lib/stringex_lite.rb +15 -0
  215. data/stringex-2.8.6/locales/da.yml +76 -0
  216. data/stringex-2.8.6/locales/de.yml +77 -0
  217. data/stringex-2.8.6/locales/en.yml +69 -0
  218. data/stringex-2.8.6/locales/fr.yml +72 -0
  219. data/stringex-2.8.6/locales/nb.yml +76 -0
  220. data/stringex-2.8.6/locales/nl.yml +69 -0
  221. data/stringex-2.8.6/locales/no.yml +76 -0
  222. data/stringex-2.8.6/locales/pl.yml +88 -0
  223. data/stringex-2.8.6/locales/pt-BR.yml +69 -0
  224. data/stringex-2.8.6/locales/ru.yml +69 -0
  225. data/stringex-2.8.6/locales/sv.yml +76 -0
  226. data/stringex-2.8.6/stringex.gemspec +290 -0
  227. data/stringex-2.8.6/test/performance/localization_performance_test.rb +24 -0
  228. data/stringex-2.8.6/test/test_helper.rb +2 -0
  229. data/stringex-2.8.6/test/unit/acts_as_url/adapter/activerecord.rb +71 -0
  230. data/stringex-2.8.6/test/unit/acts_as_url/adapter/datamapper.rb +83 -0
  231. data/stringex-2.8.6/test/unit/acts_as_url/adapter/mongoid.rb +82 -0
  232. data/stringex-2.8.6/test/unit/acts_as_url_configuration_test.rb +51 -0
  233. data/stringex-2.8.6/test/unit/acts_as_url_integration_test.rb +425 -0
  234. data/stringex-2.8.6/test/unit/localization/da_test.rb +118 -0
  235. data/stringex-2.8.6/test/unit/localization/de_test.rb +118 -0
  236. data/stringex-2.8.6/test/unit/localization/default_test.rb +115 -0
  237. data/stringex-2.8.6/test/unit/localization/en_test.rb +118 -0
  238. data/stringex-2.8.6/test/unit/localization/fr_test.rb +118 -0
  239. data/stringex-2.8.6/test/unit/localization/nl_test.rb +118 -0
  240. data/stringex-2.8.6/test/unit/localization/pl_test.rb +118 -0
  241. data/stringex-2.8.6/test/unit/localization/pt_br_test.rb +118 -0
  242. data/stringex-2.8.6/test/unit/localization/ru_test.rb +130 -0
  243. data/stringex-2.8.6/test/unit/localization/sv_test.rb +118 -0
  244. data/stringex-2.8.6/test/unit/localization_18n_failure_test.rb +40 -0
  245. data/stringex-2.8.6/test/unit/localization_test.rb +162 -0
  246. data/stringex-2.8.6/test/unit/string_extensions_configuration_test.rb +17 -0
  247. data/stringex-2.8.6/test/unit/string_extensions_test.rb +321 -0
  248. data/stringex-2.8.6/test/unit/unicode_point_suite/basic_greek_test.rb +113 -0
  249. data/stringex-2.8.6/test/unit/unicode_point_suite/basic_latin_test.rb +144 -0
  250. data/stringex-2.8.6/test/unit/unicode_point_suite/codepoint_test_helper.rb +32 -0
  251. data/stringex-2.8.6/test/unit/unidecoder/bad_localization.yml +1 -0
  252. data/stringex-2.8.6/test/unit/unidecoder/localization.yml +4 -0
  253. data/stringex-2.8.6/test/unit/unidecoder_test.rb +104 -0
  254. data/stringex-2.8.6/test/unit/version_test.rb +12 -0
  255. metadata +294 -0
@@ -0,0 +1,118 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+ require 'i18n'
5
+ require 'stringex'
6
+
7
+ class BrazilianYAMLLocalizationTest < Test::Unit::TestCase
8
+ def setup
9
+ Stringex::Localization.reset!
10
+ Stringex::Localization.backend = :i18n
11
+ Stringex::Localization.backend.load_translations :'pt-BR'
12
+ Stringex::Localization.locale = :'pt-BR'
13
+ end
14
+
15
+ {
16
+ "foo & bar" => "foo e bar",
17
+ "AT&T" => "AT e T",
18
+ "99° is normal" => "99 graus is normal",
19
+ "4 ÷ 2 is 2" => "4 dividido por 2 is 2",
20
+ "webcrawler.com" => "webcrawler ponto com",
21
+ "Well..." => "Well reticências",
22
+ "x=1" => "x igual à 1",
23
+ "a #2 pencil" => "a número 2 pencil",
24
+ "100%" => "100 porcento",
25
+ "cost+tax" => "cost mais tax",
26
+ "batman/robin fan fiction" => "batman barra robin fan fiction",
27
+ "dial *69" => "dial estrela 69",
28
+ " i leave whitespace on ends unchanged " => " i leave whitespace on ends unchanged "
29
+ }.each do |original, converted|
30
+ define_method "test_character_conversion: '#{original}'" do
31
+ assert_equal converted, original.convert_miscellaneous_characters
32
+ end
33
+ end
34
+
35
+ {
36
+ "¤20" => "20 reais",
37
+ "$100" => "100 dólares",
38
+ "$19.99" => "19 dólares 99 cents",
39
+ "£100" => "100 libras",
40
+ "£19.99" => "19 libras 99 centavos",
41
+ "€100" => "100 euros",
42
+ "€19.99" => "19 euros 99 cents",
43
+ "¥1000" => "1000 yen"
44
+ }.each do |original, converted|
45
+ define_method "test_currency_conversion: '#{original}'" do
46
+ assert_equal converted, original.convert_miscellaneous_characters
47
+ end
48
+ end
49
+
50
+ {
51
+ "Tea &amp; Sympathy" => "Tea e Sympathy",
52
+ "10&cent;" => "10 centavos",
53
+ "&copy;2000" => "(c)2000",
54
+ "98&deg; is fine" => "98 graus is fine",
55
+ "10&divide;5" => "10 dividido por 5",
56
+ "&quot;quoted&quot;" => '"quoted"',
57
+ "to be continued&hellip;" => "to be continued...",
58
+ "2000&ndash;2004" => "2000-2004",
59
+ "I wish&mdash;oh, never mind" => "I wish--oh, never mind",
60
+ "&frac12; ounce of gold" => "metade ounce of gold",
61
+ "1 and &frac14; ounces of silver" => "1 and um quarto ounces of silver",
62
+ "9 and &frac34; ounces of platinum" => "9 and três quartos ounces of platinum",
63
+ "3&gt;2" => "3>2",
64
+ "2&lt;3" => "2<3",
65
+ "two&nbsp;words" => "two words",
66
+ "&pound;100" => "libras 100",
67
+ "Walmart&reg;" => "Walmart(r)",
68
+ "&apos;single quoted&apos;" => "'single quoted'",
69
+ "2&times;4" => "2x4",
70
+ "Programming&trade;" => "Programming(tm)",
71
+ "&yen;20000" => "yen 20000",
72
+ " i leave whitespace on ends unchanged " => " i leave whitespace on ends unchanged "
73
+ }.each do |original, converted|
74
+ define_method "test_html_entity_conversion: '#{original}'" do
75
+ assert_equal converted, original.convert_miscellaneous_html_entities
76
+ end
77
+ end
78
+
79
+ {
80
+ "&frac12;" => "metade",
81
+ "½" => "metade",
82
+ "&#189;" => "metade",
83
+ "⅓" => "um terço",
84
+ "&#8531;" => "um terço",
85
+ "⅔" => "dois terços",
86
+ "&#8532;" => "dois terços",
87
+ "&frac14;" => "um quarto",
88
+ "¼" => "um quarto",
89
+ "&#188;" => "um quarto",
90
+ "&frac34;" => "três quartos",
91
+ "¾" => "três quartos",
92
+ "&#190;" => "três quartos",
93
+ "⅕" => "um quinto",
94
+ "&#8533;" => "um quinto",
95
+ "⅖" => "dois quintos",
96
+ "&#8534;" => "dois quintos",
97
+ "⅗" => "três quintos",
98
+ "&#8535;" => "três quintos",
99
+ "⅘" => "quatro quintos",
100
+ "&#8536;" => "quatro quintos",
101
+ "⅙" => "um sexto",
102
+ "&#8537;" => "um sexto",
103
+ "⅚" => "cinco sextos",
104
+ "&#8538;" => "cinco sextos",
105
+ "⅛" => "um oitavo",
106
+ "&#8539;" => "um oitavo",
107
+ "⅜" => "três oitavos",
108
+ "&#8540;" => "três oitavos",
109
+ "⅝" => "cinco oitavos",
110
+ "&#8541;" => "cinco oitavos",
111
+ "⅞" => "sete oitavos",
112
+ "&#8542;" => "sete oitavos"
113
+ }.each do |original, converted|
114
+ define_method "test_vulgar_fractions_conversion: #{original}" do
115
+ assert_equal converted, original.convert_vulgar_fractions
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,130 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+ require 'i18n'
5
+ require 'stringex'
6
+
7
+ class RussianYAMLLocalizationTest < Test::Unit::TestCase
8
+ def setup
9
+ Stringex::Localization.reset!
10
+ Stringex::Localization.backend = :i18n
11
+ Stringex::Localization.backend.load_translations :ru
12
+ Stringex::Localization.locale = :ru
13
+ end
14
+
15
+ {
16
+ "foo & bar" => "foo и bar",
17
+ "AT&T" => "AT и T",
18
+ "99° is normal" => "99 градусов is normal",
19
+ "4 ÷ 2 is 2" => "4 делить на 2 is 2",
20
+ "webcrawler.com" => "webcrawler точка com",
21
+ "Well..." => "Well многоточие",
22
+ "x=1" => "x равно 1",
23
+ "a #2 pencil" => "a номер 2 pencil",
24
+ "100%" => "100 процентов",
25
+ "cost+tax" => "cost плюс tax",
26
+ "batman/robin fan fiction" => "batman слеш robin fan fiction",
27
+ "dial *69" => "dial звезда 69",
28
+ " i leave whitespace on ends unchanged " => " i leave whitespace on ends unchanged "
29
+ }.each do |original, converted|
30
+ define_method "test_character_conversion: '#{original}'" do
31
+ assert_equal converted, original.convert_miscellaneous_characters
32
+ end
33
+ end
34
+
35
+ {
36
+ "¤20" => "20 рубль",
37
+ "$100" => "100 долларов",
38
+ "$19.99" => "19 долларов 99 центов",
39
+ "£100" => "100 фунтов",
40
+ "£19.99" => "19 фунтов 99 пенсов",
41
+ "€100" => "100 евро",
42
+ "€19.99" => "19 евро 99 центов",
43
+ "¥1000" => "1000 йен"
44
+ }.each do |original, converted|
45
+ define_method "test_currency_conversion: '#{original}'" do
46
+ assert_equal converted, original.convert_miscellaneous_characters
47
+ end
48
+ end
49
+
50
+ {
51
+ "Tea &amp; Sympathy" => "Tea и Sympathy",
52
+ "10&cent;" => "10 центов",
53
+ "&copy;2000" => "(c)2000",
54
+ "98&deg; is fine" => "98 градусов is fine",
55
+ "10&divide;5" => "10 делить на 5",
56
+ "&quot;quoted&quot;" => '"quoted"',
57
+ "to be continued&hellip;" => "to be continued...",
58
+ "2000&ndash;2004" => "2000-2004",
59
+ "I wish&mdash;oh, never mind" => "I wish--oh, never mind",
60
+ "&frac12; ounce of gold" => "половина ounce of gold",
61
+ "1 and &frac14; ounces of silver" => "1 and одна четверть ounces of silver",
62
+ "9 and &frac34; ounces of platinum" => "9 and три четверти ounces of platinum",
63
+ "3&gt;2" => "3>2",
64
+ "2&lt;3" => "2<3",
65
+ "two&nbsp;words" => "two words",
66
+ "&pound;100" => "фунтов 100",
67
+ "Walmart&reg;" => "Walmart(r)",
68
+ "&apos;single quoted&apos;" => "'single quoted'",
69
+ "2&times;4" => "2x4",
70
+ "Programming&trade;" => "Programming(tm)",
71
+ "&yen;20000" => "йен 20000",
72
+ " i leave whitespace on ends unchanged " => " i leave whitespace on ends unchanged "
73
+ }.each do |original, converted|
74
+ define_method "test_html_entity_conversion: '#{original}'" do
75
+ assert_equal converted, original.convert_miscellaneous_html_entities
76
+ end
77
+ end
78
+
79
+ {
80
+ "&frac12;" => "половина",
81
+ "½" => "половина",
82
+ "&#189;" => "половина",
83
+ "⅓" => "одна треть",
84
+ "&#8531;" => "одна треть",
85
+ "⅔" => "две трети",
86
+ "&#8532;" => "две трети",
87
+ "&frac14;" => "одна четверть",
88
+ "¼" => "одна четверть",
89
+ "&#188;" => "одна четверть",
90
+ "&frac34;" => "три четверти",
91
+ "¾" => "три четверти",
92
+ "&#190;" => "три четверти",
93
+ "⅕" => "одна пятая",
94
+ "&#8533;" => "одна пятая",
95
+ "⅖" => "две пятых",
96
+ "&#8534;" => "две пятых",
97
+ "⅗" => "три пятых",
98
+ "&#8535;" => "три пятых",
99
+ "⅘" => "четыре пятых",
100
+ "&#8536;" => "четыре пятых",
101
+ "⅙" => "одна шестая",
102
+ "&#8537;" => "одна шестая",
103
+ "⅚" => "пять шестых",
104
+ "&#8538;" => "пять шестых",
105
+ "⅛" => "одна восьмая",
106
+ "&#8539;" => "одна восьмая",
107
+ "⅜" => "три восьмых",
108
+ "&#8540;" => "три восьмых",
109
+ "⅝" => "пять восьмых",
110
+ "&#8541;" => "пять восьмых",
111
+ "⅞" => "семь восьмых",
112
+ "&#8542;" => "семь восьмых"
113
+ }.each do |original, converted|
114
+ define_method "test_vulgar_fractions_conversion: #{original}" do
115
+ assert_equal converted, original.convert_vulgar_fractions
116
+ end
117
+ end
118
+
119
+ {
120
+ "foo & bar" => "foo-i-bar",
121
+ "AT&T" => "at-i-t",
122
+ "99° is normal" => "99-ghradusov-is-normal",
123
+ "4 ÷ 2 is 2" => "4-dielit-na-2-is-2",
124
+ "webcrawler.com" => "webcrawler-tochka-com",
125
+ }.each do |original, converted|
126
+ define_method "test_character_conversion_to_url: '#{original}'" do
127
+ assert_equal converted, original.to_url
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,118 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+ require 'i18n'
5
+ require 'stringex'
6
+
7
+ class SwedishYAMLLocalizationTest < Test::Unit::TestCase
8
+ def setup
9
+ Stringex::Localization.reset!
10
+ Stringex::Localization.backend = :i18n
11
+ Stringex::Localization.backend.load_translations :sv
12
+ Stringex::Localization.locale = :sv
13
+ end
14
+
15
+ {
16
+ "foo & bar" => "foo och bar",
17
+ "AT&T" => "AT och T",
18
+ "99° is normal" => "99 grader is normal",
19
+ "4 ÷ 2 is 2" => "4 delat med 2 is 2",
20
+ "webcrawler.com" => "webcrawler punkt com",
21
+ "Well..." => "Well punkt punkt punkt",
22
+ "x=1" => "x lika med 1",
23
+ "a #2 pencil" => "a nummer 2 pencil",
24
+ "100%" => "100 procent",
25
+ "cost+tax" => "cost plus tax",
26
+ "batman/robin fan fiction" => "batman slash robin fan fiction",
27
+ "dial *69" => "dial stjärna 69",
28
+ " i leave whitespace on ends unchanged " => " i leave whitespace on ends unchanged "
29
+ }.each do |original, converted|
30
+ define_method "test_character_conversion: '#{original}'" do
31
+ assert_equal converted, original.convert_miscellaneous_characters
32
+ end
33
+ end
34
+
35
+ {
36
+ "¤20" => "20 kronor",
37
+ "$100" => "100 dollar",
38
+ "$19.99" => "19 dollar 99 cent",
39
+ "£100" => "100 pund",
40
+ "£19.99" => "19 pund 99 pence",
41
+ "€100" => "100 euro",
42
+ "€19.99" => "19 euro 99 cent",
43
+ "¥1000" => "1000 yen"
44
+ }.each do |original, converted|
45
+ define_method "test_currency_conversion: '#{original}'" do
46
+ assert_equal converted, original.convert_miscellaneous_characters
47
+ end
48
+ end
49
+
50
+ {
51
+ "Tea &amp; Sympathy" => "Tea och Sympathy",
52
+ "10&cent;" => "10 cents",
53
+ "&copy;2000" => "(c)2000",
54
+ "98&deg; is fine" => "98 grader is fine",
55
+ "10&divide;5" => "10 delat med 5",
56
+ "&quot;quoted&quot;" => '"quoted"',
57
+ "to be continued&hellip;" => "to be continued...",
58
+ "2000&ndash;2004" => "2000-2004",
59
+ "I wish&mdash;oh, never mind" => "I wish--oh, never mind",
60
+ "&frac12; ounce of gold" => "halv ounce of gold",
61
+ "1 and &frac14; ounces of silver" => "1 and en fjärdedel ounces of silver",
62
+ "9 and &frac34; ounces of platinum" => "9 and tre fjärdedelar ounces of platinum",
63
+ "3&gt;2" => "3>2",
64
+ "2&lt;3" => "2<3",
65
+ "two&nbsp;words" => "two words",
66
+ "&pound;100" => "pund 100",
67
+ "Walmart&reg;" => "Walmart(r)",
68
+ "&apos;single quoted&apos;" => "'single quoted'",
69
+ "2&times;4" => "2x4",
70
+ "Programming&trade;" => "Programming(tm)",
71
+ "&yen;20000" => "yen 20000",
72
+ " i leave whitespace on ends unchanged " => " i leave whitespace on ends unchanged "
73
+ }.each do |original, converted|
74
+ define_method "test_html_entity_conversion: '#{original}'" do
75
+ assert_equal converted, original.convert_miscellaneous_html_entities
76
+ end
77
+ end
78
+
79
+ {
80
+ "&frac12;" => "halv",
81
+ "½" => "halv",
82
+ "&#189;" => "halv",
83
+ "⅓" => "en tredjedel",
84
+ "&#8531;" => "en tredjedel",
85
+ "⅔" => "två tredjedelar",
86
+ "&#8532;" => "två tredjedelar",
87
+ "&frac14;" => "en fjärdedel",
88
+ "¼" => "en fjärdedel",
89
+ "&#188;" => "en fjärdedel",
90
+ "&frac34;" => "tre fjärdedelar",
91
+ "¾" => "tre fjärdedelar",
92
+ "&#190;" => "tre fjärdedelar",
93
+ "⅕" => "en femtedel",
94
+ "&#8533;" => "en femtedel",
95
+ "⅖" => "två femtedelar",
96
+ "&#8534;" => "två femtedelar",
97
+ "⅗" => "tre femtedelar",
98
+ "&#8535;" => "tre femtedelar",
99
+ "⅘" => "fyra femtedelar",
100
+ "&#8536;" => "fyra femtedelar",
101
+ "⅙" => "en sjättedel",
102
+ "&#8537;" => "en sjättedel",
103
+ "⅚" => "fem sjättedelar",
104
+ "&#8538;" => "fem sjättedelar",
105
+ "⅛" => "en åttondel",
106
+ "&#8539;" => "en åttondel",
107
+ "⅜" => "tre åttondelar",
108
+ "&#8540;" => "tre åttondelar",
109
+ "⅝" => "fem åttondelar",
110
+ "&#8541;" => "fem åttondelar",
111
+ "⅞" => "sju åttondelar",
112
+ "&#8542;" => "sju åttondelar"
113
+ }.each do |original, converted|
114
+ define_method "test_vulgar_fractions_conversion: #{original}" do
115
+ assert_equal converted, original.convert_vulgar_fractions
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,40 @@
1
+ require "test_helper"
2
+ require 'stringex'
3
+
4
+ class LocalizationI18nFailureTest < Test::Unit::TestCase
5
+ def setup
6
+ alias_i18n
7
+ Stringex::Localization.reset!
8
+ end
9
+
10
+ def test_loading_i18n_backend_fails_if_no_i18n_module
11
+ assert_raise(Stringex::Localization::Backend::I18nNotDefined) do
12
+ Stringex::Localization.backend = :i18n
13
+ end
14
+ ensure
15
+ unalias_i18n
16
+ end
17
+
18
+ def test_loading_i18n_backend_fails_if_i18n_defined_without_translate
19
+ Object.send :const_set, :I18n, Module.new
20
+
21
+ assert_raise(Stringex::Localization::Backend::I18nMissingTranslate) do
22
+ Stringex::Localization.backend = :i18n
23
+ end
24
+ ensure
25
+ Object.send :remove_const, :I18n
26
+ unalias_i18n
27
+ end
28
+
29
+ private
30
+
31
+ def alias_i18n
32
+ Object.send :const_set, :I18nBackup, I18n
33
+ Object.send :remove_const, :I18n
34
+ end
35
+
36
+ def unalias_i18n
37
+ Object.send :const_set, :I18n, I18nBackup
38
+ Object.send :remove_const, :I18nBackup
39
+ end
40
+ end
@@ -0,0 +1,162 @@
1
+ require "test_helper"
2
+ require 'stringex'
3
+ require 'i18n'
4
+
5
+ class LocalizationTest < Test::Unit::TestCase
6
+ def setup
7
+ I18n.locale = :en
8
+ Stringex::Localization.reset!
9
+ end
10
+
11
+ def test_stores_translations
12
+ Stringex::Localization.backend = :internal
13
+
14
+ data = { one: "number one", two: "number two" }
15
+ Stringex::Localization.store_translations :en, :test_store, data
16
+
17
+ data.each do |key, value|
18
+ assert_equal value, Stringex::Localization.translate(:test_store, key)
19
+ end
20
+ end
21
+
22
+ def test_converts_translation_keys_to_symbols
23
+ Stringex::Localization.backend = :internal
24
+
25
+ data = { "one" => "number one", "two" => "number two" }
26
+ Stringex::Localization.store_translations :en, :test_convert, data
27
+
28
+ data.each do |key, value|
29
+ assert_equal value, Stringex::Localization.translate(:test_convert, key)
30
+ assert_equal value, Stringex::Localization.translate(:test_convert, key.to_sym)
31
+ end
32
+ end
33
+
34
+ def test_can_translate
35
+ Stringex::Localization.backend = :internal
36
+
37
+ data = { one: "number one", two: "number two" }
38
+ Stringex::Localization.store_translations :en, :test_translate, data
39
+
40
+ data.each do |key, value|
41
+ assert_equal value, Stringex::Localization.translate(:test_translate, key)
42
+ end
43
+ end
44
+
45
+ def test_can_translate_when_given_string_as_key
46
+ Stringex::Localization.backend = :internal
47
+
48
+ data = { one: "number one", two: "number two" }
49
+ Stringex::Localization.store_translations :en, :test_translate, data
50
+
51
+ data.each do |key, value|
52
+ assert_equal value, Stringex::Localization.translate(:test_translate, key.to_s)
53
+ end
54
+ end
55
+
56
+ def test_returns_default_if_none_found
57
+ Stringex::Localization.backend = :internal
58
+ assert_equal "my default", Stringex::Localization.translate(:test_default, :nonexistent, default: "my default")
59
+ end
60
+
61
+ def test_returns_nil_if_no_default
62
+ Stringex::Localization.backend = :internal
63
+ assert_nil Stringex::Localization.translate(:test_no_default, :nonexistent)
64
+ end
65
+
66
+ def test_falls_back_to_default_locale
67
+ Stringex::Localization.backend = :internal
68
+ Stringex::Localization.default_locale = :es
69
+ Stringex::Localization.locale = :da
70
+
71
+ data = { "one" => "number one", "two" => "number two" }
72
+ Stringex::Localization.store_translations :es, :test_default_locale, data
73
+
74
+ data.each do |key, value|
75
+ assert_equal value, Stringex::Localization.translate(:test_default_locale, key)
76
+ end
77
+ end
78
+
79
+ def test_with_locale
80
+ Stringex::Localization.backend = :internal
81
+ Stringex::Localization.locale = :fr
82
+ assert_equal :fr, Stringex::Localization.locale
83
+ locale_set_in_block = nil
84
+ Stringex::Localization.with_locale :da do
85
+ locale_set_in_block = Stringex::Localization.locale
86
+ end
87
+ assert_equal :da, locale_set_in_block
88
+ assert_equal :fr, Stringex::Localization.locale
89
+ end
90
+
91
+ def test_stores_translations_in_i18n
92
+ Stringex::Localization.backend = :i18n
93
+
94
+ data = { one: "number one", two: "number two" }
95
+ Stringex::Localization.store_translations :en, :test_i18n_store, data
96
+
97
+ data.each do |key, value|
98
+ assert_equal value, I18n.translate("stringex.test_i18n_store.#{key}")
99
+ end
100
+ end
101
+
102
+ def test_can_translate_using_i18n
103
+ Stringex::Localization.backend = :i18n
104
+
105
+ data = { one: "number one", two: "number two" }
106
+
107
+ I18n.backend.store_translations :en, { stringex: { test_i18n_translation: data } }
108
+
109
+ data.each do |key, value|
110
+ assert_equal value, Stringex::Localization.translate(:test_i18n_translation, key)
111
+ end
112
+ end
113
+
114
+ def test_allows_blank_translations
115
+ [:internal, :i18n].each do |backend|
116
+ Stringex::Localization.backend = backend
117
+
118
+ assert_equal "Test blank", "Test&nbsp;blank".convert_miscellaneous_html_entities
119
+
120
+ Stringex::Localization.store_translations :en, :html_entities, { nbsp: "" }
121
+ assert_equal "Testblank", "Test&nbsp;blank".convert_miscellaneous_html_entities
122
+ end
123
+ end
124
+
125
+ def test_assigns_locale_in_i18n_backend
126
+ if other_locale = I18n.available_locales.find{|locale| ![:en, :de].include?(locale)}
127
+ I18n.locale = :en
128
+ Stringex::Localization.backend = :i18n
129
+
130
+ assert_equal :en, Stringex::Localization.locale
131
+
132
+ I18n.locale = other_locale
133
+ assert_equal other_locale, Stringex::Localization.locale
134
+
135
+ Stringex::Localization.locale = :de
136
+ assert_equal :de, Stringex::Localization.locale
137
+ assert_equal other_locale, I18n.locale
138
+
139
+ Stringex::Localization.locale = nil
140
+ assert_equal other_locale, Stringex::Localization.locale
141
+ assert_equal other_locale, I18n.locale
142
+ else
143
+ flunk "No I18n locales are available except :de and :en so test will not work"
144
+ end
145
+ end
146
+
147
+ def test_enforce_available_locales_default
148
+ return unless I18n.respond_to?(:enforce_available_locales)
149
+ Stringex::Localization.backend = :i18n
150
+ assert_not_nil I18n.enforce_available_locales
151
+ 'Some String'.to_url
152
+ assert_not_nil I18n.enforce_available_locales
153
+ end
154
+
155
+ def test_respects_user_enforce_available_locales_setting
156
+ return unless I18n.respond_to?(:enforce_available_locales)
157
+ Stringex::Localization.backend = :i18n
158
+ I18n.enforce_available_locales = false
159
+ 'Some String'.to_url
160
+ assert_equal false, I18n.enforce_available_locales
161
+ end
162
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+ require 'stringex'
5
+
6
+ class StringExtensionsConfigurationTest < Test::Unit::TestCase
7
+ def teardown
8
+ Stringex::StringExtensions.unconfigure!
9
+ end
10
+
11
+ def test_can_set_base_settings
12
+ Stringex::StringExtensions.configure do |c|
13
+ c.replace_whitespace_with = "~"
14
+ end
15
+ assert_equal "foo~bar", "foo bar".to_url
16
+ end
17
+ end