brick_layer 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. data/.gitignore +9 -0
  2. data/Gemfile +13 -0
  3. data/README.rdoc +278 -0
  4. data/Rakefile +36 -0
  5. data/app/assets/javascripts/tiny_mce/langs/en.js +1 -0
  6. data/app/assets/javascripts/tiny_mce/license.txt +504 -0
  7. data/app/assets/javascripts/tiny_mce/plugins/advhr/css/advhr.css +5 -0
  8. data/app/assets/javascripts/tiny_mce/plugins/advhr/editor_plugin.js +1 -0
  9. data/app/assets/javascripts/tiny_mce/plugins/advhr/editor_plugin_src.js +57 -0
  10. data/app/assets/javascripts/tiny_mce/plugins/advhr/js/rule.js +43 -0
  11. data/app/assets/javascripts/tiny_mce/plugins/advhr/langs/en_dlg.js +1 -0
  12. data/app/assets/javascripts/tiny_mce/plugins/advhr/rule.htm +58 -0
  13. data/app/assets/javascripts/tiny_mce/plugins/advimage/css/advimage.css +13 -0
  14. data/app/assets/javascripts/tiny_mce/plugins/advimage/editor_plugin.js +1 -0
  15. data/app/assets/javascripts/tiny_mce/plugins/advimage/editor_plugin_src.js +50 -0
  16. data/app/assets/javascripts/tiny_mce/plugins/advimage/image.htm +235 -0
  17. data/app/assets/javascripts/tiny_mce/plugins/advimage/img/sample.gif +0 -0
  18. data/app/assets/javascripts/tiny_mce/plugins/advimage/js/image.js +462 -0
  19. data/app/assets/javascripts/tiny_mce/plugins/advimage/langs/en_dlg.js +1 -0
  20. data/app/assets/javascripts/tiny_mce/plugins/advlink/css/advlink.css +8 -0
  21. data/app/assets/javascripts/tiny_mce/plugins/advlink/editor_plugin.js +1 -0
  22. data/app/assets/javascripts/tiny_mce/plugins/advlink/editor_plugin_src.js +61 -0
  23. data/app/assets/javascripts/tiny_mce/plugins/advlink/js/advlink.js +539 -0
  24. data/app/assets/javascripts/tiny_mce/plugins/advlink/langs/en_dlg.js +1 -0
  25. data/app/assets/javascripts/tiny_mce/plugins/advlink/link.htm +338 -0
  26. data/app/assets/javascripts/tiny_mce/plugins/advlist/editor_plugin.js +1 -0
  27. data/app/assets/javascripts/tiny_mce/plugins/advlist/editor_plugin_src.js +176 -0
  28. data/app/assets/javascripts/tiny_mce/plugins/autolink/editor_plugin.js +1 -0
  29. data/app/assets/javascripts/tiny_mce/plugins/autolink/editor_plugin_src.js +174 -0
  30. data/app/assets/javascripts/tiny_mce/plugins/autoresize/editor_plugin.js +1 -0
  31. data/app/assets/javascripts/tiny_mce/plugins/autoresize/editor_plugin_src.js +119 -0
  32. data/app/assets/javascripts/tiny_mce/plugins/autosave/editor_plugin.js +1 -0
  33. data/app/assets/javascripts/tiny_mce/plugins/autosave/editor_plugin_src.js +431 -0
  34. data/app/assets/javascripts/tiny_mce/plugins/autosave/langs/en.js +4 -0
  35. data/app/assets/javascripts/tiny_mce/plugins/bbcode/editor_plugin.js +1 -0
  36. data/app/assets/javascripts/tiny_mce/plugins/bbcode/editor_plugin_src.js +120 -0
  37. data/app/assets/javascripts/tiny_mce/plugins/contextmenu/editor_plugin.js +1 -0
  38. data/app/assets/javascripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js +161 -0
  39. data/app/assets/javascripts/tiny_mce/plugins/directionality/editor_plugin.js +1 -0
  40. data/app/assets/javascripts/tiny_mce/plugins/directionality/editor_plugin_src.js +82 -0
  41. data/app/assets/javascripts/tiny_mce/plugins/emotions/editor_plugin.js +1 -0
  42. data/app/assets/javascripts/tiny_mce/plugins/emotions/editor_plugin_src.js +43 -0
  43. data/app/assets/javascripts/tiny_mce/plugins/emotions/emotions.htm +42 -0
  44. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-cool.gif +0 -0
  45. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-cry.gif +0 -0
  46. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif +0 -0
  47. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif +0 -0
  48. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-frown.gif +0 -0
  49. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif +0 -0
  50. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif +0 -0
  51. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif +0 -0
  52. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif +0 -0
  53. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif +0 -0
  54. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-smile.gif +0 -0
  55. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif +0 -0
  56. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif +0 -0
  57. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif +0 -0
  58. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-wink.gif +0 -0
  59. data/app/assets/javascripts/tiny_mce/plugins/emotions/img/smiley-yell.gif +0 -0
  60. data/app/assets/javascripts/tiny_mce/plugins/emotions/js/emotions.js +43 -0
  61. data/app/assets/javascripts/tiny_mce/plugins/emotions/langs/en_dlg.js +1 -0
  62. data/app/assets/javascripts/tiny_mce/plugins/example/dialog.htm +22 -0
  63. data/app/assets/javascripts/tiny_mce/plugins/example/editor_plugin.js +1 -0
  64. data/app/assets/javascripts/tiny_mce/plugins/example/editor_plugin_src.js +84 -0
  65. data/app/assets/javascripts/tiny_mce/plugins/example/img/example.gif +0 -0
  66. data/app/assets/javascripts/tiny_mce/plugins/example/js/dialog.js +19 -0
  67. data/app/assets/javascripts/tiny_mce/plugins/example/langs/en.js +3 -0
  68. data/app/assets/javascripts/tiny_mce/plugins/example/langs/en_dlg.js +3 -0
  69. data/app/assets/javascripts/tiny_mce/plugins/example_dependency/editor_plugin.js +1 -0
  70. data/app/assets/javascripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js +50 -0
  71. data/app/assets/javascripts/tiny_mce/plugins/fullpage/css/fullpage.css +143 -0
  72. data/app/assets/javascripts/tiny_mce/plugins/fullpage/editor_plugin.js +1 -0
  73. data/app/assets/javascripts/tiny_mce/plugins/fullpage/editor_plugin_src.js +405 -0
  74. data/app/assets/javascripts/tiny_mce/plugins/fullpage/fullpage.htm +259 -0
  75. data/app/assets/javascripts/tiny_mce/plugins/fullpage/js/fullpage.js +232 -0
  76. data/app/assets/javascripts/tiny_mce/plugins/fullpage/langs/en_dlg.js +1 -0
  77. data/app/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -0
  78. data/app/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js +159 -0
  79. data/app/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +110 -0
  80. data/app/assets/javascripts/tiny_mce/plugins/iespell/editor_plugin.js +1 -0
  81. data/app/assets/javascripts/tiny_mce/plugins/iespell/editor_plugin_src.js +54 -0
  82. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +1 -0
  83. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +699 -0
  84. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  85. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  86. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  87. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  88. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  89. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  90. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  91. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -0
  92. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +387 -0
  93. data/app/assets/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin.js +1 -0
  94. data/app/assets/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js +83 -0
  95. data/app/assets/javascripts/tiny_mce/plugins/layer/editor_plugin.js +1 -0
  96. data/app/assets/javascripts/tiny_mce/plugins/layer/editor_plugin_src.js +262 -0
  97. data/app/assets/javascripts/tiny_mce/plugins/legacyoutput/editor_plugin.js +1 -0
  98. data/app/assets/javascripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js +139 -0
  99. data/app/assets/javascripts/tiny_mce/plugins/lists/editor_plugin.js +1 -0
  100. data/app/assets/javascripts/tiny_mce/plugins/lists/editor_plugin_src.js +954 -0
  101. data/app/assets/javascripts/tiny_mce/plugins/media/css/media.css +17 -0
  102. data/app/assets/javascripts/tiny_mce/plugins/media/editor_plugin.js +1 -0
  103. data/app/assets/javascripts/tiny_mce/plugins/media/editor_plugin_src.js +890 -0
  104. data/app/assets/javascripts/tiny_mce/plugins/media/js/embed.js +73 -0
  105. data/app/assets/javascripts/tiny_mce/plugins/media/js/media.js +470 -0
  106. data/app/assets/javascripts/tiny_mce/plugins/media/langs/en_dlg.js +1 -0
  107. data/app/assets/javascripts/tiny_mce/plugins/media/media.htm +922 -0
  108. data/app/assets/javascripts/tiny_mce/plugins/media/moxieplayer.swf +0 -0
  109. data/app/assets/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin.js +1 -0
  110. data/app/assets/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js +54 -0
  111. data/app/assets/javascripts/tiny_mce/plugins/noneditable/editor_plugin.js +1 -0
  112. data/app/assets/javascripts/tiny_mce/plugins/noneditable/editor_plugin_src.js +433 -0
  113. data/app/assets/javascripts/tiny_mce/plugins/pagebreak/editor_plugin.js +1 -0
  114. data/app/assets/javascripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js +74 -0
  115. data/app/assets/javascripts/tiny_mce/plugins/paste/editor_plugin.js +1 -0
  116. data/app/assets/javascripts/tiny_mce/plugins/paste/editor_plugin_src.js +871 -0
  117. data/app/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +36 -0
  118. data/app/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +51 -0
  119. data/app/assets/javascripts/tiny_mce/plugins/paste/langs/en_dlg.js +1 -0
  120. data/app/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +27 -0
  121. data/app/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +21 -0
  122. data/app/assets/javascripts/tiny_mce/plugins/preview/editor_plugin.js +1 -0
  123. data/app/assets/javascripts/tiny_mce/plugins/preview/editor_plugin_src.js +53 -0
  124. data/app/assets/javascripts/tiny_mce/plugins/preview/example.html +28 -0
  125. data/app/assets/javascripts/tiny_mce/plugins/preview/jscripts/embed.js +73 -0
  126. data/app/assets/javascripts/tiny_mce/plugins/preview/preview.html +17 -0
  127. data/app/assets/javascripts/tiny_mce/plugins/print/editor_plugin.js +1 -0
  128. data/app/assets/javascripts/tiny_mce/plugins/print/editor_plugin_src.js +34 -0
  129. data/app/assets/javascripts/tiny_mce/plugins/save/editor_plugin.js +1 -0
  130. data/app/assets/javascripts/tiny_mce/plugins/save/editor_plugin_src.js +101 -0
  131. data/app/assets/javascripts/tiny_mce/plugins/searchreplace/css/searchreplace.css +6 -0
  132. data/app/assets/javascripts/tiny_mce/plugins/searchreplace/editor_plugin.js +1 -0
  133. data/app/assets/javascripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js +61 -0
  134. data/app/assets/javascripts/tiny_mce/plugins/searchreplace/js/searchreplace.js +142 -0
  135. data/app/assets/javascripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js +1 -0
  136. data/app/assets/javascripts/tiny_mce/plugins/searchreplace/searchreplace.htm +100 -0
  137. data/app/assets/javascripts/tiny_mce/plugins/spellchecker/css/content.css +1 -0
  138. data/app/assets/javascripts/tiny_mce/plugins/spellchecker/editor_plugin.js +1 -0
  139. data/app/assets/javascripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js +436 -0
  140. data/app/assets/javascripts/tiny_mce/plugins/spellchecker/img/wline.gif +0 -0
  141. data/app/assets/javascripts/tiny_mce/plugins/style/css/props.css +14 -0
  142. data/app/assets/javascripts/tiny_mce/plugins/style/editor_plugin.js +1 -0
  143. data/app/assets/javascripts/tiny_mce/plugins/style/editor_plugin_src.js +71 -0
  144. data/app/assets/javascripts/tiny_mce/plugins/style/js/props.js +709 -0
  145. data/app/assets/javascripts/tiny_mce/plugins/style/langs/en_dlg.js +1 -0
  146. data/app/assets/javascripts/tiny_mce/plugins/style/props.htm +845 -0
  147. data/app/assets/javascripts/tiny_mce/plugins/style/readme.txt +19 -0
  148. data/app/assets/javascripts/tiny_mce/plugins/tabfocus/editor_plugin.js +1 -0
  149. data/app/assets/javascripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js +122 -0
  150. data/app/assets/javascripts/tiny_mce/plugins/table/cell.htm +180 -0
  151. data/app/assets/javascripts/tiny_mce/plugins/table/css/cell.css +17 -0
  152. data/app/assets/javascripts/tiny_mce/plugins/table/css/row.css +25 -0
  153. data/app/assets/javascripts/tiny_mce/plugins/table/css/table.css +13 -0
  154. data/app/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -0
  155. data/app/assets/javascripts/tiny_mce/plugins/table/editor_plugin_src.js +1428 -0
  156. data/app/assets/javascripts/tiny_mce/plugins/table/js/cell.js +319 -0
  157. data/app/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +27 -0
  158. data/app/assets/javascripts/tiny_mce/plugins/table/js/row.js +237 -0
  159. data/app/assets/javascripts/tiny_mce/plugins/table/js/table.js +489 -0
  160. data/app/assets/javascripts/tiny_mce/plugins/table/langs/en_dlg.js +1 -0
  161. data/app/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +32 -0
  162. data/app/assets/javascripts/tiny_mce/plugins/table/row.htm +158 -0
  163. data/app/assets/javascripts/tiny_mce/plugins/table/table.htm +188 -0
  164. data/app/assets/javascripts/tiny_mce/plugins/template/blank.htm +12 -0
  165. data/app/assets/javascripts/tiny_mce/plugins/template/css/template.css +23 -0
  166. data/app/assets/javascripts/tiny_mce/plugins/template/editor_plugin.js +1 -0
  167. data/app/assets/javascripts/tiny_mce/plugins/template/editor_plugin_src.js +159 -0
  168. data/app/assets/javascripts/tiny_mce/plugins/template/js/template.js +106 -0
  169. data/app/assets/javascripts/tiny_mce/plugins/template/langs/en_dlg.js +1 -0
  170. data/app/assets/javascripts/tiny_mce/plugins/template/template.htm +31 -0
  171. data/app/assets/javascripts/tiny_mce/plugins/visualblocks/css/visualblocks.css +19 -0
  172. data/app/assets/javascripts/tiny_mce/plugins/visualblocks/editor_plugin.js +1 -0
  173. data/app/assets/javascripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js +63 -0
  174. data/app/assets/javascripts/tiny_mce/plugins/visualchars/editor_plugin.js +1 -0
  175. data/app/assets/javascripts/tiny_mce/plugins/visualchars/editor_plugin_src.js +83 -0
  176. data/app/assets/javascripts/tiny_mce/plugins/wordcount/editor_plugin.js +1 -0
  177. data/app/assets/javascripts/tiny_mce/plugins/wordcount/editor_plugin_src.js +122 -0
  178. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/abbr.htm +142 -0
  179. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/acronym.htm +142 -0
  180. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/attributes.htm +149 -0
  181. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/cite.htm +142 -0
  182. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css +11 -0
  183. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/css/popup.css +9 -0
  184. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/del.htm +162 -0
  185. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js +1 -0
  186. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js +132 -0
  187. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/ins.htm +162 -0
  188. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js +28 -0
  189. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js +28 -0
  190. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js +111 -0
  191. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/js/cite.js +28 -0
  192. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/js/del.js +53 -0
  193. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js +229 -0
  194. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/js/ins.js +53 -0
  195. data/app/assets/javascripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js +1 -0
  196. data/app/assets/javascripts/tiny_mce/themes/advanced/about.htm +52 -0
  197. data/app/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +26 -0
  198. data/app/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +55 -0
  199. data/app/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +74 -0
  200. data/app/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -0
  201. data/app/assets/javascripts/tiny_mce/themes/advanced/editor_template_src.js +1467 -0
  202. data/app/assets/javascripts/tiny_mce/themes/advanced/image.htm +80 -0
  203. data/app/assets/javascripts/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  204. data/app/assets/javascripts/tiny_mce/themes/advanced/img/flash.gif +0 -0
  205. data/app/assets/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
  206. data/app/assets/javascripts/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  207. data/app/assets/javascripts/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  208. data/app/assets/javascripts/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  209. data/app/assets/javascripts/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  210. data/app/assets/javascripts/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  211. data/app/assets/javascripts/tiny_mce/themes/advanced/img/trans.gif +0 -0
  212. data/app/assets/javascripts/tiny_mce/themes/advanced/img/video.gif +0 -0
  213. data/app/assets/javascripts/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  214. data/app/assets/javascripts/tiny_mce/themes/advanced/js/about.js +73 -0
  215. data/app/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +44 -0
  216. data/app/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +363 -0
  217. data/app/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +345 -0
  218. data/app/assets/javascripts/tiny_mce/themes/advanced/js/image.js +251 -0
  219. data/app/assets/javascripts/tiny_mce/themes/advanced/js/link.js +153 -0
  220. data/app/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +78 -0
  221. data/app/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +1 -0
  222. data/app/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -0
  223. data/app/assets/javascripts/tiny_mce/themes/advanced/link.htm +57 -0
  224. data/app/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +47 -0
  225. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +50 -0
  226. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +117 -0
  227. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  228. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  229. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  230. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  231. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  232. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  233. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +215 -0
  234. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +24 -0
  235. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +105 -0
  236. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +102 -0
  237. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +48 -0
  238. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +117 -0
  239. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  240. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  241. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  242. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +218 -0
  243. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +8 -0
  244. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +5 -0
  245. data/app/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +25 -0
  246. data/app/assets/javascripts/tiny_mce/themes/simple/editor_template.js +1 -0
  247. data/app/assets/javascripts/tiny_mce/themes/simple/editor_template_src.js +84 -0
  248. data/app/assets/javascripts/tiny_mce/themes/simple/img/icons.gif +0 -0
  249. data/app/assets/javascripts/tiny_mce/themes/simple/langs/en.js +1 -0
  250. data/app/assets/javascripts/tiny_mce/themes/simple/skins/default/content.css +25 -0
  251. data/app/assets/javascripts/tiny_mce/themes/simple/skins/default/ui.css +32 -0
  252. data/app/assets/javascripts/tiny_mce/themes/simple/skins/o2k7/content.css +17 -0
  253. data/app/assets/javascripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png +0 -0
  254. data/app/assets/javascripts/tiny_mce/themes/simple/skins/o2k7/ui.css +35 -0
  255. data/app/assets/javascripts/tiny_mce/tiny_mce.js +1 -0
  256. data/app/assets/javascripts/tiny_mce/tiny_mce_popup.js +5 -0
  257. data/app/assets/javascripts/tiny_mce/tiny_mce_src.js +17480 -0
  258. data/app/assets/javascripts/tiny_mce/utils/editable_selects.js +70 -0
  259. data/app/assets/javascripts/tiny_mce/utils/form_utils.js +210 -0
  260. data/app/assets/javascripts/tiny_mce/utils/mctabs.js +162 -0
  261. data/app/assets/javascripts/tiny_mce/utils/validate.js +252 -0
  262. data/app/assets/stylesheets/brick_layer.css +4 -0
  263. data/app/assets/stylesheets/default_form.css.scss +117 -0
  264. data/app/assets/stylesheets/default_style.css.scss +90 -0
  265. data/app/assets/stylesheets/default_table.css.scss +40 -0
  266. data/app/assets/stylesheets/default_typography.css.scss +10 -0
  267. data/app/assets/stylesheets/reset.css +102 -0
  268. data/app/controllers/brick_layer/admin_controller.rb +3 -0
  269. data/app/controllers/brick_layer/data_sets_controller.rb +95 -0
  270. data/app/controllers/brick_layer/manager_controller.rb +7 -0
  271. data/app/controllers/brick_layer/routes_controller.rb +103 -0
  272. data/app/helpers/brick_layer/data_set_helper.rb +148 -0
  273. data/app/helpers/brick_layer/layout_helper.rb +20 -0
  274. data/app/helpers/brick_layer/site_helper.rb +5 -0
  275. data/app/models/brick_layer/data_set.rb +219 -0
  276. data/app/models/brick_layer/file_uploader.rb +7 -0
  277. data/app/models/brick_layer/route.rb +68 -0
  278. data/app/models/brick_layer/search.rb +61 -0
  279. data/app/views/brick_layer/data_sets/_form.html.haml +18 -0
  280. data/app/views/brick_layer/data_sets/edit.html.haml +7 -0
  281. data/app/views/brick_layer/data_sets/index.html.haml +25 -0
  282. data/app/views/brick_layer/data_sets/new.html.haml +5 -0
  283. data/app/views/brick_layer/data_sets/search.html.haml +1 -0
  284. data/app/views/brick_layer/data_sets/show.html.haml +32 -0
  285. data/app/views/brick_layer/layouts/brick_layer_layout.html.haml +40 -0
  286. data/app/views/brick_layer/manager/data_set_list.html.haml +1 -0
  287. data/app/views/brick_layer/manager/index.html.haml +1 -0
  288. data/app/views/brick_layer/routes/_form.html.haml +11 -0
  289. data/app/views/brick_layer/routes/_route.html.haml +15 -0
  290. data/app/views/brick_layer/routes/edit.html.haml +21 -0
  291. data/app/views/brick_layer/routes/index.html.haml +5 -0
  292. data/app/views/brick_layer/routes/new.html.haml +5 -0
  293. data/app/views/brick_layer/routes/show.html.haml +27 -0
  294. data/app/views/brick_layer/shared/_custom_data_sets_list.html.haml +9 -0
  295. data/config/initializers/brick_layer_carrierwave.rb +6 -0
  296. data/config/initializers/brick_layer_dragonfly.rb +10 -0
  297. data/config/routes.rb +28 -0
  298. data/lib/brick_layer/engine.rb +11 -0
  299. data/lib/brick_layer/extensions.rb +8 -0
  300. data/lib/brick_layer/serve_grid_fs_file.rb +22 -0
  301. data/lib/brick_layer.rb +27 -0
  302. data/lib/tasks/brick_layer_tasks.rake +4 -0
  303. data/lib/version.rb +3 -0
  304. data/spec/controllers/brick_layer/data_sets_controller_spec.rb +69 -0
  305. data/spec/helpers/brick_layer/data_set_helper_spec.rb +174 -0
  306. data/spec/helpers/brick_layer/layout_helper_spec.rb +17 -0
  307. data/spec/models/brick_layer/data_set_spec.rb +81 -0
  308. data/spec/models/brick_layer/route_spec.rb +76 -0
  309. data/spec/models/brick_layer/search_spec.rb +101 -0
  310. data/spec/routing/data_set_routing_spec.rb +83 -0
  311. data/spec/spec_helper.rb +44 -0
  312. metadata +588 -0
