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