trusty-cms 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +23 -0
  3. data/CHANGELOG.md +754 -0
  4. data/CONTRIBUTORS.md +263 -0
  5. data/Gemfile +40 -0
  6. data/Gemfile.lock +177 -0
  7. data/INSTALL.md +10 -0
  8. data/LICENSE.md +21 -0
  9. data/README.md +85 -0
  10. data/Rakefile +7 -0
  11. data/app/controllers/admin/configuration_controller.rb +50 -0
  12. data/app/controllers/admin/extensions_controller.rb +11 -0
  13. data/app/controllers/admin/layouts_controller.rb +8 -0
  14. data/app/controllers/admin/page_fields_controller.rb +9 -0
  15. data/app/controllers/admin/page_parts_controller.rb +9 -0
  16. data/app/controllers/admin/pages_controller.rb +89 -0
  17. data/app/controllers/admin/preferences_controller.rb +46 -0
  18. data/app/controllers/admin/references_controller.rb +7 -0
  19. data/app/controllers/admin/resource_controller.rb +245 -0
  20. data/app/controllers/admin/users_controller.rb +40 -0
  21. data/app/controllers/admin/welcome_controller.rb +48 -0
  22. data/app/controllers/application_controller.rb +114 -0
  23. data/app/controllers/site_controller.rb +97 -0
  24. data/app/helpers/admin/configuration_helper.rb +80 -0
  25. data/app/helpers/admin/export_helper.rb +2 -0
  26. data/app/helpers/admin/extensions_helper.rb +2 -0
  27. data/app/helpers/admin/layouts_helper.rb +21 -0
  28. data/app/helpers/admin/node_helper.rb +96 -0
  29. data/app/helpers/admin/pages_helper.rb +117 -0
  30. data/app/helpers/admin/preferences_helper.rb +3 -0
  31. data/app/helpers/admin/references_helper.rb +46 -0
  32. data/app/helpers/admin/regions_helper.rb +28 -0
  33. data/app/helpers/admin/resource_helper.rb +2 -0
  34. data/app/helpers/admin/users_helper.rb +8 -0
  35. data/app/helpers/admin/welcome_helper.rb +2 -0
  36. data/app/helpers/application_helper.rb +241 -0
  37. data/app/helpers/site_helper.rb +2 -0
  38. data/app/models/deprecated_tags.rb +42 -0
  39. data/app/models/file_not_found_page.rb +32 -0
  40. data/app/models/layout.rb +15 -0
  41. data/app/models/menu_renderer.rb +140 -0
  42. data/app/models/page.rb +377 -0
  43. data/app/models/page_context.rb +53 -0
  44. data/app/models/page_field.rb +3 -0
  45. data/app/models/page_part.rb +20 -0
  46. data/app/models/standard_tags.rb +1318 -0
  47. data/app/models/status.rb +41 -0
  48. data/app/models/text_filter.rb +36 -0
  49. data/app/models/trusty_cms/config.rb +313 -0
  50. data/app/models/trusty_cms/page_response_cache_director.rb +43 -0
  51. data/app/models/user.rb +96 -0
  52. data/app/models/user_action_observer.rb +25 -0
  53. data/app/views/admin/configuration/edit.html.haml +38 -0
  54. data/app/views/admin/configuration/show.html.haml +58 -0
  55. data/app/views/admin/extensions/index.html.haml +41 -0
  56. data/app/views/admin/layouts/_form.html.haml +39 -0
  57. data/app/views/admin/layouts/edit.html.haml +9 -0
  58. data/app/views/admin/layouts/index.html.haml +35 -0
  59. data/app/views/admin/layouts/new.html.haml +7 -0
  60. data/app/views/admin/layouts/remove.html.haml +16 -0
  61. data/app/views/admin/page_fields/_page_field.html.haml +12 -0
  62. data/app/views/admin/page_parts/_page_part.html.haml +18 -0
  63. data/app/views/admin/pages/_fields.html.haml +71 -0
  64. data/app/views/admin/pages/_meta_row.html.haml +8 -0
  65. data/app/views/admin/pages/_node.html.haml +26 -0
  66. data/app/views/admin/pages/_popups.html.haml +27 -0
  67. data/app/views/admin/pages/children.html.haml +2 -0
  68. data/app/views/admin/pages/edit.html.haml +12 -0
  69. data/app/views/admin/pages/index.html.haml +26 -0
  70. data/app/views/admin/pages/new.html.haml +10 -0
  71. data/app/views/admin/pages/remove.html.haml +18 -0
  72. data/app/views/admin/preferences/edit.html.haml +44 -0
  73. data/app/views/admin/references/_tag_reference.haml +3 -0
  74. data/app/views/admin/references/filters.haml +6 -0
  75. data/app/views/admin/references/tags.haml +30 -0
  76. data/app/views/admin/users/_avatar.html.haml +5 -0
  77. data/app/views/admin/users/_form.html.haml +53 -0
  78. data/app/views/admin/users/_password_fields.html.haml +18 -0
  79. data/app/views/admin/users/edit.html.haml +9 -0
  80. data/app/views/admin/users/index.html.haml +39 -0
  81. data/app/views/admin/users/new.html.haml +6 -0
  82. data/app/views/admin/users/remove.html.haml +16 -0
  83. data/app/views/admin/welcome/login.html.haml +23 -0
  84. data/app/views/layouts/application.html.haml +50 -0
  85. data/app/views/site/not_found.html.haml +3 -0
  86. data/bin/ci/before_script +15 -0
  87. data/bin/trusty_cms +53 -0
  88. data/config/application.rb +124 -0
  89. data/config/boot.rb +9 -0
  90. data/config/compass.config +15 -0
  91. data/config/database.db2.yml +20 -0
  92. data/config/database.mysql.yml +25 -0
  93. data/config/database.postgresql.yml +25 -0
  94. data/config/database.sqlite.yml +16 -0
  95. data/config/database.sqlserver.yml +20 -0
  96. data/config/environment.rb +5 -0
  97. data/config/environments/development.rb +19 -0
  98. data/config/environments/production.rb +27 -0
  99. data/config/environments/test.rb +35 -0
  100. data/config/initializers/active_record_extensions.rb +1 -0
  101. data/config/initializers/configuration_extensions.rb +0 -0
  102. data/config/initializers/haml.rb +2 -0
  103. data/config/initializers/object_extensions.rb +1 -0
  104. data/config/initializers/radiant_config.rb +16 -0
  105. data/config/initializers/rails_patch.rb +2 -0
  106. data/config/initializers/response_cache_timeout.rb +3 -0
  107. data/config/initializers/string_extensions.rb +1 -0
  108. data/config/initializers/symbol_extensions.rb +1 -0
  109. data/config/initializers/tmp.rb +2 -0
  110. data/config/locales/en.yml +230 -0
  111. data/config/locales/en_available_tags.yml +625 -0
  112. data/config/preinitializer.rb +18 -0
  113. data/config/routes.rb +30 -0
  114. data/db/migrate/001_create_radiant_tables.rb +75 -0
  115. data/db/migrate/002_insert_initial_data.rb +12 -0
  116. data/db/migrate/003_rename_behavior_column.rb +9 -0
  117. data/db/migrate/004_rename_filter_column.rb +11 -0
  118. data/db/migrate/005_add_virtual_column_to_page.rb +9 -0
  119. data/db/migrate/006_integer_columns_to_boolean.rb +36 -0
  120. data/db/migrate/007_remove_virtual_column_from_page.rb +9 -0
  121. data/db/migrate/008_add_virtual_column_to_page_again.rb +9 -0
  122. data/db/migrate/009_add_content_type_field_to_layout.rb +9 -0
  123. data/db/migrate/010_merge_behaviors_and_pages.rb +57 -0
  124. data/db/migrate/011_rename_type_column_on_page_to_class_name.rb +9 -0
  125. data/db/migrate/012_create_extension_meta.rb +13 -0
  126. data/db/migrate/013_add_notes_field_to_user.rb +9 -0
  127. data/db/migrate/014_rename_config_default_parts_key.rb +17 -0
  128. data/db/migrate/015_add_optimistic_locking.rb +15 -0
  129. data/db/migrate/016_add_sessions.rb +16 -0
  130. data/db/migrate/017_rename_created_by_updated_by_columns.rb +15 -0
  131. data/db/migrate/018_add_description_and_keywords_to_pages.rb +11 -0
  132. data/db/migrate/019_add_salt_to_users.rb +11 -0
  133. data/db/migrate/020_add_session_info_to_users.rb +11 -0
  134. data/db/migrate/021_remove_session_expire_from_users.rb +9 -0
  135. data/db/migrate/20081203140407_add_indexes.rb +19 -0
  136. data/db/migrate/20090226140109_add_user_language.rb +9 -0
  137. data/db/migrate/20090929164633_rename_developer_role_to_designer.rb +9 -0
  138. data/db/migrate/20091003095744_change_user_language_to_locale.rb +9 -0
  139. data/db/migrate/20100805154952_add_page_fields.rb +15 -0
  140. data/db/migrate/20100805155020_convert_page_metas.rb +24 -0
  141. data/db/migrate/20100810151922_add_field_name_index.rb +11 -0
  142. data/db/migrate/20110902203823_add_allowed_children_cache_to_pages.rb +13 -0
  143. data/db/migrate/20111016150725_extend_page_part_content_limit.rb +15 -0
  144. data/db/migrate/20120209231801_change_pages_allowed_children_cache_to_text.rb +11 -0
  145. data/db/schema.rb +128 -0
  146. data/lib/active_record_extensions/active_record_extensions.rb +27 -0
  147. data/lib/annotatable.rb +68 -0
  148. data/lib/configuration_extensions/configuration_extensions.rb +357 -0
  149. data/lib/generators/extension/USAGE +30 -0
  150. data/lib/generators/extension/extension_generator.rb +97 -0
  151. data/lib/generators/extension/templates/README.md +6 -0
  152. data/lib/generators/extension/templates/RSpecRakefile +109 -0
  153. data/lib/generators/extension/templates/Rakefile +25 -0
  154. data/lib/generators/extension/templates/cucumber.yml +1 -0
  155. data/lib/generators/extension/templates/cucumber_env.rb +11 -0
  156. data/lib/generators/extension/templates/cucumber_paths.rb +22 -0
  157. data/lib/generators/extension/templates/en.yml +3 -0
  158. data/lib/generators/extension/templates/extension.rb +21 -0
  159. data/lib/generators/extension/templates/functional_test.rb +15 -0
  160. data/lib/generators/extension/templates/gemspec.rb +29 -0
  161. data/lib/generators/extension/templates/lib.rb +8 -0
  162. data/lib/generators/extension/templates/migration.rb +9 -0
  163. data/lib/generators/extension/templates/radiant_config.rb +3 -0
  164. data/lib/generators/extension/templates/routes.rb +5 -0
  165. data/lib/generators/extension/templates/spec.opts +6 -0
  166. data/lib/generators/extension/templates/spec_helper.rb +42 -0
  167. data/lib/generators/extension/templates/tasks.rake +47 -0
  168. data/lib/generators/extension/templates/test_helper.rb +26 -0
  169. data/lib/generators/extension_controller/USAGE +36 -0
  170. data/lib/generators/extension_controller/extension_controller_generator.rb +84 -0
  171. data/lib/generators/extension_controller/templates/controller.rb +10 -0
  172. data/lib/generators/extension_controller/templates/controller_spec.rb +23 -0
  173. data/lib/generators/extension_controller/templates/functional_test.rb +11 -0
  174. data/lib/generators/extension_controller/templates/helper.rb +2 -0
  175. data/lib/generators/extension_controller/templates/helper_spec.rb +11 -0
  176. data/lib/generators/extension_controller/templates/helper_test.rb +4 -0
  177. data/lib/generators/extension_controller/templates/view.html.erb +2 -0
  178. data/lib/generators/extension_controller/templates/view_spec.rb +12 -0
  179. data/lib/generators/extension_mailer/USAGE +17 -0
  180. data/lib/generators/extension_mailer/extension_mailer_generator.rb +68 -0
  181. data/lib/generators/extension_mailer/templates/fixture.erb +3 -0
  182. data/lib/generators/extension_mailer/templates/mailer.rb +15 -0
  183. data/lib/generators/extension_mailer/templates/unit_test.rb +21 -0
  184. data/lib/generators/extension_mailer/templates/view.erb +3 -0
  185. data/lib/generators/extension_migration/USAGE +34 -0
  186. data/lib/generators/extension_migration/extension_migration_generator.rb +25 -0
  187. data/lib/generators/extension_migration/templates/migration.rb +11 -0
  188. data/lib/generators/extension_model/USAGE +35 -0
  189. data/lib/generators/extension_model/extension_model_generator.rb +68 -0
  190. data/lib/generators/extension_model/templates/fixtures.yml +19 -0
  191. data/lib/generators/extension_model/templates/migration.rb +16 -0
  192. data/lib/generators/extension_model/templates/model.rb +2 -0
  193. data/lib/generators/extension_model/templates/model_spec.rb +11 -0
  194. data/lib/generators/extension_model/templates/unit_test.rb +8 -0
  195. data/lib/generators/generator_base_extension.rb +16 -0
  196. data/lib/generators/instance/instance_generator.rb +148 -0
  197. data/lib/generators/instance/templates/databases/db2.yml +40 -0
  198. data/lib/generators/instance/templates/databases/mysql.yml +47 -0
  199. data/lib/generators/instance/templates/databases/postgresql.yml +44 -0
  200. data/lib/generators/instance/templates/databases/sqlite3.yml +16 -0
  201. data/lib/generators/instance/templates/databases/sqlserver.yml +21 -0
  202. data/lib/generators/instance/templates/instance_boot.rb +122 -0
  203. data/lib/generators/instance/templates/instance_config.ru +2 -0
  204. data/lib/generators/instance/templates/instance_environment.rb +83 -0
  205. data/lib/generators/instance/templates/instance_gemfile +81 -0
  206. data/lib/generators/instance/templates/instance_generate +6 -0
  207. data/lib/generators/instance/templates/instance_radiant_config.rb +16 -0
  208. data/lib/generators/instance/templates/instance_rakefile +3 -0
  209. data/lib/generators/instance/templates/instance_routes.rb +1 -0
  210. data/lib/generators/language_extension/USAGE +27 -0
  211. data/lib/generators/language_extension/language_extension_generator.rb +71 -0
  212. data/lib/generators/language_extension/templates/README +3 -0
  213. data/lib/generators/language_extension/templates/RSpecRakefile +123 -0
  214. data/lib/generators/language_extension/templates/Rakefile +25 -0
  215. data/lib/generators/language_extension/templates/available_tags.yml +553 -0
  216. data/lib/generators/language_extension/templates/cucumber.yml +1 -0
  217. data/lib/generators/language_extension/templates/cucumber_env.rb +16 -0
  218. data/lib/generators/language_extension/templates/cucumber_paths.rb +14 -0
  219. data/lib/generators/language_extension/templates/extension.rb +12 -0
  220. data/lib/generators/language_extension/templates/functional_test.rb +15 -0
  221. data/lib/generators/language_extension/templates/gemspec.rb +24 -0
  222. data/lib/generators/language_extension/templates/lang.yml +181 -0
  223. data/lib/generators/language_extension/templates/lib.rb +8 -0
  224. data/lib/generators/language_extension/templates/spec.opts +6 -0
  225. data/lib/generators/language_extension/templates/spec_helper.rb +36 -0
  226. data/lib/generators/language_extension/templates/tasks.rake +28 -0
  227. data/lib/generators/language_extension/templates/test_helper.rb +26 -0
  228. data/lib/inheritable_class_attributes.rb +65 -0
  229. data/lib/local_time.rb +6 -0
  230. data/lib/login_system.rb +132 -0
  231. data/lib/method_observer.rb +50 -0
  232. data/lib/object_extensions/object_extensions.rb +5 -0
  233. data/lib/simpleton.rb +21 -0
  234. data/lib/string_extensions/string_extensions.rb +25 -0
  235. data/lib/symbol_extensions/symbol_extensions.rb +5 -0
  236. data/lib/tasks/database.rake +85 -0
  237. data/lib/tasks/environments.rake +11 -0
  238. data/lib/tasks/extensions.rake +85 -0
  239. data/lib/tasks/framework.rake +255 -0
  240. data/lib/tasks/instance.rake +23 -0
  241. data/lib/tasks/prototype.rake +31 -0
  242. data/lib/tasks/radiant_config.rake +18 -0
  243. data/lib/tasks/release.rake +131 -0
  244. data/lib/tasks/translate.rake +59 -0
  245. data/lib/tasks/undefine.rake +28 -0
  246. data/lib/translation_support.rb +54 -0
  247. data/lib/trusty_cms/admin_ui/region_partials.rb +23 -0
  248. data/lib/trusty_cms/admin_ui/region_set.rb +35 -0
  249. data/lib/trusty_cms/admin_ui.rb +244 -0
  250. data/lib/trusty_cms/available_locales.rb +19 -0
  251. data/lib/trusty_cms/cache.rb +100 -0
  252. data/lib/trusty_cms/config/definition.rb +142 -0
  253. data/lib/trusty_cms/engine.rb +10 -0
  254. data/lib/trusty_cms/extension/script.rb +395 -0
  255. data/lib/trusty_cms/extension.rb +146 -0
  256. data/lib/trusty_cms/extension_loader.rb +130 -0
  257. data/lib/trusty_cms/extension_migrator.rb +98 -0
  258. data/lib/trusty_cms/extension_path.rb +200 -0
  259. data/lib/trusty_cms/initializer.rb +162 -0
  260. data/lib/trusty_cms/pagination/controller.rb +41 -0
  261. data/lib/trusty_cms/pagination/link_renderer.rb +34 -0
  262. data/lib/trusty_cms/resource_responses.rb +121 -0
  263. data/lib/trusty_cms/setup.rb +227 -0
  264. data/lib/trusty_cms/taggable.rb +138 -0
  265. data/lib/trusty_cms/task_support.rb +66 -0
  266. data/lib/trusty_cms.rb +19 -0
  267. data/log/.keep +0 -0
  268. data/public/.htaccess +40 -0
  269. data/public/404.html +8 -0
  270. data/public/500.html +8 -0
  271. data/public/dispatch.cgi +10 -0
  272. data/public/dispatch.fcgi +24 -0
  273. data/public/dispatch.rb +10 -0
  274. data/public/favicon.ico +0 -0
  275. data/public/images/admin/add_tab.png +0 -0
  276. data/public/images/admin/avatar_32x32.png +0 -0
  277. data/public/images/admin/avatar_64x64.png +0 -0
  278. data/public/images/admin/avatar_96x96.png +0 -0
  279. data/public/images/admin/brown_bottom_line.gif +0 -0
  280. data/public/images/admin/calendar_down.gif +0 -0
  281. data/public/images/admin/collapse.png +0 -0
  282. data/public/images/admin/draft_page.png +0 -0
  283. data/public/images/admin/expand.png +0 -0
  284. data/public/images/admin/image.png +0 -0
  285. data/public/images/admin/javascript.png +0 -0
  286. data/public/images/admin/layout.png +0 -0
  287. data/public/images/admin/metadata_toggle.png +0 -0
  288. data/public/images/admin/minus.png +0 -0
  289. data/public/images/admin/minus_disabled.png +0 -0
  290. data/public/images/admin/minus_grey.png +0 -0
  291. data/public/images/admin/navigation_secondary_separator.gif +0 -0
  292. data/public/images/admin/page.png +0 -0
  293. data/public/images/admin/plus.png +0 -0
  294. data/public/images/admin/plus_disabled.png +0 -0
  295. data/public/images/admin/plus_grey.png +0 -0
  296. data/public/images/admin/popup_border_background.png +0 -0
  297. data/public/images/admin/popup_border_bottom_left.png +0 -0
  298. data/public/images/admin/popup_border_bottom_right.png +0 -0
  299. data/public/images/admin/popup_border_top_left.png +0 -0
  300. data/public/images/admin/popup_border_top_right.png +0 -0
  301. data/public/images/admin/search.png +0 -0
  302. data/public/images/admin/single_form_shadow.png +0 -0
  303. data/public/images/admin/snippet.png +0 -0
  304. data/public/images/admin/spinner.gif +0 -0
  305. data/public/images/admin/status_background.png +0 -0
  306. data/public/images/admin/status_bottom_left.png +0 -0
  307. data/public/images/admin/status_bottom_right.png +0 -0
  308. data/public/images/admin/status_spinner.gif +0 -0
  309. data/public/images/admin/status_top_left.png +0 -0
  310. data/public/images/admin/status_top_right.png +0 -0
  311. data/public/images/admin/stylesheet.png +0 -0
  312. data/public/images/admin/tab_close.png +0 -0
  313. data/public/images/admin/upload.png +0 -0
  314. data/public/images/admin/virtual_page.png +0 -0
  315. data/public/images/radiant/radiant-badge-color.png +0 -0
  316. data/public/javascripts/admin/application.js +94 -0
  317. data/public/javascripts/admin/codearea.js +165 -0
  318. data/public/javascripts/admin/controls.js +965 -0
  319. data/public/javascripts/admin/cookie.js +80 -0
  320. data/public/javascripts/admin/dateinput.js +402 -0
  321. data/public/javascripts/admin/dragdrop.js +974 -0
  322. data/public/javascripts/admin/dropdown.js +216 -0
  323. data/public/javascripts/admin/effects.js +1122 -0
  324. data/public/javascripts/admin/lowpro.js +340 -0
  325. data/public/javascripts/admin/overrides.js +1 -0
  326. data/public/javascripts/admin/page_preview.js +41 -0
  327. data/public/javascripts/admin/pagefield.js +54 -0
  328. data/public/javascripts/admin/pagestatus.js +17 -0
  329. data/public/javascripts/admin/popup.js +339 -0
  330. data/public/javascripts/admin/prototype.js +4874 -0
  331. data/public/javascripts/admin/ruledtable.js +13 -0
  332. data/public/javascripts/admin/shortcuts.js +33 -0
  333. data/public/javascripts/admin/sitemap.js +149 -0
  334. data/public/javascripts/admin/status.js +233 -0
  335. data/public/javascripts/admin/tabcontrol.js +123 -0
  336. data/public/javascripts/admin/toggle.js +430 -0
  337. data/public/javascripts/admin/utility.js +53 -0
  338. data/public/javascripts/admin/validationerror.js +18 -0
  339. data/public/loading-iframe.html +11 -0
  340. data/public/robots.txt +1 -0
  341. data/public/stylesheets/sass/admin/_base.sass +18 -0
  342. data/public/stylesheets/sass/admin/main.sass +27 -0
  343. data/public/stylesheets/sass/admin/modules/_boxes.sass +6 -0
  344. data/public/stylesheets/sass/admin/modules/_gradients.sass +4 -0
  345. data/public/stylesheets/sass/admin/modules/_links.sass +18 -0
  346. data/public/stylesheets/sass/admin/overrides.sass +2 -0
  347. data/public/stylesheets/sass/admin/partials/_actions.sass +96 -0
  348. data/public/stylesheets/sass/admin/partials/_avatars.sass +10 -0
  349. data/public/stylesheets/sass/admin/partials/_content.sass +58 -0
  350. data/public/stylesheets/sass/admin/partials/_dateinput.sass +62 -0
  351. data/public/stylesheets/sass/admin/partials/_deprecated.sass +55 -0
  352. data/public/stylesheets/sass/admin/partials/_dropdown.sass +28 -0
  353. data/public/stylesheets/sass/admin/partials/_footer.sass +12 -0
  354. data/public/stylesheets/sass/admin/partials/_forms.sass +322 -0
  355. data/public/stylesheets/sass/admin/partials/_header.sass +114 -0
  356. data/public/stylesheets/sass/admin/partials/_index.sass +147 -0
  357. data/public/stylesheets/sass/admin/partials/_layout.sass +10 -0
  358. data/public/stylesheets/sass/admin/partials/_messages.sass +10 -0
  359. data/public/stylesheets/sass/admin/partials/_popup.sass +213 -0
  360. data/public/stylesheets/sass/admin/partials/_tabcontrol.sass +72 -0
  361. data/public/stylesheets/sass/admin/partials/_toolbar.sass +31 -0
  362. data/public/stylesheets/sass/admin/partials/_typography.sass +60 -0
  363. data/public/stylesheets/sass/admin/partials/_validations.sass +19 -0
  364. data/rails/init.rb +1 -0
  365. data/script/about +4 -0
  366. data/script/breakpointer +3 -0
  367. data/script/console +3 -0
  368. data/script/dbconsole +3 -0
  369. data/script/destroy +3 -0
  370. data/script/extension +5 -0
  371. data/script/generate +3 -0
  372. data/script/performance/benchmarker +3 -0
  373. data/script/performance/profiler +3 -0
  374. data/script/performance/request +3 -0
  375. data/script/plugin +3 -0
  376. data/script/process/inspector +3 -0
  377. data/script/process/reaper +3 -0
  378. data/script/process/spawner +3 -0
  379. data/script/process/spinner +3 -0
  380. data/script/rails +6 -0
  381. data/script/runner +3 -0
  382. data/script/server +3 -0
  383. data/script/version +5 -0
  384. data/spec/ci/database.mysql.yml +4 -0
  385. data/spec/ci/database.postgresql.yml +4 -0
  386. data/spec/ci/database.sqlite.yml +3 -0
  387. data/trusty_cms.gemspec +50 -0
  388. metadata +781 -0
