zen 0.2.8 → 0.3b

Sign up to get free protection for your applications and to get access to all the features.
Files changed (422) hide show
  1. data/.gems +20 -0
  2. data/.mailmap +3 -2
  3. data/.rvmrc +1 -1
  4. data/.travis.yml +13 -2
  5. data/.yardopts +13 -0
  6. data/AUTHORS +1 -1
  7. data/README.md +115 -77
  8. data/Rakefile +6 -7
  9. data/bin/zen +12 -5
  10. data/guide/_static/categories/categories.png +0 -0
  11. data/guide/_static/categories/category_groups.png +0 -0
  12. data/guide/_static/categories/new_category.png +0 -0
  13. data/guide/_static/categories/new_category_group.png +0 -0
  14. data/guide/_static/comments/comments.png +0 -0
  15. data/guide/_static/comments/edit_comment.png +0 -0
  16. data/guide/_static/custom_fields/custom_field_groups.png +0 -0
  17. data/guide/_static/custom_fields/custom_field_types.png +0 -0
  18. data/guide/_static/custom_fields/custom_fields.png +0 -0
  19. data/guide/_static/custom_fields/edit_custom_field_general.png +0 -0
  20. data/guide/_static/custom_fields/edit_custom_field_group.png +0 -0
  21. data/guide/_static/custom_fields/edit_custom_field_settings.png +0 -0
  22. data/guide/_static/custom_fields/edit_custom_field_type.png +0 -0
  23. data/guide/_static/menus/edit_menu.png +0 -0
  24. data/guide/_static/menus/edit_menu_item.png +0 -0
  25. data/guide/_static/menus/menu_items.png +0 -0
  26. data/guide/_static/menus/menus.png +0 -0
  27. data/guide/_static/sections/edit_entry.png +0 -0
  28. data/guide/_static/sections/edit_entry_categories.png +0 -0
  29. data/guide/_static/sections/edit_entry_general.png +0 -0
  30. data/guide/_static/sections/edit_entry_meta.png +0 -0
  31. data/guide/_static/sections/edit_section_comments.png +0 -0
  32. data/guide/_static/sections/edit_section_general.png +0 -0
  33. data/guide/_static/sections/edit_section_groups.png +0 -0
  34. data/guide/_static/sections/entries.png +0 -0
  35. data/guide/_static/sections/sections.png +0 -0
  36. data/guide/_static/settings/overview_general.png +0 -0
  37. data/guide/_static/settings/overview_security.png +0 -0
  38. data/guide/_static/settings/overview_user.png +0 -0
  39. data/guide/_static/users/edit_user.png +0 -0
  40. data/guide/_static/users/edit_user_group.png +0 -0
  41. data/guide/_static/users/edit_user_group_permissions.png +0 -0
  42. data/guide/_static/users/edit_user_permissions.png +0 -0
  43. data/guide/_static/users/overview.png +0 -0
  44. data/guide/_static/users/user_groups_overview.png +0 -0
  45. data/guide/asset_management.md +117 -0
  46. data/{CHANGELOG.md → guide/changelog.md} +42 -0
  47. data/guide/css/common.css +20 -0
  48. data/guide/getting_started.md +61 -0
  49. data/guide/hacking.md +52 -0
  50. data/guide/installation.md +44 -0
  51. data/guide/javascript.md +352 -0
  52. data/lib/vendor/sequel_sluggable.rb +137 -0
  53. data/lib/yard/tags.rb +13 -0
  54. data/lib/zen.rb +148 -78
  55. data/lib/zen/asset_groups.rb +85 -0
  56. data/lib/zen/bin/create.rb +267 -56
  57. data/lib/zen/bin/default.rb +84 -0
  58. data/lib/zen/controller/admin_controller.rb +1 -82
  59. data/lib/zen/controller/base_controller.rb +9 -5
  60. data/lib/zen/controller/frontend_controller.rb +0 -1
  61. data/lib/zen/controller/main_controller.rb +30 -42
  62. data/lib/zen/controller/preview.rb +9 -8
  63. data/lib/zen/controller/translations.rb +49 -0
  64. data/lib/zen/error.rb +17 -0
  65. data/lib/zen/event.rb +118 -0
  66. data/lib/zen/helper/asset.rb +63 -0
  67. data/lib/zen/helper/breadcrumb.rb +1 -4
  68. data/lib/zen/helper/controller.rb +73 -0
  69. data/lib/zen/helper/locale.rb +42 -0
  70. data/lib/zen/helper/message.rb +0 -3
  71. data/lib/zen/helper/search.rb +54 -0
  72. data/lib/zen/helper/stacked_aspect.rb +249 -0
  73. data/lib/zen/helper/theme.rb +3 -10
  74. data/lib/zen/language.rb +356 -181
  75. data/lib/zen/language/en/zen_general.rb +52 -0
  76. data/lib/zen/language/en/zen_models.rb +19 -0
  77. data/lib/zen/language/nl/zen_general.rb +57 -0
  78. data/lib/zen/language/nl/zen_models.rb +22 -0
  79. data/lib/zen/language/translation.rb +132 -0
  80. data/lib/zen/languages.rb +9 -0
  81. data/lib/zen/layout/admin.xhtml +3 -3
  82. data/lib/zen/layout/login.xhtml +1 -1
  83. data/lib/zen/markup.rb +189 -0
  84. data/lib/zen/model/helper.rb +65 -0
  85. data/lib/zen/model/init.rb +62 -0
  86. data/lib/zen/model/methods.rb +6 -7
  87. data/lib/zen/package.rb +312 -201
  88. data/lib/zen/package/all.rb +4 -3
  89. data/lib/zen/package/categories/lib/categories.rb +29 -41
  90. data/lib/zen/package/categories/lib/categories/controller/categories.rb +185 -130
  91. data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +172 -102
  92. data/lib/zen/package/categories/lib/categories/helper/category.rb +4 -9
  93. data/lib/zen/package/categories/lib/categories/helper/category_frontend.rb +86 -0
  94. data/lib/zen/package/categories/lib/categories/language/en/categories.rb +40 -0
  95. data/lib/zen/package/categories/lib/categories/language/en/category_groups.rb +39 -0
  96. data/lib/zen/package/categories/lib/categories/language/nl/categories.rb +42 -0
  97. data/lib/zen/package/categories/lib/categories/language/nl/category_groups.rb +42 -0
  98. data/lib/zen/package/categories/lib/categories/model/category.rb +21 -25
  99. data/lib/zen/package/categories/lib/categories/model/category_group.rb +21 -15
  100. data/lib/zen/package/categories/lib/categories/view/admin/categories/form.xhtml +25 -26
  101. data/lib/zen/package/categories/lib/categories/view/admin/categories/index.xhtml +24 -24
  102. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/form.xhtml +18 -20
  103. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/index.xhtml +21 -18
  104. data/lib/zen/package/comments/lib/comments.rb +30 -50
  105. data/lib/zen/package/comments/lib/comments/anti_spam.rb +138 -0
  106. data/lib/zen/package/comments/lib/comments/controller/comments.rb +159 -92
  107. data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +122 -34
  108. data/lib/zen/package/comments/lib/comments/helper/comment.rb +0 -3
  109. data/lib/zen/package/comments/lib/comments/helper/comment_frontend.rb +90 -0
  110. data/lib/zen/package/comments/lib/comments/language/en/comments.rb +57 -0
  111. data/lib/zen/package/comments/lib/comments/language/nl/comments.rb +61 -0
  112. data/lib/zen/package/comments/lib/comments/model/comment.rb +147 -49
  113. data/lib/zen/package/comments/lib/comments/model/comment_status.rb +0 -2
  114. data/lib/zen/package/comments/lib/comments/view/admin/comments/form.xhtml +37 -40
  115. data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +23 -42
  116. data/lib/zen/package/comments/migrations/1308774099_comment_status.rb +12 -4
  117. data/lib/zen/package/comments/migrations/1313851786_remove_defensio_signature.rb +11 -0
  118. data/lib/zen/package/custom_fields/lib/custom_fields.rb +40 -43
  119. data/lib/zen/package/custom_fields/lib/custom_fields/blue_form_parameters.rb +72 -17
  120. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +154 -118
  121. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_types.rb +147 -90
  122. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +161 -131
  123. data/lib/zen/package/custom_fields/lib/custom_fields/helper/custom_field.rb +4 -9
  124. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_groups.rb +42 -0
  125. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_types.rb +51 -0
  126. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.rb +60 -0
  127. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_groups.rb +41 -0
  128. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_types.rb +49 -0
  129. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_fields.rb +61 -0
  130. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +18 -23
  131. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +20 -19
  132. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_method.rb +1 -3
  133. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_type.rb +19 -9
  134. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +18 -15
  135. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/form.xhtml +18 -18
  136. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/index.xhtml +30 -24
  137. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-types/form.xhtml +15 -10
  138. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-types/index.xhtml +24 -19
  139. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/form.xhtml +18 -13
  140. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/index.xhtml +30 -20
  141. data/lib/zen/package/extensions/lib/extensions.rb +20 -0
  142. data/lib/zen/package/extensions/lib/extensions/controller/extensions.rb +41 -0
  143. data/lib/zen/package/extensions/lib/extensions/language/en/extensions.rb +23 -0
  144. data/lib/zen/package/extensions/lib/extensions/language/nl/extensions.rb +25 -0
  145. data/lib/zen/package/extensions/lib/extensions/view/admin/extensions/index.xhtml +86 -0
  146. data/lib/zen/package/menu.rb +109 -0
  147. data/lib/zen/package/menus/lib/menus.rb +25 -34
  148. data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +143 -107
  149. data/lib/zen/package/menus/lib/menus/controller/menus.rb +166 -115
  150. data/lib/zen/package/menus/lib/menus/helper/menu.rb +2 -8
  151. data/lib/zen/package/menus/lib/menus/helper/menu_frontend.rb +114 -0
  152. data/lib/zen/package/menus/lib/menus/language/en/menu_items.rb +48 -0
  153. data/lib/zen/package/menus/lib/menus/language/en/menus.rb +48 -0
  154. data/lib/zen/package/menus/lib/menus/language/nl/menu_items.rb +48 -0
  155. data/lib/zen/package/menus/lib/menus/language/nl/menus.rb +50 -0
  156. data/lib/zen/package/menus/lib/menus/model/menu.rb +24 -17
  157. data/lib/zen/package/menus/lib/menus/model/menu_item.rb +37 -13
  158. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/form.xhtml +32 -25
  159. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/index.xhtml +23 -17
  160. data/lib/zen/package/menus/lib/menus/view/admin/menus/form.xhtml +31 -26
  161. data/lib/zen/package/menus/lib/menus/view/admin/menus/index.xhtml +20 -22
  162. data/lib/zen/package/sections/lib/sections.rb +25 -68
  163. data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +178 -138
  164. data/lib/zen/package/sections/lib/sections/controller/sections.rb +173 -140
  165. data/lib/zen/package/sections/lib/sections/helper/section.rb +3 -6
  166. data/lib/zen/package/sections/lib/sections/helper/section_frontend.rb +146 -0
  167. data/lib/zen/package/sections/lib/sections/language/en/section_entries.rb +50 -0
  168. data/lib/zen/package/sections/lib/sections/language/en/sections.rb +55 -0
  169. data/lib/zen/package/sections/lib/sections/language/nl/section_entries.rb +50 -0
  170. data/lib/zen/package/sections/lib/sections/language/nl/sections.rb +55 -0
  171. data/lib/zen/package/sections/lib/sections/model/section.rb +36 -36
  172. data/lib/zen/package/sections/lib/sections/model/section_entry.rb +52 -59
  173. data/lib/zen/package/sections/lib/sections/model/section_entry_status.rb +2 -2
  174. data/lib/zen/package/sections/lib/sections/view/admin/form.xhtml +24 -21
  175. data/lib/zen/package/sections/lib/sections/view/admin/index.xhtml +24 -26
  176. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/form.xhtml +33 -31
  177. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +24 -25
  178. data/lib/zen/package/sections/migrations/1308672298_use_id_for_default_section.rb +14 -10
  179. data/lib/zen/package/sections/migrations/1308813320_section_entry_statuses.rb +12 -6
  180. data/lib/zen/package/settings/lib/settings.rb +25 -120
  181. data/lib/zen/package/settings/lib/settings/blue_form_parameters.rb +157 -0
  182. data/lib/zen/package/settings/lib/settings/controller/settings.rb +94 -69
  183. data/lib/zen/package/settings/lib/settings/language/en/settings.rb +41 -0
  184. data/lib/zen/package/settings/lib/settings/language/nl/settings.rb +41 -0
  185. data/lib/zen/package/settings/lib/settings/model/setting.rb +0 -2
  186. data/lib/zen/package/settings/lib/settings/setting.rb +379 -0
  187. data/lib/zen/package/settings/lib/settings/setting_groups.rb +11 -0
  188. data/lib/zen/package/settings/lib/settings/settings.rb +83 -0
  189. data/lib/zen/package/settings/lib/settings/settings_group.rb +84 -0
  190. data/lib/zen/package/settings/lib/settings/singleton_methods.rb +35 -0
  191. data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +15 -57
  192. data/lib/zen/package/settings/migrations/1321197919_remove_unused_columns.rb +17 -0
  193. data/lib/zen/package/users/lib/users.rb +51 -36
  194. data/lib/zen/package/users/lib/users/controller/user_groups.rb +133 -98
  195. data/lib/zen/package/users/lib/users/controller/users.rb +253 -136
  196. data/lib/zen/package/users/lib/users/helper/access.rb +102 -0
  197. data/lib/zen/package/users/lib/users/helper/acl.rb +113 -0
  198. data/lib/zen/package/users/lib/users/helper/users.rb +41 -24
  199. data/lib/zen/package/users/lib/users/language/en/permissions.rb +16 -0
  200. data/lib/zen/package/users/lib/users/language/en/user_groups.rb +39 -0
  201. data/lib/zen/package/users/lib/users/language/en/users.rb +73 -0
  202. data/lib/zen/package/users/lib/users/language/nl/permissions.rb +16 -0
  203. data/lib/zen/package/users/lib/users/language/nl/user_groups.rb +41 -0
  204. data/lib/zen/package/users/lib/users/language/nl/users.rb +74 -0
  205. data/lib/zen/package/users/lib/users/model/permission.rb +28 -0
  206. data/lib/zen/package/users/lib/users/model/user.rb +104 -65
  207. data/lib/zen/package/users/lib/users/model/user_group.rb +28 -24
  208. data/lib/zen/package/users/lib/users/model/user_status.rb +27 -0
  209. data/lib/zen/package/users/lib/users/public/admin/css/users/permissions.css +22 -0
  210. data/lib/zen/package/users/lib/users/public/admin/js/users/permissions.js +33 -0
  211. data/lib/zen/package/users/lib/users/settings.rb +19 -0
  212. data/lib/zen/package/users/lib/users/view/admin/user-groups/form.xhtml +58 -28
  213. data/lib/zen/package/users/lib/users/view/admin/user-groups/index.xhtml +19 -15
  214. data/lib/zen/package/users/lib/users/view/admin/users/form.xhtml +93 -62
  215. data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +23 -36
  216. data/lib/zen/package/users/lib/users/view/admin/users/login.xhtml +13 -6
  217. data/lib/zen/package/users/lib/users/view/admin/users/permissions.xhtml +33 -0
  218. data/lib/zen/package/users/lib/users/view/admin/users/register.xhtml +52 -0
  219. data/lib/zen/package/users/migrations/1313786058_update_default_date.rb +41 -0
  220. data/lib/zen/package/users/migrations/1316432327_permissions.rb +36 -0
  221. data/lib/zen/package/users/migrations/1320272365_status_ids.rb +67 -0
  222. data/lib/zen/public/admin/css/zen/buttons.css +3 -11
  223. data/lib/zen/public/admin/css/zen/datepicker.css +23 -13
  224. data/lib/zen/public/admin/css/zen/editor.css +6 -14
  225. data/lib/zen/public/admin/css/zen/forms.css +19 -12
  226. data/lib/zen/public/admin/css/zen/general.css +22 -18
  227. data/lib/zen/public/admin/css/zen/grid.css +1 -20
  228. data/lib/zen/public/admin/css/zen/layout.css +26 -11
  229. data/lib/zen/public/admin/css/zen/messages.css +3 -10
  230. data/lib/zen/public/admin/css/zen/reset.css +13 -15
  231. data/lib/zen/public/admin/css/zen/tables.css +8 -10
  232. data/lib/zen/public/admin/css/zen/tabs.css +2 -10
  233. data/lib/zen/public/admin/css/zen/window.css +2 -8
  234. data/lib/zen/public/admin/js/vendor/datepicker.js +540 -240
  235. data/lib/zen/public/admin/js/vendor/mootools/core.js +273 -283
  236. data/lib/zen/public/admin/js/vendor/mootools/more.js +131 -136
  237. data/lib/zen/public/admin/js/zen/index.js +8 -14
  238. data/lib/zen/public/admin/js/zen/lib/editor.js +36 -33
  239. data/lib/zen/public/admin/js/zen/lib/editor/markdown.js +0 -6
  240. data/lib/zen/public/admin/js/zen/lib/editor/textile.js +0 -6
  241. data/lib/zen/public/admin/js/zen/lib/html_table.js +0 -5
  242. data/lib/zen/public/admin/js/zen/lib/tabs.js +22 -79
  243. data/lib/zen/public/admin/js/zen/lib/window.js +12 -22
  244. data/lib/zen/spec/bacon/color_output.rb +1 -1
  245. data/lib/zen/spec/helper.rb +6 -11
  246. data/lib/zen/spec/simplecov.rb +3 -3
  247. data/lib/zen/task.rb +0 -1
  248. data/lib/zen/task/build.rake +46 -26
  249. data/lib/zen/task/clean.rake +14 -7
  250. data/lib/zen/task/db.rake +31 -29
  251. data/lib/zen/task/package.rake +19 -23
  252. data/lib/zen/task/proto.rake +3 -5
  253. data/lib/zen/task/setup.rake +4 -0
  254. data/lib/zen/task/test.rake +31 -6
  255. data/lib/zen/task/theme.rake +13 -19
  256. data/lib/zen/theme.rb +377 -52
  257. data/lib/zen/validation.rb +22 -30
  258. data/lib/zen/version.rb +1 -2
  259. data/lib/zen/view/bottom.xhtml +9 -1
  260. data/lib/zen/view/head.xhtml +1 -1
  261. data/lib/zen/view/main.xhtml +1 -1
  262. data/lib/zen/view/search.xhtml +9 -0
  263. data/proto/app/Rakefile +0 -1
  264. data/proto/app/app.rb +21 -16
  265. data/proto/app/config/config.rb.erb +41 -0
  266. data/proto/app/config/{database.rb → database.rb.erb} +17 -14
  267. data/proto/app/config/middlewares.rb +1 -1
  268. data/proto/app/theme/default/index.xhtml +25 -0
  269. data/proto/app/theme/theme.rb +19 -0
  270. data/proto/app/{log/database/dev → tmp}/.gitkeep +0 -0
  271. data/proto/migration.rb +3 -5
  272. data/proto/rack/thin.yml +41 -0
  273. data/proto/rack/unicorn.rb +38 -0
  274. data/spec/Rakefile +15 -11
  275. data/spec/fixtures/zen/helper/controller.rb +13 -0
  276. data/spec/fixtures/zen/helper/locale.rb +7 -0
  277. data/spec/fixtures/zen/helper/message.rb +0 -4
  278. data/spec/fixtures/zen/language.rb +31 -0
  279. data/spec/fixtures/zen/language/en/spec.rb +11 -0
  280. data/spec/fixtures/zen/language/nl/spec.rb +11 -0
  281. data/spec/fixtures/zen/package.rb +0 -10
  282. data/spec/fixtures/zen/package/categories/helper/category_frontend.rb +16 -0
  283. data/spec/fixtures/zen/package/comments/helper/comment_frontend.rb +16 -0
  284. data/spec/fixtures/zen/package/sections/helper/section_frontend.rb +16 -0
  285. data/spec/fixtures/zen/package/settings/controller/settings.rb +17 -0
  286. data/spec/fixtures/zen/package/users/helper/access.rb +18 -0
  287. data/spec/fixtures/zen/package/users/helper/acl.rb +23 -0
  288. data/spec/fixtures/zen/theme/{default-section → default}/index.xhtml +0 -0
  289. data/spec/helper.rb +12 -27
  290. data/{proto/app/log/database/live → spec/public}/.gitkeep +0 -0
  291. data/spec/zen/controller/admin_controller.rb +5 -6
  292. data/spec/zen/controller/main_controller.rb +29 -35
  293. data/spec/zen/controller/preview.rb +9 -10
  294. data/spec/zen/event.rb +44 -0
  295. data/spec/zen/helper/breadcrumb.rb +4 -5
  296. data/spec/zen/helper/controller.rb +21 -0
  297. data/spec/zen/helper/locale.rb +25 -0
  298. data/spec/zen/helper/message.rb +4 -11
  299. data/spec/zen/helper/theme.rb +11 -14
  300. data/spec/zen/language.rb +48 -22
  301. data/spec/zen/markup.rb +39 -0
  302. data/spec/zen/package.rb +48 -11
  303. data/spec/zen/package/categories/controller/categories.rb +99 -45
  304. data/spec/zen/package/categories/controller/category_groups.rb +109 -33
  305. data/spec/zen/package/categories/helper/category.rb +19 -32
  306. data/spec/zen/package/categories/helper/category_frontend.rb +61 -0
  307. data/spec/zen/package/comments/anti_spam.rb +50 -0
  308. data/spec/zen/package/comments/controller/comments.rb +121 -61
  309. data/spec/zen/package/comments/controller/comments_form.rb +120 -94
  310. data/spec/zen/package/comments/helper/comment.rb +13 -13
  311. data/spec/zen/package/comments/helper/comment_frontend.rb +92 -0
  312. data/spec/zen/package/custom_fields/blue_form_parameters.rb +50 -50
  313. data/spec/zen/package/custom_fields/controller/custom_field_groups.rb +135 -43
  314. data/spec/zen/package/custom_fields/controller/custom_field_types.rb +153 -48
  315. data/spec/zen/package/custom_fields/controller/custom_fields.rb +130 -51
  316. data/spec/zen/package/custom_fields/helper/custom_field.rb +8 -8
  317. data/spec/zen/package/extensions/controller/extensions.rb +38 -0
  318. data/spec/zen/package/menus/controller/menu_items.rb +121 -42
  319. data/spec/zen/package/menus/controller/menus.rb +125 -38
  320. data/spec/zen/package/menus/helper/menu.rb +26 -26
  321. data/spec/zen/package/menus/helper/menu_frontend.rb +104 -0
  322. data/spec/zen/package/sections/controller/section_entries.rb +145 -89
  323. data/spec/zen/package/sections/controller/sections.rb +130 -35
  324. data/spec/zen/package/sections/helper/section.rb +27 -38
  325. data/spec/zen/package/sections/helper/section_frontend.rb +160 -0
  326. data/spec/zen/package/settings/controller/settings.rb +73 -8
  327. data/spec/zen/package/settings/settings.rb +119 -0
  328. data/spec/zen/package/users/controller/user_groups.rb +134 -34
  329. data/spec/zen/package/users/controller/users.rb +189 -44
  330. data/spec/zen/package/users/helper/access.rb +29 -0
  331. data/spec/zen/package/users/helper/acl.rb +46 -0
  332. data/spec/zen/package/users/helper/users.rb +20 -64
  333. data/spec/zen/theme.rb +7 -9
  334. data/spec/zen/validation.rb +1 -2
  335. data/zen.gemspec +25 -22
  336. metadata +303 -222
  337. data/lib/zen/asset.rb +0 -292
  338. data/lib/zen/bin/runner.rb +0 -118
  339. data/lib/zen/error/language_error.rb +0 -10
  340. data/lib/zen/error/package_error.rb +0 -10
  341. data/lib/zen/error/plugin_error.rb +0 -10
  342. data/lib/zen/error/theme_error.rb +0 -10
  343. data/lib/zen/error/validation_error.rb +0 -10
  344. data/lib/zen/helper/acl.rb +0 -182
  345. data/lib/zen/helper/blue_form_vendor.rb +0 -689
  346. data/lib/zen/language/en/zen_general.yml +0 -25
  347. data/lib/zen/language/en/zen_models.yml +0 -13
  348. data/lib/zen/language/nl/zen_general.yml +0 -25
  349. data/lib/zen/language/nl/zen_models.yml +0 -13
  350. data/lib/zen/model/settings.rb +0 -78
  351. data/lib/zen/package/base.rb +0 -62
  352. data/lib/zen/package/categories/lib/categories/language/en/categories.yml +0 -36
  353. data/lib/zen/package/categories/lib/categories/language/en/category_groups.yml +0 -34
  354. data/lib/zen/package/categories/lib/categories/language/nl/categories.yml +0 -40
  355. data/lib/zen/package/categories/lib/categories/language/nl/category_groups.yml +0 -34
  356. data/lib/zen/package/categories/lib/categories/plugin/categories.rb +0 -141
  357. data/lib/zen/package/comments/lib/comments/language/en/comments.yml +0 -48
  358. data/lib/zen/package/comments/lib/comments/language/nl/comments.yml +0 -50
  359. data/lib/zen/package/comments/lib/comments/plugin/anti_spam.rb +0 -156
  360. data/lib/zen/package/comments/lib/comments/plugin/comments.rb +0 -115
  361. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_groups.yml +0 -33
  362. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_types.yml +0 -40
  363. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.yml +0 -54
  364. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_groups.yml +0 -33
  365. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_types.yml +0 -40
  366. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_fields.yml +0 -54
  367. data/lib/zen/package/menus/lib/menus/language/en/menu_items.yml +0 -41
  368. data/lib/zen/package/menus/lib/menus/language/en/menus.yml +0 -40
  369. data/lib/zen/package/menus/lib/menus/language/nl/menu_items.yml +0 -41
  370. data/lib/zen/package/menus/lib/menus/language/nl/menus.yml +0 -40
  371. data/lib/zen/package/menus/lib/menus/plugin/menus.rb +0 -152
  372. data/lib/zen/package/sections/lib/sections/language/en/section_entries.yml +0 -44
  373. data/lib/zen/package/sections/lib/sections/language/en/sections.yml +0 -48
  374. data/lib/zen/package/sections/lib/sections/language/nl/section_entries.yml +0 -44
  375. data/lib/zen/package/sections/lib/sections/language/nl/sections.yml +0 -48
  376. data/lib/zen/package/sections/lib/sections/plugin/section_entries.rb +0 -244
  377. data/lib/zen/package/sections/lib/sections/plugin/sections.rb +0 -87
  378. data/lib/zen/package/settings/lib/settings/language/en/settings.yml +0 -36
  379. data/lib/zen/package/settings/lib/settings/language/nl/settings.yml +0 -37
  380. data/lib/zen/package/settings/lib/settings/plugin/group_base.rb +0 -39
  381. data/lib/zen/package/settings/lib/settings/plugin/setting_base.rb +0 -133
  382. data/lib/zen/package/settings/lib/settings/plugin/settings.rb +0 -251
  383. data/lib/zen/package/users/lib/users/controller/access_rules.rb +0 -284
  384. data/lib/zen/package/users/lib/users/language/en/access_rules.yml +0 -38
  385. data/lib/zen/package/users/lib/users/language/en/user_groups.yml +0 -32
  386. data/lib/zen/package/users/lib/users/language/en/users.yml +0 -57
  387. data/lib/zen/package/users/lib/users/language/nl/access_rules.yml +0 -38
  388. data/lib/zen/package/users/lib/users/language/nl/user_groups.yml +0 -32
  389. data/lib/zen/package/users/lib/users/language/nl/users.yml +0 -57
  390. data/lib/zen/package/users/lib/users/model/access_rule.rb +0 -42
  391. data/lib/zen/package/users/lib/users/public/admin/js/users/access_rules.js +0 -65
  392. data/lib/zen/package/users/lib/users/public/admin/js/users/lib/access_rules.js +0 -49
  393. data/lib/zen/package/users/lib/users/view/admin/access-rules/form.xhtml +0 -120
  394. data/lib/zen/package/users/lib/users/view/admin/access-rules/index.xhtml +0 -102
  395. data/lib/zen/plugin.rb +0 -182
  396. data/lib/zen/plugin/base.rb +0 -46
  397. data/lib/zen/plugin/helper.rb +0 -47
  398. data/lib/zen/plugin/markup/lib/markup.rb +0 -14
  399. data/lib/zen/plugin/markup/lib/markup/language/en/markup.yml +0 -6
  400. data/lib/zen/plugin/markup/lib/markup/markup.rb +0 -165
  401. data/lib/zen/public/admin/js/zen/lib/asset.js +0 -111
  402. data/lib/zen/task/plugin.rake +0 -18
  403. data/lib/zen/theme/base.rb +0 -65
  404. data/proto/app/config/config.rb +0 -18
  405. data/spec/fixtures/zen/language/en/spec.yml +0 -10
  406. data/spec/fixtures/zen/language/nl/spec.yml +0 -7
  407. data/spec/fixtures/zen/package/settings/plugin/settings.rb +0 -20
  408. data/spec/zen/asset.rb +0 -97
  409. data/spec/zen/bin/create.rb +0 -89
  410. data/spec/zen/bin/runner.rb +0 -47
  411. data/spec/zen/helper/acl.rb +0 -149
  412. data/spec/zen/package/categories/plugin/categories.rb +0 -92
  413. data/spec/zen/package/comments/plugin/anti_spam.rb +0 -59
  414. data/spec/zen/package/comments/plugin/comments.rb +0 -107
  415. data/spec/zen/package/menus/plugin/menus.rb +0 -120
  416. data/spec/zen/package/sections/plugin/section_entries.rb +0 -161
  417. data/spec/zen/package/sections/plugin/sections.rb +0 -75
  418. data/spec/zen/package/settings/plugin/settings.rb +0 -33
  419. data/spec/zen/package/users/controller/access_rules.rb +0 -90
  420. data/spec/zen/plugin.rb +0 -64
  421. data/spec/zen/plugin/helper.rb +0 -11
  422. data/spec/zen/plugin/markup.rb +0 -44