data/config/routes.rb ADDED
@@ -0,0 +1,28 @@
1
+ Rails.application.routes.draw do
2
+ match "/files/*key" => BrickLayer::ServeGridFsFile
3
+
4
+ scope "/brick_layer", :module => :brick_layer do
5
+ match "/data-sets/search(.:format(/:model))" => "data_sets#search", :via => :get, :as => "search_data_set"
6
+
7
+ match "/data-sets/:model" => "data_sets#index", :via => :get, :as => "data_sets"
8
+ match "/data-sets/:model" => "data_sets#create", :via => :post, :as => "data_sets"
9
+ match "/data-sets/:model/new" => "data_sets#new", :via => :get, :as => "new_data_set"
10
+
11
+ match "/data-sets/:model/:id" => "data_sets#show", :via => :get, :as => "data_set"
12
+ match "/data-sets/:model/:id" => "data_sets#update", :via => :put
13
+ match "/data-sets/:model/:id" => "data_sets#destroy", :via => :delete
14
+ match "/data-sets/:model/:id/edit" => "data_sets#edit", :via => :get, :as => "edit_data_set"
15
+
16
+ match "/data-sets" => "manager#data_set_list", :via => :get, :as => "list_data_sets"
17
+
18
+ resources :routes
19
+
20
+ scope "/pages" do
21
+ root :to => "routes#show"
22
+ match "root", :to => "routes#show"
23
+ match "*path", :to => "routes#show", :as => "display_page"
24
+ end
25
+
26
+ root :to => "manager#index"
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ module BrickLayer
2
+ class Engine < Rails::Engine
3
+ initializer "brick_layer.load_app_instance_data" do |app|
4
+ BrickLayer.setup do |config|
5
+ config.app_root = Rails.root
6
+ config.enable_pages ||= false
7
+ config.data_sets_standalones ||= []
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ class Array
2
+ def paginate(options={:page => 1, :per_page => 50})
3
+ page = options[:page]
4
+ per_page = options[:per_page]
5
+
6
+ self[((page - 1) * per_page)...(page * per_page)]
7
+ end
8
+ end
@@ -0,0 +1,22 @@
1
+ class BrickLayer::ServeGridFsFile
2
+ class << self
3
+ def call(env)
4
+ if env["PATH_INFO"] =~ /^\/files\/(.+)$/
5
+ process_request(env, $1)
6
+ end
7
+ end
8
+
9
+ private
10
+
11
+ def process_request(env, key)
12
+ begin
13
+ Mongo::GridFileSystem.new(Mongoid.database).open(key, 'r') do |file|
14
+ [200, { 'Content-Type' => file.content_type }, [file.read]]
15
+ end
16
+ rescue
17
+ [404, { 'Content-Type' => 'text/plain' }, ['File not found.']]
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ require "bson"
2
+ require "bson_ext/cbson"
3
+ require "mongoid"
4
+ require "haml"
5
+ require "kaminari"
6
+ require "mongoid_nested_set"
7
+ require "mongoid_fulltext"
8
+ require "simple_form"
9
+ require "mongoid-ancestry"
10
+ require "rack/cache"
11
+ require "dragonfly"
12
+ require "carrierwave"
13
+ require "carrierwave/orm/mongoid"
14
+
15
+ require "brick_layer/engine"
16
+ require "brick_layer/extensions"
17
+ require "brick_layer/serve_grid_fs_file"
18
+
19
+ module BrickLayer
20
+ mattr_accessor :app_root, :enable_pages, :data_sets_standalones
21
+
22
+ def self.setup
23
+ Mongoid.config.preload_models = true
24
+
25
+ yield self
26
+ end
27
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :brick_layer do
3
+ # # Task goes here
4
+ # end
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module BrickLayer
2
+ VERSION = "0.9.0"
3
+ end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrickLayer::DataSetsController do
4
+ before(:all) do
5
+ @root_route = BrickLayer::Route.where(:slug => "").first || BrickLayer::Route.create(:slug => "")
6
+ end
7
+
8
+ before(:each) do
9
+ BrickLayer::DataSet.destroy_all
10
+ end
11
+
12
+ describe "basic REST" do
13
+ it "should assign @data_set to be a NEW employee" do
14
+ @employee = Employee.create(:title => "Employee Data Set", :route_id => @root_route.id)
15
+ get :new, :model => "employees"
16
+ assigns(:data_set).new_record?.should be_true
17
+ assigns(:data_set).is_a?(Employee).should be_true
18
+ end
19
+
20
+ it "should assign @data_sets with a LIST of employees" do
21
+ get :index, :model => "employees"
22
+ assigns(:data_sets).should == Employee.all
23
+ end
24
+
25
+ it "should assign @data_set to a specific employee to SHOW" do
26
+ @employee = Employee.create(:title => "Employee Data Set", :route_id => @root_route.id)
27
+ get :show, :model => "employees", :id => @employee.id
28
+ assigns(:data_set).should == @employee
29
+ end
30
+
31
+ it "should assign @data_set to a specific employee to EDIT" do
32
+ @employee = Employee.create(:title => "Employee Data Set", :route_id => @root_route.id)
33
+ get :edit, :model => "employees", :id => @employee.id
34
+ assigns(:data_set).should == @employee
35
+ end
36
+
37
+ it "should CREATE the employee data set if a post request is made" do
38
+ Employee.destroy_all
39
+ post :create, :model => "employees", :data_set => { :title => "Employee Data Set On Create", :route_id => BrickLayer::Route.first.id }
40
+ Employee.first.title.should == "Employee Data Set On Create"
41
+ end
42
+
43
+ it "should UPDATE the employee data set if a put request is made" do
44
+ @employee = Employee.create(:title => "Employee Data Set", :route_id => BrickLayer::Route.first.id)
45
+ put :update, :model => "employees", :id => @employee.id, :data_set => { :title => "New Title" }
46
+ @employee.reload
47
+ Employee.find(@employee.id).title.should == "New Title"
48
+ end
49
+
50
+ it "should DELETE the employee data set if a delete request is made" do
51
+ @employee = Employee.create(:title => "Employee Data Set", :route_id => BrickLayer::Route.first.id)
52
+ Employee.find(@employee.id).should_not be_nil
53
+
54
+ delete :destroy, :model => "employees", :id => @employee.id
55
+ Employee.where(:id => @employee.id).first.should be_nil
56
+ end
57
+ end
58
+
59
+ describe "basic SEARCH" do
60
+ it "should return results searching all documents" do
61
+ @employee = Employee.create(:title => "Employee Data Set", :route_id => @root_route.id)
62
+ @one_off_set = OneOffSet.create(:title => "One Off Data Set", :route_id => @root_route.id)
63
+
64
+ get :search, :title_in => ["Employee Data Set"]
65
+ assigns(:data_sets).count.should == 1
66
+ assigns(:data_sets).first.should == @employee
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,174 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrickLayer::DataSetHelper do
4
+ before(:each) { BrickLayer::DataSet.destroy_all }
5
+
6
+ it "#attributes_for(klass) should list the fields for a data set in an array" do
7
+ helper.attributes_for(Employee,{:added_only => true}).should == ["first_name","last_name"]
8
+ end
9
+
10
+ context "#form_field_formatter(obj,attribute)" do
11
+ before(:all) do
12
+ class TestOwner < BrickLayer::DataSet
13
+ field :name
14
+
15
+ has_one :group, autosave: true
16
+ end
17
+
18
+ class Group < BrickLayer::DataSet
19
+ field :name
20
+
21
+ belongs_to :test_owner
22
+ has_many :set_helper_data_sets, autosave: true
23
+ end
24
+
25
+ class SetHelperDataSet < BrickLayer::DataSet
26
+ field :first_name, type: String
27
+ field :last_name, type: String
28
+ field :dob, type: DateTime
29
+ field :some_time, type: Time
30
+ field :some_boolean, type: Boolean
31
+ field :some_date, type: Date
32
+ field :some_int, type: Integer
33
+ field :some_float, type: Float
34
+ field :some_decimal, type: BigDecimal
35
+
36
+ custom_field :some_text_area, :text
37
+ custom_field :some_email_field, :email
38
+ custom_field :some_url_field, :url
39
+ custom_field :some_phone_field, :tel
40
+ custom_field :some_password_field, :password
41
+ custom_field :some_file_field, :file
42
+ custom_field :some_image_field, :image
43
+
44
+ belongs_to :group
45
+ end
46
+
47
+
48
+ class Book < BrickLayer::DataSet
49
+ has_and_belongs_to_many :libraries
50
+ end
51
+
52
+ class Library < BrickLayer::DataSet
53
+ has_and_belongs_to_many :books
54
+ end
55
+ end
56
+
57
+ before(:each) do
58
+ @form = SimpleForm::FormBuilder.new(:data_set, SetHelperDataSet.new, helper, {:url => data_sets_path(:model => "set_helper_data_sets")}, lambda {})
59
+ end
60
+
61
+ context "BASIC FIELDS" do
62
+ it "should properly display STRING fields" do
63
+ result = helper.form_field_formatter(@form, "first_name")
64
+ result.should == @form.input(:first_name)
65
+ end
66
+
67
+ it "should properly display DATETIME fields" do
68
+ result = helper.form_field_formatter(@form, "dob")
69
+ result.should == @form.input(:dob, :as => :datetime)
70
+ end
71
+
72
+ it "should properly display TIME fields" do
73
+ result = helper.form_field_formatter(@form, "some_time")
74
+ result.should == @form.input(:some_time, :as => :time)
75
+ end
76
+
77
+ it "should properly display BOOLEAN fields" do
78
+ result = helper.form_field_formatter(@form, "some_boolean")
79
+ result.should == @form.input(:some_boolean, :as => :boolean)
80
+ end
81
+
82
+ it "should properly display DATE fields" do
83
+ result = helper.form_field_formatter(@form, "some_date")
84
+ result.should == @form.input(:some_date, :as => :date)
85
+ end
86
+
87
+ it "should properly display INTEGER fields" do
88
+ result = helper.form_field_formatter(@form, "some_int")
89
+ result.should == @form.input(:some_int, :as => :integer)
90
+ end
91
+
92
+ it "should properly display FLOAT fields" do
93
+ result = helper.form_field_formatter(@form, "some_float")
94
+ result.should == @form.input(:some_float, :as => :float)
95
+ end
96
+
97
+ it "should properly display DECIMAL fields" do
98
+ result = helper.form_field_formatter(@form, "some_decimal")
99
+ result.should == @form.input(:some_decimal, :as => :decimal)
100
+ end
101
+ end
102
+
103
+ context "CUSTOM FIELDS" do
104
+ it "should properly display a TEXT AREA field" do
105
+ result = helper.form_field_formatter(@form, "some_text_area")
106
+ result.should == @form.input(:some_text_area, :as => :text)
107
+ end
108
+
109
+ it "should properly display a EMAIL field" do
110
+ result = helper.form_field_formatter(@form, "some_email_field")
111
+ result.should == @form.input(:some_email_field, :as => :email)
112
+ end
113
+
114
+ it "should properly display a URL field" do
115
+ result = helper.form_field_formatter(@form, "some_url_field")
116
+ result.should == @form.input(:some_url_field, :as => :url)
117
+ end
118
+
119
+ it "should properly display a PHONE field" do
120
+ result = helper.form_field_formatter(@form, "some_phone_field")
121
+ result.should == @form.input(:some_phone_field, :as => :tel)
122
+ end
123
+
124
+ it "should properly display a PASSWORD field" do
125
+ result = helper.form_field_formatter(@form, "some_password_field")
126
+ result.should == @form.input(:some_password_field, :as => :password)
127
+ end
128
+
129
+ it "should properly display a FILE field" do
130
+ result = helper.form_field_formatter(@form, "some_file_field")
131
+ result.should == @form.input(:some_file_field, :as => :file)
132
+ end
133
+
134
+ it "should properly display a IMAGE field" do
135
+ result = helper.form_field_formatter(@form, "some_image_field")
136
+ result.should == @form.input(:some_image_field, :as => :file)
137
+ end
138
+ end
139
+
140
+ context "RELATIONSHIPS" do
141
+ it "should properly display BELONGS TO field" do
142
+ result = helper.relation_field_formatter(@form, "group")
143
+ result.should == helper.belongs_to_form_field(@form, "group")
144
+ end
145
+
146
+ it "should properly display HAS MANY field" do
147
+ @group_form = SimpleForm::FormBuilder.new(:data_set, Group.new, helper, {:url => data_sets_path(:model => "groups")}, lambda {})
148
+
149
+ result = helper.relation_field_formatter(@group_form, "set_helper_data_sets")
150
+ result.should == helper.has_many_form_field(@group_form, "set_helper_data_sets")
151
+ end
152
+
153
+ it "should properly display HAS ONE field" do
154
+ @owner_form = SimpleForm::FormBuilder.new(:data_set, TestOwner.new, helper, {:url => data_sets_path(:model => "test_owners")}, lambda {})
155
+
156
+ result = helper.relation_field_formatter(@owner_form, "group")
157
+ result.should == helper.has_one_form_field(@owner_form, "group")
158
+ end
159
+
160
+ it "should properly display HAS AND BELONGS TO MANY field" do
161
+ @book_form = SimpleForm::FormBuilder.new(:data_set, Book.new, helper, {:url => data_sets_path(:model => "books")}, lambda {})
162
+
163
+ result = helper.relation_field_formatter(@book_form, "libraries")
164
+ result.should == helper.has_many_form_field(@book_form, "libraries")
165
+
166
+ @library_form = SimpleForm::FormBuilder.new(:data_set, Library.new, helper, {:url => data_sets_path(:model => "books")}, lambda {})
167
+
168
+ result = helper.relation_field_formatter(@library_form, "books")
169
+ result.should == helper.has_many_form_field(@library_form, "books")
170
+ end
171
+
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrickLayer::LayoutHelper do
4
+ before(:each) { BrickLayer::DataSet.destroy_all }
5
+
6
+ before(:all) do
7
+ BrickLayer.data_sets_standalones = [:test_book, :test_friend]
8
+
9
+ class TestBook < BrickLayer::DataSet
10
+ field :name
11
+ end
12
+
13
+ class TestFriend < BrickLayer::DataSet
14
+ field :name
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrickLayer::DataSet do
4
+ before(:each) do
5
+ BrickLayer::DataSet.destroy_all
6
+ end
7
+
8
+ context "READONLY or AGGREGATE FIELDS" do
9
+ before(:all) do
10
+ class GroupedData < BrickLayer::DataSet
11
+ field :some_field_1, type: String
12
+ field :some_field_2, type: String
13
+
14
+ expose_data :employees, :recent_updates
15
+
16
+ def employees
17
+ [{name: "Jim Watson"},{name: "Ella Wright"}]
18
+ end
19
+
20
+ def recent_updates
21
+ [{event: "Some Event 1", by: "James Jones"},{event: "Some Event 2", by: "Boris Gnoesh"}]
22
+ end
23
+ end
24
+ end
25
+
26
+ it "should output the adding of these fields AS JSON" do
27
+ grouped_data = GroupedData.create(:some_field_1 => "Foo", :some_field_2 => "Bar")
28
+ grouped_data.to_json.should == "{\"employees\":[{\"name\":\"Jim Watson\"},{\"name\":\"Ella Wright\"}],\"recent_updates\":[{\"event\":\"Some Event 1\",\"by\":\"James Jones\"},{\"event\":\"Some Event 2\",\"by\":\"Boris Gnoesh\"}],\"_id\":\"#{grouped_data.id.to_s}\",\"created_at\":\"#{grouped_data.created_at.to_json.gsub('"',"")}\",\"meta_description\":null,\"meta_keywords\":null,\"route_id\":null,\"some_field_1\":\"Foo\",\"some_field_2\":\"Bar\",\"title\":null,\"updated_at\":\"#{grouped_data.updated_at.to_json.gsub('"',"")}\"}"
29
+ end
30
+ end
31
+
32
+ context "INTROSPECTION" do
33
+ it "self#all_fields(:added_only => true) should list only added fields" do
34
+ Employee.all_fields(:added_only => true).should == ["first_name", "last_name"]
35
+ end
36
+
37
+ it "self#all_fields should list all fields in an array" do
38
+ Employee.all_fields.should == ["_type", "_id", "created_at", "updated_at", "title", "meta_description", "meta_keywords", "route_id", "first_name", "last_name"]
39
+ end
40
+
41
+ it "self#exposed_data_methods should list all exposed data in an array" do
42
+ Employee.exposed_data_methods.should == ["name"]
43
+ end
44
+
45
+ it "self#fields_and_exposed_data should list all FIELDS AND EXPOSED DATA in an array" do
46
+ Employee.all_fields_and_exposed_data_methods.should == ["_type", "_id", "created_at", "updated_at", "title", "meta_description", "meta_keywords", "route_id", "first_name", "last_name","name"]
47
+ end
48
+
49
+ end
50
+
51
+ context "CUSTOM FIELDS (klass#custom_field)" do
52
+ before(:all) do
53
+ class Employee < BrickLayer::DataSet
54
+ custom_field :some_text_area, :text
55
+ custom_field :some_email_field, :email
56
+ custom_field :some_image_field, :image
57
+ end
58
+ end
59
+
60
+ describe "BUILDING FIELDS" do
61
+ it "self#custom_fields should LIST ALL CUSTOM FIELDS" do
62
+ Employee.custom_fields.should == { :some_text_area => :text,
63
+ :some_email_field => :email,
64
+ :some_image_field => :image
65
+ }
66
+ end
67
+
68
+ it "self#custom_fields should properly CREATE A STRING FIELD" do
69
+ Employee.new.fields["some_text_area"].type.should == String
70
+ end
71
+ end
72
+
73
+ describe "IMAGE FIELD" do
74
+ it "should create a field for a CREATE PROPER FIELDS" do
75
+ Employee.new.fields["some_image_field_uid"].type.should == String
76
+ Employee.new.fields["some_image_field_name"].type.should == String
77
+ end
78
+ end
79
+
80
+ end
81
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrickLayer::Route do
4
+ before(:each) do
5
+ BrickLayer::Route.destroy_all
6
+ @root = BrickLayer::Route.create(:slug => "")
7
+ end
8
+
9
+ it "should allow the creation of a route" do
10
+ route = @root.children.create(:slug => "test1")
11
+ route.should be_valid
12
+ end
13
+
14
+ it "should not allow a route with the same slug to be entered on the same parent" do
15
+ route1 = @root.children.create(:slug => "route1")
16
+ route2 = route1.children.create(:slug => "route2")
17
+
18
+ route2_again = route1.children.create(:slug => "route2")
19
+ route2_again.should_not be_valid
20
+
21
+ route3 = route2.children.create(:slug => "route3")
22
+ route2_again_valid = route3.children.create(:slug => "route2")
23
+ route2_again_valid.should be_valid
24
+ end
25
+
26
+ it "it should give it's full path in this/path/format" do
27
+ route1 = @root.children.create(:slug => "route1")
28
+ route2 = route1.children.create(:slug => "route2")
29
+ route3 = route2.children.create(:slug => "route3")
30
+
31
+ route3.full_path.should == "/route1/route2/route3"
32
+ end
33
+
34
+ it "should allow you to change it's parent" do
35
+ route1 = @root.children.create(:slug => "route1")
36
+ route2 = route1.children.create(:slug => "route2")
37
+ route3 = route2.children.create(:slug => "route3")
38
+
39
+ route3.full_path.should == "/route1/route2/route3"
40
+ route3.change_parent_to(route1)
41
+ route3.save
42
+ route3.full_path.should == "/route1/route3"
43
+
44
+ route2.full_path.should == "/route1/route2"
45
+ route2.change_parent_to(route3)
46
+ route2.save
47
+ route2.full_path.should == "/route1/route3/route2"
48
+ end
49
+
50
+ it "should remove children routes if they exist" do
51
+ route1 = @root.children.create(:slug => "route1")
52
+ route2 = route1.children.create(:slug => "route2")
53
+ route3 = route2.children.create(:slug => "route3")
54
+
55
+ lambda { BrickLayer::Route.find(route3.id) }.should_not raise_error
56
+ route2.destroy
57
+ lambda { BrickLayer::Route.find(route3.id) }.should raise_error(Mongoid::Errors::DocumentNotFound)
58
+ end
59
+
60
+ it "should properly display cached path" do
61
+ route1 = @root.children.create(:slug => "route1")
62
+ route2 = route1.children.create(:slug => "route2")
63
+ route3 = route2.children.create(:slug => "route3")
64
+
65
+ route3.set_full_path_cache.should == "/route1/route2/route3"
66
+ route3.change_parent_to(route1)
67
+ route3.save
68
+ route3.set_full_path_cache.should == "/route1/route3"
69
+
70
+ route2.set_full_path_cache.should == "/route1/route2"
71
+ route2.change_parent_to(route3)
72
+ route2.save
73
+ route2.set_full_path_cache.should == "/route1/route3/route2"
74
+ end
75
+
76
+ end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ describe BrickLayer::Search do
4
+ before(:each) do
5
+ BrickLayer::DataSet.destroy_all
6
+ end
7
+
8
+ context "PARAMS to QUERY HASH" do
9
+ it "should convert a params hash to a usable mongoid query hash" do
10
+ query = BrickLayer::Search.params_to_query({:controller => "something", :action => "something", :title_in => "Title"})
11
+ query.expand_complex_criteria.should == {:title=>{"$in"=>["Title"]}}
12
+ end
13
+
14
+ it "should create query using the correct value by type of search" do
15
+
16
+ describe "ARRAYS" do
17
+ query = BrickLayer::Search.params_to_query({:title_all => "Title"})
18
+ query.expand_complex_criteria.should == {:title=>{"$all"=>["Title"]}}
19
+
20
+ query = BrickLayer::Search.params_to_query({:title_in => "Title"})
21
+ query.expand_complex_criteria.should == {:title=>{"$in"=>["Title"]}}
22
+
23
+ query = BrickLayer::Search.params_to_query({:title_nin => "Title"})
24
+ query.expand_complex_criteria.should == {:title=>{"$nin"=>["Title"]}}
25
+
26
+ query = BrickLayer::Search.params_to_query({:title_nin => "['Another Name','My Name','Maybe']"})
27
+ query.expand_complex_criteria.should == {:title=>{"$nin"=>['Another Name','My Name','Maybe']}}
28
+ end
29
+
30
+ describe "INTEGERS" do
31
+ query = BrickLayer::Search.params_to_query({:title_gt => "5"})
32
+ query.expand_complex_criteria.should == {:title=>{"$gt"=>5}}
33
+
34
+ query = BrickLayer::Search.params_to_query({:title_gte => "5"})
35
+ query.expand_complex_criteria.should == {:title=>{"$gte"=>5}}
36
+
37
+ query = BrickLayer::Search.params_to_query({:title_lt => "10"})
38
+ query.expand_complex_criteria.should == {:title=>{"$lt"=>10}}
39
+
40
+ query = BrickLayer::Search.params_to_query({:title_lte => "12"})
41
+ query.expand_complex_criteria.should == {:title=>{"$lte"=>12}}
42
+
43
+ query = BrickLayer::Search.params_to_query({:title_size => "2"})
44
+ query.expand_complex_criteria.should == {:title=>{"$size"=>2}}
45
+ end
46
+
47
+ describe "BOOLEANS" do
48
+ query = BrickLayer::Search.params_to_query({:title_exists => "true"})
49
+ query.expand_complex_criteria.should == {:title=>{"$exists"=>true}}
50
+
51
+ end
52
+
53
+ describe "STRINGS" do
54
+ query = BrickLayer::Search.params_to_query({:title_ne => "Title"})
55
+ query.expand_complex_criteria.should == {:title=>{"$ne"=>"Title"}}
56
+ end
57
+ end
58
+ end
59
+
60
+ context "searching ALL data sets" do
61
+ before(:each) do
62
+ @employee_1 = Employee.create(:title => "Some Title 1", :meta_description => "Some Description")
63
+ @employee_2 = Employee.create(:title => "Some Title 2", :meta_description => "Some Description")
64
+ @one_off_set = OneOffSet.create(:title => "Some Title 3", :meta_description => "Some Description")
65
+ end
66
+
67
+ it "should allow a STANDARD query" do
68
+ results = BrickLayer::Search.perform_search({:meta_description_in => ['Some Description']})
69
+ results.count.should == 3
70
+ end
71
+
72
+ it "should allow FULL TEXT search" do
73
+ results = BrickLayer::Search.perform_search({:q => 'Title 2'})
74
+ results.first.should == @employee_2
75
+ end
76
+
77
+ it "should allow QUERY CHAINING" do
78
+ results = BrickLayer::Search.perform_search(:queries => { :meta_description_in => ['Some Description'], :title_in => "Some Title 3" })
79
+ results.first.should == @one_off_set
80
+ end
81
+ end
82
+
83
+ context "searching SPECIFIC data sets" do
84
+ before(:each) do
85
+ @employee = Employee.create(:title => "Title", :meta_description => "Some description")
86
+ @employee2 = Employee.create(:title => "My Employee 2", :meta_description => "Some Meta Description")
87
+ @one_off_set = OneOffSet.create(:title => "Set Title", :meta_description => "Some description")
88
+ end
89
+
90
+ it "should allow a STANDARD query" do
91
+ results = BrickLayer::Search.perform_search({:meta_description_in => 'Some Meta Description', :model => "employees"})
92
+ results.count.should == 1
93
+ end
94
+
95
+ it "should allow FULL TEXT search" do
96
+ results = BrickLayer::Search.perform_search({:q => 'Title', :model => "employee"})
97
+ results.count.should == 1
98
+ results.first.should == @employee
99
+ end
100
+ end
101
+ end