adva-core 0.0.1

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 (279) hide show
  1. data/app/controllers/admin/base_controller.rb +21 -0
  2. data/app/controllers/admin/pages_controller.rb +9 -0
  3. data/app/controllers/admin/sections_controller.rb +36 -0
  4. data/app/controllers/admin/sites_controller.rb +18 -0
  5. data/app/controllers/articles_controller.rb +3 -0
  6. data/app/controllers/base_controller.rb +22 -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 +17 -0
  17. data/app/models/section.rb +59 -0
  18. data/app/models/site.rb +26 -0
  19. data/app/views/admin/pages/_menu.html.rb +30 -0
  20. data/app/views/admin/pages/new.html.rb +19 -0
  21. data/app/views/admin/pages/show.html.rb +25 -0
  22. data/app/views/admin/sections/_menu.html.rb +12 -0
  23. data/app/views/admin/sections/_section.html.rb +7 -0
  24. data/app/views/admin/sections/_select_type.html.rb +16 -0
  25. data/app/views/admin/sections/index.html.rb +28 -0
  26. data/app/views/admin/sites/_menu.html.rb +6 -0
  27. data/app/views/admin/sites/edit.html.rb +22 -0
  28. data/app/views/admin/sites/index.html.rb +12 -0
  29. data/app/views/admin/sites/new.html.rb +39 -0
  30. data/app/views/admin/sites/show.html.rb +7 -0
  31. data/app/views/installations/new.html.rb +39 -0
  32. data/app/views/installations/show.html.rb +9 -0
  33. data/app/views/layouts/_flash.html.rb +9 -0
  34. data/app/views/layouts/admin.rb +38 -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 +56 -0
  38. data/app/views/layouts/base.rb +58 -0
  39. data/app/views/layouts/default.rb +31 -0
  40. data/app/views/layouts/default/_menu.rb +24 -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 +137 -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 +37 -0
  49. data/lib/adva/active_record/has_options.rb +55 -0
  50. data/lib/adva/cli.rb +16 -0
  51. data/lib/adva/controller.rb +7 -0
  52. data/lib/adva/controller/abstract_actions.rb +87 -0
  53. data/lib/adva/controller/internal_redirect.rb +26 -0
  54. data/lib/adva/controller/references.rb +28 -0
  55. data/lib/adva/core.rb +84 -0
  56. data/lib/adva/engine.rb +64 -0
  57. data/lib/adva/engine/sliced_models.rb +35 -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 +57 -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/menu.rb +51 -0
  88. data/lib/adva/view/menu/admin.rb +48 -0
  89. data/lib/adva/view/tabs.rb +28 -0
  90. data/lib/core_ext/rails/action_view/has_many_through_collection_helpers.rb +27 -0
  91. data/lib/core_ext/rails/active_record/skip_callbacks.rb +51 -0
  92. data/lib/core_ext/ruby/array/flatten_once.rb +9 -0
  93. data/lib/core_ext/ruby/kernel/silence_stream.rb +17 -0
  94. data/lib/core_ext/ruby/module/include_anonymous.rb +36 -0
  95. data/lib/core_ext/ruby/module/option_reader.rb +9 -0
  96. data/lib/patches/arel/table_initialization_fixes.rb +68 -0
  97. data/lib/patches/inherited_resources.rb +34 -0
  98. data/lib/patches/rails/arel_table_options_fix.rb +13 -0
  99. data/lib/patches/rails/asset_expansion_multiple_registrations.rb +21 -0
  100. data/lib/patches/rails/recognize_path_env.rb +43 -0
  101. data/lib/patches/rails/route_set_to_param.rb +25 -0
  102. data/lib/patches/rails/sti_associations.rb +17 -0
  103. data/lib/patches/rails/template_resolver_caching.rb +9 -0
  104. data/lib/patches/rails/url_for.rb +60 -0
  105. data/lib/patches/simple_form.rb +37 -0
  106. data/lib/patches/thor/core_ext/hash.rb +7 -0
  107. data/lib/patches/thor/group/symbolized_options.rb +8 -0
  108. data/lib/patches/webrat/links-data-method.rb +19 -0
  109. data/lib/patches/webrat/logger.rb +19 -0
  110. data/lib/patches/webrat/upload_file.rb +28 -0
  111. data/lib/testing/assertions.rb +19 -0
  112. data/lib/testing/factories.rb +30 -0
  113. data/lib/testing/helpers/global_helpers.rb +9 -0
  114. data/lib/testing/paths.rb +54 -0
  115. data/lib/testing/step_definitions/common_steps.rb +279 -0
  116. data/lib/testing/step_definitions/menu_steps.rb +11 -0
  117. data/lib/testing/step_definitions/routes_steps.rb +18 -0
  118. data/lib/testing/step_definitions/transforms.rb +43 -0
  119. data/lib/testing/step_definitions/webrat_steps.rb +291 -0
  120. data/lib/testing/step_definitions/within_steps.rb +17 -0
  121. data/lib/webrat/integrations/rails.rb +33 -0
  122. data/public/images/adva-core/admin/header_bg.png +0 -0
  123. data/public/images/adva-core/admin/menu_checkmark.png +0 -0
  124. data/public/images/adva-core/admin/section_menu_bg.png +0 -0
  125. data/public/images/adva-core/admin/tab_action_active.png +0 -0
  126. data/public/images/adva-core/admin/tab_main_active.png +0 -0
  127. data/public/images/adva-core/admin/tab_sidebar_active.png +0 -0
  128. data/public/images/adva-core/admin/tab_top_active.png +0 -0
  129. data/public/images/adva-core/asset_selected.png +0 -0
  130. data/public/images/adva-core/avatar.gif +0 -0
  131. data/public/images/adva-core/feed.mini.png +0 -0
  132. data/public/images/adva-core/filter-bg.png +0 -0
  133. data/public/images/adva-core/grid.png +0 -0
  134. data/public/images/adva-core/icons/accept.png +0 -0
  135. data/public/images/adva-core/icons/add.png +0 -0
  136. data/public/images/adva-core/icons/arrow_cross.png +0 -0
  137. data/public/images/adva-core/icons/arrow_cross_2.png +0 -0
  138. data/public/images/adva-core/icons/arrow_cross_3.png +0 -0
  139. data/public/images/adva-core/icons/arrow_up_down.png +0 -0
  140. data/public/images/adva-core/icons/assets/audio.png +0 -0
  141. data/public/images/adva-core/icons/assets/doc.png +0 -0
  142. data/public/images/adva-core/icons/assets/pdf.png +0 -0
  143. data/public/images/adva-core/icons/assets/video.png +0 -0
  144. data/public/images/adva-core/icons/attach.png +0 -0
  145. data/public/images/adva-core/icons/bin.png +0 -0
  146. data/public/images/adva-core/icons/bin_closed.png +0 -0
  147. data/public/images/adva-core/icons/bin_empty.png +0 -0
  148. data/public/images/adva-core/icons/bullet_black.png +0 -0
  149. data/public/images/adva-core/icons/bullet_delete.png +0 -0
  150. data/public/images/adva-core/icons/bullet_error.png +0 -0
  151. data/public/images/adva-core/icons/bullet_go.png +0 -0
  152. data/public/images/adva-core/icons/bullet_red.png +0 -0
  153. data/public/images/adva-core/icons/bullet_white.png +0 -0
  154. data/public/images/adva-core/icons/bullet_yellow.png +0 -0
  155. data/public/images/adva-core/icons/cancel.png +0 -0
  156. data/public/images/adva-core/icons/comment.gif +0 -0
  157. data/public/images/adva-core/icons/comment.png +0 -0
  158. data/public/images/adva-core/icons/comment_add.png +0 -0
  159. data/public/images/adva-core/icons/comment_blue.gif +0 -0
  160. data/public/images/adva-core/icons/comment_delete.png +0 -0
  161. data/public/images/adva-core/icons/comment_edit.png +0 -0
  162. data/public/images/adva-core/icons/comment_yellow.gif +0 -0
  163. data/public/images/adva-core/icons/cross.png +0 -0
  164. data/public/images/adva-core/icons/delete.png +0 -0
  165. data/public/images/adva-core/icons/eye.png +0 -0
  166. data/public/images/adva-core/icons/favorites.png +0 -0
  167. data/public/images/adva-core/icons/help.png +0 -0
  168. data/public/images/adva-core/icons/hourglass.png +0 -0
  169. data/public/images/adva-core/icons/icon_attachment.gif +0 -0
  170. data/public/images/adva-core/icons/icon_padlock.gif +0 -0
  171. data/public/images/adva-core/icons/link.png +0 -0
  172. data/public/images/adva-core/icons/lock.png +0 -0
  173. data/public/images/adva-core/icons/magnifier.png +0 -0
  174. data/public/images/adva-core/icons/minus.gif +0 -0
  175. data/public/images/adva-core/icons/page_add.png +0 -0
  176. data/public/images/adva-core/icons/page_delete.png +0 -0
  177. data/public/images/adva-core/icons/page_edit.png +0 -0
  178. data/public/images/adva-core/icons/page_favorites.png +0 -0
  179. data/public/images/adva-core/icons/page_go.png +0 -0
  180. data/public/images/adva-core/icons/page_green.png +0 -0
  181. data/public/images/adva-core/icons/page_red.png +0 -0
  182. data/public/images/adva-core/icons/page_white_add.png +0 -0
  183. data/public/images/adva-core/icons/page_white_delete.png +0 -0
  184. data/public/images/adva-core/icons/page_white_edit.png +0 -0
  185. data/public/images/adva-core/icons/page_white_go.png +0 -0
  186. data/public/images/adva-core/icons/page_white_link.png +0 -0
  187. data/public/images/adva-core/icons/page_white_magnify.png +0 -0
  188. data/public/images/adva-core/icons/pencil.png +0 -0
  189. data/public/images/adva-core/icons/star.png +0 -0
  190. data/public/images/adva-core/icons/stop.png +0 -0
  191. data/public/images/adva-core/icons/tag_green.png +0 -0
  192. data/public/images/adva-core/icons/tick.png +0 -0
  193. data/public/images/adva-core/icons/zoom.png +0 -0
  194. data/public/images/adva-core/indicator.gif +0 -0
  195. data/public/images/adva-core/lines.png +0 -0
  196. data/public/images/adva-core/preview.png +0 -0
  197. data/public/images/adva-core/rails.png +0 -0
  198. data/public/images/adva-core/sortable_tree/drag.png +0 -0
  199. data/public/images/adva-core/theme_selected.png +0 -0
  200. data/public/javascripts/adva-core/admin.js +21 -0
  201. data/public/javascripts/adva-core/jquery/jquery-1.4.2.min.js +154 -0
  202. data/public/javascripts/adva-core/jquery/jquery.table_tree.js +292 -0
  203. data/public/javascripts/adva-core/jquery/jquery.tablednd_0_5.js +386 -0
  204. data/public/javascripts/adva-core/rails.js +127 -0
  205. data/public/javascripts/backup/admin/jquery.admin.js +77 -0
  206. data/public/javascripts/backup/admin/jquery.article.js +22 -0
  207. data/public/javascripts/backup/admin/jquery.cached_pages.js +14 -0
  208. data/public/javascripts/backup/admin/jquery.table_tree.backup.js +279 -0
  209. data/public/javascripts/backup/admin/jquery.table_tree.js +10 -0
  210. data/public/javascripts/backup/application.js +38 -0
  211. data/public/javascripts/backup/application.prototype.js +135 -0
  212. data/public/javascripts/backup/builder.js +136 -0
  213. data/public/javascripts/backup/controls.js +965 -0
  214. data/public/javascripts/backup/cookie.js +49 -0
  215. data/public/javascripts/backup/dragdrop.js +975 -0
  216. data/public/javascripts/backup/effects.js +1130 -0
  217. data/public/javascripts/backup/flash.js +49 -0
  218. data/public/javascripts/backup/jquery.dates.js +49 -0
  219. data/public/javascripts/backup/jquery.flash.js +40 -0
  220. data/public/javascripts/backup/jquery.roles.js +23 -0
  221. data/public/javascripts/backup/jquery/jquery-lowpro.js +224 -0
  222. data/public/javascripts/backup/jquery/jquery-ui.js +273 -0
  223. data/public/javascripts/backup/jquery/jquery.js +19 -0
  224. data/public/javascripts/backup/jquery/jquery.qtip.min.js +15 -0
  225. data/public/javascripts/backup/json.js +139 -0
  226. data/public/javascripts/backup/lowpro.js +320 -0
  227. data/public/javascripts/backup/parseuri.js +39 -0
  228. data/public/javascripts/backup/prototype.js +4320 -0
  229. data/public/javascripts/backup/roles.js +16 -0
  230. data/public/javascripts/backup/scriptaculous.js +60 -0
  231. data/public/javascripts/backup/slider.js +275 -0
  232. data/public/javascripts/backup/sound.js +55 -0
  233. data/public/javascripts/backup/unittest.js +568 -0
  234. data/public/stylesheets/adva-core/admin/forms.css +172 -0
  235. data/public/stylesheets/adva-core/admin/layout.css +38 -0
  236. data/public/stylesheets/adva-core/admin/lists.css +54 -0
  237. data/public/stylesheets/adva-core/admin/navigation.css +234 -0
  238. data/public/stylesheets/adva-core/admin/sidebar.css +87 -0
  239. data/public/stylesheets/adva-core/admin/styles.css +128 -0
  240. data/public/stylesheets/adva-core/common/forms.css +174 -0
  241. data/public/stylesheets/adva-core/common/layout.css +93 -0
  242. data/public/stylesheets/adva-core/common/reset.css +42 -0
  243. data/public/stylesheets/adva-core/common/styles.css +41 -0
  244. data/public/stylesheets/adva-core/default/layout.css +0 -0
  245. data/public/stylesheets/adva-core/default/styles.css +30 -0
  246. data/public/stylesheets/adva-core/simple/layout.css +11 -0
  247. data/public/stylesheets/backup/alternate/common.css +76 -0
  248. data/public/stylesheets/backup/alternate/forms.css +121 -0
  249. data/public/stylesheets/backup/alternate/header.css +125 -0
  250. data/public/stylesheets/backup/alternate/layout.css +103 -0
  251. data/public/stylesheets/backup/alternate/lists.css +153 -0
  252. data/public/stylesheets/backup/alternate/sidebar.css +65 -0
  253. data/public/stylesheets/backup/alternate/top.css +123 -0
  254. data/public/stylesheets/backup/content.css +11 -0
  255. data/public/stylesheets/backup/helptip.css +35 -0
  256. data/public/stylesheets/backup/jquery/alternate/jquery.tooltip.css +13 -0
  257. data/public/stylesheets/backup/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  258. data/public/stylesheets/backup/jquery/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  259. data/public/stylesheets/backup/jquery/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  260. data/public/stylesheets/backup/jquery/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  261. data/public/stylesheets/backup/jquery/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  262. data/public/stylesheets/backup/jquery/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  263. data/public/stylesheets/backup/jquery/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  264. data/public/stylesheets/backup/jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  265. data/public/stylesheets/backup/jquery/images/ui-icons_222222_256x240.png +0 -0
  266. data/public/stylesheets/backup/jquery/images/ui-icons_2e83ff_256x240.png +0 -0
  267. data/public/stylesheets/backup/jquery/images/ui-icons_454545_256x240.png +0 -0
  268. data/public/stylesheets/backup/jquery/images/ui-icons_888888_256x240.png +0 -0
  269. data/public/stylesheets/backup/jquery/images/ui-icons_cd0a0a_256x240.png +0 -0
  270. data/public/stylesheets/backup/jquery/jquery-ui.css +406 -0
  271. data/public/stylesheets/backup/jquery/jquery.tooltip.css +10 -0
  272. data/public/stylesheets/backup/layout.css +22 -0
  273. data/public/stylesheets/backup/lists.css +17 -0
  274. data/public/stylesheets/backup/menu.css +129 -0
  275. data/public/stylesheets/backup/projection.css +118 -0
  276. data/public/stylesheets/backup/screen/top.css +8 -0
  277. data/public/stylesheets/backup/themes.css +49 -0
  278. data/public/stylesheets/backup/users.css +40 -0
  279. metadata +536 -0
