zen 0.2.8 → 0.3b

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 (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