adva-core 0.0.3 → 0.0.4

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 (285) hide show
  1. data/app/controllers/admin/base_controller.rb +20 -0
  2. data/app/controllers/admin/pages_controller.rb +7 -0
  3. data/app/controllers/admin/sections_controller.rb +22 -0
  4. data/app/controllers/admin/sites_controller.rb +16 -0
  5. data/app/controllers/articles_controller.rb +3 -0
  6. data/app/controllers/base_controller.rb +18 -0
  7. data/app/controllers/installations_controller.rb +28 -0
  8. data/app/controllers/pages_controller.rb +2 -0
  9. data/app/controllers/sections_controller.rb +3 -0
  10. data/app/helpers/form_helper.rb +13 -0
  11. data/app/helpers/sections_helper.rb +7 -0
  12. data/app/helpers/url_helper.rb +18 -0
  13. data/app/models/account.rb +3 -0
  14. data/app/models/article.rb +2 -0
  15. data/app/models/content.rb +4 -0
  16. data/app/models/page.rb +9 -0
  17. data/app/models/section.rb +49 -0
  18. data/app/models/site.rb +24 -0
  19. data/app/views/admin/contents/_menu.html.rb +17 -0
  20. data/app/views/admin/pages/_menu.html.rb +10 -0
  21. data/app/views/admin/pages/new.html.rb +19 -0
  22. data/app/views/admin/pages/show.html.rb +25 -0
  23. data/app/views/admin/sections/_menu.html.rb +45 -0
  24. data/app/views/admin/sections/_section.html.rb +7 -0
  25. data/app/views/admin/sections/_select_type.html.rb +16 -0
  26. data/app/views/admin/sections/index.html.rb +28 -0
  27. data/app/views/admin/sites/_menu.html.rb +2 -0
  28. data/app/views/admin/sites/edit.html.rb +22 -0
  29. data/app/views/admin/sites/index.html.rb +24 -0
  30. data/app/views/admin/sites/new.html.rb +39 -0
  31. data/app/views/admin/sites/show.html.rb +7 -0
  32. data/app/views/installations/new.html.rb +39 -0
  33. data/app/views/installations/show.html.rb +9 -0
  34. data/app/views/layouts/admin.rb +55 -0
  35. data/app/views/layouts/admin/_header.rb +48 -0
  36. data/app/views/layouts/admin/_tabs.html.rb +18 -0
  37. data/app/views/layouts/admin/_top.rb +62 -0
  38. data/app/views/layouts/base.rb +64 -0
  39. data/app/views/layouts/default.rb +46 -0
  40. data/app/views/layouts/default/_menu.rb +19 -0
  41. data/app/views/layouts/simple.rb +16 -0
  42. data/app/views/pages/show.html.rb +7 -0
  43. data/config/initializers/simple_form.rb +53 -0
  44. data/config/locales/en.yml +129 -0
  45. data/config/redirects.rb +8 -0
  46. data/config/routes.rb +21 -0
  47. data/lib/adva-core.rb +1 -0
  48. data/lib/adva.rb +40 -0
  49. data/lib/adva/active_record/has_one_default.rb +40 -0
  50. data/lib/adva/active_record/has_options.rb +55 -0
  51. data/lib/adva/cli.rb +16 -0
  52. data/lib/adva/controller.rb +7 -0
  53. data/lib/adva/controller/abstract_actions.rb +92 -0
  54. data/lib/adva/controller/internal_redirect.rb +26 -0
  55. data/lib/adva/controller/references.rb +28 -0
  56. data/lib/adva/core.rb +94 -0
  57. data/lib/adva/engine.rb +44 -0
  58. data/lib/adva/generators.rb +8 -0
  59. data/lib/adva/generators/app.rb +121 -0
  60. data/lib/adva/generators/engine.rb +58 -0
  61. data/lib/adva/generators/gemfile.rb +50 -0
  62. data/lib/adva/generators/install.rb +31 -0
  63. data/lib/adva/generators/templates/app/app_template.rb +3 -0
  64. data/lib/adva/generators/templates/engine/Gemfile.erb +3 -0
  65. data/lib/adva/generators/templates/engine/all.rb +1 -0
  66. data/lib/adva/generators/templates/engine/en.yml.erb +2 -0
  67. data/lib/adva/generators/templates/engine/engine.rb.erb +11 -0
  68. data/lib/adva/generators/templates/engine/gemspec.erb +21 -0
  69. data/lib/adva/generators/templates/engine/migration.rb.erb +11 -0
  70. data/lib/adva/generators/templates/engine/redirects.rb.erb +3 -0
  71. data/lib/adva/generators/templates/engine/routes.rb.erb +3 -0
  72. data/lib/adva/generators/templates/engine/test_helper.rb.erb +3 -0
  73. data/lib/adva/rack.rb +5 -0
  74. data/lib/adva/rack/static.rb +50 -0
  75. data/lib/adva/registry.rb +62 -0
  76. data/lib/adva/responder.rb +21 -0
  77. data/lib/adva/responder/redirect.rb +31 -0
  78. data/lib/adva/routing_filters/section_path.rb +72 -0
  79. data/lib/adva/routing_filters/section_root.rb +65 -0
  80. data/lib/adva/tasks/core.rake +9 -0
  81. data/lib/adva/tasks/core.rb +160 -0
  82. data/lib/adva/testing.rb +58 -0
  83. data/lib/adva/testing/engine.rb +37 -0
  84. data/lib/adva/view.rb +7 -0
  85. data/lib/adva/view/form.rb +44 -0
  86. data/lib/adva/view/form/tabs.rb +46 -0
  87. data/lib/adva/view/helper/i18n.rb +10 -0
  88. data/lib/adva/view/menu.rb +73 -0
  89. data/lib/adva/view/menu/admin.rb +100 -0
  90. data/lib/adva/view/menu/items.rb +26 -0
  91. data/lib/adva/view/tabs.rb +28 -0
  92. data/lib/adva_core/version.rb +3 -0
  93. data/lib/core_ext/rails/action_view/has_many_through_collection_helpers.rb +27 -0
  94. data/lib/core_ext/rails/active_record/skip_callbacks.rb +51 -0
  95. data/lib/core_ext/ruby/array/flatten_once.rb +9 -0
  96. data/lib/core_ext/ruby/kernel/silence_stream.rb +17 -0
  97. data/lib/core_ext/ruby/module/include_anonymous.rb +36 -0
  98. data/lib/core_ext/ruby/module/option_reader.rb +9 -0
  99. data/lib/patches/inherited_resources.rb +35 -0
  100. data/lib/patches/rails/asset_expansion_multiple_registrations.rb +21 -0
  101. data/lib/patches/rails/integretion_runner_respond_to.rb +13 -0
  102. data/lib/patches/rails/polymorphic_url_for.rb +115 -0
  103. data/lib/patches/rails/recognize_path_env.rb +42 -0
  104. data/lib/patches/rails/route_set_to_param.rb +25 -0
  105. data/lib/patches/rails/route_set_trailing_segment.rb +13 -0
  106. data/lib/patches/rails/sti_associations.rb +17 -0
  107. data/lib/patches/rails/template_resolver_caching.rb +9 -0
  108. data/lib/patches/rails/translation_helper.rb +18 -0
  109. data/lib/patches/responders/flash_responder.rb +17 -0
  110. data/lib/patches/simple_form.rb +37 -0
  111. data/lib/patches/thor/core_ext/hash.rb +7 -0
  112. data/lib/patches/thor/group/symbolized_options.rb +8 -0
  113. data/lib/patches/webrat/links-data-method.rb +15 -0
  114. data/lib/patches/webrat/logger.rb +14 -0
  115. data/lib/patches/webrat/upload_file.rb +23 -0
  116. data/lib/testing/assertions.rb +19 -0
  117. data/lib/testing/env.rb +41 -0
  118. data/lib/testing/factories.rb +28 -0
  119. data/lib/testing/helpers/global_helpers.rb +9 -0
  120. data/lib/testing/paths.rb +54 -0
  121. data/lib/testing/step_definitions/common_steps.rb +287 -0
  122. data/lib/testing/step_definitions/debug_steps.rb +22 -0
  123. data/lib/testing/step_definitions/menu_steps.rb +11 -0
  124. data/lib/testing/step_definitions/routes_steps.rb +18 -0
  125. data/lib/testing/step_definitions/transforms.rb +50 -0
  126. data/lib/testing/step_definitions/webrat_steps.rb +284 -0
  127. data/lib/testing/step_definitions/within_steps.rb +16 -0
  128. data/lib/webrat/integrations/rails.rb +33 -0
  129. data/public/images/adva-core/admin/header_bg.png +0 -0
  130. data/public/images/adva-core/admin/menu_checkmark.png +0 -0
  131. data/public/images/adva-core/admin/section_menu_bg.png +0 -0
  132. data/public/images/adva-core/admin/tab_action_active.png +0 -0
  133. data/public/images/adva-core/admin/tab_main_active.png +0 -0
  134. data/public/images/adva-core/admin/tab_sidebar_active.png +0 -0
  135. data/public/images/adva-core/admin/tab_top_active.png +0 -0
  136. data/public/images/adva-core/asset_selected.png +0 -0
  137. data/public/images/adva-core/avatar.gif +0 -0
  138. data/public/images/adva-core/feed.mini.png +0 -0
  139. data/public/images/adva-core/filter-bg.png +0 -0
  140. data/public/images/adva-core/grid.png +0 -0
  141. data/public/images/adva-core/icons/accept.png +0 -0
  142. data/public/images/adva-core/icons/add.png +0 -0
  143. data/public/images/adva-core/icons/arrow_cross.png +0 -0
  144. data/public/images/adva-core/icons/arrow_cross_2.png +0 -0
  145. data/public/images/adva-core/icons/arrow_cross_3.png +0 -0
  146. data/public/images/adva-core/icons/arrow_up_down.png +0 -0
  147. data/public/images/adva-core/icons/assets/audio.png +0 -0
  148. data/public/images/adva-core/icons/assets/doc.png +0 -0
  149. data/public/images/adva-core/icons/assets/pdf.png +0 -0
  150. data/public/images/adva-core/icons/assets/video.png +0 -0
  151. data/public/images/adva-core/icons/attach.png +0 -0
  152. data/public/images/adva-core/icons/bin.png +0 -0
  153. data/public/images/adva-core/icons/bin_closed.png +0 -0
  154. data/public/images/adva-core/icons/bin_empty.png +0 -0
  155. data/public/images/adva-core/icons/bullet_black.png +0 -0
  156. data/public/images/adva-core/icons/bullet_delete.png +0 -0
  157. data/public/images/adva-core/icons/bullet_error.png +0 -0
  158. data/public/images/adva-core/icons/bullet_go.png +0 -0
  159. data/public/images/adva-core/icons/bullet_red.png +0 -0
  160. data/public/images/adva-core/icons/bullet_white.png +0 -0
  161. data/public/images/adva-core/icons/bullet_yellow.png +0 -0
  162. data/public/images/adva-core/icons/cancel.png +0 -0
  163. data/public/images/adva-core/icons/comment.gif +0 -0
  164. data/public/images/adva-core/icons/comment.png +0 -0
  165. data/public/images/adva-core/icons/comment_add.png +0 -0
  166. data/public/images/adva-core/icons/comment_blue.gif +0 -0
  167. data/public/images/adva-core/icons/comment_delete.png +0 -0
  168. data/public/images/adva-core/icons/comment_edit.png +0 -0
  169. data/public/images/adva-core/icons/comment_yellow.gif +0 -0
  170. data/public/images/adva-core/icons/cross.png +0 -0
  171. data/public/images/adva-core/icons/delete.png +0 -0
  172. data/public/images/adva-core/icons/eye.png +0 -0
  173. data/public/images/adva-core/icons/favorites.png +0 -0
  174. data/public/images/adva-core/icons/help.png +0 -0
  175. data/public/images/adva-core/icons/hourglass.png +0 -0
  176. data/public/images/adva-core/icons/icon_attachment.gif +0 -0
  177. data/public/images/adva-core/icons/icon_padlock.gif +0 -0
  178. data/public/images/adva-core/icons/link.png +0 -0
  179. data/public/images/adva-core/icons/lock.png +0 -0
  180. data/public/images/adva-core/icons/magnifier.png +0 -0
  181. data/public/images/adva-core/icons/minus.gif +0 -0
  182. data/public/images/adva-core/icons/page_add.png +0 -0
  183. data/public/images/adva-core/icons/page_delete.png +0 -0
  184. data/public/images/adva-core/icons/page_edit.png +0 -0
  185. data/public/images/adva-core/icons/page_favorites.png +0 -0
  186. data/public/images/adva-core/icons/page_go.png +0 -0
  187. data/public/images/adva-core/icons/page_green.png +0 -0
  188. data/public/images/adva-core/icons/page_red.png +0 -0
  189. data/public/images/adva-core/icons/page_white_add.png +0 -0
  190. data/public/images/adva-core/icons/page_white_delete.png +0 -0
  191. data/public/images/adva-core/icons/page_white_edit.png +0 -0
  192. data/public/images/adva-core/icons/page_white_go.png +0 -0
  193. data/public/images/adva-core/icons/page_white_link.png +0 -0
  194. data/public/images/adva-core/icons/page_white_magnify.png +0 -0
  195. data/public/images/adva-core/icons/pencil.png +0 -0
  196. data/public/images/adva-core/icons/star.png +0 -0
  197. data/public/images/adva-core/icons/stop.png +0 -0
  198. data/public/images/adva-core/icons/tag_green.png +0 -0
  199. data/public/images/adva-core/icons/tick.png +0 -0
  200. data/public/images/adva-core/icons/zoom.png +0 -0
  201. data/public/images/adva-core/indicator.gif +0 -0
  202. data/public/images/adva-core/lines.png +0 -0
  203. data/public/images/adva-core/preview.png +0 -0
  204. data/public/images/adva-core/theme_selected.png +0 -0
  205. data/public/javascripts/adva-core/admin.js +22 -0
  206. data/public/javascripts/adva-core/jquery/jquery-1.4.2.min.js +154 -0
  207. data/public/javascripts/adva-core/jquery/jquery.table_tree.js +296 -0
  208. data/public/javascripts/adva-core/jquery/jquery.tablednd_0_5.js +385 -0
  209. data/public/javascripts/adva-core/rails.js +127 -0
  210. data/public/javascripts/backup/admin/jquery.admin.js +75 -0
  211. data/public/javascripts/backup/admin/jquery.article.js +22 -0
  212. data/public/javascripts/backup/admin/jquery.cached_pages.js +14 -0
  213. data/public/javascripts/backup/admin/jquery.table_tree.backup.js +279 -0
  214. data/public/javascripts/backup/admin/jquery.table_tree.js +10 -0
  215. data/public/javascripts/backup/application.js +38 -0
  216. data/public/javascripts/backup/application.prototype.js +135 -0
  217. data/public/javascripts/backup/builder.js +136 -0
  218. data/public/javascripts/backup/controls.js +965 -0
  219. data/public/javascripts/backup/cookie.js +49 -0
  220. data/public/javascripts/backup/dragdrop.js +975 -0
  221. data/public/javascripts/backup/effects.js +1130 -0
  222. data/public/javascripts/backup/flash.js +49 -0
  223. data/public/javascripts/backup/jquery.dates.js +49 -0
  224. data/public/javascripts/backup/jquery.flash.js +40 -0
  225. data/public/javascripts/backup/jquery.roles.js +23 -0
  226. data/public/javascripts/backup/jquery/jquery-lowpro.js +224 -0
  227. data/public/javascripts/backup/jquery/jquery-ui.js +273 -0
  228. data/public/javascripts/backup/jquery/jquery.js +19 -0
  229. data/public/javascripts/backup/jquery/jquery.qtip.min.js +15 -0
  230. data/public/javascripts/backup/json.js +139 -0
  231. data/public/javascripts/backup/lowpro.js +320 -0
  232. data/public/javascripts/backup/parseuri.js +39 -0
  233. data/public/javascripts/backup/prototype.js +4320 -0
  234. data/public/javascripts/backup/roles.js +16 -0
  235. data/public/javascripts/backup/scriptaculous.js +60 -0
  236. data/public/javascripts/backup/slider.js +275 -0
  237. data/public/javascripts/backup/sound.js +55 -0
  238. data/public/javascripts/backup/unittest.js +568 -0
  239. data/public/stylesheets/adva-core/admin/forms.css +172 -0
  240. data/public/stylesheets/adva-core/admin/layout.css +38 -0
  241. data/public/stylesheets/adva-core/admin/lists.css +54 -0
  242. data/public/stylesheets/adva-core/admin/navigation.css +234 -0
  243. data/public/stylesheets/adva-core/admin/sidebar.css +87 -0
  244. data/public/stylesheets/adva-core/admin/styles.css +130 -0
  245. data/public/stylesheets/adva-core/common/forms.css +174 -0
  246. data/public/stylesheets/adva-core/common/layout.css +93 -0
  247. data/public/stylesheets/adva-core/common/reset.css +42 -0
  248. data/public/stylesheets/adva-core/common/styles.css +41 -0
  249. data/public/stylesheets/adva-core/default/layout.css +0 -0
  250. data/public/stylesheets/adva-core/default/styles.css +0 -0
  251. data/public/stylesheets/adva-core/simple/layout.css +11 -0
  252. data/public/stylesheets/backup/alternate/common.css +76 -0
  253. data/public/stylesheets/backup/alternate/forms.css +121 -0
  254. data/public/stylesheets/backup/alternate/header.css +125 -0
  255. data/public/stylesheets/backup/alternate/layout.css +103 -0
  256. data/public/stylesheets/backup/alternate/lists.css +153 -0
  257. data/public/stylesheets/backup/alternate/sidebar.css +65 -0
  258. data/public/stylesheets/backup/alternate/top.css +123 -0
  259. data/public/stylesheets/backup/content.css +11 -0
  260. data/public/stylesheets/backup/helptip.css +35 -0
  261. data/public/stylesheets/backup/jquery/alternate/jquery.tooltip.css +13 -0
  262. data/public/stylesheets/backup/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  263. data/public/stylesheets/backup/jquery/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  264. data/public/stylesheets/backup/jquery/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  265. data/public/stylesheets/backup/jquery/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  266. data/public/stylesheets/backup/jquery/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  267. data/public/stylesheets/backup/jquery/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  268. data/public/stylesheets/backup/jquery/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  269. data/public/stylesheets/backup/jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  270. data/public/stylesheets/backup/jquery/images/ui-icons_222222_256x240.png +0 -0
  271. data/public/stylesheets/backup/jquery/images/ui-icons_2e83ff_256x240.png +0 -0
  272. data/public/stylesheets/backup/jquery/images/ui-icons_454545_256x240.png +0 -0
  273. data/public/stylesheets/backup/jquery/images/ui-icons_888888_256x240.png +0 -0
  274. data/public/stylesheets/backup/jquery/images/ui-icons_cd0a0a_256x240.png +0 -0
  275. data/public/stylesheets/backup/jquery/jquery-ui.css +405 -0
  276. data/public/stylesheets/backup/jquery/jquery.tooltip.css +10 -0
  277. data/public/stylesheets/backup/layout.css +22 -0
  278. data/public/stylesheets/backup/lists.css +17 -0
  279. data/public/stylesheets/backup/menu.css +129 -0
  280. data/public/stylesheets/backup/projection.css +118 -0
  281. data/public/stylesheets/backup/screen/top.css +8 -0
  282. data/public/stylesheets/backup/themes.css +49 -0
  283. data/public/stylesheets/backup/users.css +40 -0
  284. metadata +338 -40
  285. data/lib/bundler/repository.rb +0 -118