@@ -0,0 +1,31 @@
1
+ module Adva
2
+ module Generators
3
+ class Install
4
+ include Thor::Shell
5
+
6
+ attr_reader :engines
7
+
8
+ def initialize(engines)
9
+ self.engines = engines
10
+ end
11
+
12
+ def invoke
13
+ engines.each do |engine|
14
+ engine.copy_migrations.each do |path|
15
+ say_status('copy migration', File.basename(path), :green)
16
+ end
17
+ end
18
+ end
19
+
20
+ protected
21
+
22
+ def engines=(engines)
23
+ engines = Array(engines)
24
+ engines = Adva.engines if engines.blank? || engines.include?(:all)
25
+ engines = engines.map { |engine| engine.is_a?(Class) ? engine : Adva.const_get(engine.to_s.classify) }
26
+ engines.unshift(Adva::Core) unless engines.include?(Adva::Core)
27
+ @engines = engines.uniq
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ copy_file config[:source].join('lib/bundler/repository.rb'), "#{app_path}/lib/bundler/repository.rb"
2
+ copy_file config[:source].join('Gemfile'), "#{app_path}/Gemfile"
3
+ remove_file 'public/index.html'
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
@@ -0,0 +1 @@
1
+ Dir[File.expand_path('../**/*_test.rb', __FILE__)].each { |file| require file }
@@ -0,0 +1,2 @@
1
+ en:
2
+ <%= name %>: ""
@@ -0,0 +1,11 @@
1
+ require 'adva'
2
+
3
+ module Adva
4
+ class <%= class_name %> < ::Rails::Engine
5
+ include Adva::Engine
6
+
7
+ # initializer 'adva-<%= name %>.require_section_types' do
8
+ # config.to_prepare { require_dependency 'page' }
9
+ # end
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ # $: << File.expand_path('../lib', __FILE__)
4
+ # require 'adva/<%= name %>/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "adva-<%= name %>"
8
+ s.version = '0.0.1'
9
+ s.authors = ["Ingo Weiss", "Sven Fuchs"]
10
+ s.email = "nobody@adva-cms.org"
11
+ s.homepage = "http://github.com/svenfuchs/adva-cms2"
12
+ s.summary = "[summary]"
13
+ s.description = "[description]"
14
+
15
+ s.files = Dir['{app,config,lib,public}/**/*']
16
+ s.platform = Gem::Platform::RUBY
17
+ s.require_path = 'lib'
18
+ s.rubyforge_project = '[none]'
19
+
20
+ s.add_dependency 'adva-core'
21
+ end
@@ -0,0 +1,11 @@
1
+ class Adva<%= class_name %>CreateTables < ActiveRecord::Migration
2
+ def self.up
3
+ # create_table :<%= table_name %> do |t|
4
+ # t.timestamps
5
+ # end
6
+ end
7
+
8
+ def self.down
9
+ # drop_table :<%= table_name %>
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ # Adva::Registry.set :redirect, {
2
+ # 'controller#action' => lambda { |controller| controller.show_url }
3
+ # }
@@ -0,0 +1,3 @@
1
+ # Rails.application.routes.draw do
2
+ # resource :<%= name %>
3
+ # end
@@ -0,0 +1,3 @@
1
+ require File.expand_path('../../../adva-core/test/test_helper', __FILE__)
2
+
3
+ require 'adva-<%= name %>'
@@ -0,0 +1,5 @@
1
+ module Adva
2
+ module Rack
3
+ autoload :Static, 'adva/rack/static'
4
+ end
5
+ end
@@ -0,0 +1,50 @@
1
+ require 'active_support/core_ext/string/starts_ends_with'
2
+
3
+ module Adva
4
+ module Rack
5
+ class Static
6
+ FILE_METHODS = %w(GET HEAD)
7
+ STATIC_PATHS = %w(/images/adva /javascripts/adva /stylesheets/adva)
8
+
9
+ attr_reader :app, :directories
10
+
11
+ def initialize(app)
12
+ @app = app
13
+ @directories = Adva.engines.map { |engine| ::Rack::File.new(engine.root.join('public')) }
14
+ end
15
+
16
+ def call(env)
17
+ path = env['PATH_INFO'].chomp('/')
18
+ method = env['REQUEST_METHOD']
19
+
20
+ if FILE_METHODS.include?(method) && static?(path)
21
+ if directory = directories.detect { |directory| exist?(directory, path) }
22
+ return directory.call(env)
23
+ else
24
+ return not_found(path)
25
+ end
26
+ end
27
+
28
+ app.call(env)
29
+ end
30
+
31
+ def static?(path)
32
+ STATIC_PATHS.detect { |static_path| path.starts_with?(static_path) }
33
+ end
34
+
35
+ def exist?(directory, path)
36
+ File.file?(File.join(directory.root, ::Rack::Utils.unescape(path)))
37
+ end
38
+
39
+ def not_found(path)
40
+ body = "File not found: #{path}\n"
41
+ headers = {
42
+ 'Content-Type' => 'text/plain',
43
+ 'Content-Length' => body.size.to_s,
44
+ 'X-Cascade' => 'pass'
45
+ }
46
+ [404, headers, [body]]
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,62 @@
1
+ # Global registry for storing common configuration.
2
+
3
+ module Adva
4
+ class Registry < Hash
5
+ class << self
6
+ def instance
7
+ @@instance ||= new
8
+ end
9
+
10
+ def get(*args)
11
+ instance.get(*args)
12
+ end
13
+
14
+ def set(*args)
15
+ instance.set(*args)
16
+ end
17
+
18
+ def clear
19
+ instance.clear
20
+ end
21
+ end
22
+
23
+ def initialize
24
+ super &lambda { |hash, key| hash[key] = Registry.new }
25
+ end
26
+
27
+ def set(*args)
28
+ value, last_key = args.pop, args.pop.to_sym
29
+ target = args.inject(self) { |result, key| result[key.to_sym] }
30
+
31
+ case value
32
+ when Hash
33
+ target[last_key].merge!(to_registry(value))
34
+ when Array
35
+ target[last_key] = Array(target[last_key]) unless target[last_key].is_a?(Array)
36
+ target[last_key] += value
37
+ else
38
+ target.merge!(last_key => value)
39
+ end
40
+ end
41
+
42
+ def get(*keys)
43
+ keys.map { |key| key.to_sym }.inject(self) do |result, key|
44
+ return nil unless result.has_key?(key)
45
+ result[key]
46
+ end
47
+ end
48
+
49
+ protected
50
+
51
+ def merge!(other)
52
+ other.each { |key, value| self[key] = value }
53
+ end
54
+
55
+ def to_registry(hash)
56
+ hash.inject(Registry.new) do |registry, (key, value)|
57
+ registry[key.to_sym] = value.is_a?(Hash) ? to_registry(value) : value
58
+ registry
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,21 @@
1
+ require 'action_controller'
2
+ require 'responders'
3
+
4
+ module Adva
5
+ class Responder < ActionController::Responder
6
+ autoload :Redirect, 'adva/responder/redirect'
7
+
8
+ module Base
9
+ include Adva::Responder::Redirect
10
+ include Responders::FlashResponder
11
+ include Responders::HttpCacheResponder
12
+ end
13
+ include Base
14
+
15
+ delegate :params, :controller_path, :resource, :resources, :to => :controller
16
+
17
+ def action
18
+ controller.params[:action]
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ # Common redirect responder. Redirects to a :return_to param if present or an
2
+ # entry in the Registry for the current controller/action (e.g. pages#update).
3
+
4
+ module Adva
5
+ class Responder
6
+ module Redirect
7
+ def to_html
8
+ return_to_redirect || registry_redirect || super
9
+ end
10
+
11
+ def return_to_redirect
12
+ redirect_to(params[:return_to]) if !get? && params[:return_to] && !has_errors?
13
+ end
14
+
15
+ def registry_redirect
16
+ if !has_errors? && target = current_redirect
17
+ redirect_to(target)
18
+ end
19
+ end
20
+
21
+ def current_redirect
22
+ target = Registry.get(:redirect, controller_action_path)
23
+ target.respond_to?(:call) ? target.call(controller) : target
24
+ end
25
+
26
+ def controller_action_path
27
+ "#{controller_path}##{params[:action]}"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,72 @@
1
+ require 'routing_filter/filter'
2
+
3
+ # If the path is, aside from a slash and an optional locale, the leftmost part
4
+ # of the path, replace it by "sections/:id" segments.
5
+
6
+ module RoutingFilter
7
+ class SectionPath < Filter
8
+ extend ActiveSupport::Memoizable
9
+
10
+ cattr_accessor :default_port
11
+ self.default_port = '80'
12
+
13
+ cattr_accessor :exclude
14
+ self.exclude = %r(^/admin)
15
+
16
+ def around_recognize(path, env, &block)
17
+ # p "#{self.class.name}: #{path}"
18
+ if !excluded?(path)
19
+ search, replace = recognition(host(env), path)
20
+ path.sub!(%r(^/([\w]{2,4}/)?(#{search})(?=/|\.|\?|$)), "/#{$1}#{replace}#{$3}") if search
21
+ end
22
+ yield
23
+ end
24
+
25
+ def around_generate(params, &block)
26
+ yield.tap do |path|
27
+ # p "#{self.class.name}: #{path}"
28
+ if !excluded?(path)
29
+ search, replace = *generation(path)
30
+ path.sub!(search) { "#{replace}#{$3}" } if search
31
+ path.replace("/#{path}") unless path[0, 1] == '/'
32
+ end
33
+ end
34
+ end
35
+
36
+ protected
37
+
38
+ def excluded?(path)
39
+ path =~ exclude
40
+ end
41
+
42
+ def recognition(host, path)
43
+ if site = Site.by_host(host) and path =~ recognition_pattern(site)
44
+ section = site.sections.where(:path => $2).first
45
+ [$2, "#{$1}#{section.type.pluralize.downcase}/#{section.id}"]
46
+ end
47
+ end
48
+
49
+ def recognition_pattern(site)
50
+ paths = site.sections.map(&:path).reject(&:blank?)
51
+ paths = paths.sort { |a, b| b.size <=> a.size }.join('|')
52
+ paths.empty? ? %r(^$) : %r(^/([\w]{2,4}/)?(#{paths})(?=/|\.|\?|$))
53
+ end
54
+
55
+ def generation(path)
56
+ if path =~ generate_pattern
57
+ section = Section.find($2.to_i)
58
+ ["/#{$1}/#{$2}", "#{section.path}#{$3}"]
59
+ end
60
+ end
61
+
62
+ def generate_pattern
63
+ types = Section.types.map { |type| type.downcase.pluralize }.join('|')
64
+ %r(/(sections|#{types})/([\d]+(/?))(\.?))
65
+ end
66
+
67
+ def host(env)
68
+ host, port = env.values_at('SERVER_NAME', 'SERVER_PORT')
69
+ port == default_port ? host : [host, port].compact.join(':')
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,65 @@
1
+ require 'routing_filter/filter'
2
+
3
+ module RoutingFilter
4
+ class SectionRoot < Filter
5
+ extend ActiveSupport::Memoizable
6
+
7
+ cattr_accessor :default_port
8
+ self.default_port = '80'
9
+
10
+ cattr_accessor :exclude
11
+ self.exclude = %r(^/admin)
12
+
13
+ cattr_accessor :anchors
14
+ self.anchors = %w(article)
15
+
16
+ def around_recognize(path, env, &block)
17
+ # p "#{self.class.name}: #{path}"
18
+ if !excluded?(path)
19
+ search, replace = *recognition(host(env))
20
+ path.sub!(search) { "#{$1}#{replace}#{$2}" } if search
21
+ end
22
+ yield
23
+ end
24
+
25
+ def around_generate(params, &block)
26
+ yield.tap do |path|
27
+ # p "#{self.class.name}: #{path}"
28
+ remove_root_section!(path) unless excluded?(path)
29
+ end
30
+ end
31
+
32
+ protected
33
+
34
+ def excluded?(path)
35
+ path =~ exclude
36
+ end
37
+
38
+ def recognition(host)
39
+ if site = Site.by_host(host) and root = site.sections.root
40
+ [%r(^(/[\w]{2})?(?:\/?)(#{anchors.join('|')}|\.|\?|/?\Z)), "/#{root.type.tableize}/#{root.id}"]
41
+ end
42
+ end
43
+
44
+ def anchors
45
+ @anchors ||= self.class.anchors.map { |anchor| "/#{anchor}" }
46
+ end
47
+
48
+ def remove_root_section!(path)
49
+ path.sub!(%r(#{$2}/#{$3}/?), '') if path =~ generate_pattern && home?($3)
50
+ end
51
+
52
+ def generate_pattern
53
+ @generate_pattern ||= %r(^(?:/[\w]{2})?(/(#{Section.types.map(&:tableize).join('|')})/([\d]+)(?:/|\.|\?|$)))
54
+ end
55
+
56
+ def home?(id)
57
+ Section.find(id.to_i).try(:home?)
58
+ end
59
+
60
+ def host(env)
61
+ host, port = env.values_at('SERVER_NAME', 'SERVER_PORT')
62
+ port == default_port ? host : [host, port].compact.join(':')
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,9 @@
1
+ require 'rake'
2
+ require 'adva/tasks/core'
3
+
4
+ namespace :adva do
5
+ desc 'Install adva'
6
+ task :install do
7
+ Adva::Tasks::Install.start
8
+ end
9
+ end
@@ -0,0 +1,160 @@
1
+ require 'thor'
2
+ require 'thor/group'
3
+ require 'patches/thor/core_ext/hash'
4
+ require 'patches/thor/group/symbolized_options'
5
+ require 'rails/engine'
6
+
7
+ module Adva
8
+ module Tasks
9
+ class App < Thor::Group
10
+ namespace 'adva:app'
11
+ desc 'Create a new adva app'
12
+ argument :name, :required => false
13
+ class_option :target, :required => false
14
+ class_option :engines, :required => false, :type => :array
15
+ class_option :install, :required => false, :type => :boolean
16
+ class_option :migrate, :required => false, :type => :boolean, :default => true
17
+ class_option :template, :required => false
18
+ class_option :force, :required => false, :type => :boolean, :default => true
19
+
20
+ def perform
21
+ Adva::Generators::App.new(name, symbolized_options).invoke
22
+ end
23
+ end
24
+
25
+ class Engine < Thor::Group
26
+ namespace 'adva:engine'
27
+ desc 'Create an adva engine'
28
+ argument :name
29
+
30
+ def perform
31
+ require 'adva/generators/engine'
32
+ Adva::Generators::Engine.new(name, symbolized_options).invoke_all
33
+ end
34
+ end
35
+
36
+ class Install < Thor::Group
37
+ namespace 'adva:install'
38
+ desc 'Install adva engines'
39
+ class_option :engines, :required => false, :type => :array
40
+
41
+ def install
42
+ Adva::Generators::Install.new(symbolized_options).invoke
43
+ end
44
+ end
45
+
46
+ module Test
47
+ module Cucumber
48
+ def cucumber_args
49
+ args = cucumber_options + cucumber_files
50
+ args.flatten.compact
51
+ end
52
+
53
+ def cucumber_files
54
+ paths = Adva.engines.map { |engine| engine.root.join('features/**/*.feature').to_s }
55
+ paths = paths.select { |path| path.include?(pattern) } if pattern
56
+ Dir["{#{paths.join(',')}}"].sort
57
+ end
58
+
59
+ def cucumber_pattern
60
+ self.respond_to?(:pattern) ? self.pattern : ''
61
+ end
62
+
63
+ def cucumber_options
64
+ # TODO submit a patch to Cucumber: programatically find out supported Cucumber options seems
65
+ # close to impossible bc/ it immediately calls parse! on its options as soon they are defined.
66
+ # see http://github.com/aslakhellesoy/cucumber/blob/master/lib/cucumber/cli/options.rb#L261
67
+ options = self.options.reject { |name, value| name.include?('rebuild') }
68
+ options.map { |name, value| ["--#{name}", value.is_a?(String) ? value : nil] }.flatten.compact
69
+ end
70
+ end
71
+
72
+ class All < Thor::Group
73
+ namespace 'test:all'
74
+ desc 'run all features and tests'
75
+ class_option :rebuild, :aliases => '-r', :required => false
76
+
77
+ include Cucumber
78
+
79
+
80
+ def all
81
+ require 'cucumber'
82
+ ENV['REGENERATE_APP'] = true if options['rebuild']
83
+ Rails.env = 'test'
84
+ passed = !::Cucumber::Cli::Main.execute(cucumber_args) # returns true on failure
85
+
86
+ Dir['**/test/**/*_test.rb'].each { |file| require file }
87
+ passed &= test_runner.run # returns true on pass
88
+
89
+ exit(passed ? 0 : 1)
90
+ end
91
+
92
+ protected
93
+
94
+ # GOSHHHH. maybe we really should switch to minitest.
95
+
96
+ def test_runner
97
+ require 'test/unit'
98
+ ::Test::Unit::AutoRunner.new(false).tap do |runner|
99
+ runner.collector = lambda { |r| test_collector.new.collect($0.sub(/\.rb\Z/, '')) }
100
+ end
101
+ end
102
+
103
+ def test_collector
104
+ require 'test/unit/collector/objectspace'
105
+ require 'mocha/integration/test_unit'
106
+ Class.new(::Test::Unit::Collector::ObjectSpace) do
107
+ def collect(name=NAME)
108
+ suite, sub_suites = ::Test::Unit::TestSuite.new(name), []
109
+ @source.each_object(Class) do |klass|
110
+ if klass < ::Test::Unit::TestCase && klass != ::Cucumber::Rails::World
111
+ add_suite(sub_suites, klass.suite)
112
+ end
113
+ end
114
+ sort(sub_suites).each { |s| suite << s }
115
+ suite
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+ class Features < Thor::Group
122
+ namespace 'test:features'
123
+ desc 'run cucumber features'
124
+ argument :pattern, :required => false, :default => '/features'
125
+ class_option :rebuild, :aliases => '-r', :required => false, :default => false
126
+ class_option :format, :aliases => '-f', :required => false, :default => 'pretty'
127
+ class_option :tags, :aliases => '-t', :required => false, :default => '~@wip'
128
+ class_option :name, :aliases => '-n', :required => false
129
+ class_option :exclude, :aliases => '-e', :required => false
130
+ class_option :backtrace, :aliases => '-b', :required => false, :default => true
131
+ class_option :wip, :aliases => '-w', :required => false
132
+
133
+ include Cucumber
134
+
135
+ def features
136
+ require 'cucumber'
137
+ ENV['REGENERATE_APP'] = 'true' if options['rebuild']
138
+ Rails.env = 'test'
139
+
140
+ passed = !::Cucumber::Cli::Main.execute(cucumber_args) # returns true on failure
141
+ exit(passed ? 0 : 1)
142
+ end
143
+ end
144
+
145
+ class Unit < Thor::Group
146
+ namespace 'test:unit'
147
+ desc 'run tests'
148
+ argument :pattern, :required => false, :default => '**/test/**/*_test.rb'
149
+ class_option :name, :required => false, :desc => 'Runs tests matching NAME. Patterns may be used.' # Runs tests matching NAME.
150
+
151
+ def unit
152
+ Rails.env = 'test'
153
+ Dir[pattern].each { |file| require file }
154
+ exit($1.exitstatus) if $1.exited? && $1.exitstatus != 0
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+