rails3_plugin_toolbox 0.2.0 → 0.3.0
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.
- data/README.markdown +90 -53
- data/Rakefile +4 -1
- data/VERSION +1 -1
- data/lib/plugin_toolbox/extender.rb +2 -2
- data/lib/plugin_toolbox/rspec/config.rb +8 -0
- data/lib/plugin_toolbox/rspec/matchers/be_extended_with.rb +58 -0
- data/lib/plugin_toolbox/util.rb +11 -1
- data/lib/rails3_plugin_toolbox.rb +3 -1
- data/rails3_plugin_toolbox.gemspec +6 -2
- data/spec/plugin_toolbox/extend_view_content_spec.rb +48 -0
- data/spec/spec_helper.rb +5 -4
- metadata +6 -2
data/README.markdown
CHANGED
@@ -1,17 +1,10 @@
|
|
1
1
|
# Rails3 plugin toolbox
|
2
2
|
|
3
|
-
|
3
|
+
This is a small toolbox that greatly facilitates creating Plugins for Rails 3 without having to know a lot about the Rails 3 internals and Plugin architecture.
|
4
|
+
The toolbox provides a convenient DSL that abstracts away the internal Rails 3 plugin wiring to an even greater extent, making the DSL dead simple to use!
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
I have now discovered how to test he validity of Rails extensions in RSpec without having to have a full Rails 3 host app.
|
8
|
-
RSpec 2 test suite will soon be added :)
|
9
|
-
|
10
|
-
http://gist.github.com/542441
|
11
|
-
|
12
|
-
## Inspiration
|
13
|
-
|
14
|
-
This project was inspired by the Yehuda Katz article at http://www.railsdispatch.com/, titled "How Rails enables more choices".
|
6
|
+
I also provide a specialized RSpec 2 matcher *be_extended_with* which makes it easy to spec your plugin extension functionality, to make sure Rails is extended with
|
7
|
+
the functionality (modules) that you expect and desire ;)
|
15
8
|
|
16
9
|
## Install
|
17
10
|
|
@@ -20,62 +13,106 @@ This project was inspired by the Yehuda Katz article at http://www.railsdispatch
|
|
20
13
|
## Usage
|
21
14
|
|
22
15
|
<pre>
|
23
|
-
# my_plugin/lib/
|
24
|
-
module MyPlugin
|
25
|
-
Rails3::PluginExtender.new do
|
26
|
-
|
27
|
-
extend_from_module Ultra::View, :stuff, :in => :view
|
28
|
-
extend_with Ultra::Controller, :in => :controller
|
29
|
-
|
30
|
-
extend_rails :i18n do
|
31
|
-
with MyAddition
|
32
|
-
extend_from_module Ultra::Power, :util, :logging, :monitor
|
16
|
+
# my_plugin/lib/my_plugin/rails/extensions.rb
|
33
17
|
|
34
|
-
|
35
|
-
|
36
|
-
end
|
18
|
+
require 'rails/all'
|
19
|
+
require 'rails3_plugin_toolbox'
|
37
20
|
|
38
|
-
|
39
|
-
|
40
|
-
|
21
|
+
Rails3::PluginExtender.new do
|
22
|
+
extend_from_module Ultra::View, :stuff, :in => :view
|
23
|
+
extend_with Ultra::Controller, :in => :controller
|
41
24
|
|
42
|
-
|
43
|
-
|
44
|
-
|
25
|
+
before :initialize do
|
26
|
+
"Rails not yet initialized!"
|
27
|
+
end
|
45
28
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
29
|
+
extend_rails :i18n do
|
30
|
+
with MyAddition
|
31
|
+
extend_from_module Ultra::Power, :util, :logging, :monitor
|
50
32
|
|
51
|
-
|
52
|
-
|
53
|
-
end
|
33
|
+
before :initialize do
|
34
|
+
MyOtherAddition.say 'before localized!'
|
35
|
+
end
|
54
36
|
|
55
|
-
|
56
|
-
|
37
|
+
before :configuration do
|
38
|
+
MyOtherAddition.configured = 'was configured!'
|
57
39
|
end
|
58
40
|
|
59
|
-
|
60
|
-
|
41
|
+
before :eager_load do
|
42
|
+
puts "before eager load!"
|
61
43
|
end
|
62
44
|
|
63
|
-
|
64
|
-
|
65
|
-
end
|
45
|
+
after :initialize do
|
46
|
+
MyAddition.say 'localized!'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
</pre>
|
51
|
+
|
52
|
+
More API examples
|
53
|
+
|
54
|
+
<pre>
|
55
|
+
Rails3::PluginExtender.new do
|
56
|
+
extend_rails :view do # or use :action_view
|
57
|
+
with MyViewAddition
|
58
|
+
end
|
59
|
+
|
60
|
+
extend_rails :controller do # or use :action_mailer
|
61
|
+
with MyViewAddition
|
62
|
+
end
|
63
|
+
|
64
|
+
extend_rails :mailer do # or use :action_mailer
|
65
|
+
with MyMailAddition, 'MyOtherMailAddition'
|
66
|
+
end
|
67
|
+
|
68
|
+
extend_rails :AR do # active record
|
69
|
+
with MyActiveRecordAddition
|
70
|
+
end
|
66
71
|
|
67
|
-
|
68
|
-
|
69
|
-
extend_from_module Ultra::Power::More, :extra, :stuff
|
70
|
-
end
|
71
|
-
|
72
|
-
after(:initialize) do
|
73
|
-
include MyCoreModule
|
74
|
-
end
|
72
|
+
extend_rails :active_record do
|
73
|
+
with MyExtraScopeHelpers
|
75
74
|
end
|
76
|
-
|
75
|
+
|
76
|
+
extend_rails(:controller) do
|
77
|
+
extend_from_module Ultra::Power, :util, :logging, :monitor
|
78
|
+
extend_from_module Ultra::Power::More, :extra, :stuff
|
79
|
+
end
|
80
|
+
|
81
|
+
after(:initialize) do
|
82
|
+
puts "Rails initialized!"
|
83
|
+
end
|
84
|
+
end
|
77
85
|
</pre>
|
78
86
|
|
87
|
+
## RSpec 2 matchers
|
88
|
+
|
89
|
+
The library comes with a special Matcher to facilitate making Rails 3 extension specs
|
90
|
+
|
91
|
+
* be_extended_with module_name, *submodules
|
92
|
+
|
93
|
+
_Usage example:_
|
94
|
+
|
95
|
+
<pre>
|
96
|
+
|
97
|
+
require 'rspec'
|
98
|
+
require 'rails3_plugin_toolbox'
|
99
|
+
require 'rails/all'
|
100
|
+
|
101
|
+
it "should extend Action View with View Helpers" do
|
102
|
+
Rails3::PluginExtender.new do
|
103
|
+
extend_rails :view do
|
104
|
+
extend_from_module Helper::View, :panel, :window
|
105
|
+
extend_with Helper::View::Button, Helper::View::Form
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Initialize the rails application
|
110
|
+
Minimal::Application.initialize!
|
111
|
+
|
112
|
+
:view.should be_extended_with Helper::View, :panel, :window, :button, :form
|
113
|
+
:view.should_not be_extended_with Helper::View, :unknown
|
114
|
+
end
|
115
|
+
</pre>
|
79
116
|
|
80
117
|
## Note on Patches/Pull Requests
|
81
118
|
|
data/Rakefile
CHANGED
@@ -8,8 +8,11 @@ begin
|
|
8
8
|
gem.homepage = "http://github.com/kristianmandrup/rails3_plugin_toolbox"
|
9
9
|
gem.authors = ["Kristian Mandrup"]
|
10
10
|
gem.add_development_dependency "rspec", ">= 2.0.0.beta.19"
|
11
|
+
|
12
|
+
# gem.add_dependency 'active_support', ">= 3.0.0.rc"
|
11
13
|
gem.add_dependency "rails", ">= 3.0.0.rc"
|
12
|
-
gem.add_dependency "require_all", ">= 1.1.0"
|
14
|
+
gem.add_dependency "require_all", ">= 1.1.0"
|
15
|
+
|
13
16
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
14
17
|
end
|
15
18
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -20,7 +20,7 @@ module Rails3
|
|
20
20
|
def extend_from_module base_name, *module_names, options
|
21
21
|
raise ArgumentError, "You must specify an options Hash as the last argument for #extend_from_module" if !options.kind_of? Hash
|
22
22
|
module_names.each do |name|
|
23
|
-
extend_with
|
23
|
+
extend_with get_constant(base_name, name), options
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -38,7 +38,7 @@ module Rails3
|
|
38
38
|
|
39
39
|
def extend_from_module base_name, *module_names
|
40
40
|
module_names.each do |name|
|
41
|
-
include
|
41
|
+
include get_constant(base_name, name)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Rails3
|
2
|
+
class PluginExtender
|
3
|
+
module Matchers
|
4
|
+
class BeExtendedWith
|
5
|
+
include Rails3::PluginExtender::Util
|
6
|
+
|
7
|
+
attr_reader :methods, :module_const, :rails_const, :submodules
|
8
|
+
|
9
|
+
def initialize(module_const, submodules=nil)
|
10
|
+
@module_const = module_const
|
11
|
+
raise ArgumentError, "List of submodules must be given as a collection of Symbols or Strings" if submodules && !submodules.respond_to?(:flatten)
|
12
|
+
@submodules = submodules.flatten if submodules
|
13
|
+
end
|
14
|
+
|
15
|
+
def matches? type
|
16
|
+
begin
|
17
|
+
@rails_const = get_base_class(type)
|
18
|
+
return match_submodules? if submodules
|
19
|
+
methods_included? module_const.instance_methods
|
20
|
+
rescue
|
21
|
+
false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def base_class_methods
|
26
|
+
(rails_const == I18n) ? rails_const.methods : rails_const.instance_methods
|
27
|
+
end
|
28
|
+
|
29
|
+
def match_submodules?
|
30
|
+
submodules.each do |name|
|
31
|
+
return false if !methods_included? get_methods(name)
|
32
|
+
end
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
36
|
+
def methods_included? methods
|
37
|
+
(base_class_methods & methods) == methods
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_methods name
|
41
|
+
get_constant(module_const, name).instance_methods
|
42
|
+
end
|
43
|
+
|
44
|
+
def failure_message
|
45
|
+
"Expected the rails class #{rails_const} to be extended with all the methods in #{module_const}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def negative_failure_message
|
49
|
+
"Din not expect the rails class #{rails_const} to be extended with all the methods in #{module_const}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def be_extended_with(module_const, *submodules)
|
54
|
+
BeExtendedWith.new module_const, submodules
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/plugin_toolbox/util.rb
CHANGED
@@ -3,7 +3,17 @@ module Rails3
|
|
3
3
|
module Util
|
4
4
|
INIT = :initialize
|
5
5
|
ACTIVE_MODULES = {:AR => :active_record, :view => :action_view, :controller => :action_controller, :mailer => :action_mailer}
|
6
|
-
|
6
|
+
|
7
|
+
def get_base_class type
|
8
|
+
type = get_load_type(type).to_s
|
9
|
+
return "#{type.to_s.camelize}::Base".constantize if type =~/action/ || type =~/active/
|
10
|
+
"#{type.to_s.camelize}".constantize
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_constant base_name, name
|
14
|
+
"#{base_name.to_s.camelize}::#{name.to_s.camelize}".constantize
|
15
|
+
end
|
16
|
+
|
7
17
|
def get_load_type type
|
8
18
|
return ACTIVE_MODULES[type] if ACTIVE_MODULES[type]
|
9
19
|
return type if ACTIVE_MODULES.values.include? type
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rails3_plugin_toolbox}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kristian Mandrup"]
|
@@ -27,10 +27,13 @@ Gem::Specification.new do |s|
|
|
27
27
|
"config/database.yml",
|
28
28
|
"lib/plugin_toolbox/extender.rb",
|
29
29
|
"lib/plugin_toolbox/loader.rb",
|
30
|
+
"lib/plugin_toolbox/rspec/config.rb",
|
31
|
+
"lib/plugin_toolbox/rspec/matchers/be_extended_with.rb",
|
30
32
|
"lib/plugin_toolbox/util.rb",
|
31
33
|
"lib/rails3_plugin_toolbox.rb",
|
32
34
|
"log/development.log",
|
33
35
|
"rails3_plugin_toolbox.gemspec",
|
36
|
+
"spec/plugin_toolbox/extend_view_content_spec.rb",
|
34
37
|
"spec/plugin_toolbox/extender_action_spec.rb",
|
35
38
|
"spec/plugin_toolbox/extender_i18n_spec.rb",
|
36
39
|
"spec/plugin_toolbox/extender_spec.rb",
|
@@ -45,7 +48,8 @@ Gem::Specification.new do |s|
|
|
45
48
|
s.rubygems_version = %q{1.3.7}
|
46
49
|
s.summary = %q{Toolbox to facilitate Rails 3 plugin development}
|
47
50
|
s.test_files = [
|
48
|
-
"spec/plugin_toolbox/
|
51
|
+
"spec/plugin_toolbox/extend_view_content_spec.rb",
|
52
|
+
"spec/plugin_toolbox/extender_action_spec.rb",
|
49
53
|
"spec/plugin_toolbox/extender_i18n_spec.rb",
|
50
54
|
"spec/plugin_toolbox/extender_spec.rb",
|
51
55
|
"spec/spec_helper.rb"
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Helper
|
4
|
+
module View
|
5
|
+
module Panel
|
6
|
+
def draw_panel
|
7
|
+
'panel'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Window
|
12
|
+
def draw_window
|
13
|
+
'panel'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module Button
|
18
|
+
def draw_button
|
19
|
+
'button'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Form
|
24
|
+
def draw_button
|
25
|
+
'button'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe Rails3::PluginExtender do
|
32
|
+
describe '#extend_rails' do
|
33
|
+
it "should extend Action View" do
|
34
|
+
Rails3::PluginExtender.new do
|
35
|
+
extend_rails :view do
|
36
|
+
extend_from_module Helper::View, :panel, :window
|
37
|
+
extend_with Helper::View::Button, Helper::View::Form
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Initialize the rails application
|
42
|
+
Minimal::Application.initialize!
|
43
|
+
|
44
|
+
:view.should be_extended_with Helper::View, :panel, :window, :button, :form
|
45
|
+
:view.should_not be_extended_with Helper::View, :unknown
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
require 'rspec'
|
2
2
|
require 'rspec/autorun'
|
3
|
-
require 'active_support'
|
4
|
-
require 'active_record'
|
5
|
-
require 'action_controller'
|
6
|
-
require 'action_view'
|
7
3
|
require 'rails3_plugin_toolbox'
|
8
4
|
|
9
5
|
# See http://www.igvita.com/2010/08/04/rails-3-internals-railtie-creating-plugins/
|
10
6
|
|
7
|
+
# require 'active_support'
|
8
|
+
# require 'active_record'
|
9
|
+
# require 'action_controller'
|
10
|
+
# require 'action_view'
|
11
|
+
# require 'action_mailer'
|
11
12
|
# require 'active_support/railtie'
|
12
13
|
require 'rails/all'
|
13
14
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 3
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Kristian Mandrup
|
@@ -85,10 +85,13 @@ files:
|
|
85
85
|
- config/database.yml
|
86
86
|
- lib/plugin_toolbox/extender.rb
|
87
87
|
- lib/plugin_toolbox/loader.rb
|
88
|
+
- lib/plugin_toolbox/rspec/config.rb
|
89
|
+
- lib/plugin_toolbox/rspec/matchers/be_extended_with.rb
|
88
90
|
- lib/plugin_toolbox/util.rb
|
89
91
|
- lib/rails3_plugin_toolbox.rb
|
90
92
|
- log/development.log
|
91
93
|
- rails3_plugin_toolbox.gemspec
|
94
|
+
- spec/plugin_toolbox/extend_view_content_spec.rb
|
92
95
|
- spec/plugin_toolbox/extender_action_spec.rb
|
93
96
|
- spec/plugin_toolbox/extender_i18n_spec.rb
|
94
97
|
- spec/plugin_toolbox/extender_spec.rb
|
@@ -129,6 +132,7 @@ signing_key:
|
|
129
132
|
specification_version: 3
|
130
133
|
summary: Toolbox to facilitate Rails 3 plugin development
|
131
134
|
test_files:
|
135
|
+
- spec/plugin_toolbox/extend_view_content_spec.rb
|
132
136
|
- spec/plugin_toolbox/extender_action_spec.rb
|
133
137
|
- spec/plugin_toolbox/extender_i18n_spec.rb
|
134
138
|
- spec/plugin_toolbox/extender_spec.rb
|