pager-engines 2.0.20080513

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. data/CHANGELOG +267 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +83 -0
  4. data/Rakefile +188 -0
  5. data/about.yml +7 -0
  6. data/boot.rb +19 -0
  7. data/generators/plugin_migration/USAGE +45 -0
  8. data/generators/plugin_migration/plugin_migration_generator.rb +79 -0
  9. data/generators/plugin_migration/templates/plugin_migration.erb +13 -0
  10. data/init.rb +5 -0
  11. data/lib/engines.rb +174 -0
  12. data/lib/engines/assets.rb +38 -0
  13. data/lib/engines/plugin.rb +142 -0
  14. data/lib/engines/plugin/list.rb +30 -0
  15. data/lib/engines/plugin/loader.rb +18 -0
  16. data/lib/engines/plugin/locator.rb +37 -0
  17. data/lib/engines/plugin/migrator.rb +73 -0
  18. data/lib/engines/rails_extensions/action_mailer.rb +85 -0
  19. data/lib/engines/rails_extensions/asset_helpers.rb +119 -0
  20. data/lib/engines/rails_extensions/dependencies.rb +145 -0
  21. data/lib/engines/rails_extensions/migrations.rb +161 -0
  22. data/lib/engines/rails_extensions/rails.rb +11 -0
  23. data/lib/engines/rails_extensions/routing.rb +84 -0
  24. data/lib/engines/testing.rb +87 -0
  25. data/lib/engines_initializer.rb +5 -0
  26. data/rails/init.rb +5 -0
  27. data/tasks/engines.rake +179 -0
  28. data/test/app/controllers/app_and_plugin_controller.rb +5 -0
  29. data/test/app/controllers/application.rb +18 -0
  30. data/test/app/controllers/namespace/app_and_plugin_controller.rb +5 -0
  31. data/test/app/helpers/mail_helper.rb +5 -0
  32. data/test/app/models/app_and_plugin_model.rb +3 -0
  33. data/test/app/models/notify_mail.rb +26 -0
  34. data/test/app/things/thing.rb +3 -0
  35. data/test/app/views/app_and_plugin/a_view.html.erb +1 -0
  36. data/test/app/views/namespace/app_and_plugin/a_view.html.erb +1 -0
  37. data/test/app/views/notify_mail/implicit_multipart.text.html.erb +1 -0
  38. data/test/app/views/notify_mail/implicit_multipart.text.plain.erb +1 -0
  39. data/test/app/views/notify_mail/multipart_html.html.erb +1 -0
  40. data/test/app/views/notify_mail/multipart_plain.html.erb +1 -0
  41. data/test/app/views/notify_mail/signup.text.plain.erb +5 -0
  42. data/test/app/views/plugin_mail/mail_from_plugin_with_application_template.text.plain.erb +1 -0
  43. data/test/app/views/plugin_mail/multipart_from_plugin_with_application_template_plain.html.erb +1 -0
  44. data/test/functional/controller_loading_test.rb +51 -0
  45. data/test/functional/routes_test.rb +33 -0
  46. data/test/functional/view_helpers_test.rb +32 -0
  47. data/test/functional/view_loading_test.rb +60 -0
  48. data/test/lib/app_and_plugin_lib_model.rb +3 -0
  49. data/test/lib/engines_test_helper.rb +36 -0
  50. data/test/plugins/alpha_plugin/app/controllers/alpha_plugin_controller.rb +8 -0
  51. data/test/plugins/alpha_plugin/app/controllers/app_and_plugin_controller.rb +5 -0
  52. data/test/plugins/alpha_plugin/app/controllers/namespace/alpha_plugin_controller.rb +5 -0
  53. data/test/plugins/alpha_plugin/app/controllers/namespace/app_and_plugin_controller.rb +5 -0
  54. data/test/plugins/alpha_plugin/app/controllers/namespace/shared_plugin_controller.rb +5 -0
  55. data/test/plugins/alpha_plugin/app/controllers/shared_plugin_controller.rb +5 -0
  56. data/test/plugins/alpha_plugin/app/models/alpha_plugin_model.rb +3 -0
  57. data/test/plugins/alpha_plugin/app/models/app_and_plugin_model.rb +7 -0
  58. data/test/plugins/alpha_plugin/app/models/shared_plugin_model.rb +3 -0
  59. data/test/plugins/alpha_plugin/app/views/alpha_plugin/a_view.html.erb +1 -0
  60. data/test/plugins/alpha_plugin/app/views/app_and_plugin/a_view.html.erb +1 -0
  61. data/test/plugins/alpha_plugin/app/views/layouts/plugin_layout.erb +1 -0
  62. data/test/plugins/alpha_plugin/app/views/namespace/alpha_plugin/a_view.html.erb +1 -0
  63. data/test/plugins/alpha_plugin/app/views/namespace/app_and_plugin/a_view.html.erb +1 -0
  64. data/test/plugins/alpha_plugin/app/views/namespace/shared_plugin/a_view.html.erb +1 -0
  65. data/test/plugins/alpha_plugin/app/views/shared_plugin/a_view.html.erb +1 -0
  66. data/test/plugins/alpha_plugin/lib/alpha_plugin_lib_model.rb +3 -0
  67. data/test/plugins/alpha_plugin/lib/app_and_plugin_lib_model.rb +7 -0
  68. data/test/plugins/beta_plugin/app/controllers/app_and_plugin_controller.rb +5 -0
  69. data/test/plugins/beta_plugin/app/controllers/namespace/shared_plugin_controller.rb +5 -0
  70. data/test/plugins/beta_plugin/app/controllers/shared_plugin_controller.rb +5 -0
  71. data/test/plugins/beta_plugin/app/models/shared_plugin_model.rb +3 -0
  72. data/test/plugins/beta_plugin/app/views/namespace/shared_plugin/a_view.html.erb +1 -0
  73. data/test/plugins/beta_plugin/app/views/shared_plugin/a_view.html.erb +1 -0
  74. data/test/plugins/beta_plugin/init.rb +1 -0
  75. data/test/plugins/not_a_plugin/public/should_not_be_copied.txt +0 -0
  76. data/test/plugins/test_assets/app/controllers/assets_controller.rb +2 -0
  77. data/test/plugins/test_assets/app/views/assets/index.html.erb +3 -0
  78. data/test/plugins/test_assets/app/views/layouts/assets.html.erb +3 -0
  79. data/test/plugins/test_assets/init.rb +0 -0
  80. data/test/plugins/test_assets/public/file.txt +0 -0
  81. data/test/plugins/test_assets/public/subfolder/file_in_subfolder.txt +0 -0
  82. data/test/plugins/test_assets_with_assets_directory/assets/file.txt +0 -0
  83. data/test/plugins/test_assets_with_assets_directory/assets/subfolder/file_in_subfolder.txt +0 -0
  84. data/test/plugins/test_assets_with_assets_directory/init.rb +0 -0
  85. data/test/plugins/test_assets_with_no_subdirectory/assets/file.txt +0 -0
  86. data/test/plugins/test_assets_with_no_subdirectory/init.rb +0 -0
  87. data/test/plugins/test_code_mixing/app/things/thing.rb +3 -0
  88. data/test/plugins/test_code_mixing/init.rb +1 -0
  89. data/test/plugins/test_load_path/init.rb +0 -0
  90. data/test/plugins/test_migration/db/migrate/001_create_tests.rb +11 -0
  91. data/test/plugins/test_migration/db/migrate/002_create_others.rb +11 -0
  92. data/test/plugins/test_migration/init.rb +0 -0
  93. data/test/plugins/test_plugin_mailing/app/models/plugin_mail.rb +26 -0
  94. data/test/plugins/test_plugin_mailing/app/views/plugin_mail/mail_from_plugin.text.plain.erb +1 -0
  95. data/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_html.html.erb +1 -0
  96. data/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_plain.html.erb +1 -0
  97. data/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_with_application_template_html.html.erb +1 -0
  98. data/test/plugins/test_plugin_mailing/app/views/plugin_mail/multipart_from_plugin_with_application_template_plain.html.erb +1 -0
  99. data/test/plugins/test_plugin_mailing/init.rb +0 -0
  100. data/test/plugins/test_routing/app/controllers/namespace/test_routing_controller.rb +5 -0
  101. data/test/plugins/test_routing/app/controllers/test_routing_controller.rb +9 -0
  102. data/test/plugins/test_routing/init.rb +0 -0
  103. data/test/plugins/test_routing/routes.rb +2 -0
  104. data/test/plugins/test_testing/init.rb +0 -0
  105. data/test/plugins/test_testing/test/fixtures/testing_fixtures.yml +0 -0
  106. data/test/unit/action_mailer_test.rb +54 -0
  107. data/test/unit/arbitrary_code_mixing_test.rb +41 -0
  108. data/test/unit/assets_test.rb +48 -0
  109. data/test/unit/backwards_compat_test.rb +8 -0
  110. data/test/unit/load_path_test.rb +58 -0
  111. data/test/unit/migration_test.rb +43 -0
  112. data/test/unit/model_and_lib_test.rb +37 -0
  113. data/test/unit/plugins_test.rb +11 -0
  114. data/test/unit/testing_test.rb +18 -0
  115. metadata +255 -0
