trusty-cms 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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