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,42 @@
1
+ require 'trusty_cms/taggable'
2
+ module DeprecatedTags
3
+ include TrustyCms::Taggable
4
+
5
+ deprecated_tag "comment", :substitute => "hide", :deadline => '2.0'
6
+
7
+ deprecated_tag "meta", :deadline => '2.0' do |tag|
8
+ if tag.double?
9
+ tag.expand
10
+ else
11
+ tag.render('description', tag.attr) + tag.render('keywords', tag.attr)
12
+ end
13
+ end
14
+
15
+ deprecated_tag 'meta:description', :deadline => '2.0' do |tag|
16
+ show_tag = tag.attr['tag'] != 'false' || false
17
+ description = CGI.escapeHTML(tag.locals.page.field(:description).try(:content))
18
+ if show_tag
19
+ "<meta name=\"description\" content=\"#{description}\" />"
20
+ else
21
+ description
22
+ end
23
+ end
24
+
25
+ deprecated_tag 'meta:keywords', :deadline => '2.0' do |tag|
26
+ show_tag = tag.attr['tag'] != 'false' || false
27
+ keywords = CGI.escapeHTML(tag.locals.page.field(:keywords).try(:content))
28
+ if show_tag
29
+ "<meta name=\"keywords\" content=\"#{keywords}\" />"
30
+ else
31
+ keywords
32
+ end
33
+ end
34
+
35
+ deprecated_tag "rfc1123_date", :deadline => '2.0' do |tag|
36
+ page = tag.locals.page
37
+ if date = page.published_at || page.created_at
38
+ CGI.rfc1123_date(date.to_time)
39
+ end
40
+ end
41
+
42
+ end
@@ -0,0 +1,32 @@
1
+ class FileNotFoundPage < Page
2
+
3
+ def allowed_children
4
+ []
5
+ end
6
+
7
+ description %{
8
+ A "File Not Found" page can be used to override the default error
9
+ page in the event that a page is not found among a page's children.
10
+
11
+ To create a "File Not Found" error page for an entire Web site, create
12
+ a page that is a child of the root page and assign it "File Not Found"
13
+ page type.
14
+ }
15
+
16
+ tag "attempted_url" do |tag|
17
+ CGI.escapeHTML(request.request_uri) unless request.nil?
18
+ end
19
+
20
+ def virtual?
21
+ true
22
+ end
23
+
24
+ def response_code
25
+ 404
26
+ end
27
+
28
+ def cache?
29
+ false
30
+ end
31
+
32
+ end
@@ -0,0 +1,15 @@
1
+ class Layout < ActiveRecord::Base
2
+
3
+ # Default Order
4
+ default_scope :order => "name"
5
+
6
+ # Associations
7
+ has_many :pages
8
+ belongs_to :created_by, :class_name => 'User'
9
+ belongs_to :updated_by, :class_name => 'User'
10
+
11
+ # Validations
12
+ validates_presence_of :name
13
+ validates_uniqueness_of :name
14
+ validates_length_of :name, :maximum => 100
15
+ end
@@ -0,0 +1,140 @@
1
+ module MenuRenderer
2
+
3
+ def exclude(*type_names)
4
+ @excluded_class_names ||= []
5
+ @excluded_class_names.concat(type_names).uniq!
6
+ end
7
+ module_function :exclude
8
+
9
+ def excluded_class_names
10
+ MenuRenderer.instance_variable_get(:@excluded_class_names)
11
+ end
12
+
13
+ module_function :excluded_class_names
14
+ public :excluded_class_names
15
+
16
+ def view=(val)
17
+ @view = val
18
+ end
19
+
20
+ def view
21
+ @view
22
+ end
23
+
24
+ def additional_menu_features?
25
+ @additional_menu_features ||= (menu_renderer_module_name != 'MenuRenderer' && Object.const_defined?(menu_renderer_module_name))
26
+ end
27
+
28
+ def menu_renderer_module_name
29
+ simple_name = self.class_name.to_s.sub('Page','')
30
+ "#{simple_name}MenuRenderer"
31
+ end
32
+
33
+ def menu_renderer_modules
34
+ [Object.const_get(menu_renderer_module_name)]
35
+ end
36
+
37
+ def allowed_child_classes
38
+ (allowed_children_cache.to_s.split(',') - Array(excluded_class_names)).map do |name|
39
+ begin
40
+ name.constantize
41
+ rescue LoadError, NameError => e
42
+ nil
43
+ end
44
+ end.compact
45
+ end
46
+
47
+
48
+ def default_child_item
49
+ menu_item(default_child)
50
+ end
51
+
52
+ def separator_item
53
+ view.content_tag :li, '', :class => 'separator'
54
+ end
55
+
56
+ def child_items
57
+ (allowed_child_classes - [self.class.default_child]).map do |child|
58
+ menu_item(child)
59
+ end
60
+ end
61
+
62
+ def menu_items
63
+ [default_child_item, separator_item] + child_items
64
+ end
65
+
66
+ def menu_list
67
+ view.content_tag :ul, menu_items.join, :class => 'menu', :id => "allowed_children_#{id}"
68
+ end
69
+
70
+ def remove_link
71
+ view.link_to view.image('minus') + ' ' + I18n.t('remove'), view.remove_admin_page_url(self), :class => "action"
72
+ end
73
+
74
+ def remove_option
75
+ remove_link
76
+ end
77
+
78
+ def add_child_disabled?
79
+ allowed_child_classes.size == 0
80
+ end
81
+
82
+ def disabled_add_child_link
83
+ view.content_tag :span, view.image('plus_disabled') + ' ' + I18n.t('add_child'), :class => 'action disabled'
84
+ end
85
+
86
+ def add_child_link
87
+ view.link_to((view.image('plus') + ' ' + I18n.t('add_child')), view.new_admin_page_child_path(self, :page_class => default_child.name), :class => "action")
88
+ end
89
+
90
+ def add_child_link_with_menu_hook
91
+ view.link_to((view.image('plus') + ' ' + I18n.t('add_child')), "#allowed_children_#{id}", :class => "action dropdown")
92
+ end
93
+
94
+ def add_child_menu
95
+ menu_list
96
+ end
97
+
98
+ def add_child_link_with_menu
99
+ add_child_link_with_menu_hook + add_child_menu
100
+ end
101
+
102
+ def add_child_option
103
+ if add_child_disabled?
104
+ disabled_add_child_link
105
+ else
106
+ if allowed_child_classes.size == 1
107
+ add_child_link
108
+ else
109
+ add_child_link_with_menu
110
+ end
111
+ end
112
+ end
113
+
114
+ private
115
+
116
+ def clean_page_description(page_class)
117
+ page_class.description.to_s.strip.gsub(/\t/,'').gsub(/\s+/,' ')
118
+ end
119
+
120
+ def menu_item(child_class)
121
+ view.content_tag(:li, menu_link(child_class))
122
+ end
123
+
124
+ def menu_link(child_class)
125
+ title = clean_page_description(child_class)
126
+ path = view.new_admin_page_child_path(self, :page_class => child_class.name)
127
+ text = link_text_for_child_class(child_class.name)
128
+ view.link_to(text, path, :title => title)
129
+ end
130
+
131
+ def link_text_for_child_class(given_class_name)
132
+ translation_key = if given_class_name == 'Page' || given_class_name.blank?
133
+ 'normal_page'
134
+ else
135
+ given_class_name.sub('Page','').underscore
136
+ end
137
+ fallback = given_class_name == 'Page' ? 'Page' : given_class_name.sub('Page','').titleize
138
+ I18n.t(translation_key, :default => fallback)
139
+ end
140
+ end
@@ -0,0 +1,377 @@
1
+ require 'acts_as_tree'
2
+
3
+ class Page < ActiveRecord::Base
4
+
5
+ class MissingRootPageError < StandardError
6
+ def initialize(message = 'Database missing root page'); super end
7
+ end
8
+
9
+ # Callbacks
10
+ before_save :update_virtual, :update_status, :set_allowed_children_cache
11
+
12
+ # Associations
13
+ acts_as_tree :order => 'virtual DESC, title ASC'
14
+ has_many :parts, :class_name => 'PagePart', :order => 'id', :dependent => :destroy
15
+ accepts_nested_attributes_for :parts, :allow_destroy => true
16
+ has_many :fields, :class_name => 'PageField', :order => 'id', :dependent => :destroy
17
+ accepts_nested_attributes_for :fields, :allow_destroy => true
18
+ belongs_to :layout
19
+ belongs_to :created_by, :class_name => 'User'
20
+ belongs_to :updated_by, :class_name => 'User'
21
+
22
+ # Validations
23
+ validates_presence_of :title, :slug, :breadcrumb, :status_id
24
+
25
+ validates_length_of :title, :maximum => 255
26
+ validates_length_of :slug, :maximum => 100
27
+ validates_length_of :breadcrumb, :maximum => 160
28
+
29
+ validates_format_of :slug, :with => %r{^([-_.A-Za-z0-9]*|/)$}
30
+ validates_uniqueness_of :slug, :scope => :parent_id
31
+
32
+ validate :valid_class_name
33
+
34
+ include TrustyCms::Taggable
35
+ include StandardTags
36
+ include DeprecatedTags
37
+ include Annotatable
38
+
39
+ annotate :description
40
+ attr_accessor :request, :response, :pagination_parameters
41
+ class_attribute :default_child
42
+ self.default_child = self
43
+
44
+ set_inheritance_column :class_name
45
+
46
+ def layout_with_inheritance
47
+ unless layout_without_inheritance
48
+ parent.layout if parent?
49
+ else
50
+ layout_without_inheritance
51
+ end
52
+ end
53
+ alias_method_chain :layout, :inheritance
54
+
55
+ def description
56
+ self["description"]
57
+ end
58
+
59
+ def description=(value)
60
+ self["description"] = value
61
+ end
62
+
63
+ def cache?
64
+ true
65
+ end
66
+
67
+ def child_path(child)
68
+ clean_path(path + '/' + child.slug)
69
+ end
70
+ alias_method :child_url, :child_path
71
+
72
+ def part(name)
73
+ if new_record? or parts.to_a.any?(&:new_record?)
74
+ parts.to_a.find {|p| p.name == name.to_s }
75
+ else
76
+ parts.find_by_name name.to_s
77
+ end
78
+ end
79
+
80
+ def has_part?(name)
81
+ !part(name).nil?
82
+ end
83
+
84
+ def has_or_inherits_part?(name)
85
+ has_part?(name) || inherits_part?(name)
86
+ end
87
+
88
+ def inherits_part?(name)
89
+ !has_part?(name) && self.ancestors.any? { |page| page.has_part?(name) }
90
+ end
91
+
92
+ def field(name)
93
+ if new_record? or fields.any?(&:new_record?)
94
+ fields.detect { |f| f.name.downcase == name.to_s.downcase }
95
+ else
96
+ fields.find_by_name name.to_s
97
+ end
98
+ end
99
+
100
+ def published?
101
+ status == Status[:published]
102
+ end
103
+
104
+ def scheduled?
105
+ status == Status[:scheduled]
106
+ end
107
+
108
+ def status
109
+ Status.find(self.status_id)
110
+ end
111
+
112
+ def status=(value)
113
+ self.status_id = value.id
114
+ end
115
+
116
+ def path
117
+ if parent?
118
+ parent.child_path(self)
119
+ else
120
+ clean_path(slug)
121
+ end
122
+ end
123
+ alias_method :url, :path
124
+
125
+ def process(request, response)
126
+ @request, @response = request, response
127
+ set_response_headers(@response)
128
+ @response.body = render
129
+ @response.status = response_code
130
+ end
131
+
132
+ def headers
133
+ # Return a blank hash that child classes can override or merge
134
+ { }
135
+ end
136
+
137
+ def set_response_headers(response)
138
+ set_content_type(response)
139
+ headers.each { |k,v| response.headers[k] = v }
140
+ end
141
+ private :set_response_headers
142
+
143
+ def set_content_type(response)
144
+ if layout
145
+ content_type = layout.content_type.to_s.strip
146
+ if content_type.present?
147
+ response.headers['Content-Type'] = content_type
148
+ end
149
+ end
150
+ end
151
+ private :set_content_type
152
+
153
+ def response_code
154
+ 200
155
+ end
156
+
157
+ def render
158
+ if layout
159
+ parse_object(layout)
160
+ else
161
+ render_part(:body)
162
+ end
163
+ end
164
+
165
+ def render_part(part_name)
166
+ part = part(part_name)
167
+ if part
168
+ parse_object(part)
169
+ else
170
+ ''
171
+ end
172
+ end
173
+
174
+ def render_snippet(snippet)
175
+ parse_object(snippet)
176
+ end
177
+
178
+ def find_by_path(path, live = true, clean = true)
179
+ return nil if virtual?
180
+ path = clean_path(path) if clean
181
+ my_path = self.path
182
+ if (my_path == path) && (not live or published?)
183
+ self
184
+ elsif (path =~ /^#{Regexp.quote(my_path)}([^\/]*)/)
185
+ slug_child = children.find_by_slug($1)
186
+ if slug_child
187
+ found = slug_child.find_by_url(path, live, clean) # TODO: set to find_by_path after deprecation
188
+ return found if found
189
+ end
190
+ children.each do |child|
191
+ found = child.find_by_url(path, live, clean) # TODO: set to find_by_path after deprecation
192
+ return found if found
193
+ end
194
+ file_not_found_types = ([FileNotFoundPage] + FileNotFoundPage.descendants)
195
+ file_not_found_names = file_not_found_types.collect { |x| x.name }
196
+ condition = (['class_name = ?'] * file_not_found_names.length).join(' or ')
197
+ condition = "status_id = #{Status[:published].id} and (#{condition})" if live
198
+ children.where([condition] + file_not_found_names).first
199
+ end
200
+ end
201
+ alias_method :find_by_url, :find_by_path
202
+
203
+ def update_status
204
+ self.published_at = Time.zone.now if published? && self.published_at == nil
205
+
206
+ if self.published_at != nil && (published? || scheduled?)
207
+ self[:status_id] = Status[:scheduled].id if self.published_at > Time.zone.now
208
+ self[:status_id] = Status[:published].id if self.published_at <= Time.zone.now
209
+ end
210
+
211
+ true
212
+ end
213
+
214
+ def to_xml(options={}, &block)
215
+ super(options.reverse_merge(:include => :parts), &block)
216
+ end
217
+
218
+ def default_child
219
+ self.class.default_child
220
+ end
221
+
222
+ def allowed_children_lookup
223
+ [default_child, *Page.descendants.sort_by(&:name)].uniq
224
+ end
225
+
226
+ def set_allowed_children_cache
227
+ self.allowed_children_cache = allowed_children_lookup.collect(&:name).join(',')
228
+ end
229
+
230
+ class << self
231
+
232
+ def root
233
+ find_by_parent_id(nil)
234
+ end
235
+
236
+ def find_by_path(path, live = true)
237
+ raise MissingRootPageError unless root
238
+ root.find_by_path(path, live)
239
+ end
240
+ def find_by_url(*args)
241
+ ActiveSupport::Deprecation.warn("`find_by_url' has been deprecated; use `find_by_path' instead.", caller)
242
+ find_by_path(*args)
243
+ end
244
+
245
+ def date_column_names
246
+ self.columns.collect{|c| c.name if c.sql_type =~ /(date|time)/}.compact
247
+ end
248
+
249
+ def display_name(string = nil)
250
+ if string
251
+ @display_name = string
252
+ else
253
+ @display_name ||= begin
254
+ n = name.to_s
255
+ n.sub!(/^(.+?)Page$/, '\1')
256
+ n.gsub!(/([A-Z])/, ' \1')
257
+ n.strip
258
+ end
259
+ end
260
+ @display_name = @display_name + " - not installed" if missing? && @display_name !~ /not installed/
261
+ @display_name
262
+ end
263
+
264
+ def display_name=(string)
265
+ display_name(string)
266
+ end
267
+
268
+ def load_subclasses
269
+ ([TRUSTY_CMS_ROOT] + TrustyCms::Extension.descendants.map(&:root)).each do |path|
270
+ Dir["#{path}/app/models/*_page.rb"].each do |page|
271
+ $1.camelize.constantize if page =~ %r{/([^/]+)\.rb}
272
+ end
273
+ end
274
+ if ActiveRecord::Base.connection.tables.include?('pages') && Page.column_names.include?('class_name') # Assume that we have bootstrapped
275
+ Page.connection.select_values("SELECT DISTINCT class_name FROM pages WHERE class_name <> '' AND class_name IS NOT NULL").each do |p|
276
+ begin
277
+ p.constantize
278
+ rescue NameError, LoadError
279
+ eval(%Q{class #{p} < Page; acts_as_tree; def self.missing?; true end end}, TOPLEVEL_BINDING)
280
+ end
281
+ end
282
+ end
283
+ end
284
+
285
+ def new_with_defaults(config = TrustyCms::Config)
286
+ page = new
287
+ page.parts.concat default_page_parts(config)
288
+ page.fields.concat default_page_fields(config)
289
+ default_status = config['defaults.page.status']
290
+ page.status = Status[default_status] if default_status
291
+ page
292
+ end
293
+
294
+ def is_descendant_class_name?(class_name)
295
+ (Page.descendants.map(&:to_s) + [nil, "", "Page"]).include?(class_name)
296
+ end
297
+
298
+ def descendant_class(class_name)
299
+ raise ArgumentError.new("argument must be a valid descendant of Page") unless is_descendant_class_name?(class_name)
300
+ if ["", nil, "Page"].include?(class_name)
301
+ Page
302
+ else
303
+ class_name.constantize
304
+ end
305
+ end
306
+
307
+ def missing?
308
+ false
309
+ end
310
+
311
+ private
312
+
313
+ def default_page_parts(config = TrustyCms::Config)
314
+ default_parts = config['defaults.page.parts'].to_s.strip.split(/\s*,\s*/)
315
+ default_parts.map do |name|
316
+ PagePart.new(:name => name, :filter_id => config['defaults.page.filter'])
317
+ end
318
+ end
319
+
320
+ def default_page_fields(config = TrustyCms::Config)
321
+ default_fields = config['defaults.page.fields'].to_s.strip.split(/\s*,\s*/)
322
+ default_fields.map do |name|
323
+ PageField.new(:name => name)
324
+ end
325
+ end
326
+ end
327
+
328
+ private
329
+
330
+ def valid_class_name
331
+ unless Page.is_descendant_class_name?(class_name)
332
+ errors.add :class_name, "must be set to a valid descendant of Page"
333
+ end
334
+ end
335
+
336
+ def attributes_protected_by_default
337
+ super - [self.class.inheritance_column]
338
+ end
339
+
340
+ def update_virtual
341
+ unless self.class == Page.descendant_class(class_name)
342
+ self.virtual = Page.descendant_class(class_name).new.virtual?
343
+ else
344
+ self.virtual = virtual?
345
+ end
346
+ true
347
+ end
348
+
349
+ def clean_path(path)
350
+ "/#{ path.to_s.strip }/".gsub(%r{//+}, '/')
351
+ end
352
+ alias_method :clean_url, :clean_path
353
+
354
+ def parent?
355
+ !parent.nil?
356
+ end
357
+
358
+ def lazy_initialize_parser_and_context
359
+ unless @parser and @context
360
+ @context = PageContext.new(self)
361
+ @parser = Radius::Parser.new(@context, :tag_prefix => 'r')
362
+ end
363
+ @parser
364
+ end
365
+
366
+ def parse(text)
367
+ lazy_initialize_parser_and_context.parse(text)
368
+ end
369
+
370
+ def parse_object(object)
371
+ text = object.content || ''
372
+ text = parse(text)
373
+ text = object.filter.filter(text) if object.respond_to? :filter_id
374
+ text
375
+ end
376
+
377
+ end
@@ -0,0 +1,53 @@
1
+ class PageContext < Radius::Context
2
+
3
+ attr_reader :page
4
+
5
+ def initialize(page)
6
+ super
7
+ @page = page
8
+ globals.page = @page
9
+ page.tags.each do |name|
10
+ define_tag(name) { |tag_binding| page.render_tag(name, tag_binding) }
11
+ end
12
+ end
13
+
14
+ def dup
15
+ rv = self.class.new(page)
16
+ rv.globals = globals.dup
17
+ rv.definitions = definitions.dup
18
+ rv
19
+ end
20
+
21
+ def render_tag(name, attributes = {}, &block)
22
+ binding = @tag_binding_stack.last
23
+ locals = binding ? binding.locals : globals
24
+ set_process_variables(locals.page)
25
+ super
26
+ rescue Exception => e
27
+ raise e if raise_errors?
28
+ @tag_binding_stack.pop unless @tag_binding_stack.last == binding
29
+ render_error_message(e.message)
30
+ end
31
+
32
+ def tag_missing(name, attributes = {}, &block)
33
+ super
34
+ rescue Radius::UndefinedTagError => e
35
+ raise StandardTags::TagError.new(e.message)
36
+ end
37
+
38
+ private
39
+
40
+ def render_error_message(message)
41
+ "<div><strong>#{message}</strong></div>"
42
+ end
43
+
44
+ def set_process_variables(page)
45
+ page.request ||= @page.request
46
+ page.response ||= @page.response
47
+ end
48
+
49
+ def raise_errors?
50
+ Rails.env != 'production'
51
+ end
52
+
53
+ end
@@ -0,0 +1,3 @@
1
+ class PageField < ActiveRecord::Base
2
+ validates_presence_of :name
3
+ end
@@ -0,0 +1,20 @@
1
+ class PagePart < ActiveRecord::Base
2
+
3
+ # Default Order
4
+ default_scope :order => 'name'
5
+
6
+ # Associations
7
+ belongs_to :page
8
+
9
+ # Validations
10
+ validates_presence_of :name
11
+ validates_length_of :name, :maximum => 100
12
+ validates_length_of :filter_id, :maximum => 25, :allow_nil => true
13
+
14
+ object_id_attr :filter, TextFilter
15
+
16
+ def after_initialize
17
+ self.filter_id ||= TrustyCms::Config['defaults.page.filter'] if new_record?
18
+ end
19
+
20
+ end