@@ -0,0 +1,9 @@
1
+ # Gem.patching('rails', '3.0.0.rc') do
2
+ # require 'action_view/template/resolver'
3
+ # ActionView::Resolver.class_eval do
4
+ # def caching?
5
+ # # @caching ||= !defined?(Rails.application) || Rails.application.config.cache_classes
6
+ # @caching ||= !defined?(Rails.application) || Rails.application.nil? || Rails.application.config.cache_classes
7
+ # end
8
+ # end
9
+ # end
@@ -0,0 +1,18 @@
1
+ # Make the view translation helper use the :rescue_format => :html option instead
2
+ # of rescuing exceptions itself.
3
+ #
4
+ # See https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/5969-bump-i18n-and-make-translationhelper-use-new-rescue_format-option#ticket-5969-8
5
+ Gem.patching('rails', '3.0.3') do
6
+ ActionView::Helpers::TranslationHelper.module_eval do
7
+ def translate(key, options = {})
8
+ options.merge!(:rescue_format => :html) unless options.key?(:rescue_format)
9
+ translation = I18n.translate(scope_key_by_partial(key), options)
10
+ if html_safe_translation_key?(key) && translation.respond_to?(:html_safe)
11
+ translation.html_safe
12
+ else
13
+ translation
14
+ end
15
+ end
16
+ alias :t :translate
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ require 'responders/flash_responder'
2
+
3
+ Responders::FlashResponder.class_eval do
4
+ def flash_defaults_by_namespace(status)
5
+ defaults = []
6
+ slices = controller.controller_path.split('/')
7
+
8
+ while slices.size > 0
9
+ defaults << :"flash.#{slices.fill(controller.controller_name, -1).join('.')}.#{controller.action_name}.#{status}"
10
+ defaults << :"flash.#{slices.join('.')}.#{controller.action_name}.#{status}"
11
+ slices.shift
12
+ end
13
+
14
+ defaults << :"flash.#{controller.action_name}.#{status}"
15
+ defaults.uniq << ""
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ require 'gem_patching'
2
+
3
+ # add "blog edit_blog" as css classes. should propose a patch to simple_form
4
+
5
+ Gem.patching('simple_form', '1.2.2') do
6
+ SimpleForm::ActionViewExtensions::FormHelper.module_eval do
7
+ [:form_for, :fields_for, :remote_form_for].each do |helper|
8
+ class_eval <<-METHOD, __FILE__, __LINE__
9
+ def simple_#{helper}(record_or_name_or_array, *args, &block)
10
+ css_classes = simple_css_classes(record_or_name_or_array)
11
+
12
+ options = args.extract_options!
13
+ options[:builder] = SimpleForm::FormBuilder
14
+ options[:html] ||= {}
15
+ options[:html][:class] = "simple_form \#{css_classes} \#{options[:html][:class]}".strip
16
+
17
+ with_custom_field_error_proc do
18
+ #{helper}(record_or_name_or_array, *(args << options), &block)
19
+ end
20
+ end
21
+ METHOD
22
+
23
+ def simple_css_classes(record_or_name_or_array)
24
+ css_classes = case record_or_name_or_array
25
+ when String, Symbol
26
+ record_or_name_or_array.to_s
27
+ when Array
28
+ record = record_or_name_or_array.last
29
+ action = record.new_record? ? 'new' : 'edit'
30
+ [dom_class(record), dom_class(record, action)].join(' ')
31
+ else
32
+ dom_class(record_or_name_or_array)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,7 @@
1
+ require 'thor/core_ext/hash_with_indifferent_access'
2
+
3
+ Thor::CoreExt::HashWithIndifferentAccess.class_eval do
4
+ def to_hash
5
+ Hash.new.merge(self)
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ require 'thor/group'
2
+
3
+ Thor::Group.class_eval do
4
+ protected
5
+ def symbolized_options
6
+ options.to_hash.symbolize_keys
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ require 'gem_patching'
2
+
3
+ Gem.patching('webrat', '0.7.2') do
4
+ Webrat::Link.class_eval do
5
+ def http_method
6
+ if !@element["data-method"].blank?
7
+ @element["data-method"]
8
+ elsif !onclick.blank? && onclick.include?("f.submit()")
9
+ http_method_from_js_form
10
+ else
11
+ :get
12
+ end
13
+ end
14
+ end
15
+ end if defined?(Webrat)
@@ -0,0 +1,14 @@
1
+ require 'gem_patching'
2
+
3
+ Gem.patching('webrat', '0.7.2') do
4
+ Webrat::Logging.class_eval do
5
+ def logger
6
+ case Webrat.configuration.mode
7
+ when :rails
8
+ defined?(Rails) ? Rails.logger : nil
9
+ else
10
+ super
11
+ end
12
+ end
13
+ end
14
+ end if defined?(Webrat)
@@ -0,0 +1,23 @@
1
+ require 'gem_patching'
2
+
3
+ Gem.patching('webrat', '0.7.2') do
4
+ Webrat::FileField.class_eval do
5
+ include ActionDispatch::TestProcess
6
+
7
+ def test_uploaded_file
8
+ return "" if @original_value.blank?
9
+
10
+ case Webrat.configuration.mode
11
+ when :rails
12
+ if content_type
13
+ # Rails 3 does not have an ActionController::TestUploadedFile anymore
14
+ Rack::Test::UploadedFile.new(@original_value, content_type)
15
+ else
16
+ Rack::Test::UploadedFile.new(@original_value)
17
+ end
18
+ when :rack, :merb
19
+ Rack::Test::UploadedFile.new(@original_value, content_type)
20
+ end
21
+ end
22
+ end
23
+ end if defined?(Webrat)
@@ -0,0 +1,19 @@
1
+ def assert_email_sent(attributes)
2
+ emails = ::ActionMailer::Base.deliveries
3
+ assert !emails.empty?, "No emails were sent"
4
+ matching_emails = emails.select do |email|
5
+ attributes.all? do |name, value|
6
+ case name
7
+ when 'body'
8
+ value.split(',').map(&:strip).all? { |value| email.body.include?(value) }
9
+ else
10
+ email.send(name).to_s == value
11
+ end
12
+ end
13
+ end
14
+ assert !matching_emails.empty?, begin
15
+ msg = ["None of the #{emails.size} emails matched #{attributes.inspect}.\nInstead, there are the following emails:"]
16
+ msg += emails.map { |email| attributes.keys.map { |key| [key, email.send(key)] }.map { |key, value| "#{key}: #{value}" }.join(',') }
17
+ msg.join("\n")
18
+ end
19
+ end
@@ -0,0 +1,41 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ Bundler.require
5
+
6
+ name = "#{File.basename(Dir.pwd)}-test"
7
+ app = Adva::Generators::App.new(name, :target => '/tmp', :migrate => true)
8
+ app.invoke
9
+
10
+ Gem.patching('webrat', '0.7.2') do
11
+ ActionController.send(:remove_const, :AbstractRequest)
12
+ end
13
+
14
+ require 'cucumber/rails/world'
15
+ require 'cucumber/rails/active_record'
16
+ require 'cucumber/web/tableish'
17
+ require 'webrat'
18
+ require 'webrat/core/matchers'
19
+ require 'patches/webrat/logger'
20
+ require 'test/unit/assertions'
21
+ require 'action_dispatch/testing/assertions'
22
+ require 'factory_girl'
23
+ require Adva::Core.root.join('lib/core_ext/rails/active_record/skip_callbacks')
24
+
25
+ Adva::Testing.load_factories
26
+ Adva::Testing.load_cucumber_support
27
+ Adva::Testing.load_assertions
28
+ Adva::Testing.load_helpers
29
+
30
+ Webrat.configure do |config|
31
+ config.mode = :rails
32
+ config.open_error_files = false
33
+ end
34
+
35
+ ActionController::Base.allow_rescue = false
36
+ Cucumber::Rails::World.use_transactional_fixtures = true
37
+ Rails.backtrace_cleaner.remove_silencers!
38
+
39
+ World(GlobalHelpers)
40
+ Adva.out = StringIO.new('')
41
+
@@ -0,0 +1,28 @@
1
+ Factory.define :site do |f|
2
+ f.account Account.first || Account.create!
3
+ f.name 'adva-cms'
4
+ f.host 'www.example.com'
5
+ f.title 'adva-cms'
6
+ f.sections_attributes [{
7
+ :type => 'Page',
8
+ :name => 'Home',
9
+ :body => 'body'
10
+ }]
11
+ f.after_create { |site| Factory(:admin) }
12
+ end
13
+
14
+ Factory.define :section do |f|
15
+ f.site { Site.first || Factory(:site) }
16
+ f.name 'Home'
17
+ end
18
+
19
+ Factory.define :page do |f|
20
+ f.site { Site.first || Factory(:site) }
21
+ f.name 'Home'
22
+ end
23
+
24
+ Factory.define :content do |f|
25
+ f.site { Site.first || Factory(:site) }
26
+ f.section { Section.first || Factory(:section) }
27
+ f.title 'Content'
28
+ end
@@ -0,0 +1,9 @@
1
+ module GlobalHelpers
2
+ def site
3
+ Site.first || raise("Could not find a site. Maybe you want to set one up in your story background?")
4
+ end
5
+
6
+ def account
7
+ Account.first || raise("Could not find a site. Maybe you want to set one up in your story background?")
8
+ end
9
+ end
@@ -0,0 +1,54 @@
1
+ module Adva::Core::Paths
2
+ def path_to(page)
3
+ case page
4
+
5
+ when /^\//
6
+ page
7
+
8
+ when /^the home\s?page$/
9
+ '/'
10
+
11
+ when /^the site installation page$/
12
+ new_installation_path
13
+
14
+ when /^the site installation confirmation page$/
15
+ installation_path(Site.last)
16
+
17
+ when /^the "([^"]*)" section page$/
18
+ section = Section.where(:name => $1).first || raise("could not find section named #{$1}")
19
+ polymorphic_path(section)
20
+
21
+ when /^the admin sites page$/
22
+ polymorphic_path([:admin, :sites])
23
+
24
+ when /^the admin dashboard page$/
25
+ site = Site.first
26
+ polymorphic_path([:admin, site])
27
+
28
+ when /^the admin dashboard page for the site on "([^"]*)"$/
29
+ site = Site.find_by_host($1) || raise("could not find site with host #{$1}")
30
+ polymorphic_path([:admin, site])
31
+
32
+ when /^the admin sections page$/
33
+ site = Site.first
34
+ polymorphic_path([:admin, site, :sections])
35
+
36
+ when /^the admin "([^"]*)" section page$/
37
+ site = Site.first
38
+ section = Section.where(:name => $1).first || raise("could not find section named #{$1}")
39
+ polymorphic_path([:admin, site, section])
40
+
41
+ when /^the admin "([^"]*)" section settings page$/
42
+ site = Site.first
43
+ section = Section.where(:name => $1).first || raise("could not find section named #{$1}")
44
+ polymorphic_path([:edit, :admin, site, section])
45
+
46
+ else
47
+ named_route_helper = page.gsub(/(\Athe )|( page\Z)/, '').gsub(/ +/, '_').downcase + '_path'
48
+ raise "Can't find mapping from \"#{page}\" to a path.\nNow, go and add a mapping in #{__FILE__}" unless respond_to?(named_route_helper)
49
+ send named_route_helper
50
+ end
51
+ end
52
+ end
53
+
54
+ World(Adva::Core::Paths)
@@ -0,0 +1,287 @@
1
+ Given 'a site' do
2
+ @site = Factory(:site)
3
+ end
4
+
5
+ # Examples:
6
+ # 1. Given the following products:
7
+ # Also supports namespaced models, (cnet) indicating the namespace Cnet
8
+ # 2. Given the following (cnet) products:
9
+ Given /^the following ((?:\([a-z ]+\) )?(?:[\w]+)):$/ do |type, table|
10
+ type = type.gsub(/^\(([a-z ]+)\) /, "\\1/").gsub(' ', '_').singularize
11
+ table.hashes.each do |attributes|
12
+ type = attributes.delete('type').underscore if attributes.key?('type')
13
+ attributes['site'] = site if type.classify.constantize.column_names.include?('site_id')
14
+ parent = attributes.delete('parent')
15
+ attributes['parent_id'] = type.classify.constantize.find_by_name(parent) unless parent.blank?
16
+ Factory(type, attributes)
17
+ end
18
+ end
19
+
20
+ Given /^the (\w+) "([^"]*)" is a child of "([^"]*)"$/ do |model, child, parent|
21
+ model = model.classify.constantize
22
+ parent = model.find_by_name(parent)
23
+ child = model.find_by_name(child)
24
+ child.move_to_child_of(parent)
25
+ end
26
+
27
+ Given /^a site with the following sections:$/ do |table|
28
+ Site.all.map(&:destroy)
29
+ @site = Factory(:site, :sections_attributes => [])
30
+ Given "the following sections:", table
31
+ end
32
+
33
+ Given /^a site with a (\w+) named "([^"]+)"$/ do |section, name|
34
+ Site.all.map(&:destroy)
35
+ @site = Factory(:site, :sections_attributes => [])
36
+ Given %(a #{section} named "#{name}")
37
+ end
38
+
39
+ # e.g. a blog named "Blog"
40
+ Given /^an? (\w+) (name|title)d "([^"]+)"$/ do |model, attribute, value|
41
+ model = model.classify.constantize
42
+ attributes = { attribute => value }
43
+ attributes[:site_id] = site.id if model.column_names.include?('site_id')
44
+ attributes[:account_id] = account.id if model.column_names.include?('account_id')
45
+ model.where(attributes).first || model.create!(attributes)
46
+ end
47
+
48
+ Given /^an? (\w+) with the following attributes:$/ do |model, table|
49
+ Factory(model, table.rows_hash)
50
+ end
51
+
52
+ # e.g. a post titled "Post" for the blog "Blog"
53
+ # e.g. a category named "Category" belonging to the blog "Blog"
54
+ Given /^an? (\w+) (name|title)d "([^"]+)" (?:for|belonging to) the (\w+) "([^"]+)"$/ do |model, attribute, value, section, name|
55
+ section = Given(%(a #{section} named "#{name}"))
56
+ collection = section.send(model.underscore.pluralize)
57
+ attributes = { attribute => value }
58
+ collection.where(attributes).first || collection.create!(attributes)
59
+ end
60
+
61
+ # e.g. a post with the title "Post" for the blog "Blog"
62
+ # e.g. a post with the title "Post" belonging to the blog "Blog"
63
+ Given /^an? (\w+) with the (\w+) "([^"]+)" (?:for|belonging to) the (\w+) "([^"]+)"$/ do |model, attribute, value, section, name|
64
+ section = Given(%(a #{section} named "#{name}"))
65
+ collection = section.send(model.underscore.pluralize)
66
+ attributes = { attribute => value }
67
+ collection.where(attributes).first || collection.create!(attributes)
68
+ end
69
+
70
+ Given /^(\w+)s with the following attributes:$/ do |model, table|
71
+ table.hashes.each do |attributes|
72
+ Factory(model, attributes)
73
+ end
74
+ end
75
+
76
+ When /^(.+) that link$/ do |step|
77
+ raise "no last link" if @last_link.blank?
78
+ When %(#{step} "#{@last_link}")
79
+ end
80
+
81
+ When /^I (press|click) "(.*)" in the row (of the ([a-z ]+) table )?where "(.*)" is "(.*)"$/ do |press_or_click, link_or_button, _, table_id, header, cell_content|
82
+ body = Nokogiri::HTML(response.body)
83
+ table_xpath = table_id.nil? ? 'table' : "table[@id='#{table_id.gsub(/ /, '_')}']"
84
+ table_header_cells = body.xpath("//#{table_xpath}/descendant::th[normalize-space(text())='#{header}']/@id")
85
+ assert !table_header_cells.empty?, "could not find table header cell '#{header}'"
86
+ header_id = body.xpath("//#{table_xpath}/descendant::th[normalize-space(text())='#{header}']/@id").first.value
87
+ row_id = body.xpath("//#{table_xpath}/descendant::td[@headers='#{header_id}'][normalize-space(text())='#{cell_content}']/ancestor::tr/@id").first.value
88
+ within("##{row_id}") do
89
+ send({'press' => 'click_button', 'click' => 'click_link'}[press_or_click], link_or_button)
90
+ end
91
+ end
92
+
93
+ When /^I visit the url from the email to (.*)$/ do |to|
94
+ email = ::ActionMailer::Base.deliveries.detect { |email| email.to.include?(to) }
95
+ assert email, "email to #{to} could not be found"
96
+ url = email.body.to_s =~ %r((http://[^\s"]+)) && $1
97
+ visit(url)
98
+ end
99
+
100
+ Then /^I should (not )?see a ([a-z ]+ )?row (?:of the ([a-z ]+) table )?where "(.*)" is "(.*)"$/ do |optional_not, row_classes, table_id, header, cell_content|
101
+ body = Nokogiri::HTML(response.body)
102
+ table_xpath = table_id.nil? ? 'table' : "table[@id='#{table_id.gsub(/ /, '_')}']"
103
+ table_header_cells = body.xpath("//#{table_xpath}/descendant::th[normalize-space(text())='#{header}']/@id")
104
+
105
+ unless optional_not.present?
106
+ assert !table_header_cells.empty?, "could not find table header cell '#{header}'"
107
+ end
108
+ header_id = body.xpath("//#{table_xpath}/descendant::th[normalize-space(text())='#{header}']/@id").first.try(:value)
109
+
110
+ class_condition = row_classes.to_s.split(' ').map do |row_class|
111
+ "contains(concat(' ', normalize-space(@class), ' '), ' #{row_class} ')"
112
+ end.join(' and ')
113
+ tr_xpath = class_condition.empty? ? 'ancestor::tr' : "ancestor::tr[#{class_condition}]"
114
+ xpath_result = body.xpath("//#{table_xpath}/descendant::td[@headers='#{header_id}'][normalize-space(text())='#{cell_content}']/#{tr_xpath}/@id")
115
+
116
+ if optional_not.present?
117
+ assert xpath_result.empty?, 'should not find a row'
118
+ else
119
+ assert xpath_result.any?, 'should find at least one row'
120
+ end
121
+ end
122
+
123
+ Then /^there should be an? (\w+)$/ do |model|
124
+ assert @last_record = model.classify.constantize.first, "could not find any #{model}"
125
+ end
126
+
127
+ Then /^there should be an? (\w+) named "([^\"]+)"$/ do |model, name|
128
+ assert @last_record = model.classify.constantize.where(:name => name).first, "could not find any #{model} named #{name}"
129
+ end
130
+
131
+ Then /^there should not be an? (\w+) named "([^"]*)"$/ do |model, name|
132
+ assert !model.classify.constantize.where(:name => name).first, "expected no #{model} named #{name} exists, but found one"
133
+ end
134
+
135
+ Then /^there should be a (\w+) with the following attributes:$/ do |model, table|
136
+ assert @last_record = model.classify.constantize.where(table.rows_hash).first, "could not find a #{model} with #{table.rows_hash.inspect}"
137
+ end
138
+
139
+ Then /^there should be (\w+)s with the following attributes:$/ do |model, table|
140
+ table.hashes.each do |attributes|
141
+ assert model.classify.constantize.where(attributes).first, "could not find a #{model} with #{attributes.inspect}"
142
+ end
143
+ end
144
+
145
+ Then /^that (\w+) should have an? (\w+) with the following attributes:$/ do |last, model, table|
146
+ assert @last_record.is_a?(last.classify.constantize), "wrong type for last #{last}"
147
+ assert @last_record.send(model.pluralize).where(table.rows_hash).first, "could not find a #{model} with #{table.rows_hash.inspect}"
148
+ end
149
+
150
+ Then /^that (\w+) should have (\w+)s with the following attributes:$/ do |last, model, table|
151
+ assert @last_record.is_a?(last.classify.constantize), "wrong type for last #{last}"
152
+ table.hashes.each do |attributes|
153
+ assert @last_record.send(model.pluralize).where(attributes).first, "could not find a #{model} with #{attributes.inspect}"
154
+ end
155
+ end
156
+
157
+ Then /^the title should be "([^"]+)"$/ do |title|
158
+ assert_select('title', title)
159
+ end
160
+
161
+ Then /^I should see (an?|the) "([^"]+)"$/ do |kind, thing|
162
+ kind = { 'a' => '.', 'the' => '#' }[kind]
163
+ assert_select("#{kind}#{thing}")
164
+ end
165
+
166
+ Then /^I should see a link "([^"]+)"$/ do |link|
167
+ @last_link = link
168
+ assert_select('a', link)
169
+ end
170
+
171
+ Then /^I should not see any (\w+)$/ do |type|
172
+ assert_select(".#{type.singularize}", :count => 0) # .#{type},
173
+ end
174
+
175
+ Then /^I should see an? (\w+)$/ do |type|
176
+ assert_select(".#{type}")
177
+ end
178
+
179
+ Then /^I should see an? (\w+) (?:titled|named) "([^"]+)"$/ do |type, text|
180
+ assert_select(".#{type} h2", text)
181
+ end
182
+
183
+ Then /^I should see an? (\w+) containing "([^"]+)"$/ do |type, text|
184
+ assert_select(".#{type}", /#{text}/)
185
+ end
186
+
187
+ Then /^I should see an? (\w+) list$/ do |type|
188
+ assert_select(".#{type}.list")
189
+ end
190
+
191
+ Then /^I should see a list of (\w+)$/ do |type|
192
+ assert_select(".#{type}.list")
193
+ end
194
+
195
+ Then /^I should see an? ([a-z ]+) form$/ do |type|
196
+ tokens = type.split(' ')
197
+ types = [tokens.join('_'), tokens.reverse.join('_')]
198
+ selectors = types.map { |type| "form.#{type}, form##{type}" }
199
+ assert_select(selectors.join(', '))
200
+ end
201
+
202
+ Then /^I should not see an? ([a-z ]+) form$/ do |type|
203
+ type = type.gsub(' ', '_') #.gsub(/edit_/, '')
204
+ assert_select("form.#{type}, form##{type}", :count => 0)
205
+ end
206
+
207
+ Then /^I should see an? ([a-z ]+) form with the following values:$/ do |type, table|
208
+ type = type.gsub(' ', '_') #.gsub(/edit_/, '')
209
+ assert_select("form.#{type}, form##{type}") do |form|
210
+ table.rows_hash.each do |name, value|
211
+ assert_equal value, webrat.current_scope.field_labeled(name).value
212
+ end
213
+ end
214
+ end
215
+
216
+ Then /^I should see a "(.+)" table with the following entries:$/ do |table_id, expected_table|
217
+ actual_table = table(tableish("table##{table_id} tr", 'td,th'))
218
+ begin
219
+ diff_table = expected_table.dup
220
+ diff_table.diff!(actual_table.dup)
221
+ rescue
222
+ puts "\nActual table:#{actual_table.to_s}\n"
223
+ puts "Expected table:#{expected_table.to_s}\n"
224
+ puts "Difference:#{diff_table.to_s}\n"
225
+ raise
226
+ end
227
+ end
228
+
229
+ Then /^I should see the "([^"]+)" page$/ do |name|
230
+ assert_select('h2', name)
231
+ end
232
+
233
+ Then(/(?:\$|eval) (.*)$/) do |code|
234
+ pp eval(code)
235
+ end
236
+
237
+ Then /^I should see a flash (error|notice|message) "(.+)"$/ do |message_type, message|
238
+ assert_match message, flash_cookie[message_type].to_s
239
+ end
240
+
241
+ Then /^I should not see a flash (error|notice) "(.+)"$/ do |message_type, message|
242
+ assert_no_match /message/, flash_cookie[message_type].to_s
243
+ end
244
+
245
+ Then /^I should (see|not see) the error "([^"]+)" for attribute "([^"]+)" of the "([^"]+)"$/ do |should_see, error_msg, attribute, model|
246
+ if should_see == 'see' # ugh ...
247
+ assert_select "*[id*=#{model.downcase.gsub(' ', '_')}_#{attribute.downcase.gsub(' ', '_')}] + span.error",
248
+ :text => error_msg
249
+ elsif should_see == 'not see'
250
+ assert_select "*[id*=#{model.downcase.gsub(' ', '_')}_#{attribute.downcase.gsub(' ', '_')}] + span.error",
251
+ :text => error_msg, :count => 0
252
+ end
253
+ end
254
+
255
+ Then /^the following emails should have been sent:$/ do |expected_emails|
256
+ expected_emails.hashes.each do |attributes|
257
+ assert_email_sent(attributes)
258
+ end
259
+ end
260
+
261
+ Then /^"([^"]*)" should be filled in with "([^"]*)"$/ do |field, value|
262
+ field = webrat.field_labeled(field)
263
+ assert_equal value, field.value
264
+ end
265
+
266
+ Then /^"([^"]*)" should be checked$/ do |label|
267
+ field = webrat.field_labeled(label)
268
+ assert field.checked?, "expected the checkbox #{label} to be checked"
269
+ end
270
+
271
+ Then /^"([^"]*)" should not be checked$/ do |label|
272
+ field = webrat.field_labeled(label)
273
+ assert !field.checked?, "expected the checkbox #{label} not to be checked"
274
+ end
275
+
276
+ Then /^"([^"]*)" should be selected as "([^"]*)"$/ do |value, label|
277
+ select = webrat.field_labeled(label)
278
+ assert select, "count not find a select field labeled #{label}"
279
+ selected = select.element.xpath(".//option[@selected = 'selected']").first
280
+ assert selected, "could not find a selected option"
281
+ assert_equal value, selected.text
282
+ end
283
+
284
+ Then /^I should see "([^"]*)" formatted as a "([^"]*)" tag$/ do |value, tag|
285
+ assert_select(tag, value)
286
+ end
287
+