@@ -0,0 +1,65 @@
1
+ module Zen
2
+ module Model
3
+ ##
4
+ # Zen::Model::Helper is a helper module that contains a few methods for
5
+ # Sequel models. Using this helper can be done by simply including it into
6
+ # your model:
7
+ #
8
+ # class MyModel < Sequel::Model
9
+ # include Zen::Model::Helper
10
+ # end
11
+ #
12
+ # See the individual methods in this module for more information.
13
+ #
14
+ # @since 16-10-2011
15
+ #
16
+ module Helper
17
+ # Array containing the database adapters that don't support regular
18
+ # expressions.
19
+ NoRegexpSupport = [:sqlite]
20
+
21
+ ##
22
+ # Extends the including class with the methods in the {ClassMethods}
23
+ # module.
24
+ #
25
+ # @since 16-10-2011
26
+ #
27
+ def self.included(into)
28
+ into.extend(ClassMethods)
29
+ end
30
+
31
+ # The methods in this module will be added as class methods to the
32
+ # including class.
33
+ module ClassMethods
34
+ ##
35
+ # Given a column name and a value this method will determine whether a
36
+ # regular expression should be used or a simple LIKE statement. If the
37
+ # DBMS supports the use of regular expressions those will be used,
38
+ # otherwise a LIKE in the format of "%VALUE%" is used.
39
+ #
40
+ # The return value of this method is either a ``Hash`` containing the
41
+ # column and the regular expression or an instance of
42
+ # ``Sequel::SQL::BooleanExpression``.
43
+ #
44
+ # @example Using a DBMS that supports the use of a regex
45
+ # search_column(:name, 'ruby \d+') # => {:name => /ruby \d+/i}
46
+ #
47
+ # @example Using a DBMS that does not support the use of a regex
48
+ # search_column(:name, 'ruby \d+') # => #<Sequel::SQL::BooleanExpression ....>
49
+ #
50
+ # @since 16-10-2011
51
+ # @param [Symbol] column The column to use in the statement.
52
+ # @param [String] value The value for the statement.
53
+ # @return [Hash|Sequel::SQL::BooleanExpression]
54
+ #
55
+ def search_column(column, value)
56
+ if NoRegexpSupport.include?(Zen.database.adapter_scheme)
57
+ return column.like("%#{value}%")
58
+ else
59
+ return {column => /#{value}/i}
60
+ end
61
+ end
62
+ end # ClassMethods
63
+ end # Helper
64
+ end # Model
65
+ end # Zen
@@ -0,0 +1,62 @@
1
+ Zen::Language.load('zen_models')
2
+
3
+ Sequel::Model.plugin(:validation_helpers)
4
+ Sequel::Model.plugin(:association_pks)
5
+
6
+ Sequel.extension(:migration)
7
+ Sequel.extension(:pagination)
8
+ Sequel.extension(:inflector)
9
+
10
+ Sequel::Plugins::ValidationHelpers::DEFAULT_OPTIONS.merge!(
11
+ {
12
+ :exact_length => {
13
+ :message => lambda { |length| lang('zen_models.exact_length') & length }
14
+ },
15
+
16
+ :format => {
17
+ :message => lang('zen_models.format')
18
+ },
19
+
20
+ :includes => {
21
+ :message => lambda { |arg| lang('zen_models.includes') % arg.inspect },
22
+ :allow_nil => false
23
+ },
24
+
25
+ :integer => {
26
+ :message => lang('zen_models.integer'),
27
+ :allow_nil => true
28
+ },
29
+
30
+ :length_range => {
31
+ :message => lang('zen_models.length_range')
32
+ },
33
+
34
+ :max_length => {
35
+ :message => lambda { |length| lang('zen_models.max_length') % length },
36
+ :allow_nil => true
37
+ },
38
+
39
+ :min_length => {
40
+ :message => lambda { |length| lang('zen_models.min_length') % length }
41
+ },
42
+
43
+ :not_string => {
44
+ :message => lang('zen_models.not_string')
45
+ },
46
+
47
+ :numeric => {
48
+ :message => lang('zen_models.numeric')
49
+ },
50
+
51
+ :type => {
52
+ :message => lambda { |type| lang('zen_models.type') % type }
53
+ },
54
+
55
+ :presence => {
56
+ :message => lang('zen_models.presence')
57
+ },
58
+
59
+ :unique => {
60
+ :message => lang('zen_models.unique')
61
+ }
62
+ })
@@ -3,25 +3,24 @@ module Sequel
3
3
  #:nodoc:
4
4
  class Model
5
5
  ##
6
- # Retrieves all primary values and an optional column and returns the
7
- # results as an array of hashes in which the keys of these hashes are the
8
- # IDs and the values the values of the specified column. This array can be
6
+ # Retrieves all primary values and an optional column and returns the
7
+ # results as an array of hashes in which the keys of these hashes are the
8
+ # IDs and the values the values of the specified column. This array can be
9
9
  # used when creating <select> elements using the BlueForm helper.
10
10
  #
11
11
  # @example
12
12
  # Sections::Model::Section.pk_hash(:name) # => {1 => 'Blog', 2 => 'General'}
13
13
  #
14
- # @author Yorick Peterse
15
14
  # @param [Symbol] column The name of the optional column to select.
16
15
  # @return [Hash]
17
16
  #
18
- def self.pk_hash column
17
+ def self.pk_hash(column)
19
18
  hash = {}
20
-
19
+
21
20
  self.select(:id, column.to_sym).each do |row|
22
21
  hash[row.id] = row.send(column)
23
22
  end
24
-
23
+
25
24
  return hash
26
25
  end
27
26
  end # Model
data/lib/zen/package.rb CHANGED
@@ -1,280 +1,391 @@
1
1
  require 'ramaze/gestalt'
2
- require __DIR__('error/package_error')
3
- require __DIR__('package/base')
2
+ require __DIR__('package/menu')
4
3
 
5
- #:nodoc:
6
4
  module Zen
7
5
  ##
8
- # Module used for registering extensions and themes, setting their details and
9
- # the whole shebang. Packages follow the same directory structure as Rubygems
10
- # and can actually be installed using either Rubygems or by storing them in a
11
- # custom directory. As long as you require the correct file you're good to go.
6
+ # Zen::Package allows developers to register so called "packages". Packages
7
+ # are collections of controllers, models, views and pretty much anything else
8
+ # that goes in a typical Ramaze application. In fact, you can actually
9
+ # distribute entire Ramaze applications as a package (though it would most
10
+ # likely require some modifications).
12
11
  #
13
- # Packages are added or "described" using a simple block and the add() method
14
- # as following:
12
+ # A package is registered by calling ``Zen::Package.add`` and passing a block
13
+ # to it. This block will be yielded on a new instance of ``Zen::Package``:
14
+ #
15
+ # Zen::Package.add do |p|
15
16
  #
16
- # Zen::Package.add do |ext|
17
- # # ....
18
17
  # end
19
18
  #
20
- # When using this block you're required to set the following attributes:
19
+ # When adding a package you must **always** set the following attributes:
21
20
  #
22
- # * name: the name of the package in lowercased letters and/or numbers.
23
- # * author: the name of the person who made the package.
24
- # * about: a small description of the package.
25
- # * url: the URL to the package's website.
26
- # * directory: the root directory of the package, set this using __DIR__('path').
21
+ # * name: the name of the package, should be a symbol
22
+ # * title: the title of the package. This should be a language key such as
23
+ # "users.titles.index" as this allows users to view the package name in
24
+ # their chosen language.
25
+ # * author: the name of the package's author.
26
+ # * about: a description of the package, just like the title attribute this
27
+ # should be a language key, "users.description" is an example of such a key.
28
+ # * root: the root directory of the package, this path should point to the
29
+ # directory containing your ``helper/`` and ``language/`` directories as
30
+ # well as any ``public/`` directories.
27
31
  #
28
- # Optionally you can also specify the attribute "menu" (more on that later).
32
+ # Setting these (and other) attributes is very easy:
29
33
  #
30
- # ## ACL
34
+ # Zen::Package.add do |p|
35
+ # p.name = :some_package
36
+ # p.title = 'some_package.titles.index'
37
+ # p.author = 'John Doe'
38
+ # p.root = __DIR__('some_package')
39
+ # end
31
40
  #
32
- # Packages allow developers to register controllers for the ACL system that
33
- # ships with Zen. Doing this means a user can set controller specific rules
34
- # in the backend without having to write any code. In order to register a set
35
- # of controllers you'll need to set the "controllers" attribute in the package
36
- # block to a hash. The keys of this hash should be a human readable name of
37
- # the controller and the values the full namespace of the controller as either
38
- # a string or a constants:
41
+ # Besides the required attributes listed above you can also set the following
42
+ # ones:
39
43
  #
40
- # Zen::Package.add do |pkg|
41
- # pkg.controllers = {
42
- # 'Test Controller' => Test::Controller::TestController
43
- # }
44
- # end
44
+ # * url: a URL that points to the website of the package.
45
+ # * migrations: a directory containing all Sequel migrations.
45
46
  #
46
- # ## Menu Items
47
+ # ## Package Structure
47
48
  #
48
- # The package system easily allows modules to add navigation/sub-navigation
49
- # elements to the backend menu. Each extension can have an attribute named
50
- # "menu", this attribute is an array of hashes. Each hash must have the
51
- # following 2 keys (they're symbols):
49
+ # Packages should have the same structure as generic Rubygems. In it's most
50
+ # basic form this means you'll end up with a structure that looks like the
51
+ # following:
52
52
  #
53
- # * title: the value used for both the title tag and the text of the anchor
54
- # element
55
- # * url: the URI the navigation item will point to. Leading slash isn't
56
- # required
53
+ # root/
54
+ # |
55
+ # |__ lib/
56
+ # |__ package.rb
57
+ # |__ package/
58
+ # |__ controller/
59
+ # |__ helper/
57
60
  #
58
- # Optionally you can specify child elements using the "children" key. This key
59
- # will again contain an array of hashes just like regular navigation elements.
60
- # For example, one could do the following:
61
+ # There's no requirement for the location of your migrations but it's
62
+ # recommended to place it in the same directory as the ``lib/`` directory as
63
+ # this is the convention followed by Zen itself.
61
64
  #
62
- # ext.menu = [{:title => "Dashboard", :url => "admin/dashboard"}]
65
+ # The advantage of this structure is that when a package is shipped via
66
+ # Rubygems it can be loaded in exactly the same way as a normal gem. Say the
67
+ # "some_package" example described earlier would be distributed via Rubygems,
68
+ # all a developer would have to do to load the package is the following:
63
69
  #
64
- # Adding a number of child elements isn't very difficult either:
70
+ # require 'some_package'
65
71
  #
66
- # ext.menu = [{
67
- # :title => "Dashboard", :url => "admin/dashboard",
68
- # :children => [{:title => "Child", :url => "admin/dashboard/child"}]
69
- # }]
72
+ # It's not recommended to place packages or gems in the ``Zen`` namespace
73
+ # unless they modify or add core features such as more validation methods for
74
+ # ``Zen::Validation``.
70
75
  #
71
- # Once a certain number of navigation elements have been added you can
72
- # generate the HTML for a fully fledged navigation menu using the
73
- # build_menu() method. This method uses Gestalt to build the HTML and also
74
- # takes care of permissions for each user/module.
76
+ # ## Menu Management
75
77
  #
76
- # ## Migrations
78
+ # Menus can be added by calling the method ``menu()`` on the object passed to
79
+ # the block. This method takes a URL, a title/label and a hash of options.
80
+ # Note that just like the ``name`` attribute the title/label should be a
81
+ # language key.
82
+ #
83
+ # Zen::Package.add do |p|
84
+ # p.menu('some_package.titles.index', '/admin/some-packages')
85
+ # end
77
86
  #
78
- # If your package uses it's own database tables it's best to use migrations as
79
- # these make it very easy to install/uninstall the extension. Migrations
80
- # should be put in the root directory of your extension. For example, if your
81
- # extension is in "foobar" the migrations should be located in
82
- # "foobar/migrations", the lib directory in "foobar/lib", etc.
87
+ # For more information see ``Zen::Package#menu()`` and ``Zen::Package::Menu``.
83
88
  #
84
- # Migrations can be executed using the Thor task "package:migrate" or
85
- # "db:migrate", the latter will install all packages while the first one will
86
- # only install the specified packages. For more information on these tasks
87
- # execute the following command:
89
+ # ## Permissions
90
+ #
91
+ # When creating a package you can add a number of permissions. These
92
+ # permissions can be assigned to a user or user group in the admin interface.
93
+ # Permissions allow you to restrict access to certain actions to specific
94
+ # users/user groups. A permission can be added by calling ``permission()`` on
95
+ # the object passed to the block. Again the title of the permission should be
96
+ # a langauge key so it can be displayed in a custom language:
97
+ #
98
+ # Zen::Package.add do |p|
99
+ # p.permission(:show_some_package, 'packages.titles.index')
100
+ # end
101
+ #
102
+ # For more information on how to specify permission requirements in your
103
+ # controllers see ``Ramaze::Helper::ACL``.
104
+ #
105
+ # ## Migrations
88
106
  #
89
- # $ rake -T
107
+ # Zen comes with two tasks that allow users and developers to update their
108
+ # database, ``rake db:migrate`` and ``rake package:migrate``. For these tasks
109
+ # to work there of course have to be migrations. When registering a package
110
+ # you can set the ``migrations`` attribute. This attribute should contain a
111
+ # path to a directory containing a group of timestamp based migrations such as
112
+ # "1316770622_hello_world.rb".
90
113
  #
91
- # @author Yorick Peterse
92
114
  # @since 0.1
93
115
  #
94
- module Package
95
- ##
96
- # Hash containing all the registered packages. The keys of this hash are the
116
+ class Package
117
+ include Zen::Validation
118
+
119
+ # Hash containing all the registered packages. The keys of this hash are the
97
120
  # names of all packages and the values the instances of Zen::Package::Base.
98
- #
99
- # @author Yorick Peterse
100
- # @since 0.2.5
101
- #
102
- Registered = {}
121
+ REGISTERED = {}
103
122
 
104
- ##
105
- # Array containing all controllers of all packages.
106
- #
107
- # @author Yorick Peterse
108
- # @since 0.2.5
109
- #
110
- Controllers = []
123
+ # The name of the package.
124
+ attr_reader :name
111
125
 
112
- ##
113
- # Adds a new package along with all it's details such as the name, author,
114
- # version and so on. Extensions can be added using a simple block as
115
- # following:
116
- #
117
- # Zen::Package.add do |ext|
118
- # ext.name = "name"
119
- # ext.author = "Author"
120
- # end
121
- #
122
- # When adding a new extension the following setters are required:
123
- #
124
- # * name
125
- # * author
126
- # * version
127
- # * about
128
- # * url
129
- # * directory
130
- #
131
- # You can also set "migration_dir" to a directory with all migrations. By
132
- # default Zen will assume that it's 2 levels above your root directory.
133
- #
134
- # @author Yorick Peterse
135
- # @since 0.1
136
- # @yield [package] Object containing all setters and getters for each
137
- # package.
138
- #
139
- def self.add
140
- package = Zen::Package::Base.new
126
+ # The author of the package.
127
+ attr_accessor :author
128
+
129
+ # The URL of the package.
130
+ attr_accessor :url
141
131
 
142
- yield package
132
+ # The root directory of the package.
133
+ attr_reader :root
143
134
 
144
- # Validate the package
145
- package.validate
146
- package.name = package.name.to_sym
135
+ # The directory to all migrations.
136
+ attr_accessor :migrations
147
137
 
148
- # Update the root but prevent duplicates
149
- if !Ramaze.options.roots.include?(package.directory)
150
- Ramaze.options.roots.push(package.directory)
138
+ class << self
139
+ ##
140
+ # Adds a new package along with all it's details such as the name, author,
141
+ # version and so on. Extensions can be added using a simple block as
142
+ # following:
143
+ #
144
+ # Zen::Package.add do |ext|
145
+ # extrans.name = "name"
146
+ # ext.author = "Author"
147
+ # end
148
+ #
149
+ # @since 0.1
150
+ #
151
+ def add
152
+ package = self.new
153
+
154
+ yield(package)
155
+ package.validate
156
+
157
+ REGISTERED[package.name] = package
151
158
  end
152
159
 
153
- # Update the language directory
154
- if !Zen::Language.options.paths.include?(package.directory)
155
- Zen::Language.options.paths.push(package.directory)
160
+ ##
161
+ # Retrieves the package for the given name.
162
+ #
163
+ # @example
164
+ # Zen::Package[:users]
165
+ #
166
+ # @since 0.1
167
+ #
168
+ def [](name)
169
+ name = name.to_sym
170
+
171
+ if REGISTERED.empty?
172
+ raise(PackageError, "No packages have been added yet.")
173
+ end
174
+
175
+ if !REGISTERED.key?(name)
176
+ raise(PackageError, "The package \"#{name}\" doesn't exist.")
177
+ end
178
+
179
+ return REGISTERED[name]
156
180
  end
157
181
 
158
- package.controllers.each do |name, controller|
159
- controller = controller.to_s
182
+ ##
183
+ # Builds the entire navigation menu for all packages.
184
+ #
185
+ # @example
186
+ # Zen::Package.build_menu('left', [:edit_user, :show_user, :show_setting])
187
+ #
188
+ # @since 0.3
189
+ # @param [String] html_class An HTML class to apply to the <ul> element.
190
+ # @param [Array] permissions An array of permissions for the current
191
+ # user.
192
+ # @return [String]
193
+ #
194
+ def build_menu(html_class = 'navigation', permissions = [])
195
+ g = Ramaze::Gestalt.new
196
+
197
+ g.ul(:class => html_class) do
198
+ # Sort the hash
199
+ keys = REGISTERED.keys.sort
160
200
 
161
- if !Controllers.include?(controller)
162
- Controllers.push(controller)
201
+ keys.each do |key|
202
+ unless REGISTERED[key].menu.nil?
203
+ g.out << REGISTERED[key].menu.html(permissions)
204
+ end
205
+ end
163
206
  end
207
+
208
+ return g.to_s
164
209
  end
210
+ end # class << self
165
211
 
166
- Registered[package.name.to_sym] = package
212
+ ##
213
+ # Sets the name of the package. The name of a package should be a short and
214
+ # unique name. A human readable version can be set using title=().
215
+ #
216
+ # @since 0.3
217
+ # @param [#to_sym] name The name of the package.
218
+ #
219
+ def name=(name)
220
+ @name = name.to_sym
167
221
  end
168
222
 
169
223
  ##
170
- # Retrieves the package for the given name.
224
+ # Sets the title of the package.
171
225
  #
172
- # @author Yorick Peterse
173
- # @since 0.1
226
+ # @since 0.3
227
+ # @param [String] title The title or language key of the package.
174
228
  #
175
- def self.[](name)
176
- name = name.to_sym
229
+ def title=(title)
230
+ @title = title
231
+ end
177
232
 
178
- if Registered.empty?
179
- raise(PackageError, "No packages have been added yet.")
233
+ ##
234
+ # Returns the title of the package. This method will try to translate it and
235
+ # fall back to the original value in case the language key doesn't exist.
236
+ #
237
+ # @since 0.3
238
+ # @return [String]
239
+ #
240
+ def title
241
+ begin
242
+ return lang(@title)
243
+ rescue
244
+ return @title
180
245
  end
246
+ end
181
247
 
182
- if !Registered.key?(name)
183
- raise(PackageError, "The package \"#{name}\" doesn't exist.")
248
+ ##
249
+ # Returns the title as either an ``<a>`` tag or plain text depending on
250
+ # whether or not the package has a URL set.
251
+ #
252
+ # @since 19-11-2011
253
+ # @return [String]
254
+ #
255
+ def formatted_title
256
+ if url
257
+ return '<a href="%s" title="%s">%s</a>' % [url, title, title]
258
+ else
259
+ return title
184
260
  end
261
+ end
185
262
 
186
- return Registered[name]
263
+ ##
264
+ # Sets the description of the package.
265
+ #
266
+ # @since 0.3
267
+ # @param [String] about The description of the package.
268
+ #
269
+ def about=(about)
270
+ @about = about
187
271
  end
188
272
 
189
273
  ##
190
- # Builds a navigation menu for all installed extensions.
191
- # Extensions can have an infinite amount of sub-navigation
192
- # items. This method will generate an unordered list of items
193
- # of which each list item can contain N sub items.
274
+ # Tries to translate the description and returns it.
194
275
  #
195
- # @author Yorick Peterse
196
- # @param [String] html_class A string of CSS classes to apply to the main UL
197
- # element.
198
- # @param [Hash] permissions Hash containing the permissions as returned by
199
- # Ramaze::Helper::ACL.extension_permissions
200
- # @since 0.1
276
+ # @since 0.3
277
+ # @return [String]
201
278
  #
202
- def self.build_menu(html_class = '', permissions = {})
203
- @g = Ramaze::Gestalt.new
204
- @permissions = permissions
205
- menu_items = []
206
-
207
- Registered.each do |name, pkg|
208
- # Got a menu for us?
209
- if !pkg.menu.nil?
210
- pkg.menu.each do |m|
211
- menu_items.push(m)
212
- end
213
- end
279
+ def about
280
+ begin
281
+ return lang(@about)
282
+ rescue
283
+ return @about
214
284
  end
285
+ end
286
+
287
+ ##
288
+ # Sets the root directory of the package.
289
+ #
290
+ # @since 0.3
291
+ # @param [String] root The path to the root directory.
292
+ #
293
+ def root=(root)
294
+ @root = root
295
+ lang_dir = File.join(@root, 'language')
215
296
 
216
- # Sort the menu alphabetical
217
- menu_items = menu_items.sort_by do |item|
218
- item[:title]
297
+ if !Ramaze.options.roots.include?(@root)
298
+ Ramaze.options.roots << @root
219
299
  end
220
300
 
221
- @g.ul :class => html_class do
222
- if !menu_items.empty?
223
- menu_items.each do |m|
224
- self.nav_list(m)
225
- end
226
- end
301
+ if !Zen::Language.options.paths.include?(@root) \
302
+ and File.directory?(lang_dir)
303
+ Zen::Language.options.paths << lang_dir
227
304
  end
228
305
 
229
- return @g.to_s
306
+ if !Ramaze::HelpersHelper.options.paths.push.include?(@root)
307
+ Ramaze::HelpersHelper.options.paths << @root
308
+ end
230
309
  end
231
310
 
232
- private
233
-
234
311
  ##
235
- # Method that's used to generate the list items for each
236
- # navigation menu along with all sub elements.
312
+ # Sets all the navigation items for the package. Sub items can be specified
313
+ # by calling this method and passing a block to it.
237
314
  #
238
- # @author Yorick Peterse
239
- # @param [Hash] menu Hash containing the navigation items (url, title, etc)
240
- # @since 0.1
315
+ # @example
316
+ # Zen::Package.add do |p|
317
+ # p.menu('Hello,' ,'/admin/hello') do |sub|
318
+ # sub.menu('Sub menu', '/admin/hello/sub')
319
+ # end
320
+ # end
241
321
  #
242
- def self.nav_list(menu)
243
- if menu[:url][0, 1] != '/'
244
- menu[:url] = '/' + menu[:url]
322
+ # @since 0.3
323
+ # @see Zen::Package::Menu#initialize()
324
+ # @return [Zen::Package::Menu] The current navigation menu if no new one is
325
+ # specified.
326
+ #
327
+ def menu(title = nil, url = nil, options = {}, &block)
328
+ if title.nil? and url.nil? and !block_given?
329
+ return @menu
245
330
  end
246
331
 
247
- # Get the controller for the current item
248
- controller = Ramaze::AppMap.at('/').url_map.at(menu[:url]).to_s
332
+ @menu = Zen::Package::Menu.new(title, url, options, &block)
333
+ end
334
+
335
+ ##
336
+ # Adds a new permission along with it's title or language key.
337
+ #
338
+ # @example
339
+ # Zen::Package.add do |p|
340
+ # p.permission :show_user, 'users.titles.index'
341
+ # p.permission :edit_user, 'users.titles.edit'
342
+ # end
343
+ #
344
+ # @since 0.3
345
+ # @param [#to_sym] permission The name of the permission.
346
+ # @param [String] title The title or language key of the permission, shown
347
+ # in the admin interface.
348
+ #
349
+ def permission(permission, title)
350
+ @permissions ||= {}
351
+ @permissions[permission.to_sym] = title
352
+ end
249
353
 
250
- if @permissions[controller].nil?
251
- read_access = false
252
- else
253
- read_access = @permissions[controller].include?(:read)
254
- end
354
+ ##
355
+ # Returns the permissions for the current package. This method will
356
+ # automatically try to translate the titles using the current language.
357
+ #
358
+ # @since 0.3
359
+ # @return [Hash]
360
+ #
361
+ def permissions
362
+ perms = {}
255
363
 
256
- # Ignore the menu item alltogether
257
- if !read_access and !menu.key?(:children)
258
- return
364
+ @permissions.each do |perm, title|
365
+ begin
366
+ perms[perm] = lang(title)
367
+ rescue
368
+ perms[perm] = title
369
+ end
259
370
  end
260
371
 
261
- @g.li do
262
- # Easy way of disabling an item and not fucking up the menu
263
- if !read_access
264
- menu[:url] = '#'
265
- end
372
+ return perms
373
+ end
266
374
 
267
- @g.a :href => menu[:url], :title => menu[:title] do
268
- menu[:title]
269
- end
375
+ ##
376
+ # Validates all the attributes.
377
+ #
378
+ # @since 0.2.5
379
+ #
380
+ def validate
381
+ validates_presence([:name, :title, :author, :about, :root])
270
382
 
271
- if menu.key?(:children)
272
- @g.ul do
273
- menu[:children].each do |c|
274
- self.nav_list(c)
275
- end
276
- end
277
- end
383
+ validates_filepath(:root)
384
+ validates_filepath(:migrations) unless migrations.nil?
385
+
386
+ # Check if the package hasn't been registered yet
387
+ if Zen::Package::REGISTERED.key?(name.to_sym)
388
+ raise(Zen::ValidationError, "The package #{name} already exists.")
278
389
  end
279
390
  end
280
391
  end # Package