pager-engines 2.0.20080513

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