tiny-safe-mod 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/stringex-2.8.6/Gemfile +51 -0
  3. data/stringex-2.8.6/MIT-LICENSE +20 -0
  4. data/stringex-2.8.6/README.md +162 -0
  5. data/stringex-2.8.6/Rakefile +57 -0
  6. data/stringex-2.8.6/VERSION +1 -0
  7. data/stringex-2.8.6/init.rb +3 -0
  8. data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/active_record.rb +23 -0
  9. data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/base.rb +240 -0
  10. data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/data_mapper.rb +61 -0
  11. data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/mongoid.rb +37 -0
  12. data/stringex-2.8.6/lib/stringex/acts_as_url/adapter.rb +26 -0
  13. data/stringex-2.8.6/lib/stringex/acts_as_url.rb +107 -0
  14. data/stringex-2.8.6/lib/stringex/configuration/acts_as_url.rb +50 -0
  15. data/stringex-2.8.6/lib/stringex/configuration/base.rb +58 -0
  16. data/stringex-2.8.6/lib/stringex/configuration/configurator.rb +25 -0
  17. data/stringex-2.8.6/lib/stringex/configuration/string_extensions.rb +20 -0
  18. data/stringex-2.8.6/lib/stringex/configuration.rb +4 -0
  19. data/stringex-2.8.6/lib/stringex/configuration_lite.rb +3 -0
  20. data/stringex-2.8.6/lib/stringex/core_ext.rb +10 -0
  21. data/stringex-2.8.6/lib/stringex/localization/backend/base.rb +13 -0
  22. data/stringex-2.8.6/lib/stringex/localization/backend/i18n.rb +86 -0
  23. data/stringex-2.8.6/lib/stringex/localization/backend/internal.rb +47 -0
  24. data/stringex-2.8.6/lib/stringex/localization/conversion_expressions.rb +154 -0
  25. data/stringex-2.8.6/lib/stringex/localization/converter.rb +129 -0
  26. data/stringex-2.8.6/lib/stringex/localization/default_conversions.rb +89 -0
  27. data/stringex-2.8.6/lib/stringex/localization.rb +112 -0
  28. data/stringex-2.8.6/lib/stringex/rails/railtie.rb +10 -0
  29. data/stringex-2.8.6/lib/stringex/string_extensions.rb +228 -0
  30. data/stringex-2.8.6/lib/stringex/unidecoder.rb +82 -0
  31. data/stringex-2.8.6/lib/stringex/unidecoder_data/x00.yml +257 -0
  32. data/stringex-2.8.6/lib/stringex/unidecoder_data/x01.yml +257 -0
  33. data/stringex-2.8.6/lib/stringex/unidecoder_data/x02.yml +256 -0
  34. data/stringex-2.8.6/lib/stringex/unidecoder_data/x03.yml +256 -0
  35. data/stringex-2.8.6/lib/stringex/unidecoder_data/x04.yml +256 -0
  36. data/stringex-2.8.6/lib/stringex/unidecoder_data/x05.yml +256 -0
  37. data/stringex-2.8.6/lib/stringex/unidecoder_data/x06.yml +256 -0
  38. data/stringex-2.8.6/lib/stringex/unidecoder_data/x07.yml +256 -0
  39. data/stringex-2.8.6/lib/stringex/unidecoder_data/x09.yml +256 -0
  40. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0a.yml +256 -0
  41. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0b.yml +256 -0
  42. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0c.yml +256 -0
  43. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0d.yml +256 -0
  44. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0e.yml +256 -0
  45. data/stringex-2.8.6/lib/stringex/unidecoder_data/x0f.yml +256 -0
  46. data/stringex-2.8.6/lib/stringex/unidecoder_data/x10.yml +256 -0
  47. data/stringex-2.8.6/lib/stringex/unidecoder_data/x11.yml +256 -0
  48. data/stringex-2.8.6/lib/stringex/unidecoder_data/x12.yml +257 -0
  49. data/stringex-2.8.6/lib/stringex/unidecoder_data/x13.yml +256 -0
  50. data/stringex-2.8.6/lib/stringex/unidecoder_data/x14.yml +257 -0
  51. data/stringex-2.8.6/lib/stringex/unidecoder_data/x15.yml +257 -0
  52. data/stringex-2.8.6/lib/stringex/unidecoder_data/x16.yml +256 -0
  53. data/stringex-2.8.6/lib/stringex/unidecoder_data/x17.yml +256 -0
  54. data/stringex-2.8.6/lib/stringex/unidecoder_data/x18.yml +256 -0
  55. data/stringex-2.8.6/lib/stringex/unidecoder_data/x1e.yml +256 -0
  56. data/stringex-2.8.6/lib/stringex/unidecoder_data/x1f.yml +256 -0
  57. data/stringex-2.8.6/lib/stringex/unidecoder_data/x20.yml +256 -0
  58. data/stringex-2.8.6/lib/stringex/unidecoder_data/x21.yml +256 -0
  59. data/stringex-2.8.6/lib/stringex/unidecoder_data/x22.yml +256 -0
  60. data/stringex-2.8.6/lib/stringex/unidecoder_data/x23.yml +256 -0
  61. data/stringex-2.8.6/lib/stringex/unidecoder_data/x24.yml +256 -0
  62. data/stringex-2.8.6/lib/stringex/unidecoder_data/x25.yml +256 -0
  63. data/stringex-2.8.6/lib/stringex/unidecoder_data/x26.yml +256 -0
  64. data/stringex-2.8.6/lib/stringex/unidecoder_data/x27.yml +256 -0
  65. data/stringex-2.8.6/lib/stringex/unidecoder_data/x28.yml +257 -0
  66. data/stringex-2.8.6/lib/stringex/unidecoder_data/x2e.yml +256 -0
  67. data/stringex-2.8.6/lib/stringex/unidecoder_data/x2f.yml +256 -0
  68. data/stringex-2.8.6/lib/stringex/unidecoder_data/x30.yml +256 -0
  69. data/stringex-2.8.6/lib/stringex/unidecoder_data/x31.yml +256 -0
  70. data/stringex-2.8.6/lib/stringex/unidecoder_data/x32.yml +256 -0
  71. data/stringex-2.8.6/lib/stringex/unidecoder_data/x33.yml +256 -0
  72. data/stringex-2.8.6/lib/stringex/unidecoder_data/x4d.yml +256 -0
  73. data/stringex-2.8.6/lib/stringex/unidecoder_data/x4e.yml +257 -0
  74. data/stringex-2.8.6/lib/stringex/unidecoder_data/x4f.yml +257 -0
  75. data/stringex-2.8.6/lib/stringex/unidecoder_data/x50.yml +257 -0
  76. data/stringex-2.8.6/lib/stringex/unidecoder_data/x51.yml +257 -0
  77. data/stringex-2.8.6/lib/stringex/unidecoder_data/x52.yml +257 -0
  78. data/stringex-2.8.6/lib/stringex/unidecoder_data/x53.yml +257 -0
  79. data/stringex-2.8.6/lib/stringex/unidecoder_data/x54.yml +257 -0
  80. data/stringex-2.8.6/lib/stringex/unidecoder_data/x55.yml +257 -0
  81. data/stringex-2.8.6/lib/stringex/unidecoder_data/x56.yml +257 -0
  82. data/stringex-2.8.6/lib/stringex/unidecoder_data/x57.yml +257 -0
  83. data/stringex-2.8.6/lib/stringex/unidecoder_data/x58.yml +257 -0
  84. data/stringex-2.8.6/lib/stringex/unidecoder_data/x59.yml +257 -0
  85. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5a.yml +257 -0
  86. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5b.yml +257 -0
  87. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5c.yml +257 -0
  88. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5d.yml +257 -0
  89. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5e.yml +257 -0
  90. data/stringex-2.8.6/lib/stringex/unidecoder_data/x5f.yml +257 -0
  91. data/stringex-2.8.6/lib/stringex/unidecoder_data/x60.yml +257 -0
  92. data/stringex-2.8.6/lib/stringex/unidecoder_data/x61.yml +257 -0
  93. data/stringex-2.8.6/lib/stringex/unidecoder_data/x62.yml +257 -0
  94. data/stringex-2.8.6/lib/stringex/unidecoder_data/x63.yml +257 -0
  95. data/stringex-2.8.6/lib/stringex/unidecoder_data/x64.yml +257 -0
  96. data/stringex-2.8.6/lib/stringex/unidecoder_data/x65.yml +257 -0
  97. data/stringex-2.8.6/lib/stringex/unidecoder_data/x66.yml +257 -0
  98. data/stringex-2.8.6/lib/stringex/unidecoder_data/x67.yml +257 -0
  99. data/stringex-2.8.6/lib/stringex/unidecoder_data/x68.yml +257 -0
  100. data/stringex-2.8.6/lib/stringex/unidecoder_data/x69.yml +257 -0
  101. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6a.yml +257 -0
  102. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6b.yml +257 -0
  103. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6c.yml +257 -0
  104. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6d.yml +257 -0
  105. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6e.yml +257 -0
  106. data/stringex-2.8.6/lib/stringex/unidecoder_data/x6f.yml +257 -0
  107. data/stringex-2.8.6/lib/stringex/unidecoder_data/x70.yml +257 -0
  108. data/stringex-2.8.6/lib/stringex/unidecoder_data/x71.yml +257 -0
  109. data/stringex-2.8.6/lib/stringex/unidecoder_data/x72.yml +257 -0
  110. data/stringex-2.8.6/lib/stringex/unidecoder_data/x73.yml +257 -0
  111. data/stringex-2.8.6/lib/stringex/unidecoder_data/x74.yml +257 -0
  112. data/stringex-2.8.6/lib/stringex/unidecoder_data/x75.yml +257 -0
  113. data/stringex-2.8.6/lib/stringex/unidecoder_data/x76.yml +257 -0
  114. data/stringex-2.8.6/lib/stringex/unidecoder_data/x77.yml +257 -0
  115. data/stringex-2.8.6/lib/stringex/unidecoder_data/x78.yml +257 -0
  116. data/stringex-2.8.6/lib/stringex/unidecoder_data/x79.yml +257 -0
  117. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7a.yml +257 -0
  118. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7b.yml +257 -0
  119. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7c.yml +257 -0
  120. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7d.yml +257 -0
  121. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7e.yml +257 -0
  122. data/stringex-2.8.6/lib/stringex/unidecoder_data/x7f.yml +257 -0
  123. data/stringex-2.8.6/lib/stringex/unidecoder_data/x80.yml +257 -0
  124. data/stringex-2.8.6/lib/stringex/unidecoder_data/x81.yml +257 -0
  125. data/stringex-2.8.6/lib/stringex/unidecoder_data/x82.yml +257 -0
  126. data/stringex-2.8.6/lib/stringex/unidecoder_data/x83.yml +257 -0
  127. data/stringex-2.8.6/lib/stringex/unidecoder_data/x84.yml +257 -0
  128. data/stringex-2.8.6/lib/stringex/unidecoder_data/x85.yml +257 -0
  129. data/stringex-2.8.6/lib/stringex/unidecoder_data/x86.yml +257 -0
  130. data/stringex-2.8.6/lib/stringex/unidecoder_data/x87.yml +257 -0
  131. data/stringex-2.8.6/lib/stringex/unidecoder_data/x88.yml +257 -0
  132. data/stringex-2.8.6/lib/stringex/unidecoder_data/x89.yml +257 -0
  133. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8a.yml +257 -0
  134. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8b.yml +257 -0
  135. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8c.yml +257 -0
  136. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8d.yml +257 -0
  137. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8e.yml +257 -0
  138. data/stringex-2.8.6/lib/stringex/unidecoder_data/x8f.yml +257 -0
  139. data/stringex-2.8.6/lib/stringex/unidecoder_data/x90.yml +257 -0
  140. data/stringex-2.8.6/lib/stringex/unidecoder_data/x91.yml +257 -0
  141. data/stringex-2.8.6/lib/stringex/unidecoder_data/x92.yml +257 -0
  142. data/stringex-2.8.6/lib/stringex/unidecoder_data/x93.yml +257 -0
  143. data/stringex-2.8.6/lib/stringex/unidecoder_data/x94.yml +257 -0
  144. data/stringex-2.8.6/lib/stringex/unidecoder_data/x95.yml +257 -0
  145. data/stringex-2.8.6/lib/stringex/unidecoder_data/x96.yml +257 -0
  146. data/stringex-2.8.6/lib/stringex/unidecoder_data/x97.yml +257 -0
  147. data/stringex-2.8.6/lib/stringex/unidecoder_data/x98.yml +257 -0
  148. data/stringex-2.8.6/lib/stringex/unidecoder_data/x99.yml +257 -0
  149. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9a.yml +257 -0
  150. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9b.yml +257 -0
  151. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9c.yml +257 -0
  152. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9d.yml +257 -0
  153. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9e.yml +257 -0
  154. data/stringex-2.8.6/lib/stringex/unidecoder_data/x9f.yml +256 -0
  155. data/stringex-2.8.6/lib/stringex/unidecoder_data/xa0.yml +257 -0
  156. data/stringex-2.8.6/lib/stringex/unidecoder_data/xa1.yml +257 -0
  157. data/stringex-2.8.6/lib/stringex/unidecoder_data/xa2.yml +257 -0
  158. data/stringex-2.8.6/lib/stringex/unidecoder_data/xa3.yml +257 -0
  159. data/stringex-2.8.6/lib/stringex/unidecoder_data/xa4.yml +256 -0
  160. data/stringex-2.8.6/lib/stringex/unidecoder_data/xac.yml +257 -0
  161. data/stringex-2.8.6/lib/stringex/unidecoder_data/xad.yml +257 -0
  162. data/stringex-2.8.6/lib/stringex/unidecoder_data/xae.yml +257 -0
  163. data/stringex-2.8.6/lib/stringex/unidecoder_data/xaf.yml +257 -0
  164. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb0.yml +257 -0
  165. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb1.yml +257 -0
  166. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb2.yml +257 -0
  167. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb3.yml +257 -0
  168. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb4.yml +257 -0
  169. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb5.yml +257 -0
  170. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb6.yml +257 -0
  171. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb7.yml +257 -0
  172. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb8.yml +257 -0
  173. data/stringex-2.8.6/lib/stringex/unidecoder_data/xb9.yml +257 -0
  174. data/stringex-2.8.6/lib/stringex/unidecoder_data/xba.yml +257 -0
  175. data/stringex-2.8.6/lib/stringex/unidecoder_data/xbb.yml +257 -0
  176. data/stringex-2.8.6/lib/stringex/unidecoder_data/xbc.yml +257 -0
  177. data/stringex-2.8.6/lib/stringex/unidecoder_data/xbd.yml +257 -0
  178. data/stringex-2.8.6/lib/stringex/unidecoder_data/xbe.yml +257 -0
  179. data/stringex-2.8.6/lib/stringex/unidecoder_data/xbf.yml +257 -0
  180. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc0.yml +257 -0
  181. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc1.yml +257 -0
  182. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc2.yml +257 -0
  183. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc3.yml +257 -0
  184. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc4.yml +257 -0
  185. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc5.yml +257 -0
  186. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc6.yml +257 -0
  187. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc7.yml +257 -0
  188. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc8.yml +257 -0
  189. data/stringex-2.8.6/lib/stringex/unidecoder_data/xc9.yml +257 -0
  190. data/stringex-2.8.6/lib/stringex/unidecoder_data/xca.yml +257 -0
  191. data/stringex-2.8.6/lib/stringex/unidecoder_data/xcb.yml +257 -0
  192. data/stringex-2.8.6/lib/stringex/unidecoder_data/xcc.yml +257 -0
  193. data/stringex-2.8.6/lib/stringex/unidecoder_data/xcd.yml +257 -0
  194. data/stringex-2.8.6/lib/stringex/unidecoder_data/xce.yml +257 -0
  195. data/stringex-2.8.6/lib/stringex/unidecoder_data/xcf.yml +257 -0
  196. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd0.yml +257 -0
  197. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd1.yml +257 -0
  198. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd2.yml +257 -0
  199. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd3.yml +257 -0
  200. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd4.yml +257 -0
  201. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd5.yml +257 -0
  202. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd6.yml +257 -0
  203. data/stringex-2.8.6/lib/stringex/unidecoder_data/xd7.yml +256 -0
  204. data/stringex-2.8.6/lib/stringex/unidecoder_data/xf9.yml +257 -0
  205. data/stringex-2.8.6/lib/stringex/unidecoder_data/xfa.yml +256 -0
  206. data/stringex-2.8.6/lib/stringex/unidecoder_data/xfb.yml +257 -0
  207. data/stringex-2.8.6/lib/stringex/unidecoder_data/xfc.yml +257 -0
  208. data/stringex-2.8.6/lib/stringex/unidecoder_data/xfd.yml +256 -0
  209. data/stringex-2.8.6/lib/stringex/unidecoder_data/xfe.yml +257 -0
  210. data/stringex-2.8.6/lib/stringex/unidecoder_data/xff.yml +257 -0
  211. data/stringex-2.8.6/lib/stringex/version.rb +8 -0
  212. data/stringex-2.8.6/lib/stringex.rb +17 -0
  213. data/stringex-2.8.6/lib/stringex_lite.rb +15 -0
  214. data/stringex-2.8.6/locales/da.yml +76 -0
  215. data/stringex-2.8.6/locales/de.yml +77 -0
  216. data/stringex-2.8.6/locales/en.yml +69 -0
  217. data/stringex-2.8.6/locales/fr.yml +72 -0
  218. data/stringex-2.8.6/locales/nb.yml +76 -0
  219. data/stringex-2.8.6/locales/nl.yml +69 -0
  220. data/stringex-2.8.6/locales/no.yml +76 -0
  221. data/stringex-2.8.6/locales/pl.yml +88 -0
  222. data/stringex-2.8.6/locales/pt-BR.yml +69 -0
  223. data/stringex-2.8.6/locales/ru.yml +69 -0
  224. data/stringex-2.8.6/locales/sv.yml +76 -0
  225. data/stringex-2.8.6/stringex.gemspec +290 -0
  226. data/stringex-2.8.6/test/performance/localization_performance_test.rb +24 -0
  227. data/stringex-2.8.6/test/test_helper.rb +2 -0
  228. data/stringex-2.8.6/test/unit/acts_as_url/adapter/activerecord.rb +71 -0
  229. data/stringex-2.8.6/test/unit/acts_as_url/adapter/datamapper.rb +83 -0
  230. data/stringex-2.8.6/test/unit/acts_as_url/adapter/mongoid.rb +82 -0
  231. data/stringex-2.8.6/test/unit/acts_as_url_configuration_test.rb +51 -0
  232. data/stringex-2.8.6/test/unit/acts_as_url_integration_test.rb +425 -0
  233. data/stringex-2.8.6/test/unit/localization/da_test.rb +118 -0
  234. data/stringex-2.8.6/test/unit/localization/de_test.rb +118 -0
  235. data/stringex-2.8.6/test/unit/localization/default_test.rb +115 -0
  236. data/stringex-2.8.6/test/unit/localization/en_test.rb +118 -0
  237. data/stringex-2.8.6/test/unit/localization/fr_test.rb +118 -0
  238. data/stringex-2.8.6/test/unit/localization/nl_test.rb +118 -0
  239. data/stringex-2.8.6/test/unit/localization/pl_test.rb +118 -0
  240. data/stringex-2.8.6/test/unit/localization/pt_br_test.rb +118 -0
  241. data/stringex-2.8.6/test/unit/localization/ru_test.rb +130 -0
  242. data/stringex-2.8.6/test/unit/localization/sv_test.rb +118 -0
  243. data/stringex-2.8.6/test/unit/localization_18n_failure_test.rb +40 -0
  244. data/stringex-2.8.6/test/unit/localization_test.rb +162 -0
  245. data/stringex-2.8.6/test/unit/string_extensions_configuration_test.rb +17 -0
  246. data/stringex-2.8.6/test/unit/string_extensions_test.rb +321 -0
  247. data/stringex-2.8.6/test/unit/unicode_point_suite/basic_greek_test.rb +113 -0
  248. data/stringex-2.8.6/test/unit/unicode_point_suite/basic_latin_test.rb +144 -0
  249. data/stringex-2.8.6/test/unit/unicode_point_suite/codepoint_test_helper.rb +32 -0
  250. data/stringex-2.8.6/test/unit/unidecoder/bad_localization.yml +1 -0
  251. data/stringex-2.8.6/test/unit/unidecoder/localization.yml +4 -0
  252. data/stringex-2.8.6/test/unit/unidecoder_test.rb +104 -0
  253. data/stringex-2.8.6/test/unit/version_test.rb +12 -0
  254. data/tiny-safe-mod.gemspec +11 -0
  255. metadata +293 -0