@@ -0,0 +1,130 @@
1
+ require 'trusty_cms/extension'
2
+ require 'trusty_cms/extension_path'
3
+ require 'method_observer'
4
+
5
+ module TrustyCms
6
+ class ExtensionLoader
7
+ # The ExtensionLoader is reponsible for the loading, activation and reactivation of extensions.
8
+ # The noticing of important subdirectories is now handled by the ExtensionPath class.
9
+
10
+ class DependenciesObserver < MethodObserver
11
+ # Extends the reload mechanism in ActiveSupport so that extensions are deactivated and reactivated
12
+ # when model classes are reloaded (in development mode, usually).
13
+
14
+ attr_accessor :config
15
+
16
+ def initialize(rails_config) #:nodoc
17
+ @config = rails_config
18
+ end
19
+
20
+ def before_clear(*args) #:nodoc
21
+ ExtensionLoader.deactivate_extensions
22
+ end
23
+
24
+ def after_clear(*args) #:nodoc
25
+ ExtensionLoader.load_extensions
26
+ ExtensionLoader.activate_extensions
27
+ end
28
+ end
29
+
30
+ include Simpleton
31
+
32
+ attr_accessor :initializer, :extensions
33
+
34
+ def initialize #:nodoc
35
+ self.extensions = []
36
+ end
37
+
38
+ # Returns a list of paths to all the extensions that are enabled in the configuration of this application.
39
+ #
40
+ def enabled_extension_paths
41
+ ExtensionPath.enabled.map(&:to_s)
42
+ end
43
+
44
+ # Returns a list of all the paths discovered within extension roots of the specified type.
45
+ # (by calling the corresponding class method on ExtensionPath).
46
+ #
47
+ # extension_loader.paths(:metal) #=> ['extension/app/metal', 'extension/app/metal']
48
+ # extension_loader.paths(:controller) #=> ['extension/app/controllers', 'extension/app/controllers']
49
+ # extension_loader.paths(:eager_load) #=> ['extension/app/controllers', 'extension/app/models', 'extension/app/helpers']
50
+ #
51
+ # For compatibility with the old loader, there are corresponding +type_paths+ methods.
52
+ # There are also (deprecated) +add_type_paths+ methods.
53
+ #
54
+ def paths(type)
55
+ ExtensionPath.send("#{type}_paths".to_sym)
56
+ end
57
+
58
+ # Loads but does not activate all the extensions that have been enabled, in the configured order
59
+ # (which defaults to alphabetically). If an extension fails to load an error will be logged
60
+ # but application startup will continue. If an extension doesn't exist, a LoadError will be raised
61
+ # and startup will halt.
62
+ #
63
+ def load_extensions
64
+ configuration = TrustyCms::Application.config
65
+ @observer ||= DependenciesObserver.new(configuration).observe(::ActiveSupport::Dependencies)
66
+ self.extensions = configuration.enabled_extensions.map { |ext| load_extension(ext) }.compact
67
+ end
68
+
69
+ # Loads the specified extension.
70
+ #
71
+ def load_extension(name)
72
+ extension_path = ExtensionPath.find(name)
73
+ begin
74
+ constant = "#{name}_extension".camelize
75
+ extension = constant.constantize
76
+ extension.unloadable
77
+ extension.path = extension_path
78
+ extension
79
+ rescue LoadError, NameError => e
80
+ $stderr.puts "Could not load extension: #{name}.\n#{e.inspect}"
81
+ nil
82
+ end
83
+ end
84
+
85
+ # Loads all the initializers defined in enabled extensions, in the configured order.
86
+ #
87
+ def load_extension_initalizers
88
+ extensions.each &:load_initializers
89
+ end
90
+
91
+ # Deactivates all enabled extensions.
92
+ #
93
+ def deactivate_extensions
94
+ extensions.each &:deactivate
95
+ end
96
+
97
+ # Activates all enabled extensions and makes sure that any newly declared subclasses of Page are recognised.
98
+ # The admin UI and views have to be reinitialized each time to pick up changes and avoid duplicates.
99
+ #
100
+ def activate_extensions
101
+ initializer.initialize_views
102
+ extensions.each &:activate
103
+ Page.load_subclasses
104
+ end
105
+ alias :reactivate :activate_extensions
106
+
107
+ class << self
108
+ # Builds an ExtensionPath object from the supplied path, working out the name of the extension on the way.
109
+ # The ExtensionPath object will later be used to scan and load the extension.
110
+ # An extension name can be supplied in addition to the path. It will be processed in the usual way to
111
+ # remove radiant- and -extension and any verion numbering.
112
+ #
113
+ def record_path(path, name=nil)
114
+ ExtensionPath.from_path(path, name)
115
+ end
116
+
117
+ # For compatibility with old calls probably still to be found in some extensions.
118
+ #
119
+ %w{controller model view metal plugin load locale}.each do |type|
120
+ define_method("#{type}_paths".to_sym) do
121
+ paths(type)
122
+ end
123
+ define_method("add_#{type}_paths".to_sym) do |additional_paths|
124
+ ::ActiveSupport::Deprecation.warn("ExtensionLoader.add_#{type}_paths is has been moved and is deprecated. Please use TrustyCms.configuration.add_#{type}_paths", caller)
125
+ initializer.configuration.send("add_#{type}_paths".to_sym, additional_paths)
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,98 @@
1
+ module TrustyCms
2
+ class ExtensionMigrator < ActiveRecord::Migrator
3
+ class << self
4
+ attr_accessor :extension
5
+
6
+ def migrate(target_version = nil)
7
+ super extension.migrations_path, target_version
8
+ end
9
+
10
+ def migrate_extensions
11
+ TrustyCms::Application.config.enabled_extensions.each do |ext|
12
+ to_migrate = Extension.descendants.detect{|descendant| descendant.name == "#{ext.to_s.camelize}Extension" }
13
+ to_migrate.migrator.migrate
14
+ end
15
+ end
16
+
17
+ def get_all_versions
18
+ ActiveRecord::Base.connection.select_values("SELECT version FROM #{schema_migrations_table_name}").
19
+ select { |version| version.starts_with?("#{@extension.extension_name}-")}.
20
+ map { |version| version.sub("#{@extension.extension_name}-", '').to_i }.sort
21
+ end
22
+ end
23
+
24
+ def initialize(direction, migrations_path, target_version = nil)
25
+ super
26
+ initialize_extension_schema_migrations
27
+ initialize_received_migrations
28
+ end
29
+
30
+ private
31
+ def quote(s)
32
+ ActiveRecord::Base.connection.quote(s)
33
+ end
34
+
35
+ def extension_name
36
+ self.class.extension.extension_name
37
+ end
38
+
39
+ def version_string(version)
40
+ "#{extension_name}-#{version}"
41
+ end
42
+
43
+ def initialize_extension_schema_migrations
44
+ current_version = ActiveRecord::Base.connection.select_value("SELECT schema_version FROM extension_meta WHERE name = #{quote(extension_name)}")
45
+ if current_version
46
+ assume_migrated_upto_version(current_version.to_i)
47
+ ActiveRecord::Base.connection.delete("DELETE FROM extension_meta WHERE name = #{quote(extension_name)}")
48
+ end
49
+ end
50
+
51
+ def initialize_received_migrations
52
+ if donors = self.class.extension.migrates_from
53
+ donors.each do |extension_name, until_migration|
54
+ replaced = ActiveRecord::Base.connection.select_values("SELECT version FROM #{ActiveRecord::Migrator.schema_migrations_table_name} WHERE version LIKE '#{extension_name}-%'").map{|v| v.sub(/^#{extension_name}\-/, '').to_i}
55
+ replaced.delete_if{|v| v > until_migration.to_i} if until_migration
56
+ assume_migrated_upto_version(replaced.max) if replaced.any?
57
+ end
58
+ end
59
+ end
60
+
61
+ def assume_migrated_upto_version(version)
62
+ version = version.to_i
63
+ sm_table = self.class.schema_migrations_table_name
64
+
65
+ migrated = self.class.get_all_versions
66
+ versions = Dir["#{@migrations_path}/[0-9]*_*.rb"].map do |filename|
67
+ filename.split('/').last.split('_').first.to_i
68
+ end
69
+
70
+ unless migrated.include?(version)
71
+ ActiveRecord::Base.connection.execute "INSERT INTO #{sm_table} (version) VALUES (#{quote(version_string(version))})"
72
+ end
73
+
74
+ inserted = Set.new
75
+ (versions - migrated).each do |v|
76
+ if inserted.include?(v)
77
+ raise "Duplicate migration #{v}. Please renumber your migrations to resolve the conflict."
78
+ elsif v < version
79
+ ActiveRecord::Base.connection.execute "INSERT INTO #{sm_table} (version) VALUES (#{quote(version_string(v))})"
80
+ inserted << v
81
+ end
82
+ end
83
+ end
84
+
85
+ def record_version_state_after_migrating(version)
86
+ sm_table = self.class.schema_migrations_table_name
87
+
88
+ @migrated_versions ||= []
89
+ if down?
90
+ @migrated_versions.delete(version.to_i)
91
+ ActiveRecord::Base.connection.update("DELETE FROM #{sm_table} WHERE version = #{quote(version_string(version))}")
92
+ else
93
+ @migrated_versions.push(version.to_i).sort!
94
+ ActiveRecord::Base.connection.insert("INSERT INTO #{sm_table} (version) VALUES (#{quote(version_string(version))})")
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,200 @@
1
+ module TrustyCms
2
+ class ExtensionPath
3
+ # This class holds information about extensions that may be loaded. It has two roles: to remember the
4
+ # location of the extension so that we don't have to search for it again, and to look within that path
5
+ # for significant application subdirectories.
6
+ #
7
+ # We can't just retrieve this information from the Extension class because the initializer sets up
8
+ # most of the application load_paths before plugins (including extensions) are loaded. You can think
9
+ # of this as a sort of pre-extension class preparing the way for extension loading.
10
+ #
11
+ # You can use instances of this class to retrieve information about a particular extension:
12
+ #
13
+ # ExtensionPath.new(:name, :path)
14
+ # ExtensionPath.find(:name) #=> ExtensionPath instance
15
+ # ExtensionPath.find(:name).plugin_paths #=> "path/vendor/plugins" if it exists and is a directory
16
+ # ExtensionPath.for(:name) #=> "path"
17
+ #
18
+ # The initializer calls class methods to get overall lists (in configured order) of enabled load paths:
19
+ #
20
+ # ExtensionPath.enabled #=> ["path", "path", "path", "path"]
21
+ # ExtensionPath.plugin_paths #=> ["path/vendor/plugins", "path/vendor/plugins"]
22
+
23
+ attr_accessor :name, :path
24
+ @@known_paths = {}
25
+
26
+ def initialize(options = {}) #:nodoc
27
+ @name, @path = options[:name], options[:path]
28
+ @@known_paths[@name.to_sym] = self
29
+ end
30
+
31
+ def required
32
+ File.join(path, "#{name}_extension")
33
+ end
34
+
35
+ def to_s
36
+ path
37
+ end
38
+
39
+ # Builds a new ExtensionPath object from the supplied path, working out the name of the extension by
40
+ # stripping the extra bits from radiant-something-extension-1.0.0 to leave just 'something'. The object
41
+ # is returned, and also remembered here for later use by the initializer (to find load paths) and the
42
+ # ExtensionLoader, to load and activate the extension.
43
+ #
44
+ # If two arguments are given, the second is taken to be the full extension name.
45
+ #
46
+ def self.from_path(path, name=nil)
47
+ name = path if name.blank?
48
+ name = File.basename(name).gsub(/^trusty-|-extension(-[\d\.a-z]+|-[a-z\d]+)*$/, '')
49
+ new(:name => name, :path => path)
50
+ end
51
+
52
+ # Forgets all recorded extension paths.
53
+ # Currently only used in testing.
54
+ #
55
+ def self.clear_paths!
56
+ @@known_paths = {}
57
+ end
58
+
59
+ # Returns a list of all the likely load paths found within this extension root. It includes all of these
60
+ # that exist and are directories:
61
+ #
62
+ # * path
63
+ # * path/lib
64
+ # * path/app/models
65
+ # * path/app/controllers
66
+ # * path/app/metal
67
+ # * path/app/helpers
68
+ # * path/test/helpers
69
+ #
70
+ # You can call the class method ExtensionPath.load_paths to get a flattened list of all the load paths in all the enabled extensions.
71
+ #
72
+ def load_paths
73
+ %w(lib app/models app/controllers app/metal app/helpers test/helpers).collect { |d| check_subdirectory(d) }.push(path).flatten.compact
74
+ end
75
+
76
+ # Returns a list of all the +vendor/plugin+ paths found within this extension root.
77
+ # Call the class method ExtensionPath.plugin_paths to get a list of the plugin paths found in all enabled extensions.
78
+ #
79
+ def plugin_paths
80
+ check_subdirectory("vendor/plugins")
81
+ end
82
+
83
+ # Returns a list of names of all the locale files found within this extension root.
84
+ # Call the class method ExtensionPath.locale_paths to get a list of the locale files found in all enabled extensions
85
+ # in reverse order so that locale definitions override one another correctly.
86
+ #
87
+ def locale_paths
88
+ if check_subdirectory("config/locales")
89
+ Dir[File.join("#{path}","config/locales","*.{rb,yml}")]
90
+ end
91
+ end
92
+
93
+ # Returns the app/helpers path if it is found within this extension root.
94
+ # Call the class method ExtensionPath.helper_paths to get a list of the helper paths found in all enabled extensions.
95
+ #
96
+ def helper_paths
97
+ check_subdirectory("app/helpers")
98
+ end
99
+
100
+ # Returns the app/models path if it is found within this extension root.
101
+ # Call the class method ExtensionPath.model_paths to get a list of the model paths found in all enabled extensions.
102
+ #
103
+ def model_paths
104
+ check_subdirectory("app/models")
105
+ end
106
+
107
+ # Returns the app/controllers path if it is found within this extension root.
108
+ # Call the class method ExtensionPath.controller_paths to get a list of the controller paths found in all enabled extensions.
109
+ #
110
+ def controller_paths
111
+ check_subdirectory("app/controllers")
112
+ end
113
+
114
+ # Returns the app/views path if it is found within this extension root.
115
+ # Call the class method ExtensionPath.view_paths to get a list of the view paths found in all enabled extensions
116
+ # in reverse order so that views override one another correctly.
117
+ #
118
+ def view_paths
119
+ check_subdirectory("app/views")
120
+ end
121
+
122
+ # Returns the app/metal path if it is found within this extension root.
123
+ # Call the class method ExtensionPath.metal_paths to get a list of the metal paths found in all enabled extensions.
124
+ #
125
+ def metal_paths
126
+ check_subdirectory("app/metal")
127
+ end
128
+
129
+ # Returns a list of all the rake task files found within this extension root.
130
+ #
131
+ def rake_task_paths
132
+ if check_subdirectory("lib/tasks")
133
+ Dir[File.join("#{path}","lib/tasks/**","*.rake")]
134
+ end
135
+ end
136
+
137
+ # Returns a list of extension subdirectories that should be marked for eager loading. At the moment that
138
+ # includes all the controller, model and helper paths. The main purpose here is to ensure that extension
139
+ # controllers are loaded before running cucumber features, and there may be a better way to achieve that.
140
+ #
141
+ # Call the class method ExtensionPath.eager_load_paths to get a list for all enabled extensions.
142
+ #
143
+ def eager_load_paths
144
+ [controller_paths, model_paths, helper_paths].flatten.compact
145
+ end
146
+
147
+ class << self
148
+ # Returns the ExtensionPath object for the given extension name.
149
+ #
150
+ def find(name)
151
+ raise LoadError, "Cannot return path for unknown extension: #{name}" unless @@known_paths[name.to_sym]
152
+ @@known_paths[name.to_sym]
153
+ end
154
+
155
+ # Returns the root path recorded for the given extension name.
156
+ #
157
+ def for(name)
158
+ find(name).path
159
+ end
160
+
161
+ # Returns a list of path objects for all the enabled extensions in the configured order.
162
+ # If a configured extension has not been found during initialization, a LoadError will be thrown here.
163
+ #
164
+ # Note that at this stage, in line with the usage of config.extensions = [], the extension names
165
+ # are being passed around as symbols.
166
+ #
167
+ def enabled
168
+ enabled_extensions = TrustyCms::Application.config.enabled_extensions
169
+ @@known_paths.values_at(*enabled_extensions).compact
170
+ end
171
+
172
+ # Returns a list of the root paths to all the enabled extensions, in the configured order.
173
+ #
174
+ def enabled_paths
175
+ enabled.map(&:path)
176
+ end
177
+
178
+ [:load_paths, :plugin_paths, :helper_paths, :model_paths, :controller_paths, :eager_load_paths].each do |m|
179
+ define_method(m) do
180
+ enabled.map{|ep| ep.send(m)}.flatten.compact
181
+ end
182
+ end
183
+ [:locale_paths, :view_paths, :metal_paths, :rake_task_paths].each do |m|
184
+ define_method(m) do
185
+ enabled.map{|ep| ep.send(m)}.flatten.compact.reverse
186
+ end
187
+ end
188
+ end
189
+
190
+ private
191
+
192
+ # If the supplied path within the extension root exists and is a directory, its absolute path is returned. Otherwise, nil.
193
+ #
194
+ def check_subdirectory(subpath)
195
+ subdirectory = File.join(path, subpath)
196
+ subdirectory if File.directory?(subdirectory)
197
+ end
198
+
199
+ end
200
+ end
@@ -0,0 +1,162 @@
1
+ require 'trusty_cms/admin_ui'
2
+ require 'trusty_cms/extension_loader'
3
+
4
+ module TrustyCms
5
+
6
+ module Initializer
7
+
8
+ # Rails::Initializer is essentially a list of startup steps and we extend it here by:
9
+ # * overriding or extending some of those steps so that they use radiant and extension paths
10
+ # as well as (or instead of) the rails defaults.
11
+ # * appending some extra steps to set up the admin UI and activate extensions
12
+
13
+
14
+ # Returns true in the very unusual case where radiant has been deployed as a rails app itself, rather than
15
+ # loaded as a gem or from vendor/. This is only likely in situations where radiant is customised so heavily
16
+ # that extensions are not sufficient.
17
+ #
18
+ def deployed_as_app?
19
+ TRUSTY_CMS_ROOT == Rails.root
20
+ end
21
+
22
+ # Extends the Rails::Initializer default to add extension paths to the autoload list.
23
+ # Note that +default_autoload_paths+ is also overridden to point to TRUSTY_CMS_ROOT.
24
+ #
25
+ def set_autoload_patf
26
+ super
27
+ end
28
+
29
+ # Overrides the Rails initializer to load metal from TRUSTY_CMS_ROOT and from radiant extensions.
30
+ #
31
+ def initialize_metal
32
+ Rails::Rack::Metal.requested_metals = configuration.metals
33
+ Rails::Rack::Metal.metal_paths = ["#{TRUSTY_CMS_ROOT}/app/metal"] # reset Rails default to TRUSTY_CMS_ROOT
34
+ Rails::Rack::Metal.metal_paths += plugin_loader.engine_metal_paths
35
+ Rails::Rack::Metal.metal_paths += extension_loader.paths(:metal)
36
+ Rails::Rack::Metal.metal_paths.uniq!
37
+
38
+ configuration.middleware.insert_before(
39
+ :"ActionController::ParamsParser",
40
+ Rails::Rack::Metal, :if => Rails::Rack::Metal.metals.any?)
41
+ end
42
+
43
+ # Extends the Rails initializer to add locale paths from TRUSTY_CMS_ROOT and from radiant extensions.
44
+ #
45
+ def initialize_i18n
46
+ radiant_locale_paths = Dir[File.join(TRUSTY_CMS_ROOT, 'config', 'locales', '*.{rb,yml}')]
47
+ configuration.i18n.load_path = radiant_locale_paths + extension_loader.paths(:locale)
48
+ super
49
+ end
50
+
51
+ # Extends the Rails initializer to add plugin paths in extensions
52
+ # and makes extension load paths reloadable (eg in development mode)
53
+ #
54
+ def add_plugin_load_paths
55
+ configuration.add_plugin_paths(extension_loader.paths(:plugin))
56
+ super
57
+ ActiveSupport::Dependencies.autoload_once_paths -= extension_loader.paths(:load)
58
+ end
59
+
60
+ # Overrides the standard gem-loader to use Bundler instead of config.gem. This is the method normally monkey-patched
61
+ # into Rails::Initializer from boot.rb if you follow the instructions at http://gembundler.com/rails23.html
62
+ #
63
+ def load_gems
64
+ @bundler_loaded ||= Bundler.require :default, Rails.env
65
+ end
66
+
67
+ # Extends the Rails initializer also to load radiant extensions (which have been excluded from the list of plugins).
68
+ #
69
+ def load_plugins
70
+ super
71
+ extension_loader.load_extensions
72
+ end
73
+
74
+ # Extends the Rails initializer to run initializers from radiant and from extensions. The load order will be:
75
+ # 1. TRUSTY_CMS_ROOT/config/intializers/*.rb
76
+ # 2. Rails.root/config/intializers/*.rb
77
+ # 3. config/initializers/*.rb found in extensions, in extension load order.
78
+ #
79
+ # In the now rare case where radiant is deployed as an ordinary rails application, step 1 is skipped
80
+ # because it is equivalent to step 2.
81
+ #
82
+ def load_application_initializers
83
+ load_radiant_initializers unless deployed_as_app?
84
+ super
85
+ extension_loader.load_extension_initalizers
86
+ end
87
+
88
+ # Loads initializers found in TRUSTY_CMS_ROOT/config/initializers.
89
+ #
90
+ def load_radiant_initializers
91
+ Dir["#{TRUSTY_CMS_ROOT}/config/initializers/**/*.rb"].sort.each do |initializer|
92
+ load(initializer)
93
+ end
94
+ end
95
+
96
+ # Extends the Rails initializer with some extra steps at the end of initialization:
97
+ # * hook up radiant view paths in controllers and notifiers
98
+ # * initialize the navigation tabs in the admin interface
99
+ # * initialize the extendable partial sets that make up the admin interface
100
+ # * call +activate+ on all radiant extensions
101
+ # * add extension controller paths
102
+ # * mark extension app paths for eager loading
103
+ #
104
+ def after_initialize
105
+ super
106
+ extension_loader.activate_extensions # also calls initialize_views
107
+ TrustyCms::Application.config.add_controller_paths(extension_loader.paths(:controller))
108
+ TrustyCms::Application.config.add_eager_load_paths(extension_loader.paths(:eager_load))
109
+ end
110
+
111
+ # Initializes all the admin interface elements and views. Separate here so that it can be called
112
+ # to reset the interface before extension (re)activation.
113
+ #
114
+ def initialize_views
115
+ initialize_default_admin_tabs
116
+ initialize_framework_views
117
+ admin.load_default_regions
118
+ end
119
+
120
+ # Initializes the core admin tabs. Separate so that it can be invoked by itself in tests.
121
+ #
122
+ def initialize_default_admin_tabs
123
+ admin.initialize_nav
124
+ end
125
+
126
+ # This adds extension view paths to the standard Rails::Initializer method.
127
+ # In environments that don't cache templates it reloads the path set on each request,
128
+ # so that new extension paths are noticed without a restart.
129
+ #
130
+ def initialize_framework_views
131
+ view_paths = extension_loader.paths(:view) #.push(TrustyCms::Application.config.view_path)
132
+ if ActionController::Base.view_paths.count == 0 || !ActionView::Base.cache_template_loading
133
+ ActionController::Base.view_paths = ActionView::Base.process_view_paths(view_paths)
134
+ end
135
+ if ActionMailer::Base.view_paths.count == 0 || !ActionView::Base.cache_template_loading
136
+ ActionMailer::Base.view_paths = ActionView::Base.process_view_paths(view_paths)
137
+ end
138
+ end
139
+
140
+ # Extends the Rails initializer to make sure that extension controller paths are available when routes
141
+ # are initialized.
142
+ #
143
+ def initialize_routing
144
+ configuration.add_controller_paths(extension_loader.paths(:controller))
145
+ configuration.add_eager_load_paths(extension_loader.paths(:eager_load))
146
+ super
147
+ end
148
+
149
+ # Returns the TrustyCms::AdminUI singleton so that the initializer can set up the admin interface.
150
+ #
151
+ def admin
152
+ TrustyCms::Application.config.admin
153
+ end
154
+
155
+ # Returns the ExtensionLoader singleton that will eventually load extensions.
156
+ #
157
+ def extension_loader
158
+ ExtensionLoader.instance {|l| l.initializer = self }
159
+ end
160
+
161
+ end
162
+ end
@@ -0,0 +1,41 @@
1
+ module TrustyCms
2
+ module Pagination
3
+ module Controller
4
+ # for inclusion into public-facing controllers
5
+
6
+ def configure_pagination
7
+ # unconfigured parameters remain at will_paginate defaults
8
+ # will_paginate controller options are not overridden by tag attribetus
9
+ WillPaginate::ViewHelpers.pagination_options[:param_name] = TrustyCms::Config["pagination.param_name"].to_sym unless TrustyCms::Config["pagination.param_name"].blank?
10
+ WillPaginate::ViewHelpers.pagination_options[:per_page_param_name] = TrustyCms::Config["pagination.per_page_param_name"].blank? ? :per_page : TrustyCms::Config["pagination.per_page_param_name"].to_sym
11
+
12
+ # will_paginate view options can be overridden by tag attributes
13
+ [:class, :previous_label, :next_label, :inner_window, :outer_window, :separator, :container].each do |opt|
14
+ WillPaginate::ViewHelpers.pagination_options[opt] = TrustyCms::Config["pagination.#{opt}"] unless TrustyCms::Config["pagination.#{opt}"].blank?
15
+ end
16
+ end
17
+
18
+ def pagination_parameters
19
+ {
20
+ :page => params[WillPaginate::ViewHelpers.pagination_options[:param_name]] || 1,
21
+ :per_page => params[WillPaginate::ViewHelpers.pagination_options[:per_page_param_name]] || TrustyCms::Config['pagination.per_page'] || 20
22
+ }
23
+ end
24
+
25
+ def self.included(base)
26
+ base.class_eval {
27
+ helper_method :pagination_parameters
28
+ before_filter :configure_pagination
29
+ }
30
+ end
31
+ end
32
+ end
33
+
34
+
35
+
36
+ end
37
+
38
+
39
+
40
+
41
+
@@ -0,0 +1,34 @@
1
+ # This handy simplification is adapted from SphinxSearch (thanks)
2
+ # and originally came from Ultrasphinx
3
+ # it saves us a lot of including and bodging to make will_paginate's template calls work in the Page model
4
+
5
+ module TrustyCms
6
+ module Pagination
7
+ class LinkRenderer < WillPaginate::LinkRenderer
8
+ def initialize(url_stem)
9
+ @url_stem = url_stem
10
+ end
11
+
12
+ def to_html
13
+ links = @options[:page_links] ? windowed_links : []
14
+ links.unshift page_link_or_span(@collection.previous_page, 'disabled prev_page', @options[:previous_label])
15
+ links.push page_link_or_span(@collection.next_page, 'disabled next_page', @options[:next_label])
16
+ html = links.join(@options[:separator])
17
+ @options[:container] ? %{<div class="pagination">#{html}</div>} : html
18
+ end
19
+
20
+ # this is rather crude compared to the WillPaginate link-builder,
21
+ # but it can get by without much context to draw on
22
+ def page_link(page, text, attributes = {})
23
+ linkclass = %{ class="#{attributes[:class]}"} if attributes[:class]
24
+ linkrel = %{ rel="#{attributes[:rel]}"} if attributes[:rel]
25
+ param_name = WillPaginate::ViewHelpers.pagination_options[:param_name]
26
+ %Q{<a href="#{@url_stem}?#{param_name}=#{page}"#{linkrel}#{linkclass}>#{text}</a>}
27
+ end
28
+
29
+ def page_span(page, text, attributes = {})
30
+ %{<span class="#{attributes[:class]}">#{text}</span>}
31
+ end
32
+ end
33
+ end
34
+ end