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,142 @@
1
+ module TrustyCms
2
+ class Config
3
+ class Definition
4
+
5
+ attr_reader :empty, :default, :type, :notes, :validate_with, :select_from, :allow_blank, :allow_display, :allow_change, :units, :definer
6
+
7
+ # Configuration 'definitions' are metadata held in memory that add restriction and description to individual config entries.
8
+ #
9
+ # By default radiant's configuration machinery is open and ad-hoc: config items are just globally-accessible variables.
10
+ # They're created when first mentioned and then available in all parts of the application. The definition mechanism is a way
11
+ # to place limits on that behavior. It allows you to protect a config entry, to specify the values it can take and to
12
+ # validate it when it changes. In the next update it will also allow you to declare that
13
+ # a config item is global or site-specific.
14
+ #
15
+ # The actual defining is done by TrustyCms::Config#define and usually in a block like this:
16
+ #
17
+ # TrustyCms::Config.prepare do |config|
18
+ # config.namespace('users', :allow_change => true) do |users|
19
+ # users.define 'allow_password_reset?', :label => 'Allow password reset?'
20
+ # end
21
+ # end
22
+ #
23
+ # See the method documentation in TrustyCms::Config for options and conventions.
24
+ #
25
+ def initialize(options={})
26
+ [:empty, :default, :type, :notes, :validate_with, :select_from, :allow_blank, :allow_change, :allow_display, :units, :definer].each do |attribute|
27
+ instance_variable_set "@#{attribute}".to_sym, options[attribute]
28
+ end
29
+ end
30
+
31
+ # Returns true if the definition included an :empty flag, which should only be the case for the blank, unrestricting
32
+ # definitions created when an undefined config item is set or got.
33
+ #
34
+ def empty?
35
+ !!empty
36
+ end
37
+
38
+ # Returns true if the definition included a :type => :boolean parameter. Config entries that end in '?' are automatically
39
+ # considered boolean, whether a type is declared or not. config.boolean? may therefore differ from config.definition.boolean?
40
+ #
41
+ def boolean?
42
+ type == :boolean
43
+ end
44
+
45
+ # Returns true if the definition included a :select_from parameter (either as list or proc).
46
+ #
47
+ def selector?
48
+ !select_from.blank?
49
+ end
50
+
51
+ # Returns true if the definition included a :type => :integer parameter
52
+ def integer?
53
+ type == :integer
54
+ end
55
+
56
+ # Returns the list of possible values for this config entry in a form suitable for passing to options_for_select.
57
+ # if :select_from is a proc it is called first with no arguments and its return value passed through.
58
+ #
59
+ def selection
60
+ if selector?
61
+ choices = select_from
62
+ choices = choices.call if choices.respond_to? :call
63
+ choices = normalize_selection(choices)
64
+ choices.unshift ["",""] if allow_blank?
65
+ choices
66
+ end
67
+ end
68
+
69
+ # in definitions we accept anything that options_for_select would normally take
70
+ # here we standardises on an options array-of-arrays so that it's easier to validate input
71
+ #
72
+ def normalize_selection(choices)
73
+ choices = choices.to_a if Hash === choices
74
+ choices = choices.collect{|c| (c.is_a? Array) ? c : [c,c]}
75
+ end
76
+
77
+ # If the config item is a selector and :select_from specifies [name, value] pairs (as hash or array),
78
+ # this will return the name corresponding to the currently selected value.
79
+ #
80
+ def selected(value)
81
+ if value && selector? && pair = selection.find{|s| s.last == value}
82
+ pair.first
83
+ end
84
+ end
85
+
86
+ # Checks the supplied value against the validation rules for this definition.
87
+ # There are several ways in which validations might be defined or implied:
88
+ # * if :validate_with specifies a block, the setting object is passed to the block
89
+ # * if :type is :integer, we test that the supplied string resolves to a valid integer
90
+ # * if the config item is a selector we test that its value is one of the permitted options
91
+ # * if :allow_blank has been set to false, we test that the value is not blank
92
+ #
93
+ def validate(setting)
94
+ if allow_blank?
95
+ return if setting.value.blank?
96
+ else
97
+ setting.errors.add :value, :blank if setting.value.blank?
98
+ end
99
+ if validate_with.is_a? Proc
100
+ validate_with.call(setting)
101
+ end
102
+ if selector?
103
+ setting.errors.add :value, :not_permitted unless selectable?(setting.value)
104
+ end
105
+ if integer?
106
+ Integer(setting.value) rescue setting.errors.add :value, :not_a_number
107
+ end
108
+ end
109
+
110
+ # Returns true if the value is one of the permitted selections. Not case-sensitive.
111
+ def selectable?(value)
112
+ return true unless selector?
113
+ selection.map(&:last).map(&:downcase).include?(value.downcase)
114
+ end
115
+
116
+ # Returns true unless :allow_blank has been explicitly set to false. Defaults to true.
117
+ # A config item that does not allow_blank must be set or it will not be valid.
118
+ def allow_blank?
119
+ true unless allow_blank == false
120
+ end
121
+
122
+ # Returns true unless :allow_change has been explicitly set to false. Defaults to true.
123
+ # A config item that is not settable cannot be changed in the running application.
124
+ def settable?
125
+ true unless allow_change == false
126
+ end
127
+
128
+ # Returns true unless :allow_change has been explicitly set to false. Defaults to true.
129
+ # A config item that is not visible cannot be displayed in a radius tag.
130
+ def visible?
131
+ true unless allow_display == false
132
+ end
133
+
134
+ # Returns true if :allow_display has been explicitly set to false. Defaults to true.
135
+ def hidden?
136
+ true if allow_display == false
137
+ end
138
+
139
+ end
140
+ end
141
+ end
142
+
@@ -0,0 +1,10 @@
1
+ module TrustyCms
2
+ class Engine < Rails::Engine
3
+ isolate_namespace TrustyCms
4
+
5
+ config.generators do |g|
6
+ g.test_framework :rspec
7
+ g.integration_tool :cucumber
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,395 @@
1
+ require 'active_resource'
2
+ require 'tmpdir'
3
+ require 'fileutils'
4
+ require 'rake'
5
+
6
+ module Registry
7
+ class Extension < ActiveResource::Base
8
+ self.site = ENV['REGISTRY_URL'] || "http://ext.radiantcms.org/"
9
+
10
+ def install
11
+ Registry.const_get(install_type).new(self).install
12
+ end
13
+
14
+ def uninstall
15
+ Uninstaller.new(self).uninstall
16
+ end
17
+
18
+ def inspect
19
+ %{
20
+ Name: #{name}
21
+ Description:
22
+ #{description}
23
+ Author: #{author.name} <#{author.email}>
24
+ Source code: #{repository_url}
25
+ Download: #{download_url}
26
+ Install type: #{install_type}
27
+ Supports: TrustyCms #{supports_radiant_version}
28
+ }.strip
29
+ end
30
+ end
31
+
32
+ class Action
33
+ def rake(command)
34
+ puts "rake #{command}"
35
+ puts `rake #{command} Rails.env=#{Rails.env}` if tasks_include? command
36
+ end
37
+
38
+ def tasks_include?(command)
39
+ command = command.split(':')
40
+ if command.length > 1 && command[0..1] == ['radiant','extensions']
41
+ extension = command[2]
42
+ task = "radiant:extensions:#{extension}:#{command[3].split[0]}"
43
+ else
44
+ extension = task = command[0]
45
+ end
46
+ rake_file = File.join(Rails.root, 'vendor', 'extensions', extension) + '/lib/tasks/' + extension + '_extension_tasks.rake'
47
+ load rake_file if File.exist? rake_file
48
+ tasks = Rake.application.tasks.map(&:name)
49
+ tasks.include? task
50
+ end
51
+
52
+ def file_utils
53
+ FileUtils
54
+ end
55
+
56
+ delegate :cd, :cp_r, :rm_r, :to => :file_utils
57
+ end
58
+
59
+ class Installer < Action
60
+ attr_accessor :url, :path, :name
61
+ def initialize(url, name)
62
+ self.url, self.name = url, name
63
+ end
64
+
65
+ def install
66
+ copy_to_vendor_extensions
67
+ migrate
68
+ update
69
+ end
70
+
71
+ def copy_to_vendor_extensions
72
+ cp_r(self.path, File.expand_path(File.join(Rails.root, 'vendor', 'extensions', name)))
73
+ rm_r(self.path)
74
+ end
75
+
76
+ def migrate
77
+ rake "radiant:extensions:#{name}:migrate"
78
+ end
79
+
80
+ def update
81
+ rake "radiant:extensions:#{name}:update"
82
+ end
83
+ end
84
+
85
+ class Uninstaller < Action
86
+ attr_accessor :name
87
+ def initialize(extension)
88
+ self.name = extension.name
89
+ end
90
+
91
+ def uninstall
92
+ migrate_down
93
+ remove_extension_directory
94
+ end
95
+
96
+ def migrate_down
97
+ rake "radiant:extensions:#{name}:migrate VERSION=0"
98
+ end
99
+
100
+ def remove_extension_directory
101
+ rm_r(File.join(Rails.root, 'vendor', 'extensions', name))
102
+ end
103
+ end
104
+
105
+ class Checkout < Installer
106
+ def initialize(extension)
107
+ super(extension.repository_url, extension.name)
108
+ end
109
+
110
+ def checkout_command
111
+ raise "Not Implemented!"
112
+ end
113
+
114
+ def install
115
+ checkout
116
+ super
117
+ end
118
+
119
+ def checkout
120
+ self.path = File.join(Dir.tmpdir, name)
121
+ cd(Dir.tmpdir) { system "#{checkout_command}" }
122
+ end
123
+ end
124
+
125
+ class Download < Installer
126
+ def initialize(extension)
127
+ super(extension.download_url, extension.name)
128
+ end
129
+
130
+ def install
131
+ download
132
+ unpack
133
+ super
134
+ end
135
+
136
+ def unpack
137
+ raise "Not Implemented!"
138
+ end
139
+
140
+ def filename
141
+ File.basename(self.url)
142
+ end
143
+
144
+ def download
145
+ require 'open-uri'
146
+ File.open(File.join(Dir.tmpdir, self.filename), 'w') {|f| f.write open(self.url).read }
147
+ end
148
+ end
149
+
150
+ class Git < Checkout
151
+ def project_in_git?
152
+ @in_git ||= File.directory?(".git")
153
+ end
154
+
155
+ def checkout_command
156
+ "git clone #{url} #{name}"
157
+ end
158
+
159
+ def checkout
160
+ if project_in_git?
161
+ system "git submodule add #{url} vendor/extensions/#{name}"
162
+ cd(File.join('vendor', 'extensions', name)) do
163
+ system "git submodule init && git submodule update"
164
+ end
165
+ else
166
+ super
167
+ cd(path) do
168
+ system "git submodule init && git submodule update"
169
+ end
170
+ end
171
+ end
172
+
173
+ def copy_to_vendor_extensions
174
+ super unless project_in_git?
175
+ end
176
+ end
177
+
178
+ class Subversion < Checkout
179
+ def checkout_command
180
+ "svn checkout #{url} #{name}"
181
+ end
182
+ end
183
+
184
+ class Gem < Download
185
+ def gem_name(name)
186
+ name.gsub(/-\d+\.\d+\.\d+(.+)?\.gem/, '')
187
+ end
188
+
189
+ def download
190
+ # Don't download the gem if it's already installed
191
+ extension = gem_name(filename)
192
+ begin
193
+ gem extension
194
+ rescue ::Gem::LoadError
195
+ super
196
+ `gem install #{extension}`
197
+ end
198
+ end
199
+
200
+ def unpack
201
+ output = nil
202
+ cd(Dir.tmpdir) do
203
+ output = `gem unpack #{gem_name(filename)}`
204
+ end
205
+ self.path = output.match(/'(.*)'/)[1]
206
+ end
207
+ end
208
+
209
+ class Tarball < Download
210
+ def filename
211
+ "#{self.name}.tar"
212
+ end
213
+
214
+ def unpack
215
+ output = nil
216
+ cd(Dir.tmpdir) { output = `tar xvf #{filename}` }
217
+ self.path = File.join(Dir.tmpdir, output.split(/\n/).first.split('/').first)
218
+ end
219
+ end
220
+
221
+ class Gzip < Tarball
222
+ def filename
223
+ @unpacked ? super : "#{self.name}.tar.gz"
224
+ end
225
+
226
+ def unpack
227
+ cd(Dir.tmpdir) { system "gunzip #{self.filename}" }
228
+ @unpacked = true
229
+ super
230
+ end
231
+ end
232
+
233
+ class Bzip2 < Tarball
234
+ def filename
235
+ @unpacked ? super : "#{self.name}.tar.bz2"
236
+ end
237
+
238
+ def unpack
239
+ cd(Dir.tmpdir) { system "bunzip2 #{self.filename}" }
240
+ @unpacked = true
241
+ super
242
+ end
243
+ end
244
+
245
+ class Zip < Download
246
+ def unpack
247
+ output = nil
248
+ cd(Dir.tmpdir) { output = `unzip #{filename} -d #{name}` }
249
+ self.path = File.join(Dir.tmpdir, name)
250
+ end
251
+ end
252
+ end
253
+
254
+ module TrustyCms
255
+ class Extension
256
+ module Script
257
+ class << self
258
+ def execute(args)
259
+ command = args.shift || 'help'
260
+ begin
261
+ const_get(command.camelize).new(args)
262
+ rescue ArgumentError => e
263
+ puts e.message
264
+ Help.new [command]
265
+ end
266
+ end
267
+ end
268
+
269
+ module Util
270
+ attr_accessor :extension_name, :extension
271
+
272
+ def to_extension_name(string)
273
+ string.to_s.underscore
274
+ end
275
+
276
+ def installed?
277
+ path_match = Regexp.compile("(^|/|\\\\)#{extension_name}$")
278
+ extension_paths.any? {|p| p =~ path_match }
279
+ end
280
+
281
+ def registered?
282
+ self.extension
283
+ end
284
+
285
+ def extension_paths
286
+ paths = [Rails.root, TRUSTY_CMS_ROOT].uniq.map { |p| Dir["#{p}/vendor/extensions/*"] }
287
+ paths.unshift Dir["#{TRUSTY_CMS_ROOT}/test/fixtures/extensions/*"] if Rails.env == 'test' #nasty
288
+ paths.flatten
289
+ end
290
+
291
+ def load_extensions
292
+ Registry::Extension.find(:all)
293
+ end
294
+
295
+ def find_extension
296
+ self.extension = load_extensions.find{|e| e.name == self.extension_name }
297
+ end
298
+ end
299
+
300
+ class Install
301
+ include Util
302
+
303
+ def initialize(args=[])
304
+ raise ArgumentError, "You must specify an extension to install." if args.blank?
305
+ self.extension_name = to_extension_name(args.shift)
306
+ if installed?
307
+ puts "#{extension_name} is already installed."
308
+ else
309
+ find_extension
310
+ if registered?
311
+ extension.install
312
+ else
313
+ raise ArgumentError, "#{extension_name} is not available in the registry."
314
+ end
315
+ end
316
+ end
317
+ end
318
+
319
+ class Uninstall
320
+ include Util
321
+
322
+ def initialize(args=[])
323
+ raise ArgumentError, "You must specify an extension to uninstall." if args.blank?
324
+ self.extension_name = to_extension_name(args.shift)
325
+ if installed?
326
+ find_extension && extension.uninstall
327
+ else
328
+ puts "#{extension_name} is not installed."
329
+ end
330
+ end
331
+ end
332
+
333
+ class Info
334
+ include Util
335
+
336
+ def initialize(args=[])
337
+ raise ArgumentError, "You must specify an extension to get info on" if args.blank?
338
+ self.extension_name = to_extension_name(args.shift)
339
+ find_extension and puts extension.inspect
340
+ end
341
+ end
342
+
343
+ class Help
344
+ def initialize(args=[])
345
+ command = args.shift
346
+ command = 'help' unless self.class.instance_methods(false).collect {|im| im.to_s}.include?(command.to_s)
347
+ send(command)
348
+ end
349
+
350
+ def help
351
+ $stdout.puts %{Usage: script/extension command [arguments]
352
+
353
+ Available commands:
354
+ #{command_names}
355
+
356
+ For help on an individual command:
357
+ script/extension help command
358
+
359
+ You may install extensions from another registry by setting the REGISTRY_URL
360
+ By default the REGISTRY_URL is set to http://ext.radiantcms.org
361
+
362
+ Code for the registry application may be found at:
363
+ http://github.com/radiant/radiant-extension-registry/
364
+ }
365
+ end
366
+
367
+ def install
368
+ $stdout.puts %{Usage: script/extension install extension_name
369
+
370
+ Installs an extension from information in the global registry.
371
+ }
372
+ end
373
+
374
+ def uninstall
375
+ $stdout.puts %{Usage: script/extension uninstall extension_name
376
+
377
+ Removes a previously installed extension from the current project.
378
+ }
379
+ end
380
+
381
+ def info
382
+ $stdout.puts %{Usage: script/extension info extension_name
383
+
384
+ Displays registry information about the extension.
385
+ }
386
+ end
387
+
388
+ private
389
+ def command_names
390
+ (TrustyCms::Extension::Script.constants - ['Util']).sort.map {|n| n.to_s.underscore }.join(", ")
391
+ end
392
+ end
393
+ end
394
+ end
395
+ end
@@ -0,0 +1,146 @@
1
+ require 'annotatable'
2
+ require 'simpleton'
3
+ require 'trusty_cms/admin_ui'
4
+
5
+ module TrustyCms
6
+ class Extension
7
+ include Simpleton
8
+ include Annotatable
9
+
10
+ annotate :version, :description, :url, :extension_name, :path
11
+
12
+ attr_writer :active
13
+
14
+ def active?
15
+ @active
16
+ end
17
+
18
+ def root
19
+ path.to_s
20
+ end
21
+
22
+ def migrated?
23
+ migrator.new(:up, migrations_path).pending_migrations.empty?
24
+ end
25
+
26
+ def enabled?
27
+ active? and migrated?
28
+ end
29
+
30
+ # Conventional plugin-like routing
31
+ def routed?
32
+ File.exist?(routing_file)
33
+ end
34
+
35
+ def migrations_path
36
+ File.join(self.root, 'db', 'migrate')
37
+ end
38
+
39
+ def migrates_from
40
+ @migrates_from ||= {}
41
+ end
42
+
43
+ def routing_file
44
+ File.join(self.root, 'config', 'routes.rb')
45
+ end
46
+
47
+ def load_initializers
48
+ Dir["#{self.root}/config/initializers/**/*.rb"].sort.each do |initializer|
49
+ load(initializer)
50
+ end
51
+ end
52
+
53
+ def migrator
54
+ unless @migrator
55
+ extension = self
56
+ @migrator = Class.new(ExtensionMigrator){ self.extension = extension }
57
+ end
58
+ @migrator
59
+ end
60
+
61
+ def admin
62
+ AdminUI.instance
63
+ end
64
+
65
+ def tab(name, options={}, &block)
66
+ @the_tab = admin.nav[name]
67
+ unless @the_tab
68
+ @the_tab = TrustyCms::AdminUI::NavTab.new(name)
69
+ before = options.delete(:before)
70
+ after = options.delete(:after)
71
+ tab_name = before || after
72
+ tab_object = admin.nav[tab_name]
73
+ if tab_object
74
+ index = admin.nav.index(tab_object)
75
+ index += 1 unless before
76
+ admin.nav.insert(index, @the_tab)
77
+ else
78
+ admin.nav << @the_tab
79
+ end
80
+ end
81
+ if block_given?
82
+ block.call(@the_tab)
83
+ end
84
+ return @the_tab
85
+ end
86
+ alias :add_tab :tab
87
+
88
+ def add_item(*args)
89
+ @the_tab.add_item(*args)
90
+ end
91
+
92
+ # Determine if another extension is installed and up to date.
93
+ #
94
+ # if MyExtension.extension_enabled?(:third_party)
95
+ # ThirdPartyExtension.extend(MyExtension::IntegrationPoints)
96
+ # end
97
+ def extension_enabled?(extension)
98
+ begin
99
+ extension = (extension.to_s.camelcase + 'Extension').constantize
100
+ extension.enabled?
101
+ rescue NameError
102
+ false
103
+ end
104
+ end
105
+
106
+ class << self
107
+
108
+ def activate_extension
109
+ return if instance.active?
110
+ instance.activate if instance.respond_to? :activate
111
+ TrustyCms::Application.config.paths["config/routes"].concat([instance.routing_file]) if instance.routed?
112
+ TrustyCms::Application.reload_routes!
113
+ instance.active = true
114
+ end
115
+ alias :activate :activate_extension
116
+
117
+ def deactivate_extension
118
+ return unless instance.active?
119
+ instance.active = false
120
+ instance.deactivate if instance.respond_to? :deactivate
121
+ end
122
+ alias :deactivate :deactivate_extension
123
+
124
+ def inherited(subclass)
125
+ subclass.extension_name = subclass.name.to_name('Extension')
126
+ end
127
+
128
+ def migrate_from(extension_name, until_migration=nil)
129
+ instance.migrates_from[extension_name] = until_migration
130
+ end
131
+
132
+ # Expose the configuration object for init hooks
133
+ # class MyExtension < ActiveRecord::Base
134
+ # extension_config do |config|
135
+ # config.after_initialize do
136
+ # run_something
137
+ # end
138
+ # end
139
+ # end
140
+ def extension_config(&block)
141
+ yield Rails.configuration
142
+ end
143
+
144
+ end
145
+ end
146
+ end