pluginfactory 1.0.7 → 1.0.8
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.tar.gz.sig +0 -0
- data/.gemtest +0 -0
- data/ChangeLog +511 -212
- data/History.rdoc +46 -0
- data/Manifest.txt +8 -0
- data/README.rdoc +237 -0
- data/Rakefile +17 -347
- data/lib/pluginfactory.rb +42 -18
- data/spec/lib/helpers.rb +116 -206
- data/spec/pluginfactory_spec.rb +27 -20
- metadata +157 -97
- metadata.gz.sig +1 -2
- data/LICENSE +0 -27
- data/README +0 -200
- data/rake/191_compat.rb +0 -26
- data/rake/dependencies.rb +0 -76
- data/rake/documentation.rb +0 -115
- data/rake/helpers.rb +0 -502
- data/rake/hg.rb +0 -287
- data/rake/manual.rb +0 -787
- data/rake/packaging.rb +0 -129
- data/rake/publishing.rb +0 -348
- data/rake/style.rb +0 -62
- data/rake/svn.rb +0 -668
- data/rake/testing.rb +0 -187
- data/rake/verifytask.rb +0 -64
data/spec/pluginfactory_spec.rb
CHANGED
@@ -10,7 +10,7 @@ BEGIN {
|
|
10
10
|
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
11
11
|
}
|
12
12
|
|
13
|
-
require '
|
13
|
+
require 'rspec'
|
14
14
|
require 'logger'
|
15
15
|
require 'pluginfactory'
|
16
16
|
|
@@ -32,7 +32,6 @@ end
|
|
32
32
|
|
33
33
|
|
34
34
|
describe PluginFactory do
|
35
|
-
include PluginFactory::SpecHelpers
|
36
35
|
|
37
36
|
before( :each ) do
|
38
37
|
setup_logging( :fatal )
|
@@ -55,11 +54,11 @@ describe PluginFactory do
|
|
55
54
|
|
56
55
|
it "doesn't error when its log method is called if no logging callback is set" do
|
57
56
|
PluginFactory.logger_callback = nil
|
58
|
-
|
57
|
+
expect { PluginFactory.log.debug("msg") }.to_not raise_error()
|
59
58
|
end
|
60
59
|
|
61
60
|
|
62
|
-
|
61
|
+
context "-extended class" do
|
63
62
|
|
64
63
|
it "knows about all of its derivatives" do
|
65
64
|
Plugin.derivatives.keys.should include( 'sub' )
|
@@ -85,19 +84,23 @@ describe PluginFactory do
|
|
85
84
|
end
|
86
85
|
end
|
87
86
|
|
87
|
+
exception = nil
|
88
88
|
begin
|
89
89
|
Plugin.create('pugilist')
|
90
|
-
rescue ::
|
91
|
-
|
90
|
+
rescue ::RuntimeError => err
|
91
|
+
exception = err
|
92
92
|
else
|
93
|
-
fail "Expected an exception to be raised"
|
93
|
+
fail "Expected an exception to be raised."
|
94
94
|
end
|
95
|
+
|
96
|
+
exception.backtrace.first.should =~ /#{__FILE__}/
|
95
97
|
end
|
96
98
|
|
97
99
|
it "will refuse to create an object other than one of its derivatives" do
|
98
100
|
class Doppelgaenger; end
|
99
|
-
|
100
|
-
|
101
|
+
expect {
|
102
|
+
Plugin.create(Doppelgaenger)
|
103
|
+
}.to raise_error( ArgumentError, /is not a descendent of/ )
|
101
104
|
end
|
102
105
|
|
103
106
|
|
@@ -123,8 +126,9 @@ describe PluginFactory do
|
|
123
126
|
at_least(6).times.
|
124
127
|
and_return {|path| raise LoadError, "path" }
|
125
128
|
|
126
|
-
|
127
|
-
|
129
|
+
expect {
|
130
|
+
Plugin.create('scintillating')
|
131
|
+
}.to raise_error( FactoryError, /couldn't find a \S+ named \S+.*tried \[/i )
|
128
132
|
end
|
129
133
|
|
130
134
|
|
@@ -132,8 +136,9 @@ describe PluginFactory do
|
|
132
136
|
# at least 6 -> 3 variants * 2 paths
|
133
137
|
Plugin.should_receive( :require ).and_return( true )
|
134
138
|
|
135
|
-
|
136
|
-
|
139
|
+
expect {
|
140
|
+
Plugin.create('corruscating')
|
141
|
+
}.to raise_error( FactoryError, /Require of '\S+' succeeded, but didn't load a Plugin/i )
|
137
142
|
end
|
138
143
|
|
139
144
|
|
@@ -145,13 +150,14 @@ describe PluginFactory do
|
|
145
150
|
raise ScriptError, "error while parsing #{path}"
|
146
151
|
}
|
147
152
|
|
148
|
-
|
149
|
-
|
153
|
+
expect {
|
154
|
+
Plugin.create('portable')
|
155
|
+
}.to raise_error( ScriptError, /error while parsing/ )
|
150
156
|
end
|
151
157
|
end
|
152
158
|
|
153
159
|
|
154
|
-
|
160
|
+
context "derivative of an extended class" do
|
155
161
|
|
156
162
|
it "knows what type of factory loads it" do
|
157
163
|
TestingPlugin.factory_type.should == 'Plugin'
|
@@ -159,13 +165,14 @@ describe PluginFactory do
|
|
159
165
|
|
160
166
|
it "raises a FactoryError if it can't figure out what type of factory loads it" do
|
161
167
|
TestingPlugin.stub!( :ancestors ).and_return( [] )
|
162
|
-
|
163
|
-
|
168
|
+
expect {
|
169
|
+
TestingPlugin.factory_type
|
170
|
+
}.to raise_error( FactoryError, /couldn't find factory base/i )
|
164
171
|
end
|
165
172
|
end
|
166
173
|
|
167
174
|
|
168
|
-
|
175
|
+
context "derivative of an extended class that isn't named <Something>Plugin" do
|
169
176
|
|
170
177
|
it "is still creatable via its full name" do
|
171
178
|
Plugin.create( 'blacksheep' ).should be_an_instance_of( BlackSheep )
|
@@ -174,7 +181,7 @@ describe PluginFactory do
|
|
174
181
|
end
|
175
182
|
|
176
183
|
|
177
|
-
|
184
|
+
context "derivative of an extended class in another namespace" do
|
178
185
|
|
179
186
|
it "is still creatable via its derivative name" do
|
180
187
|
Plugin.create( 'loadable' ).should be_an_instance_of( Test::LoadablePlugin )
|
metadata
CHANGED
@@ -1,120 +1,180 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: pluginfactory
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
- 7
|
10
|
-
version: 1.0.7
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.8
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
- Martin Chase
|
7
|
+
authors:
|
8
|
+
- Martin Chase
|
9
|
+
- Michael Granger
|
14
10
|
autorequire:
|
15
11
|
bindir: bin
|
16
|
-
cert_chain:
|
17
|
-
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
12
|
+
cert_chain:
|
13
|
+
- !binary |-
|
14
|
+
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURMRENDQWhTZ0F3SUJB
|
15
|
+
Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREE4TVF3d0NnWURWUVFEREFOblpX
|
16
|
+
UXgKRnpBVkJnb0praWFKay9Jc1pBRVpGZ2RmWVdWeWFXVmZNUk13RVFZS0Na
|
17
|
+
SW1pWlB5TEdRQkdSWURiM0puTUI0WApEVEV3TURreE5qRTBORGcxTVZvWERU
|
18
|
+
RXhNRGt4TmpFME5EZzFNVm93UERFTU1Bb0dBMVVFQXd3RFoyVmtNUmN3CkZR
|
19
|
+
WUtDWkltaVpQeUxHUUJHUllIWDJGbGNtbGxYekVUTUJFR0NnbVNKb21UOGl4
|
20
|
+
a0FSa1dBMjl5WnpDQ0FTSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURD
|
21
|
+
Q0FRb0NnZ0VCQUx5Ly9CRnhDMWYvY1BTbnd0SkJXb0ZpRnJpcgpoN1JpY0kr
|
22
|
+
am9xL29jVlhRcUk0VERXUHlGLzh0cWt2dCtyRDk5WDlxczJZZVI4Q1UvWWlJ
|
23
|
+
cExXclFPWVNUNzBKCnZEbjdVdmhiMm11RlZxcTYrdm9iZVRrSUxCRU82cGlv
|
24
|
+
bldERzhqU2JvM3FLbTFSaktKRHdnOXA0d05LaFB1dTgKS0d1ZS9CRmI2N0tm
|
25
|
+
bHF5QXBQbVBlYjNWZGQ5Y2xzcHpxZUZxcDdjVUJNRXBGUzZMV3h5NEdrK3F2
|
26
|
+
RkZKQkpMQgpCVUhFL0xaVkpNVnpmcEM1VXErUW1ZN0IrRkgvUXFObmRuM3RP
|
27
|
+
SGdzUGFkTFROaW11QjFzQ3VMMWE0ejNQZXBkClRlTEJFRm1FYW81RGszSy9R
|
28
|
+
OG84dmxiSUIvakJEVFV4NkRqYmd4dzc3OTA5eDZnSTlkb1U0TEQ1WE1jQ0F3
|
29
|
+
RUEKQWFNNU1EY3dDUVlEVlIwVEJBSXdBREFMQmdOVkhROEVCQU1DQkxBd0hR
|
30
|
+
WURWUjBPQkJZRUZKZW9Ha09yOWw0Qgorc2FNa1cvWlhUNFVlU3ZWTUEwR0NT
|
31
|
+
cUdTSWIzRFFFQkJRVUFBNElCQVFCRzJLT2J2WUkyZUh5eUJVSlNKM2pOCnZF
|
32
|
+
blUzZDYwem5BWGJyU2QycWIzcjFsWTFFUEREM2JjeTBNZ2dDZkdkZzNYdTU0
|
33
|
+
ejIxb3F5SWRrOHVHdFdCUEwKSElhOUVnZkZHU1VFZ3ZjSXZhWXFpTjRqVFV0
|
34
|
+
aWRmRUZ3K0x0anM4QVA5Z1dnU0lZUzZHcjM4VjBXR0ZGTnpJSAphT0Qyd211
|
35
|
+
OW9vL1JmZlc0aFMvOEd1dmZNemN3N0NRMzU1d0ZSNEtCL255emUrRXNaMVk1
|
36
|
+
RGVyQ0FhZ01WdURRClUwQkxtV0RGelBHR1dsUGVRQ3JZSENyK0FjSnorTlJu
|
37
|
+
YUhDS0xaZFNLai9SSHVUT3QrZ2JsUmV4OEZBaDhOZUEKY21saFhlNDZwWk5K
|
38
|
+
Z1dLYnhaYWg4NWpJang5NWhSOHZPSStOQU01aUg5a09xSzEzRHJ4YWNUS1Bo
|
39
|
+
cWo1UGp3RgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
|
40
|
+
date: 2012-02-20 00:00:00.000000000 Z
|
41
|
+
dependencies:
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: hoe-mercurial
|
44
|
+
requirement: &70125869528840 !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ~>
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 1.3.1
|
50
|
+
type: :development
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: *70125869528840
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: hoe-highline
|
55
|
+
requirement: &70125869528340 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 0.0.1
|
61
|
+
type: :development
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: *70125869528340
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: hoe-mercurial
|
66
|
+
requirement: &70125869527820 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ~>
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 1.3.1
|
72
|
+
type: :development
|
73
|
+
prerelease: false
|
74
|
+
version_requirements: *70125869527820
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: hoe-deveiate
|
77
|
+
requirement: &70125869527320 !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.0'
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: *70125869527320
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: rdoc
|
88
|
+
requirement: &70125869526780 !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '3.10'
|
94
|
+
type: :development
|
95
|
+
prerelease: false
|
96
|
+
version_requirements: *70125869526780
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: hoe
|
99
|
+
requirement: &70125869526280 !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
101
|
+
requirements:
|
102
|
+
- - ~>
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '2.13'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: *70125869526280
|
108
|
+
description: ! 'PluginFactory is a mixin module that turns an including class into
|
109
|
+
a factory for
|
41
110
|
|
42
|
-
description: |-
|
43
|
-
PluginFactory is a mixin module that turns an including class into a factory for
|
44
111
|
its derivatives, capable of searching for and loading them by name. This is
|
112
|
+
|
45
113
|
useful when you have an abstract base class which defines an interface and basic
|
114
|
+
|
46
115
|
functionality for a part of a larger system, and a collection of subclasses
|
116
|
+
|
47
117
|
which implement the interface for different underlying functionality.
|
48
|
-
|
118
|
+
|
119
|
+
|
120
|
+
An example of where this might be useful is in a program which talks to a
|
121
|
+
|
122
|
+
database. To avoid coupling it to a specific database, you use a Driver class
|
123
|
+
|
124
|
+
which encapsulates your program''s interaction with the database behind a useful
|
125
|
+
|
126
|
+
interface. Now you can create a concrete implementation of the Driver class for
|
127
|
+
|
128
|
+
each kind of database you wish to talk to. If you make the base Driver class a
|
129
|
+
|
130
|
+
PluginFactory, too, you can add new drivers simply by dropping them in a
|
131
|
+
|
132
|
+
directory and using the Driver''s `create` method to instantiate them:'
|
133
|
+
email:
|
49
134
|
- stillflame@FaerieMUD.org
|
50
135
|
- ged@FaerieMUD.org
|
51
136
|
executables: []
|
52
|
-
|
53
137
|
extensions: []
|
54
|
-
|
55
|
-
|
138
|
+
extra_rdoc_files:
|
139
|
+
- Manifest.txt
|
140
|
+
- History.rdoc
|
141
|
+
- README.rdoc
|
142
|
+
files:
|
56
143
|
- ChangeLog
|
57
|
-
-
|
58
|
-
-
|
59
|
-
|
144
|
+
- History.rdoc
|
145
|
+
- Manifest.txt
|
146
|
+
- README.rdoc
|
60
147
|
- Rakefile
|
61
|
-
- ChangeLog
|
62
|
-
- README
|
63
|
-
- LICENSE
|
64
|
-
- spec/pluginfactory_spec.rb
|
65
|
-
- spec/lib/helpers.rb
|
66
148
|
- lib/pluginfactory.rb
|
67
|
-
-
|
68
|
-
-
|
69
|
-
-
|
70
|
-
|
71
|
-
|
72
|
-
-
|
73
|
-
- rake/packaging.rb
|
74
|
-
- rake/publishing.rb
|
75
|
-
- rake/style.rb
|
76
|
-
- rake/svn.rb
|
77
|
-
- rake/testing.rb
|
78
|
-
- rake/verifytask.rb
|
79
|
-
has_rdoc: true
|
80
|
-
homepage: http://deveiate.org/projects/PluginFactory/
|
81
|
-
licenses: []
|
82
|
-
|
149
|
+
- spec/lib/helpers.rb
|
150
|
+
- spec/pluginfactory_spec.rb
|
151
|
+
- .gemtest
|
152
|
+
homepage: http://deveiate.org/projects/PluginFactory
|
153
|
+
licenses:
|
154
|
+
- BSD
|
83
155
|
post_install_message:
|
84
|
-
rdoc_options:
|
85
|
-
- --
|
86
|
-
-
|
87
|
-
|
88
|
-
- .
|
89
|
-
- --main=README
|
90
|
-
- --title=pluginfactory
|
91
|
-
require_paths:
|
156
|
+
rdoc_options:
|
157
|
+
- --main
|
158
|
+
- README.rdoc
|
159
|
+
require_paths:
|
92
160
|
- lib
|
93
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
161
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
162
|
none: false
|
95
|
-
requirements:
|
96
|
-
- -
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
|
99
|
-
|
100
|
-
- 0
|
101
|
-
version: "0"
|
102
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ! '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
168
|
none: false
|
104
|
-
requirements:
|
105
|
-
- -
|
106
|
-
- !ruby/object:Gem::Version
|
107
|
-
|
108
|
-
segments:
|
109
|
-
- 0
|
110
|
-
version: "0"
|
169
|
+
requirements:
|
170
|
+
- - ! '>='
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '0'
|
111
173
|
requirements: []
|
112
|
-
|
113
|
-
|
114
|
-
rubygems_version: 1.3.7
|
174
|
+
rubyforge_project: pluginfactory
|
175
|
+
rubygems_version: 1.8.16
|
115
176
|
signing_key:
|
116
177
|
specification_version: 3
|
117
|
-
summary:
|
118
|
-
|
119
|
-
|
120
|
-
- spec/lib/helpers.rb
|
178
|
+
summary: PluginFactory is a mixin module that turns an including class into a factory
|
179
|
+
for its derivatives, capable of searching for and loading them by name
|
180
|
+
test_files: []
|
metadata.gz.sig
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
Y�8�?a^� MѼ�}X`�Bke��a��5ä{��֍M�coa9�Mc_}��r�����/gD��KIM�3��j-��N���A�� x���\����o�&�<6Á�M�G����F�(Ț����B�C�{��]0P�Y5�r(;�`��[/�J��xE.e�ߙj
|
1
|
+
*���W��y�K������M�[n��H;�:[2M�B)�\%���!PK���1,���:e۰�V�~:&�uC�e'p -�Qܮ��ws�"a�7'j,D�ᴱJ��O�7���$hnkƜA��X���#6��������o��h�,����T#��f0Ʊ�Z����MiI�l�l���t���zF[T��{��V~TpX>�P�qԬ/�6�;^߫��x�R|Q��w���{���ѫc/��&uf=�6�a�
|
data/LICENSE
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
Copyright (c) 2008, 2009 Michael Granger and Martin Chase
|
2
|
-
All rights reserved.
|
3
|
-
|
4
|
-
Redistribution and use in source and binary forms, with or without
|
5
|
-
modification, are permitted provided that the following conditions are met:
|
6
|
-
|
7
|
-
* Redistributions of source code must retain the above copyright notice,
|
8
|
-
this list of conditions and the following disclaimer.
|
9
|
-
|
10
|
-
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
-
this list of conditions and the following disclaimer in the documentation
|
12
|
-
and/or other materials provided with the distribution.
|
13
|
-
|
14
|
-
* Neither the name of the author/s, nor the names of the project's
|
15
|
-
contributors may be used to endorse or promote products derived from this
|
16
|
-
software without specific prior written permission.
|
17
|
-
|
18
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
-
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
-
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
-
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
-
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
-
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
-
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
-
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
-
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README
DELETED
@@ -1,200 +0,0 @@
|
|
1
|
-
|
2
|
-
= PluginFactory
|
3
|
-
|
4
|
-
PluginFactory is a mixin module that turns an including class into a factory for
|
5
|
-
its derivatives, capable of searching for and loading them by name. This is
|
6
|
-
useful when you have an abstract base class which defines an interface and basic
|
7
|
-
functionality for a part of a larger system, and a collection of subclasses
|
8
|
-
which implement the interface for different underlying functionality.
|
9
|
-
|
10
|
-
An example of where this might be useful is in a program which talks to a
|
11
|
-
database. To avoid coupling it to a specific database, you use a Driver class
|
12
|
-
which encapsulates your program's interaction with the database behind a useful
|
13
|
-
interface. Now you can create a concrete implementation of the Driver class for
|
14
|
-
each kind of database you wish to talk to. If you make the base Driver class a
|
15
|
-
PluginFactory, too, you can add new drivers simply by dropping them in a
|
16
|
-
directory and using the Driver's <tt>create</tt> method to instantiate them:
|
17
|
-
|
18
|
-
== Synopsis
|
19
|
-
|
20
|
-
in driver.rb:
|
21
|
-
|
22
|
-
require "PluginFactory"
|
23
|
-
|
24
|
-
class Driver
|
25
|
-
include PluginFactory
|
26
|
-
def self::derivative_dirs
|
27
|
-
["drivers"]
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
in drivers/mysql.rb:
|
32
|
-
|
33
|
-
require 'driver'
|
34
|
-
|
35
|
-
class MysqlDriver < Driver
|
36
|
-
...implementation...
|
37
|
-
end
|
38
|
-
|
39
|
-
in /usr/lib/ruby/1.8/PostgresDriver.rb:
|
40
|
-
|
41
|
-
require 'driver'
|
42
|
-
|
43
|
-
class PostgresDriver < Driver
|
44
|
-
...implementation...
|
45
|
-
end
|
46
|
-
|
47
|
-
elsewhere
|
48
|
-
|
49
|
-
require 'driver'
|
50
|
-
|
51
|
-
config[:driver_type] #=> "mysql"
|
52
|
-
driver = Driver.create( config[:driver_type] )
|
53
|
-
driver.class #=> MysqlDriver
|
54
|
-
pgdriver = Driver.create( "PostGresDriver" )
|
55
|
-
|
56
|
-
== How Plugins Are Loaded
|
57
|
-
|
58
|
-
The +create+ class method added to your class by PluginFactory searches for your
|
59
|
-
module using several different strategies. It tries various permutations of the
|
60
|
-
base class's name in combination with the derivative requested. For example,
|
61
|
-
assume we want to make a +DataDriver+ base class, and then use plugins to define
|
62
|
-
drivers for different kinds of data sources:
|
63
|
-
|
64
|
-
require 'pluginfactory'
|
65
|
-
|
66
|
-
class DataDriver
|
67
|
-
include PluginFactory
|
68
|
-
end
|
69
|
-
|
70
|
-
When you attempt to load the 'socket' data-driver class like so:
|
71
|
-
|
72
|
-
DataDriver.create( 'socket' )
|
73
|
-
|
74
|
-
PluginFactory searches for modules with the following names:
|
75
|
-
|
76
|
-
'socketdatadriver'
|
77
|
-
'socket_datadriver'
|
78
|
-
'socketDataDriver'
|
79
|
-
'socket_DataDriver'
|
80
|
-
'SocketDataDriver'
|
81
|
-
'Socket_DataDriver'
|
82
|
-
'socket'
|
83
|
-
'Socket'
|
84
|
-
|
85
|
-
Obviously the last one will load something other than what is intended, so you
|
86
|
-
can also tell PluginFactory that plugins should be loaded from a subdirectory by
|
87
|
-
declaring a class method called `derivative_dirs` in the base class. It should
|
88
|
-
return an Array that contains a list of subdirectories to try:
|
89
|
-
|
90
|
-
class DataDriver
|
91
|
-
include PluginFactory
|
92
|
-
|
93
|
-
def self::derivative_dirs
|
94
|
-
['drivers']
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
This will change the list that is required to:
|
99
|
-
|
100
|
-
'drivers/socketdatadriver'
|
101
|
-
'drivers/socket_datadriver'
|
102
|
-
'drivers/socketDataDriver'
|
103
|
-
'drivers/socket_DataDriver'
|
104
|
-
'drivers/SocketDataDriver'
|
105
|
-
'drivers/Socket_DataDriver'
|
106
|
-
'drivers/socket'
|
107
|
-
'drivers/Socket'
|
108
|
-
|
109
|
-
If you return more than one subdirectory, each of them will be tried in turn:
|
110
|
-
|
111
|
-
class DataDriver
|
112
|
-
include PluginFactory
|
113
|
-
|
114
|
-
def self::derivative_dirs
|
115
|
-
['drivers', 'datadriver']
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
will change the search to include:
|
120
|
-
|
121
|
-
'drivers/socketdatadriver'
|
122
|
-
'drivers/socket_datadriver'
|
123
|
-
'drivers/socketDataDriver'
|
124
|
-
'drivers/socket_DataDriver'
|
125
|
-
'drivers/SocketDataDriver'
|
126
|
-
'drivers/Socket_DataDriver'
|
127
|
-
'drivers/socket'
|
128
|
-
'drivers/Socket'
|
129
|
-
'datadriver/socketdatadriver'
|
130
|
-
'datadriver/socket_datadriver'
|
131
|
-
'datadriver/socketDataDriver'
|
132
|
-
'datadriver/socket_DataDriver'
|
133
|
-
'datadriver/SocketDataDriver'
|
134
|
-
'datadriver/Socket_DataDriver'
|
135
|
-
'datadriver/socket'
|
136
|
-
'datadriver/Socket'
|
137
|
-
|
138
|
-
If the plugin is not found, a FactoryError is raised, and the message will list
|
139
|
-
all the permutations that were tried.
|
140
|
-
|
141
|
-
== Logging
|
142
|
-
|
143
|
-
If you need a little more insight into what's going on, PluginFactory exposes a
|
144
|
-
logging callback which will be called at various points in the process, and will
|
145
|
-
include details on what's being attempted.
|
146
|
-
|
147
|
-
You can activate logging by setting PluginFactory.logger_callback to something
|
148
|
-
that responds to the #call message. It will be called with two arguments, a
|
149
|
-
severity level and a message:
|
150
|
-
|
151
|
-
callback.call( :info, "Something happened" )
|
152
|
-
|
153
|
-
This is intended to make it easy to hook up to Logger or anything with a similar
|
154
|
-
interface:
|
155
|
-
|
156
|
-
require 'pluginfactory'
|
157
|
-
require 'logger'
|
158
|
-
|
159
|
-
class DataDriver
|
160
|
-
include PluginFactory
|
161
|
-
|
162
|
-
@logger = Logger.new( $stderr )
|
163
|
-
@logger.level = Logger::DEBUG
|
164
|
-
PluginFactory.logger_callback = lambda do |severity, msg|
|
165
|
-
@logger.send(severity, msg)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
DataDriver.create( 'ringbuffer' )
|
170
|
-
|
171
|
-
this might generate a log that looks like:
|
172
|
-
|
173
|
-
D, [...] DEBUG -- : Loading derivative ringbuffer
|
174
|
-
D, [...] DEBUG -- : Subdirs are: [""]
|
175
|
-
D, [...] DEBUG -- : Path is: ["ringbufferdatadriver", "ringbufferDataDriver",
|
176
|
-
"ringbuffer"]...
|
177
|
-
D, [...] DEBUG -- : Trying ringbufferdatadriver...
|
178
|
-
D, [...] DEBUG -- : No module at 'ringbufferdatadriver', trying the next
|
179
|
-
alternative: 'no such file to load -- ringbufferdatadriver'
|
180
|
-
D, [...] DEBUG -- : Trying ringbufferDataDriver...
|
181
|
-
D, [...] DEBUG -- : No module at 'ringbufferDataDriver', trying the next
|
182
|
-
alternative: 'no such file to load -- ringbufferDataDriver'
|
183
|
-
D, [...] DEBUG -- : Trying ringbuffer...
|
184
|
-
D, [...] DEBUG -- : No module at 'ringbuffer', trying the next alternative:
|
185
|
-
'no such file to load -- ringbuffer'
|
186
|
-
D, [...] DEBUG -- : fatals = []
|
187
|
-
E, [...] ERROR -- : Couldn't find a DataDriver named 'ringbuffer':
|
188
|
-
tried ["ringbufferdatadriver", "ringbufferDataDriver", "ringbuffer"]
|
189
|
-
|
190
|
-
== Authors
|
191
|
-
|
192
|
-
* Martin Chase <stillflame@FaerieMUD.org>
|
193
|
-
* Michael Granger <ged@FaerieMUD.org>
|
194
|
-
|
195
|
-
:include: LICENSE
|
196
|
-
|
197
|
-
--
|
198
|
-
|
199
|
-
Please see the file LICENSE for licensing details.
|
200
|
-
|