@@ -0,0 +1,26 @@
1
+ require "stringex/acts_as_url/adapter/base"
2
+ require "stringex/acts_as_url/adapter/active_record"
3
+ require "stringex/acts_as_url/adapter/data_mapper"
4
+ require "stringex/acts_as_url/adapter/mongoid"
5
+
6
+ module Stringex
7
+ module ActsAsUrl
8
+ module Adapter
9
+ def self.add_loaded_adapter(adapter)
10
+ @loaded_adapters << adapter
11
+ end
12
+
13
+ def self.load_available
14
+ @loaded_adapters = []
15
+ constants.each do |name|
16
+ adapter = const_get(name)
17
+ adapter.load if adapter.loadable?
18
+ end
19
+ end
20
+
21
+ def self.first_available
22
+ @loaded_adapters[0]
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,107 @@
1
+ # encoding: UTF-8
2
+ require "stringex/acts_as_url/adapter"
3
+
4
+ module Stringex
5
+ module ActsAsUrl # :nodoc:
6
+ def self.configure(&block)
7
+ Stringex::Configuration::ActsAsUrl.configure(&block)
8
+ end
9
+
10
+ def self.unconfigure!
11
+ Stringex::Configuration::ActsAsUrl.unconfigure!
12
+ end
13
+
14
+ module ActsAsUrlClassMethods # :doc:
15
+ # Creates a callback to automatically create an url-friendly representation
16
+ # of the <tt>attribute</tt> argument. Example:
17
+ #
18
+ # acts_as_url :title
19
+ #
20
+ # will use the string contents of the <tt>title</tt> attribute
21
+ # to create the permalink. <strong>Note:</strong> you can also use a non-database-backed
22
+ # method to supply the string contents for the permalink. Just use that method's name
23
+ # as the argument as you would an attribute.
24
+ #
25
+ # The default attribute <tt>acts_as_url</tt> uses to save the permalink is <tt>url</tt>
26
+ # but this can be changed in the options hash. Available options are:
27
+ #
28
+ # <tt>:adapter</tt>:: If specified, will indicate what ORM adapter to use. Default functionality
29
+ # is to use the first available adapter. This should work for most cases
30
+ # unless you are using multiple ORMs in a single project.
31
+ # <tt>:allow_slash</tt>:: If true, allows the generated url to contain slashes. Default is false[y].
32
+ # <tt>:allow_duplicates</tt>:: If true, allows duplicate urls instead of appending numbers to
33
+ # differentiate between urls. Default is false[y]. See note on <tt>:scope</tt>.
34
+ # <tt>:duplicate_count_separator</tt>:: String to use when forcing unique urls from non-unique strings.
35
+ # Default is "-".
36
+ # <tt>:duplicate_sequence</tt>:: Supply an enumerator to generate the values used to generate
37
+ # unique urls (when <tt>:allow_duplicates</tt> is false).
38
+ # By default, generates positive integers in sequence from 1.
39
+ # <strong>Note:</strong> The sequence is restarted for each record
40
+ # (by calling <tt>#rewind</tt>).
41
+ # <tt>:force_downcase</tt>:: If false, allows generated url to contain uppercased letters. Default is false.
42
+ # <tt>:exclude_list</tt>:: List of complete strings that should not be transformed by <tt>acts_as_url</tt>.
43
+ # Default is empty.
44
+ # <tt>:only_when_blank</tt>:: If true, the url generation will only happen when <tt>:url_attribute</tt> is
45
+ # blank. Default is false[y] (meaning url generation will happen always).
46
+ # <tt>:scope</tt>:: The name of model attribute to scope unique urls to. There is no default here.
47
+ # <strong>Note:</strong> this will automatically act as if <tt>:allow_duplicates</tt>
48
+ # is set to true.
49
+ # <tt>:sync_url</tt>:: If set to true, the url field will be updated when changes are made to the
50
+ # attribute it is based on. Default is false.
51
+ # <tt>:url_attribute</tt>:: The name of the attribute to use for storing the generated url string.
52
+ # Default is <tt>:url</tt>.
53
+ # <tt>:limit</tt>:: The maximum size a generated url should be. <strong>Note:</strong> this does not
54
+ # include the characters needed to enforce uniqueness on duplicate urls.
55
+ # Default is nil.
56
+ def acts_as_url(attribute, options = {})
57
+ class_eval do
58
+ class << self
59
+ attr_accessor :acts_as_url_configuration
60
+ end
61
+
62
+ define_method :acts_as_url_configuration do
63
+ klass = self.class
64
+ while klass.acts_as_url_configuration.nil?
65
+ klass = klass.superclass
66
+ end
67
+ klass.acts_as_url_configuration
68
+ end
69
+ end
70
+
71
+ options[:attribute_to_urlify] = attribute
72
+ self.acts_as_url_configuration = Stringex::Configuration::ActsAsUrl.new(options)
73
+
74
+ acts_as_url_configuration.adapter.create_callbacks! self
75
+ end
76
+
77
+
78
+ # Some ORMs function as mixins not base classes and need to have a hook to reinclude
79
+ # and re-extend ActsAsUrl methods
80
+ def included(base = nil, &block)
81
+ super
82
+
83
+ if base
84
+ base.send :include, Stringex::ActsAsUrl::ActsAsUrlInstanceMethods
85
+ base.send :extend, Stringex::ActsAsUrl::ActsAsUrlClassMethods
86
+ end
87
+ end
88
+
89
+ # Initialize the url fields for the records that need it. Designed for people who add
90
+ # <tt>acts_as_url</tt> support once there's already development/production data they'd
91
+ # like to keep around.
92
+ #
93
+ # Note: This method can get very expensive, very fast. If you're planning on using this
94
+ # on a large selection, you will get much better results writing your own version with
95
+ # using pagination.
96
+ def initialize_urls
97
+ acts_as_url_configuration.adapter.initialize_urls! self
98
+ end
99
+ end
100
+
101
+ module ActsAsUrlInstanceMethods
102
+ def ensure_unique_url
103
+ acts_as_url_configuration.adapter.ensure_unique_url! self
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,50 @@
1
+ module Stringex
2
+ module Configuration
3
+ class ActsAsUrl < Base
4
+ def initialize(options = {})
5
+ if options[:scope]
6
+ options[:scope_for_url] = options.delete(:scope)
7
+ end
8
+ super
9
+ end
10
+
11
+ def string_extensions_settings
12
+ [
13
+ :allow_slash,
14
+ :exclude,
15
+ :force_downcase,
16
+ :limit,
17
+ :replace_whitespace_with,
18
+ :truncate_words
19
+ ].inject(Hash.new){|m, x| m[x] = settings.send(x); m}
20
+ end
21
+
22
+ def self.settings
23
+ @settings
24
+ end
25
+
26
+ private
27
+
28
+ def default_settings
29
+ self.class.default_settings
30
+ end
31
+
32
+ def self.default_settings
33
+ @default_settings ||= {
34
+ allow_duplicates: false,
35
+ callback_method: :before_validation,
36
+ duplicate_count_separator: "-",
37
+ enforce_uniqueness_on_sti_base_class: false,
38
+ only_when_blank: false,
39
+ scope_for_url: nil,
40
+ sync_url: false,
41
+ url_attribute: "url",
42
+ blacklist: %w[new],
43
+ blacklist_policy: lambda { |instance, url|
44
+ "#{url}-#{instance.class.to_s.downcase}"
45
+ }
46
+ }.merge(Stringex::Configuration::StringExtensions.new.default_settings)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,58 @@
1
+ module Stringex
2
+ module Configuration
3
+ class Base
4
+ attr_accessor :settings
5
+
6
+ def initialize(local_options = {})
7
+ current_settings = default_settings.merge(system_wide_customizations)
8
+ current_settings.merge! local_options
9
+
10
+ @settings = OpenStruct.new(current_settings)
11
+ end
12
+
13
+ # NOTE: This does not cache itself so that instance and class can be cached on the adapter
14
+ # without worrying about thread safety or race conditions
15
+ def adapter
16
+ adapter_name = settings.adapter || Stringex::ActsAsUrl::Adapter.first_available
17
+ case adapter_name
18
+ when Class
19
+ adapter_name.send :new, self
20
+ when :active_record
21
+ Stringex::ActsAsUrl::Adapter::ActiveRecord.new self
22
+ when :mongoid
23
+ Stringex::ActsAsUrl::Adapter::Mongoid.new self
24
+ else
25
+ raise ArgumentError, "#{adapter_name} is not a defined ActsAsUrl adapter. Please feel free to implement your own and submit it back upstream."
26
+ end
27
+ end
28
+
29
+ def self.configure(&block)
30
+ configurator = Stringex::Configuration::Configurator.new(self)
31
+ yield configurator
32
+ end
33
+
34
+ def self.system_wide_customizations
35
+ @system_wide_customizations ||= {}
36
+ end
37
+
38
+ def self.unconfigure!
39
+ @system_wide_customizations = {}
40
+ end
41
+
42
+ private
43
+
44
+ def default_settings
45
+ raise ArgumentError, "You shouldn't have hit default_settings on Stringex::Configuration::Base. Check your code."
46
+ end
47
+
48
+ def system_wide_customizations
49
+ self.class.system_wide_customizations
50
+ end
51
+
52
+ def self.valid_configuration_details
53
+ default_settings.keys
54
+ end
55
+ end
56
+ end
57
+ end
58
+
@@ -0,0 +1,25 @@
1
+ module Stringex
2
+ module Configuration
3
+ class Configurator
4
+ attr_accessor :klass
5
+
6
+ def initialize(klass)
7
+ @klass = klass
8
+
9
+ self.klass.valid_configuration_details.each do |name|
10
+ define_instance_method_for_configuration_wrapper name
11
+ end
12
+ end
13
+
14
+ def define_instance_method_for_configuration_wrapper(name)
15
+ name = name.respond_to?(:intern) ? name.intern : name
16
+ (class << self; self; end).instance_eval do
17
+ define_method("#{name}=") do |value|
18
+ customizations = klass.send(:system_wide_customizations)
19
+ customizations[name] = value
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ module Stringex
2
+ module Configuration
3
+ class StringExtensions < Base
4
+ def default_settings
5
+ self.class.default_settings
6
+ end
7
+
8
+ def self.default_settings
9
+ @default_settings ||= {
10
+ allow_slash: false,
11
+ exclude: [],
12
+ force_downcase: true,
13
+ limit: nil,
14
+ replace_whitespace_with: "-",
15
+ truncate_words: true
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,4 @@
1
+ require "stringex/configuration/base"
2
+ require "stringex/configuration/configurator"
3
+ require "stringex/configuration/acts_as_url"
4
+ require "stringex/configuration/string_extensions"
@@ -0,0 +1,3 @@
1
+ require 'stringex/configuration/base'
2
+ require 'stringex/configuration/configurator'
3
+ require 'stringex/configuration/string_extensions'
@@ -0,0 +1,10 @@
1
+ Stringex = Module.new unless defined?(Stringex)
2
+ ensure_module_defined = ->(base, module_name){
3
+ base.const_set(module_name, Module.new) unless base.const_defined?(module_name)
4
+ }
5
+ ensure_module_defined[Stringex, :StringExtensions]
6
+ ensure_module_defined[Stringex::StringExtensions, :PublicInstanceMethods]
7
+ ensure_module_defined[Stringex::StringExtensions, :PublicClassMethods]
8
+
9
+ String.send :include, Stringex::StringExtensions::PublicInstanceMethods
10
+ String.send :extend, Stringex::StringExtensions::PublicClassMethods
@@ -0,0 +1,13 @@
1
+ module Stringex
2
+ module Localization
3
+ module Backend
4
+ class Base
5
+ class << self
6
+ def reset!
7
+ instance_variables.each { |var| remove_instance_variable var }
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,86 @@
1
+ module Stringex
2
+ module Localization
3
+ module Backend
4
+ class I18n < Base
5
+ LOAD_PATH_BASE = File.join(File.expand_path(File.dirname(__FILE__)), '..', '..', '..', '..', 'locales')
6
+
7
+ class << self
8
+ def reset!
9
+ super
10
+ @locale = nil
11
+ ::I18n.reload! if defined?(::I18n) && ::I18n.respond_to?(:reload!)
12
+ end
13
+
14
+ def locale
15
+ @locale || ::I18n.locale
16
+ end
17
+
18
+ def locale=(new_locale)
19
+ @locale = new_locale
20
+ end
21
+
22
+ def default_locale
23
+ ::I18n.default_locale
24
+ end
25
+
26
+ def default_locale=(new_locale)
27
+ ::I18n.default_locale = new_locale
28
+ end
29
+
30
+ def with_locale(new_locale, &block)
31
+ ::I18n.with_locale new_locale, &block
32
+ end
33
+
34
+ def store_translations(locale, scope, data)
35
+ ::I18n.backend.store_translations(locale, {stringex: {scope => data}})
36
+ reset_translations_cache
37
+ end
38
+
39
+ def translations
40
+ # Set up hash like translations[:en][:transliterations]["é"]
41
+ @translations ||= Hash.new { |hsh, locale| hsh[locale] = Hash.new({}).merge(i18n_translations_for(locale)) }
42
+ end
43
+
44
+ def initial_translation(scope, key, locale)
45
+ translations[locale][scope][key.to_sym]
46
+ end
47
+
48
+ def load_translations(locale = nil)
49
+ locale ||= self.locale
50
+ ::I18n.load_path |= Dir[File.join(LOAD_PATH_BASE, "#{locale}.yml")]
51
+ ::I18n.backend.load_translations
52
+ reset_translations_cache
53
+ end
54
+
55
+ def i18n_translations_for(locale)
56
+ ensure_locales_enforced_or_not
57
+ ::I18n.translate("stringex", locale: locale, default: {})
58
+ end
59
+
60
+ def reset_translations_cache
61
+ @translations = nil
62
+ end
63
+
64
+ def ensure_locales_enforced_or_not
65
+ return unless ::I18n.respond_to?(:enforce_available_locales)
66
+ # Allow users to have set this to false manually but default to true
67
+ return unless ::I18n.enforce_available_locales == nil
68
+ ::I18n.enforce_available_locales = ::I18n.available_locales != []
69
+ end
70
+ end
71
+ end
72
+
73
+ class I18nNotDefined < RuntimeError
74
+ def initialize
75
+ super 'Stringex cannot use I18n backend: I18n is not defined'
76
+ end
77
+ end
78
+
79
+ class I18nMissingTranslate < RuntimeError
80
+ def initialize
81
+ super 'Stringex cannot use I18n backend: I18n is defined but missing a translate method'
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,47 @@
1
+ module Stringex
2
+ module Localization
3
+ module Backend
4
+ class Internal < Base
5
+ DEFAULT_LOCALE = :en
6
+
7
+ class << self
8
+ def locale
9
+ @locale || default_locale
10
+ end
11
+
12
+ def locale=(new_locale)
13
+ @locale = new_locale.to_sym
14
+ end
15
+
16
+ def default_locale
17
+ @default_locale || DEFAULT_LOCALE
18
+ end
19
+
20
+ def default_locale=(new_locale)
21
+ @default_locale = @locale = new_locale.to_sym
22
+ end
23
+
24
+ def with_locale(new_locale, &block)
25
+ original_locale = locale
26
+ self.locale = new_locale
27
+ yield
28
+ self.locale = original_locale
29
+ end
30
+
31
+ def translations
32
+ # Set up hash like translations[:en][:transliterations]["é"]
33
+ @translations ||= Hash.new { |k, v| k[v] = Hash.new({}) }
34
+ end
35
+
36
+ def store_translations(locale, scope, data)
37
+ self.translations[locale.to_sym][scope.to_sym] = Hash[data.map { |k, v| [k.to_sym, v] }] # Symbolize keys
38
+ end
39
+
40
+ def initial_translation(scope, key, locale)
41
+ translations[locale][scope][key.to_sym]
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,154 @@
1
+ # encoding: UTF-8
2
+
3
+ module Stringex
4
+ module Localization
5
+ module ConversionExpressions
6
+ ABBREVIATION = /(\s|\(|^)([[:alpha:]](\.[[:alpha:]])+(\.?)[[:alpha:]]*(\s|\)|$))/
7
+
8
+ ACCENTED_HTML_ENTITY = /&([A-Za-z])(grave|acute|circ|tilde|uml|ring|cedil|slash);/
9
+
10
+ APOSTROPHE = /(^|[[:alpha:]])'|`([[:alpha:]]|$)/
11
+
12
+ CHARACTERS = {
13
+ and: /\s*&\s*/,
14
+ at: /\s*@\s*/,
15
+ degrees: /\s*°\s*/,
16
+ divide: /\s*÷\s*/,
17
+ dot: /(\S|^)\.(\S)/,
18
+ ellipsis: /\s*\.{3,}\s*/,
19
+ equals: /\s*=\s*/,
20
+ number: /\s*#/,
21
+ percent: /\s*%\s*/,
22
+ plus: /\s*\+\s*/,
23
+ slash: /\s*(\\|\/|/)\s*/,
24
+ star: /\s*\*\s*/,
25
+ }
26
+
27
+ # Things that just get converted to spaces
28
+ CLEANUP_CHARACTERS = /[\.,:;(){}\[\]\?!\^'ʼ"`~_\|<>]/
29
+ CLEANUP_HTML_ENTITIES = /&[^;]+;/
30
+
31
+ CURRENCIES_SUPPORTED_SIMPLE = {
32
+ generic: /¤/,
33
+ dollars: /\$/,
34
+ euros: /€/,
35
+ pounds: /£/,
36
+ yen: /¥/,
37
+ reais: /R\$/
38
+ }
39
+ CURRENCIES_SUPPORTED_COMPLEX = {
40
+ dollars: :dollars_cents,
41
+ euros: :euros_cents,
42
+ pounds: :pounds_pence,
43
+ reais: :reais_cents
44
+ }
45
+ CURRENCIES_SUPPORTED = Regexp.new(CURRENCIES_SUPPORTED_SIMPLE.values.join('|'))
46
+ CURRENCIES_SIMPLE = CURRENCIES_SUPPORTED_SIMPLE.inject({}) do |hash, content|
47
+ key, expression = content
48
+ hash[key] = /(?:\s|^)#{expression}(\d*)(?:\s|$)/
49
+ hash
50
+ end
51
+ CURRENCIES_COMPLEX = CURRENCIES_SUPPORTED_SIMPLE.inject({}) do |hash, content|
52
+ key, expression = content
53
+ # Do we really need to not worry about complex currencies if there are none for the currency?
54
+ complex_key = CURRENCIES_SUPPORTED_COMPLEX[key]
55
+ if complex_key
56
+ hash[complex_key] = /(?:\s|^)#{expression}(\d+)\.(\d+)(?:\s|$)/
57
+ end
58
+ hash
59
+ end
60
+ CURRENCIES = CURRENCIES_SIMPLE.merge(CURRENCIES_COMPLEX)
61
+
62
+ HTML_ENTITIES = Proc.new(){
63
+ base = {
64
+ amp: %w{#38 amp},
65
+ cent: %w{#162 cent},
66
+ copy: %w{#169 copy},
67
+ deg: %w{#176 deg},
68
+ divide: %w{#247 divide},
69
+ double_quote: %w{#34 #822[012] quot ldquo rdquo dbquo},
70
+ ellipsis: %w{#8230 hellip},
71
+ en_dash: %w{#8211 ndash},
72
+ em_dash: %w{#8212 mdash},
73
+ frac14: %w{#188 frac14},
74
+ frac12: %w{#189 frac12},
75
+ frac34: %w{#190 frac34},
76
+ gt: %w{#62 gt},
77
+ lt: %w{#60 lt},
78
+ nbsp: %w{#160 nbsp},
79
+ pound: %w{#163 pound},
80
+ reg: %w{#174 reg},
81
+ single_quote: %w{#39 #821[678] apos lsquo rsquo sbquo},
82
+ times: %w{#215 times},
83
+ trade: %w{#8482 trade},
84
+ yen: %w{#165 yen},
85
+ }
86
+ base.inject({}) do |hash, content|
87
+ key, expression = content
88
+ hash[key] = /&(#{expression.join('|')});/
89
+ hash
90
+ end
91
+ }.call
92
+
93
+ HTML_TAG = Proc.new(){
94
+ name = /[\w:-]+/
95
+ value = /([A-Za-z0-9]+|('[^']*?'|"[^"]*?"))/
96
+ attr = /(#{name}(\s*=\s*#{value})?)/
97
+ /<[!\/?\[]?(#{name}|--)(\s+(#{attr}(\s+#{attr})*))?\s*([!\/?\]]+|--)?>/
98
+ }.call
99
+
100
+ SMART_PUNCTUATION = {
101
+ /(“|”|\302\223|\302\224|\303\222|\303\223)/ => '"',
102
+ /(‘|’|\302\221|\302\222|\303\225)/ => "'",
103
+ /…/ => "...",
104
+ }
105
+
106
+ UNREADABLE_CONTROL_CHARACTERS = /[[:cntrl:]]/
107
+
108
+ # Ordered by denominator then numerator of the value
109
+ VULGAR_FRACTIONS = {
110
+ half: /(&#189;|&frac12;|½)/,
111
+ one_third: /(&#8531;|⅓)/,
112
+ two_thirds: /(&#8532;|⅔)/,
113
+ one_fourth: /(&#188;|&frac14;|¼)/,
114
+ three_fourths: /(&#190;|&frac34;|¾)/,
115
+ one_fifth: /(&#8533;|⅕)/,
116
+ two_fifths: /(&#8534;|⅖)/,
117
+ three_fifths: /(&#8535;|⅗)/,
118
+ four_fifths: /(&#8536;|⅘)/,
119
+ one_sixth: /(&#8537;|⅙)/,
120
+ five_sixths: /(&#8538;|⅚)/,
121
+ one_eighth: /(&#8539;|⅛)/,
122
+ three_eighths: /(&#8540;|⅜)/,
123
+ five_eighths: /(&#8541;|⅝)/,
124
+ seven_eighths: /(&#8542;|⅞)/,
125
+ }
126
+
127
+ WHITESPACE = /\s+/
128
+
129
+ class << self
130
+ %w{
131
+ abbreviation
132
+ accented_html_entity
133
+ apostrophe
134
+ characters
135
+ cleanup_characters
136
+ cleanup_html_entities
137
+ currencies
138
+ currencies_simple
139
+ currencies_complex
140
+ html_entities
141
+ html_tag
142
+ smart_punctuation
143
+ unreadable_control_characters
144
+ vulgar_fractions
145
+ whitespace
146
+ }.each do |conversion_type|
147
+ define_method conversion_type do
148
+ const_get conversion_type.upcase
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end