tb_core 0.9.17

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 (341) hide show
  1. checksums.yaml +15 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.markdown +60 -0
  4. data/Rakefile +28 -0
  5. data/app/assets/images/back_disabled.jpg +0 -0
  6. data/app/assets/images/back_enabled.jpg +0 -0
  7. data/app/assets/images/favicon.ico +0 -0
  8. data/app/assets/images/forward_disabled.jpg +0 -0
  9. data/app/assets/images/forward_enabled.jpg +0 -0
  10. data/app/assets/images/sort_asc.png +0 -0
  11. data/app/assets/images/sort_asc_disabled.png +0 -0
  12. data/app/assets/images/sort_both.png +0 -0
  13. data/app/assets/images/sort_desc.png +0 -0
  14. data/app/assets/images/sort_desc_disabled.png +0 -0
  15. data/app/assets/images/spud/admin/down_arrow.gif +0 -0
  16. data/app/assets/images/spud/admin/flick/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  17. data/app/assets/images/spud/admin/flick/ui-bg_flat_0_eeeeee_40x100.png +0 -0
  18. data/app/assets/images/spud/admin/flick/ui-bg_flat_55_ffffff_40x100.png +0 -0
  19. data/app/assets/images/spud/admin/flick/ui-bg_flat_75_ffffff_40x100.png +0 -0
  20. data/app/assets/images/spud/admin/flick/ui-bg_glass_65_ffffff_1x400.png +0 -0
  21. data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
  22. data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
  23. data/app/assets/images/spud/admin/flick/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
  24. data/app/assets/images/spud/admin/flick/ui-icons_0073ea_256x240.png +0 -0
  25. data/app/assets/images/spud/admin/flick/ui-icons_454545_256x240.png +0 -0
  26. data/app/assets/images/spud/admin/flick/ui-icons_666666_256x240.png +0 -0
  27. data/app/assets/images/spud/admin/flick/ui-icons_ff0084_256x240.png +0 -0
  28. data/app/assets/images/spud/admin/flick/ui-icons_ffffff_256x240.png +0 -0
  29. data/app/assets/images/spud/admin/spud_logo.png +0 -0
  30. data/app/assets/images/spud/admin/spud_logo@2x.png +0 -0
  31. data/app/assets/images/spud/admin/up_arrow.gif +0 -0
  32. data/app/assets/images/spud/admin/users_thumb.png +0 -0
  33. data/app/assets/javascripts/spud/admin/application.js +133 -0
  34. data/app/assets/javascripts/spud/admin/dashboard.js +80 -0
  35. data/app/assets/javascripts/spud/admin/date_picker.js +56 -0
  36. data/app/assets/javascripts/spud/admin/editor.js +167 -0
  37. data/app/assets/javascripts/spud/admin/jquery.dataTables.min.js +151 -0
  38. data/app/assets/javascripts/spud/admin/preinit.js +1 -0
  39. data/app/assets/javascripts/spud/password_resets.js +2 -0
  40. data/app/assets/libs/bootstrap/css/bootstrap-responsive.css +1088 -0
  41. data/app/assets/libs/bootstrap/css/bootstrap.css +5893 -0
  42. data/app/assets/libs/bootstrap/img/glyphicons-halflings-white.png +0 -0
  43. data/app/assets/libs/bootstrap/img/glyphicons-halflings.png +0 -0
  44. data/app/assets/libs/bootstrap/js/bootstrap.js +2025 -0
  45. data/app/assets/libs/datepicker/css/datepicker.css +223 -0
  46. data/app/assets/libs/datepicker/js/bootstrap-datepicker.js +779 -0
  47. data/app/assets/libs/datepicker/less/datepicker.less +122 -0
  48. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  49. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_0_eeeeee_40x100.png +0 -0
  50. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_55_ffffff_40x100.png +0 -0
  51. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  52. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  53. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_100_f6f6f6_1x100.png +0 -0
  54. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_25_0073ea_1x100.png +0 -0
  55. data/app/assets/libs/jquery-ui/css/flick/images/ui-bg_highlight-soft_50_dddddd_1x100.png +0 -0
  56. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_0073ea_256x240.png +0 -0
  57. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_454545_256x240.png +0 -0
  58. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_666666_256x240.png +0 -0
  59. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_ff0084_256x240.png +0 -0
  60. data/app/assets/libs/jquery-ui/css/flick/images/ui-icons_ffffff_256x240.png +0 -0
  61. data/app/assets/libs/jquery-ui/css/flick/jquery-ui-1.9.1.custom.css +297 -0
  62. data/app/assets/libs/jquery-ui/css/flick/jquery-ui-1.9.1.custom.min.css +5 -0
  63. data/app/assets/libs/jquery-ui/js/jquery-ui-1.9.1.custom.js +4870 -0
  64. data/app/assets/libs/jquery-ui/js/jquery-ui-1.9.1.custom.min.js +6 -0
  65. data/app/assets/libs/tiny_mce/jquery.tinymce.js +1 -0
  66. data/app/assets/libs/tiny_mce/langs/en.js +1 -0
  67. data/app/assets/libs/tiny_mce/license.txt +504 -0
  68. data/app/assets/libs/tiny_mce/plugins/advhr/css/advhr.css +5 -0
  69. data/app/assets/libs/tiny_mce/plugins/advhr/editor_plugin.js +1 -0
  70. data/app/assets/libs/tiny_mce/plugins/advhr/editor_plugin_src.js +57 -0
  71. data/app/assets/libs/tiny_mce/plugins/advhr/js/rule.js +43 -0
  72. data/app/assets/libs/tiny_mce/plugins/advhr/langs/en_dlg.js +1 -0
  73. data/app/assets/libs/tiny_mce/plugins/advhr/rule.htm +58 -0
  74. data/app/assets/libs/tiny_mce/plugins/advimage/css/advimage.css +13 -0
  75. data/app/assets/libs/tiny_mce/plugins/advimage/editor_plugin.js +1 -0
  76. data/app/assets/libs/tiny_mce/plugins/advimage/editor_plugin_src.js +50 -0
  77. data/app/assets/libs/tiny_mce/plugins/advimage/image.htm +235 -0
  78. data/app/assets/libs/tiny_mce/plugins/advimage/img/sample.gif +0 -0
  79. data/app/assets/libs/tiny_mce/plugins/advimage/js/image.js +462 -0
  80. data/app/assets/libs/tiny_mce/plugins/advimage/langs/en_dlg.js +1 -0
  81. data/app/assets/libs/tiny_mce/plugins/advlink/css/advlink.css +8 -0
  82. data/app/assets/libs/tiny_mce/plugins/advlink/editor_plugin.js +1 -0
  83. data/app/assets/libs/tiny_mce/plugins/advlink/editor_plugin_src.js +61 -0
  84. data/app/assets/libs/tiny_mce/plugins/advlink/js/advlink.js +539 -0
  85. data/app/assets/libs/tiny_mce/plugins/advlink/langs/en_dlg.js +1 -0
  86. data/app/assets/libs/tiny_mce/plugins/advlink/link.htm +338 -0
  87. data/app/assets/libs/tiny_mce/plugins/advlist/editor_plugin.js +1 -0
  88. data/app/assets/libs/tiny_mce/plugins/advlist/editor_plugin_src.js +176 -0
  89. data/app/assets/libs/tiny_mce/plugins/autolink/editor_plugin.js +1 -0
  90. data/app/assets/libs/tiny_mce/plugins/autolink/editor_plugin_src.js +174 -0
  91. data/app/assets/libs/tiny_mce/plugins/autoresize/editor_plugin.js +1 -0
  92. data/app/assets/libs/tiny_mce/plugins/autoresize/editor_plugin_src.js +119 -0
  93. data/app/assets/libs/tiny_mce/plugins/contextmenu/editor_plugin.js +1 -0
  94. data/app/assets/libs/tiny_mce/plugins/contextmenu/editor_plugin_src.js +161 -0
  95. data/app/assets/libs/tiny_mce/plugins/directionality/editor_plugin.js +1 -0
  96. data/app/assets/libs/tiny_mce/plugins/directionality/editor_plugin_src.js +82 -0
  97. data/app/assets/libs/tiny_mce/plugins/example/dialog.htm +22 -0
  98. data/app/assets/libs/tiny_mce/plugins/example/editor_plugin.js +1 -0
  99. data/app/assets/libs/tiny_mce/plugins/example/editor_plugin_src.js +84 -0
  100. data/app/assets/libs/tiny_mce/plugins/example/img/example.gif +0 -0
  101. data/app/assets/libs/tiny_mce/plugins/example/js/dialog.js +19 -0
  102. data/app/assets/libs/tiny_mce/plugins/example/langs/en.js +3 -0
  103. data/app/assets/libs/tiny_mce/plugins/example/langs/en_dlg.js +3 -0
  104. data/app/assets/libs/tiny_mce/plugins/example_dependency/editor_plugin.js +1 -0
  105. data/app/assets/libs/tiny_mce/plugins/example_dependency/editor_plugin_src.js +50 -0
  106. data/app/assets/libs/tiny_mce/plugins/iespell/editor_plugin.js +1 -0
  107. data/app/assets/libs/tiny_mce/plugins/iespell/editor_plugin_src.js +54 -0
  108. data/app/assets/libs/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
  109. data/app/assets/libs/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +699 -0
  110. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  111. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  112. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  113. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  114. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  115. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  116. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  117. data/app/assets/libs/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
  118. data/app/assets/libs/tiny_mce/plugins/inlinepopups/template.htm +387 -0
  119. data/app/assets/libs/tiny_mce/plugins/layer/editor_plugin.js +1 -0
  120. data/app/assets/libs/tiny_mce/plugins/layer/editor_plugin_src.js +262 -0
  121. data/app/assets/libs/tiny_mce/plugins/lists/editor_plugin.js +1 -0
  122. data/app/assets/libs/tiny_mce/plugins/lists/editor_plugin_src.js +951 -0
  123. data/app/assets/libs/tiny_mce/plugins/media/css/media.css +17 -0
  124. data/app/assets/libs/tiny_mce/plugins/media/editor_plugin.js +1 -0
  125. data/app/assets/libs/tiny_mce/plugins/media/editor_plugin_src.js +890 -0
  126. data/app/assets/libs/tiny_mce/plugins/media/js/embed.js +73 -0
  127. data/app/assets/libs/tiny_mce/plugins/media/js/media.js +470 -0
  128. data/app/assets/libs/tiny_mce/plugins/media/langs/en_dlg.js +1 -0
  129. data/app/assets/libs/tiny_mce/plugins/media/media.htm +922 -0
  130. data/app/assets/libs/tiny_mce/plugins/media/moxieplayer.swf +0 -0
  131. data/app/assets/libs/tiny_mce/plugins/paste/editor_plugin.js +1 -0
  132. data/app/assets/libs/tiny_mce/plugins/paste/editor_plugin_src.js +871 -0
  133. data/app/assets/libs/tiny_mce/plugins/paste/js/pastetext.js +36 -0
  134. data/app/assets/libs/tiny_mce/plugins/paste/js/pasteword.js +51 -0
  135. data/app/assets/libs/tiny_mce/plugins/paste/langs/en_dlg.js +1 -0
  136. data/app/assets/libs/tiny_mce/plugins/paste/pastetext.htm +27 -0
  137. data/app/assets/libs/tiny_mce/plugins/paste/pasteword.htm +21 -0
  138. data/app/assets/libs/tiny_mce/plugins/spellchecker/css/content.css +1 -0
  139. data/app/assets/libs/tiny_mce/plugins/spellchecker/editor_plugin.js +1 -0
  140. data/app/assets/libs/tiny_mce/plugins/spellchecker/editor_plugin_src.js +436 -0
  141. data/app/assets/libs/tiny_mce/plugins/spellchecker/img/wline.gif +0 -0
  142. data/app/assets/libs/tiny_mce/plugins/style/css/props.css +14 -0
  143. data/app/assets/libs/tiny_mce/plugins/style/editor_plugin.js +1 -0
  144. data/app/assets/libs/tiny_mce/plugins/style/editor_plugin_src.js +71 -0
  145. data/app/assets/libs/tiny_mce/plugins/style/js/props.js +709 -0
  146. data/app/assets/libs/tiny_mce/plugins/style/langs/en_dlg.js +1 -0
  147. data/app/assets/libs/tiny_mce/plugins/style/props.htm +845 -0
  148. data/app/assets/libs/tiny_mce/plugins/style/readme.txt +19 -0
  149. data/app/assets/libs/tiny_mce/plugins/table/cell.htm +180 -0
  150. data/app/assets/libs/tiny_mce/plugins/table/css/cell.css +17 -0
  151. data/app/assets/libs/tiny_mce/plugins/table/css/row.css +25 -0
  152. data/app/assets/libs/tiny_mce/plugins/table/css/table.css +13 -0
  153. data/app/assets/libs/tiny_mce/plugins/table/editor_plugin.js +1 -0
  154. data/app/assets/libs/tiny_mce/plugins/table/editor_plugin_src.js +1428 -0
  155. data/app/assets/libs/tiny_mce/plugins/table/js/cell.js +319 -0
  156. data/app/assets/libs/tiny_mce/plugins/table/js/merge_cells.js +27 -0
  157. data/app/assets/libs/tiny_mce/plugins/table/js/row.js +237 -0
  158. data/app/assets/libs/tiny_mce/plugins/table/js/table.js +489 -0
  159. data/app/assets/libs/tiny_mce/plugins/table/langs/en_dlg.js +1 -0
  160. data/app/assets/libs/tiny_mce/plugins/table/merge_cells.htm +32 -0
  161. data/app/assets/libs/tiny_mce/plugins/table/row.htm +158 -0
  162. data/app/assets/libs/tiny_mce/plugins/table/table.htm +188 -0
  163. data/app/assets/libs/tiny_mce/plugins/tableDropdown/editor_plugin.js +140 -0
  164. data/app/assets/libs/tiny_mce/themes/advanced/about.htm +52 -0
  165. data/app/assets/libs/tiny_mce/themes/advanced/anchor.htm +26 -0
  166. data/app/assets/libs/tiny_mce/themes/advanced/charmap.htm +55 -0
  167. data/app/assets/libs/tiny_mce/themes/advanced/color_picker.htm +70 -0
  168. data/app/assets/libs/tiny_mce/themes/advanced/editor_template.js +1 -0
  169. data/app/assets/libs/tiny_mce/themes/advanced/editor_template_src.js +1467 -0
  170. data/app/assets/libs/tiny_mce/themes/advanced/image.htm +80 -0
  171. data/app/assets/libs/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  172. data/app/assets/libs/tiny_mce/themes/advanced/img/flash.gif +0 -0
  173. data/app/assets/libs/tiny_mce/themes/advanced/img/icons.gif +0 -0
  174. data/app/assets/libs/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  175. data/app/assets/libs/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  176. data/app/assets/libs/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  177. data/app/assets/libs/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  178. data/app/assets/libs/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  179. data/app/assets/libs/tiny_mce/themes/advanced/img/trans.gif +0 -0
  180. data/app/assets/libs/tiny_mce/themes/advanced/img/video.gif +0 -0
  181. data/app/assets/libs/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  182. data/app/assets/libs/tiny_mce/themes/advanced/js/about.js +73 -0
  183. data/app/assets/libs/tiny_mce/themes/advanced/js/anchor.js +44 -0
  184. data/app/assets/libs/tiny_mce/themes/advanced/js/charmap.js +363 -0
  185. data/app/assets/libs/tiny_mce/themes/advanced/js/color_picker.js +345 -0
  186. data/app/assets/libs/tiny_mce/themes/advanced/js/image.js +251 -0
  187. data/app/assets/libs/tiny_mce/themes/advanced/js/link.js +153 -0
  188. data/app/assets/libs/tiny_mce/themes/advanced/js/source_editor.js +78 -0
  189. data/app/assets/libs/tiny_mce/themes/advanced/langs/en.js +1 -0
  190. data/app/assets/libs/tiny_mce/themes/advanced/langs/en_dlg.js +1 -0
  191. data/app/assets/libs/tiny_mce/themes/advanced/link.htm +57 -0
  192. data/app/assets/libs/tiny_mce/themes/advanced/shortcuts.htm +47 -0
  193. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/content.css +51 -0
  194. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/dialog.css +118 -0
  195. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  196. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  197. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  198. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  199. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  200. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  201. data/app/assets/libs/tiny_mce/themes/advanced/skins/default/ui.css +215 -0
  202. data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/content.css +25 -0
  203. data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +106 -0
  204. data/app/assets/libs/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
  205. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/content.css +49 -0
  206. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/dialog.css +118 -0
  207. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  208. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  209. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  210. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui.css +218 -0
  211. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  212. data/app/assets/libs/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  213. data/app/assets/libs/tiny_mce/themes/advanced/source_editor.htm +25 -0
  214. data/app/assets/libs/tiny_mce/themes/simple/editor_template.js +1 -0
  215. data/app/assets/libs/tiny_mce/themes/simple/editor_template_src.js +84 -0
  216. data/app/assets/libs/tiny_mce/themes/simple/img/icons.gif +0 -0
  217. data/app/assets/libs/tiny_mce/themes/simple/langs/en.js +1 -0
  218. data/app/assets/libs/tiny_mce/themes/simple/skins/default/content.css +25 -0
  219. data/app/assets/libs/tiny_mce/themes/simple/skins/default/ui.css +32 -0
  220. data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/content.css +17 -0
  221. data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
  222. data/app/assets/libs/tiny_mce/themes/simple/skins/o2k7/ui.css +35 -0
  223. data/app/assets/libs/tiny_mce/tiny_mce.js +1 -0
  224. data/app/assets/libs/tiny_mce/tiny_mce_popup.js +5 -0
  225. data/app/assets/libs/tiny_mce/tiny_mce_src.js +16753 -0
  226. data/app/assets/libs/tiny_mce/utils/editable_selects.js +70 -0
  227. data/app/assets/libs/tiny_mce/utils/form_utils.js +210 -0
  228. data/app/assets/libs/tiny_mce/utils/mctabs.js +162 -0
  229. data/app/assets/libs/tiny_mce/utils/validate.js +252 -0
  230. data/app/assets/stylesheets/spud/admin/application.css +480 -0
  231. data/app/assets/stylesheets/spud/admin/jquery-ui.css +568 -0
  232. data/app/assets/stylesheets/spud/admin/settings.css +4 -0
  233. data/app/assets/stylesheets/spud/admin/users.css +4 -0
  234. data/app/assets/stylesheets/spud/forms.css +108 -0
  235. data/app/assets/stylesheets/spud/login/application.css +302 -0
  236. data/app/assets/stylesheets/spud/login.css +58 -0
  237. data/app/assets/stylesheets/spud/password_resets.css +4 -0
  238. data/app/assets/stylesheets/spud/setup.css +4 -0
  239. data/app/assets/stylesheets/spud/sitemaps.css +4 -0
  240. data/app/assets/stylesheets/spud/user_sessions.css +4 -0
  241. data/app/assets/stylesheets/spud/users.css +4 -0
  242. data/app/controllers/spud/admin/application_controller.rb +61 -0
  243. data/app/controllers/spud/admin/dashboard_controller.rb +34 -0
  244. data/app/controllers/spud/admin/users_controller.rb +109 -0
  245. data/app/controllers/spud/application_controller.rb +89 -0
  246. data/app/controllers/spud/password_resets_controller.rb +50 -0
  247. data/app/controllers/spud/setup_controller.rb +21 -0
  248. data/app/controllers/spud/sitemaps_controller.rb +8 -0
  249. data/app/controllers/spud/user_sessions_controller.rb +33 -0
  250. data/app/controllers/spud/users_controller.rb +45 -0
  251. data/app/helpers/spud/admin/application_helper.rb +54 -0
  252. data/app/helpers/spud/application_helper.rb +22 -0
  253. data/app/helpers/spud/password_resets_helper.rb +2 -0
  254. data/app/mailers/spud/core_mailer.rb +12 -0
  255. data/app/models/concerns/spud_authentication.rb +10 -0
  256. data/app/models/spud_admin_permission.rb +5 -0
  257. data/app/models/spud_user.rb +26 -0
  258. data/app/models/spud_user_session.rb +3 -0
  259. data/app/models/spud_user_setting.rb +6 -0
  260. data/app/views/layouts/spud/admin/application.html.erb +72 -0
  261. data/app/views/layouts/spud/admin/detail.html.erb +31 -0
  262. data/app/views/layouts/spud/login/application.html.erb +17 -0
  263. data/app/views/layouts/spud/setup.html.erb +47 -0
  264. data/app/views/spud/admin/dashboard/index.html.erb +18 -0
  265. data/app/views/spud/admin/users/_edit.html.erb +14 -0
  266. data/app/views/spud/admin/users/_form.html.erb +90 -0
  267. data/app/views/spud/admin/users/_new.html.erb +15 -0
  268. data/app/views/spud/admin/users/edit.html.erb +3 -0
  269. data/app/views/spud/admin/users/index.html.erb +42 -0
  270. data/app/views/spud/admin/users/new.html.erb +3 -0
  271. data/app/views/spud/admin/users/show.html.erb +12 -0
  272. data/app/views/spud/core_mailer/forgot_password_notification.html.erb +14 -0
  273. data/app/views/spud/core_mailer/forgot_password_notification.text.erb +10 -0
  274. data/app/views/spud/password_resets/edit.html.erb +25 -0
  275. data/app/views/spud/password_resets/new.html.erb +14 -0
  276. data/app/views/spud/setup/index.html.erb +43 -0
  277. data/app/views/spud/sitemaps/show.xml.builder +12 -0
  278. data/app/views/spud/user_sessions/new.html.erb +27 -0
  279. data/app/views/spud/users/_form.html.erb +60 -0
  280. data/app/views/spud/users/settings.html.erb +12 -0
  281. data/config/routes.rb +18 -0
  282. data/db/migrate/20111214161011_create_spud_admin_permissions.rb +11 -0
  283. data/db/migrate/20111214161146_create_spud_users.rb +29 -0
  284. data/db/migrate/20120327124229_add_time_zone_to_spud_user.rb +6 -0
  285. data/db/migrate/20120328235431_add_scope_to_spud_admin_permissions.rb +6 -0
  286. data/db/migrate/20120329174000_create_spud_user_settings.rb +11 -0
  287. data/lib/spud_core/belongs_to_app.rb +59 -0
  288. data/lib/spud_core/configuration.rb +58 -0
  289. data/lib/spud_core/engine.rb +55 -0
  290. data/lib/spud_core/searchable.rb +11 -0
  291. data/lib/spud_core/test_files.rb +25 -0
  292. data/lib/spud_core/version.rb +5 -0
  293. data/lib/tasks/spud_core_tasks.rake +4 -0
  294. data/lib/tb_core.rb +6 -0
  295. data/spec/controllers/spud/admin/application_controller_spec.rb +49 -0
  296. data/spec/controllers/spud/admin/dashboard_controller_spec.rb +129 -0
  297. data/spec/controllers/spud/admin/users_controller_spec.rb +194 -0
  298. data/spec/controllers/spud/application_controller_spec.rb +6 -0
  299. data/spec/controllers/spud/password_reset_controller_spec.rb +93 -0
  300. data/spec/controllers/spud/setup_controller_spec.rb +56 -0
  301. data/spec/controllers/spud/sitemap_controllers_spec.rb +20 -0
  302. data/spec/controllers/spud/user_sessions_controller_spec.rb +51 -0
  303. data/spec/controllers/spud/users_controller_spec.rb +69 -0
  304. data/spec/dummy/README.rdoc +261 -0
  305. data/spec/dummy/Rakefile +7 -0
  306. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  307. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  308. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  309. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  310. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  311. data/spec/dummy/config/application.rb +58 -0
  312. data/spec/dummy/config/boot.rb +10 -0
  313. data/spec/dummy/config/database.yml +15 -0
  314. data/spec/dummy/config/environment.rb +5 -0
  315. data/spec/dummy/config/environments/development.rb +37 -0
  316. data/spec/dummy/config/environments/production.rb +67 -0
  317. data/spec/dummy/config/environments/test.rb +37 -0
  318. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  319. data/spec/dummy/config/initializers/inflections.rb +15 -0
  320. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  321. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  322. data/spec/dummy/config/initializers/session_store.rb +8 -0
  323. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  324. data/spec/dummy/config/locales/en.yml +5 -0
  325. data/spec/dummy/config/routes.rb +5 -0
  326. data/spec/dummy/config.ru +4 -0
  327. data/spec/dummy/db/schema.rb +59 -0
  328. data/spec/dummy/log/development.log +39 -0
  329. data/spec/dummy/log/test.log +37811 -0
  330. data/spec/dummy/public/404.html +26 -0
  331. data/spec/dummy/public/422.html +26 -0
  332. data/spec/dummy/public/500.html +25 -0
  333. data/spec/dummy/public/favicon.ico +0 -0
  334. data/spec/dummy/script/rails +6 -0
  335. data/spec/helpers/spud/admin/application_helper_spec.rb +150 -0
  336. data/spec/helpers/spud/application_helper_spec.rb +66 -0
  337. data/spec/lib/spud_core/configuration_spec.rb +34 -0
  338. data/spec/models/spud_user_spec.rb +27 -0
  339. data/spec/spec_helper.rb +40 -0
  340. data/spec/support/authlogic_helper.rb +2 -0
  341. metadata +652 -0
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ </body>
25
+ </html>
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,150 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spud::Admin::ApplicationHelper do
4
+ describe :timestamp do
5
+ it "should return 'Never' if a timedate is not given" do
6
+ timestamp.should == 'Never'
7
+ end
8
+
9
+ it "should reutrn 'x ago' when the supplied timestamp is less than a week ago" do
10
+ timestamp(6.days.ago).should match('.*? ago')
11
+ end
12
+
13
+ it "should not return 'x at x' when the timestamp is less than a week ago" do
14
+ timestamp(5.minutes.ago).should_not match(/.*? at .*/)
15
+ end
16
+
17
+ it "should return 'x at x' when the timestamp is more than a week ago" do
18
+ timestamp(7.days.ago).should match(/.*? at .*/)
19
+ end
20
+
21
+ it "should not reutrn 'x ago' when the supplied timestamp is more than a week ago" do
22
+ timestamp(8.days.ago).should_not match('.*? ago')
23
+ end
24
+
25
+ end
26
+
27
+ describe :current_admin_site_name do
28
+ let(:core_site_name) { "Spud" }
29
+ let(:multi_site_name) { "Spud2" }
30
+ before(:each) do
31
+ Spud::Core.stubs(:site_name).returns(core_site_name)
32
+ end
33
+
34
+ context "with multisite mode enabled" do
35
+ before(:each) do
36
+ Spud::Core.stubs(:multisite_mode_enabled).returns(true)
37
+ end
38
+
39
+ context "with a site selected" do
40
+ before(:each) do
41
+ controller.stubs(:session).returns({:admin_site => 1})
42
+ end
43
+
44
+ it "should return the spud core site name if the selected site's name is not configured" do
45
+ Spud::Core.stubs(:multisite_config).returns([{:site_id => 2, :site_name => multi_site_name}])
46
+ helper.current_admin_site_name.should == core_site_name
47
+ end
48
+
49
+ it "should return the selected site name if the select site's name is configured" do
50
+ Spud::Core.stubs(:multisite_config).returns([{:site_id => 1, :site_name => multi_site_name}])
51
+ helper.current_admin_site_name.should == multi_site_name
52
+ end
53
+ end
54
+
55
+ context "without a site selected" do
56
+ before(:each) do
57
+ controller.stubs(:session).returns({:admin_site => nil})
58
+ end
59
+
60
+ it "should return the core's site name" do
61
+ helper.current_admin_site_name.should == core_site_name
62
+ end
63
+ end
64
+ end
65
+
66
+ context "with multisite mode disabled" do
67
+ before(:each) do
68
+ Spud::Core.stubs(:multisite_mode_enabled).returns(false)
69
+ end
70
+
71
+ it "should return the core's site name" do
72
+ helper.current_admin_site_name.should == core_site_name
73
+ end
74
+ end
75
+ end
76
+
77
+ describe :header_style do
78
+ let(:style_string) { 'Big' }
79
+
80
+ context "with multisite mode enabled" do
81
+ before(:each) do
82
+ Spud::Core.stubs(:multisite_mode_enabled).returns(true)
83
+ end
84
+
85
+ context "and an admin site is selected" do
86
+ before(:each) do
87
+ controller.stubs(:session).returns({:admin_site => 1})
88
+ end
89
+
90
+ it "should return a style string if the site is configured" do
91
+ Spud::Core.stubs(:multisite_config).returns([{:site_id => 1, :header_style => style_string}])
92
+ helper.header_style.should == style_string
93
+ end
94
+
95
+ it "should return an empty string if the site is not configured" do
96
+ Spud::Core.stubs(:multisite_config).returns([])
97
+ helper.header_style.should == ''
98
+ end
99
+ end
100
+
101
+ context "and an admin site is not selected" do
102
+ before(:each) do
103
+ controller.stubs(:session).returns({:admin_site => nil})
104
+ end
105
+
106
+ it "should return an empty string" do
107
+ helper.header_style.should == ''
108
+ end
109
+ end
110
+ end
111
+
112
+ context "with multisite mode disabled" do
113
+ before(:each) do
114
+ Spud::Core.stubs(:multisite_mode_enabled).returns(false)
115
+ end
116
+
117
+ it "should return an empty string" do
118
+ helper.header_style.should == ''
119
+ end
120
+ end
121
+ end
122
+
123
+ describe :error_messages_for do
124
+ before(:each) do
125
+ @user = FactoryGirl.create(:spud_user)
126
+ end
127
+
128
+ it "should return blank when no errors exist" do
129
+ helper.error_messages_for(@user).should == ''
130
+ end
131
+
132
+ it "should display 1 error when the subject has 2 errors" do
133
+ @user.errors[:base] << "error 1"
134
+ helper.error_messages_for(@user).should include("1 error")
135
+ end
136
+
137
+ (1..3).each do |error_count|
138
+ it "should display #{error_count} errors when the subject has #{error_count} errors" do
139
+ error_count.times {|x| @user.errors[:base] << "error #{x}" }
140
+ helper.error_messages_for(@user).should include("#{@user.errors[:base].size} error")
141
+ end
142
+ end
143
+
144
+ it "should display the error" do
145
+ error = "You're invalid"
146
+ @user.errors[:base] << error
147
+ helper.error_messages_for(@user).should include(error)
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spud::ApplicationHelper do
4
+ before :each do
5
+ activate_authlogic
6
+ @user = FactoryGirl.create(:spud_user)
7
+ @session = SpudUserSession.create(@user)
8
+ end
9
+
10
+ describe :current_site_name do
11
+
12
+ it "should return config site name if multisite is disabled" do
13
+ Spud::Core.configure do |config|
14
+ config.multisite_mode_enabled = false
15
+ config.site_name = "Test Site"
16
+ config.multisite_config = []
17
+ end
18
+ helper.current_site_name.should == 'Test Site'
19
+ end
20
+
21
+ it "should return config site name if multisite is enabled but multisite name is blank" do
22
+ Spud::Core.configure do |config|
23
+ config.site_name = "Test Site"
24
+ config.multisite_mode_enabled = true
25
+ config.multisite_config = []
26
+
27
+ end
28
+
29
+ helper.current_site_name.should == 'Test Site'
30
+ end
31
+
32
+ it "should return multisite name if multisite is enabled" do
33
+ Spud::Core.configure do |config|
34
+ config.site_name = "Test Site"
35
+ config.multisite_mode_enabled = true
36
+ config.multisite_config += [{:hosts => ["test.host"], :site_name =>"Site B", :site_id => 1}]
37
+ end
38
+
39
+ helper.current_site_name.should == 'Site B'
40
+ end
41
+ end
42
+
43
+ describe :current_site_id do
44
+
45
+
46
+
47
+ it "should return the default site id if multisite is disabled" do
48
+ Spud::Core.configure do |config|
49
+ config.site_id = 0
50
+ config.multisite_mode_enabled = false
51
+ config.multisite_config = []
52
+ end
53
+ helper.current_site_id.should == 0
54
+ end
55
+
56
+ it "should return the current site id if multisite is enabled" do
57
+ Spud::Core.configure do |config|
58
+ config.multisite_mode_enabled = true
59
+ config.multisite_config = [{:hosts => ["test.host"], :site_name =>"Site B", :site_id => 1}]
60
+ end
61
+ # @controller.request = request
62
+ helper.current_site_id.should == 1
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spud::Core do
4
+
5
+ before :each do
6
+ Spud::Core.configure do |config|
7
+ config.site_id = 0
8
+ config.site_name = "Default Site"
9
+ config.short_name = "default"
10
+ config.multisite_mode_enabled = true
11
+ config.multisite_config = [{:hosts => ["test.host"], :site_name =>"Site B", :short_name => 'site_b', :site_id => 1}]
12
+ end
13
+ end
14
+
15
+ describe :site_config_for_id do
16
+ it "should should return the default site config" do
17
+ config = Spud::Core.site_config_for_id(0)
18
+ config.should == {:site_name =>"Default Site", :short_name => 'default', :site_id => 0}
19
+ end
20
+
21
+ it "should return the config for Site B" do
22
+ config = Spud::Core.site_config_for_id(1)
23
+ config.should == {:hosts => ["test.host"], :site_name =>"Site B", :short_name => 'site_b', :site_id => 1}
24
+ end
25
+ end
26
+
27
+ describe :default_site_config do
28
+ it "should return the default site config" do
29
+ config = Spud::Core.default_site_config
30
+ config.should == {:site_name =>"Default Site", :short_name => 'default', :site_id => 0}
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe SpudUser do
4
+ it { should have_many(:spud_admin_permissions) }
5
+
6
+ describe ".full_name" do
7
+ it "should return the full name if the first and last name are not blank" do
8
+ u = FactoryGirl.build(:spud_user)
9
+ u.full_name.should == "#{u.first_name} #{u.last_name}"
10
+ end
11
+
12
+ it "should return only the last name if the first name is blank" do
13
+ u = FactoryGirl.build(:spud_user, :first_name => nil)
14
+ u.full_name.should == u.last_name
15
+ end
16
+
17
+ it "should return only the first name if the last name is blank" do
18
+ u = FactoryGirl.build(:spud_user, :last_name => nil)
19
+ u.full_name.should == u.first_name
20
+ end
21
+
22
+ it "should return the login if the first and last name are blank" do
23
+ u = FactoryGirl.build(:spud_user, :first_name => nil, :last_name => nil)
24
+ u.full_name.should == u.login
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,40 @@
1
+ # Track code coverage
2
+ require 'simplecov'
3
+ SimpleCov.start 'rails' do
4
+ # root "dummy/"
5
+ add_filter "/factories/"
6
+ end
7
+
8
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
9
+ ENV["RAILS_ENV"] = 'test'
10
+ require File.expand_path("../dummy/config/environment", __FILE__)
11
+ require 'rspec/rails'
12
+ require 'rspec/autorun'
13
+ require 'database_cleaner'
14
+ require 'shoulda'
15
+ require 'factory_girl'
16
+ require 'mocha'
17
+
18
+ # Requires supporting ruby files with custom matchers and macros, etc,
19
+ # in spec/support/ and its subdirectories.
20
+ ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')
21
+ Dir[File.join(ENGINE_RAILS_ROOT,"spec/support/**/*.rb"), File.join(ENGINE_RAILS_ROOT,"factories/*")].each {|f| require f}
22
+
23
+ RSpec.configure do |config|
24
+ config.mock_with :mocha
25
+ config.use_transactional_fixtures = true
26
+ config.infer_base_class_for_anonymous_controllers = false
27
+
28
+ config.before(:suite) do
29
+ DatabaseCleaner.strategy = :transaction
30
+ DatabaseCleaner.clean_with(:truncation)
31
+ end
32
+
33
+ config.before(:each) do
34
+ DatabaseCleaner.start
35
+ end
36
+
37
+ config.after(:each) do
38
+ DatabaseCleaner.clean
39
+ end
40
+ end
@@ -0,0 +1,2 @@
1
+ require 'authlogic/test_case'
2
+ include Authlogic::TestCase