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,27 @@
1
+ require 'action_view/helpers/form_helper'
2
+
3
+ ActionView::Helpers::FormBuilder.send :include do
4
+ def has_many_through_collection_check_boxes(attribute, collection, label_attribute)
5
+ through_class = object.class.reflect_on_association(attribute).class_name.constantize
6
+ foreign_key = through_class.reflect_on_all_associations(:belongs_to).detect { |r| r.class_name != object.class.name }.primary_key_name
7
+
8
+ html = ''
9
+ collection.each_with_index do |item, ix|
10
+ param = "#{object_name}[#{attribute}_attributes][#{ix}]"
11
+ through = object.send(attribute).detect { |t| t.send(foreign_key) == item.id }
12
+
13
+ if through
14
+ html << @template.hidden_field_tag("#{param}[id]", through.id, :id => '')
15
+ html << @template.hidden_field_tag("#{param}[_destroy]", '1', :id => '')
16
+ html << @template.label_tag("#{param}[_destroy]", :class => 'checkbox') do
17
+ @template.check_box_tag("#{param}[_destroy]", '0', true) + item.send(label_attribute)
18
+ end
19
+ else
20
+ html << @template.label_tag("#{param}[#{foreign_key}]", :class => 'checkbox') do
21
+ @template.check_box_tag("#{param}[#{foreign_key}]", item.id) + item.send(label_attribute)
22
+ end
23
+ end
24
+ end
25
+ html.html_safe
26
+ end
27
+ end
@@ -0,0 +1,51 @@
1
+ require 'active_support/basic_object'
2
+
3
+ ActiveRecord::Base.class_eval do
4
+ class WithoutCallbacks < ActiveSupport::BasicObject
5
+ def initialize(target, types)
6
+ @target = target
7
+ @types = types
8
+ end
9
+
10
+ def respond_to?(method, include_private = false)
11
+ @target.respond_to?(method, include_private)
12
+ end
13
+
14
+ def method_missing(method, *args, &block)
15
+ @target.skip_callbacks(*@types) do
16
+ @target.send(method, *args, &block)
17
+ end
18
+ end
19
+ end
20
+
21
+ class << self
22
+ def without_callbacks(*types)
23
+ WithoutCallbacks.new(self, types)
24
+ end
25
+
26
+ def skip_callbacks(*types)
27
+ deactivate_callbacks(*types)
28
+ yield.tap do
29
+ activate_callbacks(*types)
30
+ end
31
+ end
32
+
33
+ def deactivate_callbacks(*types)
34
+ types = [:save, :create, :update, :destroy, :touch] if types.empty?
35
+ types.each do |type|
36
+ name = :"_run_#{type}_callbacks"
37
+ alias_method(:"_deactivated_#{name}", name)
38
+ define_method(name) { |&block| block.call }
39
+ end
40
+ end
41
+
42
+ def activate_callbacks(*types)
43
+ types = [:save, :create, :update, :destroy, :touch] if types.empty?
44
+ types.each do |type|
45
+ name = :"_run_#{type}_callbacks"
46
+ alias_method(name, :"_deactivated_#{name}")
47
+ undef_method(:"_deactivated_#{name}")
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,9 @@
1
+ class Array
2
+ def flatten_once
3
+ inject([]) { |result, elem| elem.is_a?(Array) ? result + elem : result << elem }
4
+ end
5
+
6
+ def flatten_once!
7
+ replace(flatten_once)
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ # from lib/core/facets/kernel/silence.rb
2
+ def silence_stream(*streams)
3
+ on_hold = streams.collect{ |stream| stream.dup }
4
+ streams.each do |stream|
5
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
6
+ stream.sync = true
7
+ end
8
+ yield
9
+ ensure
10
+ streams.each_with_index do |stream, i|
11
+ stream.reopen(on_hold[i])
12
+ end
13
+ end
14
+
15
+ def silence_stdout
16
+ silence_stream(STDOUT) { yield }
17
+ end
@@ -0,0 +1,36 @@
1
+ # Include an anonymous module
2
+ #
3
+ # Useful for defining a class or module with a base module. So, instead of:
4
+ #
5
+ # class Foo
6
+ # module Base
7
+ # def bar
8
+ # # ...
9
+ # end
10
+ # end
11
+ # include Base
12
+ # end
13
+ #
14
+ # You can do:
15
+ #
16
+ # class Foo
17
+ # include do
18
+ # def bar
19
+ # # ...
20
+ # end
21
+ # end
22
+ # end
23
+
24
+ Class.class_eval do
25
+ def include(*args, &block)
26
+ block_given? ? super(Module.new(&block)) : super(*args)
27
+ end
28
+ end
29
+
30
+ Module.class_eval do
31
+ def include_with_anonymous(*args, &block)
32
+ block_given? ? include_without_anonymous(Module.new(&block)) : include_without_anonymous(*args)
33
+ end
34
+ alias :include_without_anonymous :include
35
+ alias :include :include_with_anonymous
36
+ end
@@ -0,0 +1,9 @@
1
+ Module.class_eval do
2
+ def option_reader(*names)
3
+ options = names.last.is_a?(Hash) ? names.last : {}
4
+ names.each do |name|
5
+ define_method(name) { @options[name.to_sym] }
6
+ define_method(:"#{name}?") { !!@options[name.to_sym] }
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,35 @@
1
+ require 'gem_patching'
2
+ require 'inherited_resources'
3
+
4
+ Gem.patching('inherited_resources', '1.1.2') do
5
+ InheritedResources::Actions.module_eval do
6
+ module Actions
7
+ def index(options={}, &block)
8
+ respond_with(*(with_chain(resource_class) << options), &block)
9
+ end
10
+ alias :index! :index
11
+ end
12
+ end
13
+
14
+ InheritedResources::BaseHelpers.module_eval do
15
+ def collection
16
+ get_collection_ivar || begin
17
+ collection = end_of_association_chain
18
+ collection = collection.find(:all) unless collection.respond_to?(:each)
19
+ set_collection_ivar(collection)
20
+ end
21
+ end
22
+
23
+ def build_resource
24
+ get_resource_ivar || begin
25
+ resource = end_of_association_chain.send(method_for_build, params[resource_instance_name] || {})
26
+ # check if resource is included to prevent deleting from a relation
27
+ if method_for_build == :build && end_of_association_chain.include?(resource)
28
+ end_of_association_chain.delete(resource)
29
+ end
30
+ set_resource_ivar(resource)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,21 @@
1
+ # Allow to register javascript/stylesheet_expansions to existing symbols
2
+ #
3
+ # see https://rails.lighthouseapp.com/projects/8994/tickets/1975-allow-to-register-javascriptstylesheet_expansions-to-existing-symbols
4
+
5
+ require 'action_view/helpers/asset_tag_helper'
6
+
7
+ module ActionView::Helpers::AssetTagHelper
8
+ def self.register_javascript_expansion(expansions)
9
+ expansions.each do |key, values|
10
+ @@javascript_expansions[key] ||= []
11
+ @@javascript_expansions[key] += Array(values)
12
+ end
13
+ end
14
+
15
+ def self.register_stylesheet_expansion(expansions)
16
+ expansions.each do |key, values|
17
+ @@stylesheet_expansions[key] ||= []
18
+ @@stylesheet_expansions[key] += Array(values)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ require 'gem_patching'
2
+
3
+ # ActionDispatch::Integration::Runner defines method_missing but no accompaning
4
+ # respond_to? method. It thus doesn't respond_to? to named route url helpers even
5
+ # though it actually responds to them. Happens with the PolymorphicRoutes patch
6
+ # above, so this patch is here as well.
7
+ Gem.patching('rails', '3.0.3') do
8
+ ActionDispatch::Integration::Runner.module_eval do
9
+ def respond_to?(method, include_private = false)
10
+ @integration_session.respond_to?(method, include_private) || super
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,115 @@
1
+ # Walks up the inheritance chain for given records if the generated named route
2
+ # helper does not exist. Caches resulting method names.
3
+ # see https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/2986-polymorphic_url-should-handle-sti-better
4
+ Gem.patching('rails', '3.0.3') do
5
+ require 'action_dispatch/routing/polymorphic_routes'
6
+
7
+ ActionDispatch::Routing::PolymorphicRoutes.module_eval do
8
+ def build_named_route_call(objects, inflection, options = {})
9
+ objects = objects[:id] if objects.is_a?(Hash)
10
+ NamedRouteCall.method_name(self, Array(objects), inflection, options)
11
+ end
12
+
13
+ class NamedRouteCall < Array
14
+ mattr_accessor :cache
15
+ self.cache = {}
16
+
17
+ class << self
18
+ def method_name(view, objects, inflection, options = {})
19
+ key = cache_key(objects, inflection, options)
20
+ method = cache[key] ||= begin
21
+ NamedRouteCall.new(objects, inflection, options).detect do |method|
22
+ view.respond_to?(method)
23
+ end
24
+ end
25
+ end
26
+
27
+ def cache_key(objects, inflection, options)
28
+ objects = objects + [inflection, options[:action_prefix], options[:routing_type]]
29
+ objects.compact.map do |object|
30
+ case object
31
+ when String, Symbol
32
+ object
33
+ when Class
34
+ object.name
35
+ else
36
+ "<#{object.class.name}>"
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ attr_reader :objects, :inflection, :action_prefix, :routing_type
43
+
44
+ def initialize(objects, inflection, options = {})
45
+ @objects = Array(objects)
46
+ @inflection = inflection
47
+ @action_prefix = options[:action_prefix]
48
+ @routing_type = options[:routing_type] || :url
49
+ end
50
+
51
+ def detect
52
+ while method = build
53
+ return method if yield(method)
54
+ end
55
+ return first
56
+ end
57
+
58
+ def build
59
+ if combination = combinations.shift
60
+ self << method_name(combination)
61
+ self.last
62
+ end
63
+ end
64
+
65
+ def method_name(combination)
66
+ combination[-1] = pluralize(combination.last)
67
+ combination << 'index' if uncountable?(combination.last) && inflection == :plural
68
+ combination.unshift(action_prefix).push(routing_type).compact.join('_')
69
+ end
70
+
71
+ def pluralize(string)
72
+ # polymorphic_url passes an incorrect inflection in some cases
73
+ if [String, Symbol].include?(objects.last.class)
74
+ string
75
+ elsif inflection == :singular
76
+ string.singularize
77
+ else
78
+ string.pluralize
79
+ end
80
+ end
81
+
82
+ def combinations
83
+ @combinations ||= if classes.size == 1
84
+ classes.first.map { |klass| [klass] }
85
+ else
86
+ classes.inject(classes.shift) { |a, b| a.product(b) }.map(&:flatten)
87
+ end
88
+ end
89
+
90
+ def classes
91
+ @classes ||= objects.map do |object|
92
+ case object
93
+ when Symbol, String
94
+ [object.to_s]
95
+ when Class
96
+ ancestry(object)
97
+ else
98
+ ancestry(object.class)
99
+ end
100
+ end
101
+ end
102
+
103
+ def ancestry(model)
104
+ ancestry = [model]
105
+ ancestry << ancestry.last.superclass until ancestry.last.superclass == ActiveRecord::Base
106
+ ancestry.map { |model| ActiveModel::Naming.plural(model).singularize }
107
+ end
108
+
109
+ def uncountable?(string)
110
+ string.singularize == string.pluralize
111
+ end
112
+ end
113
+ end
114
+ end
115
+
@@ -0,0 +1,42 @@
1
+ require 'action_dispatch/routing/mapper'
2
+ require 'action_dispatch/routing/route_set'
3
+
4
+ # make recognize_path pass the given environment through
5
+
6
+ module ActionDispatch
7
+ module Routing
8
+ class RouteSet
9
+ def recognize_path(path, environment = {})
10
+ method = (environment[:method] || "GET").to_s.upcase
11
+ path = Rack::Mount::Utils.normalize_path(path)
12
+
13
+ begin
14
+ # env = Rack::MockRequest.env_for(path, {:method => method})
15
+ env = Rack::MockRequest.env_for(path, {:method => method}).merge(environment)
16
+ rescue URI::InvalidURIError => e
17
+ raise ActionController::RoutingError, e.message
18
+ end
19
+
20
+ req = Rack::Request.new(env)
21
+ @set.recognize(req) do |route, matches, params|
22
+ params.each do |key, value|
23
+ if value.is_a?(String)
24
+ value = value.dup.force_encoding(Encoding::BINARY) if value.encoding_aware?
25
+ params[key] = URI.unescape(value)
26
+ end
27
+ end
28
+
29
+ dispatcher = route.app
30
+ dispatcher = dispatcher.app while dispatcher.is_a?(Mapper::Constraints)
31
+
32
+ if dispatcher.is_a?(Dispatcher) && dispatcher.controller(params, false)
33
+ dispatcher.prepare_params!(params)
34
+ return params
35
+ end
36
+ end
37
+
38
+ raise ActionController::RoutingError, "No route matches #{path.inspect}"
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,25 @@
1
+ # make route_set generator pass the current segment/param name to to_param
2
+ # if arity allows it. so we can use param names in routes and distinguish them
3
+ # in the model.
4
+
5
+ require 'action_dispatch/routing/route_set'
6
+
7
+ ActionDispatch::Routing::RouteSet::Generator.class_eval do
8
+ def opts
9
+ parameterize = lambda do |name, value|
10
+ if name == :controller
11
+ value
12
+ elsif value.is_a?(Array)
13
+ value.map { |v| Rack::Mount::Utils.escape_uri(to_param(name, v)) }.join('/')
14
+ else
15
+ return nil unless param = to_param(name, value)
16
+ param.split('/').map { |v| Rack::Mount::Utils.escape_uri(v) }.join("/")
17
+ end
18
+ end
19
+ {:parameterize => parameterize}
20
+ end
21
+
22
+ def to_param(name, value)
23
+ value.method(:to_param).arity == 1 ? value.to_param(name) : value.to_param
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ require 'gem_patching'
2
+
3
+ # remove trailing segments '.1' and query params '?=1' from url
4
+ Gem.patching('rails', '3.0.3') do
5
+ ActionDispatch::Routing::RouteSet.class_eval do
6
+ def url_for_with_singleton_resource_patch(options)
7
+ url_for_without_singleton_resource_patch(options).
8
+ sub(/\.\d+(\Z|\?)/) { $1 || '' }.
9
+ sub(/\?=\d+$/, '')
10
+ end
11
+ alias_method_chain :url_for, :singleton_resource_patch
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ require 'gem_patching'
2
+
3
+ # Make build associations have their given type
4
+ # i.e.: site.sections.build(:type => 'Page').class == Page
5
+ # http://pragmatig.com/2010/06/04/fixing-rails-nested-attributes-on-collections-with-sti
6
+
7
+ Gem.patching('rails', '3.0.3') do
8
+ class ActiveRecord::Reflection::AssociationReflection
9
+ def build_association(*options)
10
+ if options.first.is_a?(Hash) && options.first[:type].present?
11
+ options.first[:type].to_s.constantize.new(*options)
12
+ else
13
+ klass.new(*options)
14
+ end
15
+ end
16
+ end
17
+ end