@@ -0,0 +1,5 @@
1
+ class AppAndPluginController < ApplicationController
2
+ def an_action
3
+ render_class_and_action 'from app'
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ # Filters added to this controller apply to all controllers in the application.
2
+ # Likewise, all the methods added will be available for all controllers.
3
+
4
+ class ApplicationController < ActionController::Base
5
+ def render_class_and_action(note = nil, options={})
6
+ text = "rendered in #{self.class.name}##{params[:action]}"
7
+ text += " (#{note})" unless note.nil?
8
+ render options.update(:text => text)
9
+ end
10
+
11
+ def rescue_action(e) raise e end;
12
+
13
+ helper :all # include all helpers, all the time
14
+
15
+ # See ActionController::RequestForgeryProtection for details
16
+ # Uncomment the :secret if you're not using the cookie session store
17
+ protect_from_forgery # :secret => 'b955354e438fc4ba070083505af94518'
18
+ end
@@ -0,0 +1,5 @@
1
+ class Namespace::AppAndPluginController < ApplicationController
2
+ def an_action
3
+ render_class_and_action 'from app'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module MailHelper
2
+ def do_something_helpful(var)
3
+ var.to_s.reverse
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ class AppAndPluginModel < ActiveRecord::Base
2
+ def self.report_location; TestHelper::report_location(__FILE__); end
3
+ end
@@ -0,0 +1,26 @@
1
+ class NotifyMail < ActionMailer::Base
2
+
3
+ helper :mail
4
+
5
+ def signup(txt)
6
+ body(:name => txt)
7
+ end
8
+
9
+ def multipart
10
+ recipients 'some_address@email.com'
11
+ subject 'multi part email'
12
+ from "another_user@email.com"
13
+ content_type 'multipart/alternative'
14
+
15
+ part :content_type => "text/html", :body => render_message("multipart_html", {})
16
+ part "text/plain" do |p|
17
+ p.body = render_message("multipart_plain", {})
18
+ end
19
+ end
20
+
21
+ def implicit_multipart
22
+ recipients 'some_address@email.com'
23
+ subject 'multi part email'
24
+ from "another_user@email.com"
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ class Thing
2
+ def self.from_app; TestHelper::report_location(__FILE__); end
3
+ end
@@ -0,0 +1 @@
1
+ <%= self.first_render %> (from app)
@@ -0,0 +1 @@
1
+ <%= self.first_render %> (from app)
@@ -0,0 +1 @@
1
+ the implicit html part of the email <%= do_something_helpful("semaj") %>
@@ -0,0 +1 @@
1
+ the implicit plaintext part of the email
@@ -0,0 +1 @@
1
+ the html part of the email <%= do_something_helpful("semaj") %>
@@ -0,0 +1 @@
1
+ the plaintext part of the email
@@ -0,0 +1,5 @@
1
+ Signup template from application
2
+
3
+ Here's a local variable set in the Mail object: <%= @name %>.
4
+
5
+ And here's a method called in a mail helper: <%= do_something_helpful(@name) %>
@@ -0,0 +1 @@
1
+ plugin mail template loaded from application
@@ -0,0 +1,51 @@
1
+ # Tests in this file ensure that:
2
+ #
3
+ # * plugin controller actions are found
4
+ # * actions defined in application controllers take precedence over those in plugins
5
+ # * actions in controllers in subsequently loaded plugins take precendence over those in previously loaded plugins
6
+ # * this works for actions in namespaced controllers accordingly
7
+
8
+ require File.dirname(__FILE__) + '/../test_helper'
9
+
10
+ class ControllerLoadingTest < Test::Unit::TestCase
11
+ def setup
12
+ @request = ActionController::TestRequest.new
13
+ @response = ActionController::TestResponse.new
14
+ end
15
+
16
+ # plugin controller actions should be found
17
+
18
+ def test_WITH_an_action_defined_only_in_a_plugin_IT_should_use_this_action
19
+ get_action_on_controller :an_action, :alpha_plugin
20
+ assert_response_body 'rendered in AlphaPluginController#an_action'
21
+ end
22
+
23
+ def test_WITH_an_action_defined_only_in_a_namespaced_plugin_controller_IT_should_use_this_action
24
+ get_action_on_controller :an_action, :alpha_plugin, :namespace
25
+ assert_response_body 'rendered in Namespace::AlphaPluginController#an_action'
26
+ end
27
+
28
+ # app takes precedence over plugins
29
+
30
+ def test_WITH_an_action_defined_in_both_app_and_plugin_IT_should_use_the_one_in_app
31
+ get_action_on_controller :an_action, :app_and_plugin
32
+ assert_response_body 'rendered in AppAndPluginController#an_action (from app)'
33
+ end
34
+
35
+ def test_WITH_an_action_defined_in_namespaced_controllers_in_both_app_and_plugin_IT_should_use_the_one_in_app
36
+ get_action_on_controller :an_action, :app_and_plugin, :namespace
37
+ assert_response_body 'rendered in Namespace::AppAndPluginController#an_action (from app)'
38
+ end
39
+
40
+ # subsequently loaded plugins take precendence over previously loaded plugins
41
+
42
+ def test_WITH_an_action_defined_in_two_plugin_controllers_IT_should_use_the_latter_of_both
43
+ get_action_on_controller :an_action, :shared_plugin
44
+ assert_response_body 'rendered in SharedPluginController#an_action (from beta_plugin)'
45
+ end
46
+
47
+ def test_WITH_an_action_defined_in_two_namespaced_plugin_controllers_IT_should_use_the_latter_of_both
48
+ get_action_on_controller :an_action, :shared_plugin, :namespace
49
+ assert_response_body 'rendered in Namespace::SharedPluginController#an_action (from beta_plugin)'
50
+ end
51
+ end
@@ -0,0 +1,33 @@
1
+ # Tests in this file ensure that:
2
+ #
3
+ # * Routes from plugins can be routed to
4
+ # * Named routes can be defined within a plugin
5
+
6
+ require File.dirname(__FILE__) + '/../test_helper'
7
+
8
+ class RoutesTest < Test::Unit::TestCase
9
+ def setup
10
+ @controller = TestRoutingController.new
11
+ @request = ActionController::TestRequest.new
12
+ @response = ActionController::TestResponse.new
13
+ end
14
+
15
+ def test_WITH_a_route_defined_in_a_plugin_IT_should_route_it
16
+ path = '/routes/an_action'
17
+ opts = {:controller => 'test_routing', :action => 'an_action'}
18
+ assert_routing path, opts
19
+ assert_recognizes opts, path # not sure what exactly the difference is, but it won't hurt either
20
+ end
21
+
22
+ def test_WITH_a_route_for_a_namespaced_controller_defined_in_a_plugin_IT_should_route_it
23
+ path = 'somespace/routes/an_action'
24
+ opts = {:controller => 'namespace/test_routing', :action => 'an_action'}
25
+ assert_routing path, opts
26
+ assert_recognizes opts, path
27
+ end
28
+
29
+ def test_should_properly_generate_named_routes
30
+ get :test_named_routes_from_plugin
31
+ assert_response_body '/somespace/routes'
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class ViewHelpersTest < Test::Unit::TestCase
4
+ def setup
5
+ @controller = AssetsController.new
6
+ @request = ActionController::TestRequest.new
7
+ @response = ActionController::TestResponse.new
8
+ get :index
9
+ end
10
+
11
+ # TODO: refactor this to use assert_select
12
+ def test_plugin_javascript_helpers
13
+ attrs = { :type => "text/javascript" }
14
+ assert_tag :script, :attributes => attrs.update(:src => "/plugin_assets/test_assets/javascripts/file.1.js")
15
+ assert_tag :script, :attributes => attrs.update(:src => "/plugin_assets/test_assets/javascripts/file2.js")
16
+ end
17
+
18
+ def test_plugin_stylesheet_helpers
19
+ attrs = { :media => "screen", :rel => "stylesheet", :type => "text/css" }
20
+ assert_tag :link, :attributes => attrs.update(:href => "/plugin_assets/test_assets/stylesheets/file.1.css")
21
+ assert_tag :link, :attributes => attrs.update(:href => "/plugin_assets/test_assets/stylesheets/file2.css")
22
+ end
23
+
24
+ def test_plugin_image_helpers
25
+ assert_tag :img, :attributes => { :src => "/plugin_assets/test_assets/images/image.png", :alt => "Image" }
26
+ end
27
+
28
+ def test_plugin_layouts
29
+ get :index
30
+ assert_tag :div, :attributes => { :id => "assets_layout" }
31
+ end
32
+ end
@@ -0,0 +1,60 @@
1
+ # Tests in this file ensure that:
2
+ #
3
+ # * plugin views are found
4
+ # * views in the application take precedence over those in plugins
5
+ # * views in subsequently loaded plugins take precendence over those in previously loaded plugins
6
+ # * this works for namespaced views accordingly
7
+
8
+ require File.dirname(__FILE__) + '/../test_helper'
9
+
10
+ class ViewLoadingTest < Test::Unit::TestCase
11
+ def setup
12
+ @request = ActionController::TestRequest.new
13
+ @response = ActionController::TestResponse.new
14
+ end
15
+
16
+ # plugin views should be found
17
+
18
+ def test_WITH_a_view_defined_only_in_a_plugin_IT_should_find_the_view
19
+ get_action_on_controller :a_view, :alpha_plugin
20
+ assert_response_body 'alpha_plugin/a_view'
21
+ end
22
+
23
+ def test_WITH_a_namespaced_view_defined_only_in_a_plugin_IT_should_find_the_view
24
+ get_action_on_controller :a_view, :alpha_plugin, :namespace
25
+ assert_response_body 'namespace/alpha_plugin/a_view'
26
+ end
27
+
28
+ # app takes precedence over plugins
29
+
30
+ def test_WITH_a_view_defined_in_both_app_and_plugin_IT_should_find_the_one_in_app
31
+ get_action_on_controller :a_view, :app_and_plugin
32
+ assert_response_body 'app_and_plugin/a_view (from app)'
33
+ end
34
+
35
+ def test_WITH_a_namespaced_view_defined_in_both_app_and_plugin_IT_should_find_the_one_in_app
36
+ get_action_on_controller :a_view, :app_and_plugin, :namespace
37
+ assert_response_body 'namespace/app_and_plugin/a_view (from app)'
38
+ end
39
+
40
+ # subsequently loaded plugins take precendence over previously loaded plugins
41
+
42
+ def test_WITH_a_view_defined_in_two_plugins_IT_should_find_the_latter_of_both
43
+ get_action_on_controller :a_view, :shared_plugin
44
+ assert_response_body 'shared_plugin/a_view (from beta_plugin)'
45
+ end
46
+
47
+ def test_WITH_a_namespaced_view_defined_in_two_plugins_IT_should_find_the_latter_of_both
48
+ get_action_on_controller :a_view, :shared_plugin, :namespace
49
+ assert_response_body 'namespace/shared_plugin/a_view (from beta_plugin)'
50
+ end
51
+
52
+ # layouts loaded from plugins
53
+
54
+ def test_should_be_able_to_load_a_layout_from_a_plugin
55
+ get_action_on_controller :action_with_layout, :alpha_plugin
56
+ assert_response_body 'rendered in AlphaPluginController#action_with_layout (with plugin layout)'
57
+ end
58
+
59
+ end
60
+
@@ -0,0 +1,3 @@
1
+ class AppAndPluginLibModel < ActiveRecord::Base
2
+ def self.report_location; TestHelper::report_location(__FILE__); end
3
+ end
@@ -0,0 +1,36 @@
1
+ module TestHelper
2
+ def self.report_location(path)
3
+ [RAILS_ROOT + '/', 'vendor/plugins/'].each { |part| path.sub! part, ''}
4
+ path = path.split('/')
5
+ location, subject = path.first, path.last
6
+ if subject.sub! '.rb', ''
7
+ subject = subject.classify
8
+ else
9
+ subject.sub! '.html.erb', ''
10
+ end
11
+ "#{subject} (from #{location})"
12
+ end
13
+ end
14
+
15
+ class Test::Unit::TestCase
16
+ # Add more helper methods to be used by all tests here...
17
+ def get_action_on_controller(*args)
18
+ action = args.shift
19
+ with_controller *args
20
+ get action
21
+ end
22
+
23
+ def with_controller(controller, namespace = nil)
24
+ classname = controller.to_s.classify + 'Controller'
25
+ classname = namespace.to_s.classify + '::' + classname unless namespace.nil?
26
+ @controller = classname.constantize.new
27
+ end
28
+
29
+ def assert_response_body(expected)
30
+ assert_equal expected, @response.body
31
+ end
32
+ end
33
+
34
+ # Because we're testing this behaviour, we actually want these features on!
35
+ Engines.disable_application_view_loading = false
36
+ Engines.disable_application_code_loading = false
@@ -0,0 +1,8 @@
1
+ class AlphaPluginController < ApplicationController
2
+ def an_action
3
+ render_class_and_action
4
+ end
5
+ def action_with_layout
6
+ render_class_and_action(nil, :layout => "plugin_layout")
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ class AppAndPluginController < ApplicationController
2
+ def an_action
3
+ render_class_and_action 'from alpha_plugin'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Namespace::AlphaPluginController < ApplicationController
2
+ def an_action
3
+ render_class_and_action
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Namespace::AppAndPluginController < ApplicationController
2
+ def an_action
3
+ render_class_and_action 'from alpha_plugin'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Namespace::SharedPluginController < ApplicationController
2
+ def an_action
3
+ render_class_and_action 'from alpha_plugin'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class SharedEngineController < ApplicationController
2
+ def an_action
3
+ render_class_and_action 'from alpha_engine'
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ class AlphaPluginModel < ActiveRecord::Base
2
+ def self.report_location; TestHelper::report_location(__FILE__); end
3
+ end
@@ -0,0 +1,7 @@
1
+ class AppAndPluginModel < ActiveRecord::Base
2
+ def self.report_location; TestHelper::report_location(__FILE__); end
3
+
4
+ def defined_only_in_alpha_plugin_version
5
+ # should not be defined as the model in app/models takes precedence
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ class SharedPluginModel < ActiveRecord::Base
2
+ def self.report_location; TestHelper::report_location(__FILE__); end
3
+ end
@@ -0,0 +1 @@
1
+ <%= self.first_render %>
@@ -0,0 +1 @@
1
+ <%= self.first_render %> (from a_view)
@@ -0,0 +1 @@
1
+ <%= yield %> (with plugin layout)
@@ -0,0 +1 @@
1
+ <%= self.first_render %> (from alpha_plugin)
@@ -0,0 +1 @@
1
+ <%= self.first_render %> (from alpha_plugin)
@@ -0,0 +1,3 @@
1
+ class AlphaPluginLibModel < ActiveRecord::Base
2
+ def self.report_location; TestHelper::report_location(__FILE__); end
3
+ end
@@ -0,0 +1,7 @@
1
+ class AppAndPluginLibModel < ActiveRecord::Base
2
+ def self.report_location; TestHelper::report_location(__FILE__); end
3
+
4
+ def defined_only_in_alpha_plugin_version
5
+ # should not be defined
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class AppAndPluginController < ApplicationController
2
+ def an_action
3
+ render_class_and_action 'from beta_plugin'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Namespace::SharedPluginController < ApplicationController
2
+ def an_action
3
+ render_class_and_action 'from beta_plugin'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class SharedPluginController < ApplicationController
2
+ def an_action
3
+ render_class_and_action 'from beta_plugin'
4
+ end
5
+ end