pluggability 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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/History.rdoc +5 -0
- data/Manifest.txt +1 -1
- data/README.rdoc +70 -51
- data/Rakefile +16 -4
- data/lib/pluggability.rb +52 -2
- data/spec/{lib/helpers.rb → helpers.rb} +7 -15
- data/spec/pluggability_spec.rb +67 -42
- data.tar.gz.sig +0 -0
- metadata +40 -14
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7600ea51c42f4decce2b6402e83f70aa7b12d5c2
|
4
|
+
data.tar.gz: cee2efb2884df9d5f930d6bb284d6c8e7fce3668
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7889a6316ded531e79c33b91f84537e0ecbd848e52f25eb51df7346d2b9d351758e4608f128c163d0e84aeb1672e7201dcc115f4c1af0bf8e86e4e12c9dcead6
|
7
|
+
data.tar.gz: 0dc094f630d4dcb4b6a4ca50ea311a56c83e3980fecff63fe44f58e8b67859d7f3864d9f0191885dc643ff8f6741b6cff21b2461b687388eca440962c55079d5
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/History.rdoc
CHANGED
data/Manifest.txt
CHANGED
data/README.rdoc
CHANGED
@@ -77,22 +77,18 @@ formats:
|
|
77
77
|
def read_from_file( path ); end
|
78
78
|
end
|
79
79
|
|
80
|
-
When you attempt to load the 'apache'
|
80
|
+
When you attempt to load the 'apache' logreader class like so:
|
81
81
|
|
82
82
|
LogReader.create( 'apache' )
|
83
83
|
|
84
84
|
Pluggability searches for modules with the following names:
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
'apache'
|
93
|
-
'Apache'
|
94
|
-
|
95
|
-
Obviously the last one will load something other than what is intended,
|
86
|
+
ApacheLogReader
|
87
|
+
apachelogreader
|
88
|
+
apache_log_reader
|
89
|
+
apache
|
90
|
+
|
91
|
+
Obviously the last one might load something other than what is intended,
|
96
92
|
so you can also tell Pluggability that plugins should be loaded from a
|
97
93
|
subdirectory by declaring one or more +plugin_prefixes+ in the base
|
98
94
|
class. Each prefix will be tried (in the order they're declared) when
|
@@ -105,50 +101,74 @@ searching for a subclass:
|
|
105
101
|
|
106
102
|
This will change the list that is required to:
|
107
103
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
'drivers/Apache_LogReader'
|
114
|
-
'drivers/apache'
|
115
|
-
'drivers/Apache'
|
104
|
+
drivers/apache_logreader
|
105
|
+
drivers/apache_LogReader
|
106
|
+
drivers/apachelogreader
|
107
|
+
drivers/apacheLogReader
|
108
|
+
drivers/apache
|
116
109
|
|
117
|
-
If you
|
110
|
+
If you specify more than one subdirectory, each of them will be tried in
|
118
111
|
turn:
|
119
112
|
|
120
113
|
class LogReader
|
121
114
|
extend Pluggability
|
122
|
-
plugin_prefixes 'drivers', '
|
115
|
+
plugin_prefixes 'drivers', 'logreader'
|
123
116
|
end
|
124
117
|
|
125
118
|
will change the search to include:
|
126
119
|
|
127
|
-
'drivers/
|
128
|
-
'drivers/
|
120
|
+
'drivers/apachelogreader'
|
121
|
+
'drivers/apache_logreader'
|
129
122
|
'drivers/apacheLogReader'
|
130
123
|
'drivers/apache_LogReader'
|
131
124
|
'drivers/ApacheLogReader'
|
132
125
|
'drivers/Apache_LogReader'
|
133
126
|
'drivers/apache'
|
134
127
|
'drivers/Apache'
|
135
|
-
'
|
136
|
-
'
|
137
|
-
'
|
138
|
-
'
|
139
|
-
'
|
140
|
-
'
|
141
|
-
'
|
142
|
-
'
|
128
|
+
'logreader/apachelogreader'
|
129
|
+
'logreader/apache_logreader'
|
130
|
+
'logreader/apacheLogReader'
|
131
|
+
'logreader/apache_LogReader'
|
132
|
+
'logreader/ApacheLogReader'
|
133
|
+
'logreader/Apache_LogReader'
|
134
|
+
'logreader/apache'
|
135
|
+
'logreader/Apache'
|
143
136
|
|
144
137
|
If the plugin is not found, a Pluggability::PluginError is raised, and
|
145
138
|
the message will list all the permutations that were tried.
|
146
139
|
|
147
140
|
|
141
|
+
=== Preloaded Plugins
|
142
|
+
|
143
|
+
Sometimes you don't want to wait for plugins to be loaded on demand. For
|
144
|
+
that case, Pluggability provides the load_all[rdoc-ref:Pluggability#load_all]
|
145
|
+
method. This will find all possible matches for plugin files and load
|
146
|
+
them, returning an Array of all the loaded classes:
|
147
|
+
|
148
|
+
class Template::Tag
|
149
|
+
extend Pluggability
|
150
|
+
plugin_prefixes 'tag'
|
151
|
+
end
|
152
|
+
|
153
|
+
tag_classes = Template::Tag.load_all
|
154
|
+
|
155
|
+
|
156
|
+
=== Excluding Some Files
|
157
|
+
|
158
|
+
You can also prevent some files from being automatically loaded by
|
159
|
+
either create[rdoc-ref:Pluggability#create] or
|
160
|
+
load_all[rdoc-ref:Pluggability#load_all] by setting one or more exclusion
|
161
|
+
patterns:
|
162
|
+
|
163
|
+
LogReader.plugin_exclusions 'spec/*', %r{/test/}
|
164
|
+
|
165
|
+
The patterns can either be Regexps or glob Strings.
|
166
|
+
|
167
|
+
|
148
168
|
=== Logging
|
149
169
|
|
150
170
|
If you need a little more insight into what's going on, Pluggability
|
151
|
-
uses the
|
171
|
+
uses the Loggability[https://rubygems.org/gems/loggability] library.
|
152
172
|
Just set the log level to 'debug' and it'll explain what's going on:
|
153
173
|
|
154
174
|
require 'pluggability'
|
@@ -166,32 +186,31 @@ Just set the log level to 'debug' and it'll explain what's going on:
|
|
166
186
|
|
167
187
|
LogReader.create( 'ringbuffer' )
|
168
188
|
|
169
|
-
this might generate a log that looks like:
|
189
|
+
this might generate a log that looks (something) like:
|
170
190
|
|
171
191
|
[...] debug {} -- Loading derivative ringbuffer
|
172
192
|
[...] debug {} -- Subdirs are: [""]
|
173
|
-
[...] debug {} -- Path is: ["
|
174
|
-
"
|
175
|
-
|
176
|
-
[...] debug {} --
|
177
|
-
|
178
|
-
next alternative: 'cannot load such file -- ringbuffer_datadriver'
|
193
|
+
[...] debug {} -- Path is: ["ringbuffer_logreader", "ringbuffer_LogReader",
|
194
|
+
"ringbufferlogreader", "ringbufferLogReader", "ringbuffer"]...
|
195
|
+
[...] debug {} -- Trying ringbuffer_logreader...
|
196
|
+
[...] debug {} -- No module at 'ringbuffer_logreader', trying the next alternative:
|
197
|
+
'cannot load such file -- ringbuffer_logreader'
|
179
198
|
[...] debug {} -- Trying ringbuffer_LogReader...
|
180
|
-
[...] debug {} -- No module at 'ringbuffer_LogReader', trying the
|
181
|
-
|
182
|
-
[...] debug {} -- Trying
|
183
|
-
[...] debug {} -- No module at '
|
184
|
-
|
199
|
+
[...] debug {} -- No module at 'ringbuffer_LogReader', trying the next alternative:
|
200
|
+
'cannot load such file -- ringbuffer_LogReader'
|
201
|
+
[...] debug {} -- Trying ringbufferlogreader...
|
202
|
+
[...] debug {} -- No module at 'ringbufferlogreader', trying the next alternative:
|
203
|
+
'cannot load such file -- ringbufferlogreader'
|
185
204
|
[...] debug {} -- Trying ringbufferLogReader...
|
186
|
-
[...] debug {} -- No module at 'ringbufferLogReader', trying the
|
187
|
-
|
205
|
+
[...] debug {} -- No module at 'ringbufferLogReader', trying the next alternative:
|
206
|
+
'cannot load such file -- ringbufferLogReader'
|
188
207
|
[...] debug {} -- Trying ringbuffer...
|
189
|
-
[...] debug {} -- No module at 'ringbuffer', trying the next
|
190
|
-
|
208
|
+
[...] debug {} -- No module at 'ringbuffer', trying the next alternative:
|
209
|
+
'cannot load such file -- ringbuffer'
|
191
210
|
[...] debug {} -- fatals = []
|
192
|
-
[...] error {} -- Couldn't find a LogReader named 'ringbuffer':
|
193
|
-
|
194
|
-
"
|
211
|
+
[...] error {} -- Couldn't find a LogReader named 'ringbuffer': tried
|
212
|
+
["ringbuffer_logreader", "ringbuffer_LogReader",
|
213
|
+
"ringbufferlogreader", "ringbufferLogReader", "ringbuffer"]
|
195
214
|
|
196
215
|
|
197
216
|
== Installation
|
data/Rakefile
CHANGED
@@ -5,6 +5,7 @@ require 'hoe'
|
|
5
5
|
Hoe.plugin :deveiate
|
6
6
|
Hoe.plugin :mercurial
|
7
7
|
Hoe.plugin :signing
|
8
|
+
Hoe.plugin :bundler
|
8
9
|
|
9
10
|
Hoe.plugins.delete :rubyforge
|
10
11
|
|
@@ -13,21 +14,32 @@ hoespec = Hoe.spec 'pluggability' do
|
|
13
14
|
self.history_file = 'History.rdoc'
|
14
15
|
self.extra_rdoc_files = Rake::FileList[ '*.rdoc' ]
|
15
16
|
self.spec_extras[:rdoc_options] = ['-t', 'Pluggability Toolkit']
|
16
|
-
|
17
|
+
|
18
|
+
# Hoops to avoid adding a formatting to the gem's spec, but still build
|
19
|
+
# with a custom formatter locally
|
20
|
+
self.spec_extras[:rdoc_options] += [ '-f', 'fivefish' ] if
|
21
|
+
File.directory?( '.hg' ) && !(ARGV.include?('gem') || ARGV.include?('release'))
|
17
22
|
|
18
23
|
self.developer 'Martin Chase', 'stillflame@FaerieMUD.org'
|
19
24
|
self.developer 'Michael Granger', 'ged@FaerieMUD.org'
|
20
25
|
|
21
|
-
self.dependency 'loggability', '~> 0.
|
26
|
+
self.dependency 'loggability', '~> 0.7'
|
22
27
|
|
23
|
-
self.dependency 'hoe-deveiate', '~> 0.
|
28
|
+
self.dependency 'hoe-deveiate', '~> 0.3', :development
|
29
|
+
self.dependency 'hoe-bundler', '~> 1.2', :development
|
30
|
+
self.dependency 'rdoc-generator-fivefish', '~> 0.1', :development
|
24
31
|
|
25
|
-
self.
|
32
|
+
self.license "BSD"
|
26
33
|
self.hg_sign_tags = true if self.respond_to?( :hg_sign_tags= )
|
27
34
|
self.check_history_on_release = true if self.respond_to?( :check_history_on_release= )
|
28
35
|
self.rdoc_locations << "deveiate:/usr/local/www/public/code/#{remote_rdoc_dir}"
|
29
36
|
end
|
30
37
|
|
38
|
+
task :gem do
|
39
|
+
hoespec.spec.rdoc_options.delete( '-f' )
|
40
|
+
hoespec.spec.rdoc_options.delete( 'fivefish' )
|
41
|
+
end
|
42
|
+
|
31
43
|
ENV['VERSION'] ||= hoespec.spec.version.to_s
|
32
44
|
|
33
45
|
task 'hg:precheckin' => [ :check_history, :check_manifest, :spec ]
|
data/lib/pluggability.rb
CHANGED
@@ -12,7 +12,7 @@ module Pluggability
|
|
12
12
|
|
13
13
|
|
14
14
|
# Library version
|
15
|
-
VERSION = '0.
|
15
|
+
VERSION = '0.3.0'
|
16
16
|
|
17
17
|
|
18
18
|
# An exception class for Pluggability specific errors.
|
@@ -23,6 +23,7 @@ module Pluggability
|
|
23
23
|
### Add the @derivatives instance variable to including classes.
|
24
24
|
def self::extend_object( obj )
|
25
25
|
obj.instance_variable_set( :@plugin_prefixes, [] )
|
26
|
+
obj.instance_variable_set( :@plugin_exclusions, [] )
|
26
27
|
obj.instance_variable_set( :@derivatives, {} )
|
27
28
|
|
28
29
|
Pluggability.pluggable_classes << obj
|
@@ -69,6 +70,50 @@ module Pluggability
|
|
69
70
|
end
|
70
71
|
|
71
72
|
|
73
|
+
### Get/set patterns which cause files in a plugin path to not be loaded. Typical
|
74
|
+
### use case is to exclude test/spec directories:
|
75
|
+
###
|
76
|
+
### MyFactoryType.plugin_exclude( 'spec/**' )
|
77
|
+
###
|
78
|
+
def plugin_exclusions( *exclusions )
|
79
|
+
@plugin_exclusions.replace( exclusions ) if !exclusions.empty?
|
80
|
+
return @plugin_exclusions
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
### Set the plugin exclusion patterns which cause files in a plugin path to not
|
85
|
+
### be loaded.
|
86
|
+
def plugin_exclusions=( args )
|
87
|
+
@plugin_exclusions = Array( args )
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
### Returns +true+ if any of the #plugin_exclusions match the specified
|
92
|
+
### +path.
|
93
|
+
def is_excluded_path?( path )
|
94
|
+
rval = self.plugin_exclusions.find do |exclusion|
|
95
|
+
case exclusion
|
96
|
+
when Regexp
|
97
|
+
path =~ exclusion
|
98
|
+
when String
|
99
|
+
flags = 0
|
100
|
+
flags &= File::FNM_EXTGLOB if defined?( File::FNM_EXTGLOB )
|
101
|
+
File.fnmatch( exclusion, path, flags )
|
102
|
+
else
|
103
|
+
Pluggability.log.warn "Don't know how to apply exclusion: %p" % [ exclusion ]
|
104
|
+
false
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
if rval
|
109
|
+
Pluggability.log.debug "load path %p is excluded by %p" % [ path, rval ]
|
110
|
+
return true
|
111
|
+
else
|
112
|
+
return false
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
|
72
117
|
### Returns the type name used when searching for a derivative.
|
73
118
|
def plugin_type
|
74
119
|
base = Pluggability.plugin_base_class( self ) or
|
@@ -216,7 +261,10 @@ module Pluggability
|
|
216
261
|
Pluggability.log.debug " found %d matching files" % [ candidates.length ]
|
217
262
|
next if candidates.empty?
|
218
263
|
|
219
|
-
candidates.each
|
264
|
+
candidates.each do |path|
|
265
|
+
next if self.is_excluded_path?( path )
|
266
|
+
require( path )
|
267
|
+
end
|
220
268
|
end
|
221
269
|
|
222
270
|
return self.derivative_classes
|
@@ -284,6 +332,8 @@ module Pluggability
|
|
284
332
|
# module.
|
285
333
|
subdirs.map( &:strip ).each do |subdir|
|
286
334
|
self.make_require_path( mod_name, subdir ).each do |path|
|
335
|
+
next if self.is_excluded_path?( path )
|
336
|
+
|
287
337
|
Pluggability.logger.debug "Trying #{path}..."
|
288
338
|
tries << path
|
289
339
|
|
@@ -1,31 +1,23 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
BEGIN {
|
5
|
-
require 'pathname'
|
6
|
-
basedir = Pathname.new( __FILE__ ).dirname.parent
|
7
|
-
|
8
|
-
libdir = basedir + "lib"
|
9
|
-
|
10
|
-
$LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
|
11
|
-
}
|
12
|
-
|
13
4
|
require 'rspec'
|
14
5
|
require 'loggability/spechelpers'
|
15
6
|
require 'pluggability'
|
16
7
|
|
17
|
-
|
18
|
-
|
19
8
|
### Mock with Rspec
|
20
9
|
RSpec.configure do |config|
|
21
|
-
ruby_version_vec = RUBY_VERSION.split('.').map {|c| c.to_i }.pack( "N*" )
|
22
10
|
|
23
|
-
config.include( Loggability::SpecHelpers )
|
24
11
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
12
|
+
config.run_all_when_everything_filtered = true
|
13
|
+
config.filter_run :focus
|
14
|
+
config.order = 'random'
|
15
|
+
config.mock_with( :rspec ) do |mock_config|
|
16
|
+
mock_config.syntax = :expect
|
17
|
+
end
|
25
18
|
|
26
|
-
config.
|
19
|
+
config.include( Loggability::SpecHelpers )
|
27
20
|
end
|
28
21
|
|
29
|
-
|
30
22
|
# vim: set nosta noet ts=4 sw=4:
|
31
23
|
|
data/spec/pluggability_spec.rb
CHANGED
@@ -1,18 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
require 'pathname'
|
5
|
-
basedir = Pathname.new( __FILE__ ).dirname.parent
|
3
|
+
require_relative 'helpers'
|
6
4
|
|
7
|
-
libdir = basedir + "lib"
|
8
|
-
|
9
|
-
$LOAD_PATH.unshift( basedir ) unless $LOAD_PATH.include?( basedir )
|
10
|
-
$LOAD_PATH.unshift( libdir ) unless $LOAD_PATH.include?( libdir )
|
11
|
-
}
|
12
|
-
|
13
|
-
require 'rspec'
|
14
5
|
require 'pluggability'
|
15
|
-
require 'spec/lib/helpers'
|
16
6
|
|
17
7
|
|
18
8
|
#
|
@@ -39,17 +29,21 @@ class SubSubPlugin < SubPlugin; end
|
|
39
29
|
#
|
40
30
|
describe Pluggability do
|
41
31
|
|
32
|
+
before( :all ) do
|
33
|
+
setup_logging()
|
34
|
+
end
|
35
|
+
|
42
36
|
before( :each ) do
|
43
|
-
|
37
|
+
Plugin.plugin_exclusions = []
|
44
38
|
end
|
45
39
|
|
46
|
-
after( :
|
40
|
+
after( :all ) do
|
47
41
|
reset_logging()
|
48
42
|
end
|
49
43
|
|
50
44
|
|
51
45
|
it "allows extended objects to declare one or more prefixes to use when requiring derviatives" do
|
52
|
-
Plugin.plugin_prefixes.
|
46
|
+
expect( Plugin.plugin_prefixes ).to eq( ['plugins', 'plugins/private'] )
|
53
47
|
end
|
54
48
|
|
55
49
|
|
@@ -57,19 +51,17 @@ describe Pluggability do
|
|
57
51
|
context "-extended class" do
|
58
52
|
|
59
53
|
it "knows about all of its derivatives" do
|
60
|
-
Plugin.derivatives.keys
|
61
|
-
|
62
|
-
Plugin.derivatives.keys.should include( 'SubPlugin' )
|
63
|
-
Plugin.derivatives.keys.should include( SubPlugin )
|
54
|
+
expect( Plugin.derivatives.keys ).
|
55
|
+
to include( 'sub', 'subplugin', 'SubPlugin', SubPlugin )
|
64
56
|
end
|
65
57
|
|
66
58
|
it "returns derivatives directly if they're already loaded" do
|
67
59
|
class AlreadyLoadedPlugin < Plugin; end
|
68
|
-
Kernel.
|
69
|
-
Plugin.create(
|
70
|
-
Plugin.create(
|
71
|
-
Plugin.create(
|
72
|
-
Plugin.create(
|
60
|
+
expect( Kernel ).to_not receive( :require )
|
61
|
+
expect( Plugin.create('alreadyloaded') ).to be_an_instance_of( AlreadyLoadedPlugin )
|
62
|
+
expect( Plugin.create('AlreadyLoaded') ).to be_an_instance_of( AlreadyLoadedPlugin )
|
63
|
+
expect( Plugin.create('AlreadyLoadedPlugin') ).to be_an_instance_of( AlreadyLoadedPlugin )
|
64
|
+
expect( Plugin.create(AlreadyLoadedPlugin) ).to be_an_instance_of( AlreadyLoadedPlugin )
|
73
65
|
end
|
74
66
|
|
75
67
|
it "filters errors that happen when creating an instance of derivatives so they " +
|
@@ -89,7 +81,7 @@ describe Pluggability do
|
|
89
81
|
fail "Expected an exception to be raised."
|
90
82
|
end
|
91
83
|
|
92
|
-
exception.backtrace.first.
|
84
|
+
expect( exception.backtrace.first ).to match(/#{__FILE__}/)
|
93
85
|
end
|
94
86
|
|
95
87
|
it "will refuse to create an object other than one of its derivatives" do
|
@@ -103,14 +95,14 @@ describe Pluggability do
|
|
103
95
|
it "will load new plugins from the require path if they're not loaded yet" do
|
104
96
|
loaded_class = nil
|
105
97
|
|
106
|
-
Plugin.
|
98
|
+
expect( Plugin ).to receive( :require ).with( 'plugins/dazzle_plugin' ).and_return do |*args|
|
107
99
|
loaded_class = Class.new( Plugin )
|
108
100
|
# Simulate a named class, since we're not really requiring
|
109
101
|
Plugin.derivatives['dazzle'] = loaded_class
|
110
102
|
true
|
111
103
|
end
|
112
104
|
|
113
|
-
Plugin.create(
|
105
|
+
expect( Plugin.create('dazzle') ).to be_an_instance_of( loaded_class )
|
114
106
|
end
|
115
107
|
|
116
108
|
|
@@ -118,7 +110,7 @@ describe Pluggability do
|
|
118
110
|
"derivative fails" do
|
119
111
|
|
120
112
|
# at least 6 -> 3 variants * 2 paths
|
121
|
-
Plugin.
|
113
|
+
expect( Plugin ).to receive( :require ).
|
122
114
|
at_least(6).times.
|
123
115
|
and_return {|path| raise LoadError, "path" }
|
124
116
|
|
@@ -130,7 +122,7 @@ describe Pluggability do
|
|
130
122
|
|
131
123
|
it "will output a sensible description when a require succeeds, but it loads something unintended" do
|
132
124
|
# at least 6 -> 3 variants * 2 paths
|
133
|
-
Plugin.
|
125
|
+
expect( Plugin ).to receive( :require ).and_return( true )
|
134
126
|
|
135
127
|
expect {
|
136
128
|
Plugin.create('corruscating')
|
@@ -142,9 +134,8 @@ describe Pluggability do
|
|
142
134
|
"derivative if none of the paths work" do
|
143
135
|
|
144
136
|
# at least 6 -> 3 variants * 2 paths
|
145
|
-
Plugin.
|
146
|
-
|
147
|
-
}
|
137
|
+
expect( Plugin ).to receive( :require ).at_least(6).times.
|
138
|
+
and_raise( ScriptError.new("error while parsing path") )
|
148
139
|
|
149
140
|
expect {
|
150
141
|
Plugin.create('portable')
|
@@ -153,31 +144,65 @@ describe Pluggability do
|
|
153
144
|
|
154
145
|
|
155
146
|
it "can preload all of its derivatives" do
|
156
|
-
Gem.
|
147
|
+
expect( Gem ).to receive( :find_files ).with( 'plugins/*.rb' ).
|
148
|
+
and_return([ 'plugins/first.rb' ])
|
149
|
+
expect( Gem ).to receive( :find_files ).with( 'plugins/private/*.rb' ).
|
150
|
+
and_return([ 'plugins/private/second.rb', 'plugins/private/third.rb' ])
|
151
|
+
|
152
|
+
expect( Plugin ).to receive( :require ).with( 'plugins/first.rb' ).
|
153
|
+
and_return( true )
|
154
|
+
expect( Plugin ).to receive( :require ).with( 'plugins/private/second.rb' ).
|
155
|
+
and_return( true )
|
156
|
+
expect( Plugin ).to receive( :require ).with( 'plugins/private/third.rb' ).
|
157
|
+
and_return( true )
|
158
|
+
|
159
|
+
Plugin.load_all
|
160
|
+
end
|
161
|
+
|
162
|
+
|
163
|
+
it "doesn't preload derivatives whose path matches a Regexp exclusion" do
|
164
|
+
expect( Gem ).to receive( :find_files ).with( 'plugins/*.rb' ).
|
157
165
|
and_return([ 'plugins/first.rb' ])
|
158
|
-
Gem.
|
166
|
+
expect( Gem ).to receive( :find_files ).with( 'plugins/private/*.rb' ).
|
159
167
|
and_return([ 'plugins/private/second.rb', 'plugins/private/third.rb' ])
|
160
168
|
|
161
|
-
Plugin.
|
169
|
+
expect( Plugin ).to receive( :require ).with( 'plugins/first.rb' ).
|
162
170
|
and_return( true )
|
163
|
-
Plugin.
|
171
|
+
expect( Plugin ).to_not receive( :require ).with( 'plugins/private/second.rb' )
|
172
|
+
expect( Plugin ).to_not receive( :require ).with( 'plugins/private/third.rb' )
|
173
|
+
|
174
|
+
Plugin.plugin_exclusions( %r{/private} )
|
175
|
+
Plugin.load_all
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
it "doesn't preload derivatives whose path matches a glob String exclusion" do
|
180
|
+
expect( Gem ).to receive( :find_files ).with( 'plugins/*.rb' ).
|
181
|
+
and_return([ 'plugins/first.rb' ])
|
182
|
+
expect( Gem ).to receive( :find_files ).with( 'plugins/private/*.rb' ).
|
183
|
+
and_return([ 'plugins/private/second.rb', 'plugins/private/third.rb' ])
|
184
|
+
|
185
|
+
expect( Plugin ).to receive( :require ).with( 'plugins/first.rb' ).
|
164
186
|
and_return( true )
|
165
|
-
Plugin.
|
187
|
+
expect( Plugin ).to receive( :require ).with( 'plugins/private/second.rb' ).
|
166
188
|
and_return( true )
|
189
|
+
expect( Plugin ).to_not receive( :require ).with( 'plugins/private/third.rb' )
|
167
190
|
|
191
|
+
Plugin.plugin_exclusions( '**/third.rb' )
|
168
192
|
Plugin.load_all
|
169
193
|
end
|
194
|
+
|
170
195
|
end
|
171
196
|
|
172
197
|
|
173
198
|
context "derivative of an extended class" do
|
174
199
|
|
175
200
|
it "knows what type of plugin loads it" do
|
176
|
-
TestingPlugin.plugin_type.
|
201
|
+
expect( TestingPlugin.plugin_type ).to eq( 'Plugin' )
|
177
202
|
end
|
178
203
|
|
179
204
|
it "raises a PluginError if it can't figure out what type of factory loads it" do
|
180
|
-
TestingPlugin.
|
205
|
+
allow( TestingPlugin ).to receive( :ancestors ).and_return( [] )
|
181
206
|
expect {
|
182
207
|
TestingPlugin.plugin_type
|
183
208
|
}.to raise_error( Pluggability::PluginError, /couldn't find plugin base/i )
|
@@ -188,11 +213,11 @@ describe Pluggability do
|
|
188
213
|
context "derivative of an extended class that isn't named <Something>Plugin" do
|
189
214
|
|
190
215
|
it "is still creatable via its full name" do
|
191
|
-
Plugin.create(
|
216
|
+
expect( Plugin.create('blacksheep') ).to be_an_instance_of( BlackSheep )
|
192
217
|
end
|
193
218
|
|
194
219
|
it "is loadable via its underbarred name" do
|
195
|
-
Plugin.create(
|
220
|
+
expect( Plugin.create('black_sheep') ).to be_an_instance_of( BlackSheep )
|
196
221
|
end
|
197
222
|
|
198
223
|
end
|
@@ -201,7 +226,7 @@ describe Pluggability do
|
|
201
226
|
context "derivative of an extended class in another namespace" do
|
202
227
|
|
203
228
|
it "is still creatable via its derivative name" do
|
204
|
-
Plugin.create(
|
229
|
+
expect( Plugin.create('loadable') ).to be_an_instance_of( Test::LoadablePlugin )
|
205
230
|
end
|
206
231
|
|
207
232
|
end
|
@@ -210,7 +235,7 @@ describe Pluggability do
|
|
210
235
|
context "subclass of a derivative" do
|
211
236
|
|
212
237
|
it "is still registered with the base class" do
|
213
|
-
Plugin.derivatives[
|
238
|
+
expect( Plugin.derivatives['subsub'] ).to eq( SubSubPlugin )
|
214
239
|
end
|
215
240
|
|
216
241
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pluggability
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Chase
|
@@ -31,7 +31,7 @@ cert_chain:
|
|
31
31
|
6mKCwjpegytE0oifXfF8k75A9105cBnNiMZOe1tXiqYc/exCgWvbggurzDOcRkZu
|
32
32
|
/YSusaiDXHKU2O3Akc3htA==
|
33
33
|
-----END CERTIFICATE-----
|
34
|
-
date: 2013-
|
34
|
+
date: 2013-09-26 00:00:00.000000000 Z
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: loggability
|
@@ -39,14 +39,14 @@ dependencies:
|
|
39
39
|
requirements:
|
40
40
|
- - ~>
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '0.
|
42
|
+
version: '0.7'
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - ~>
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '0.
|
49
|
+
version: '0.7'
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
51
|
name: hoe-mercurial
|
52
52
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,42 +81,70 @@ dependencies:
|
|
81
81
|
requirements:
|
82
82
|
- - ~>
|
83
83
|
- !ruby/object:Gem::Version
|
84
|
-
version: '
|
84
|
+
version: '4.0'
|
85
85
|
type: :development
|
86
86
|
prerelease: false
|
87
87
|
version_requirements: !ruby/object:Gem::Requirement
|
88
88
|
requirements:
|
89
89
|
- - ~>
|
90
90
|
- !ruby/object:Gem::Version
|
91
|
-
version: '
|
91
|
+
version: '4.0'
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: hoe-deveiate
|
94
94
|
requirement: !ruby/object:Gem::Requirement
|
95
95
|
requirements:
|
96
96
|
- - ~>
|
97
97
|
- !ruby/object:Gem::Version
|
98
|
-
version: '0.
|
98
|
+
version: '0.3'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
101
|
version_requirements: !ruby/object:Gem::Requirement
|
102
102
|
requirements:
|
103
103
|
- - ~>
|
104
104
|
- !ruby/object:Gem::Version
|
105
|
-
version: '0.
|
105
|
+
version: '0.3'
|
106
|
+
- !ruby/object:Gem::Dependency
|
107
|
+
name: hoe-bundler
|
108
|
+
requirement: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ~>
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '1.2'
|
113
|
+
type: :development
|
114
|
+
prerelease: false
|
115
|
+
version_requirements: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ~>
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '1.2'
|
120
|
+
- !ruby/object:Gem::Dependency
|
121
|
+
name: rdoc-generator-fivefish
|
122
|
+
requirement: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ~>
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0.1'
|
127
|
+
type: :development
|
128
|
+
prerelease: false
|
129
|
+
version_requirements: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0.1'
|
106
134
|
- !ruby/object:Gem::Dependency
|
107
135
|
name: hoe
|
108
136
|
requirement: !ruby/object:Gem::Requirement
|
109
137
|
requirements:
|
110
138
|
- - ~>
|
111
139
|
- !ruby/object:Gem::Version
|
112
|
-
version: '3.
|
140
|
+
version: '3.7'
|
113
141
|
type: :development
|
114
142
|
prerelease: false
|
115
143
|
version_requirements: !ruby/object:Gem::Requirement
|
116
144
|
requirements:
|
117
145
|
- - ~>
|
118
146
|
- !ruby/object:Gem::Version
|
119
|
-
version: '3.
|
147
|
+
version: '3.7'
|
120
148
|
description: "Pluggability is a mixin module that turns an including class into a\nfactory
|
121
149
|
for its derivatives, capable of searching for and loading them\nby name. This is
|
122
150
|
useful when you have an abstract base class which\ndefines an interface and basic
|
@@ -154,7 +182,7 @@ files:
|
|
154
182
|
- README.rdoc
|
155
183
|
- Rakefile
|
156
184
|
- lib/pluggability.rb
|
157
|
-
- spec/
|
185
|
+
- spec/helpers.rb
|
158
186
|
- spec/pluggability_spec.rb
|
159
187
|
- .gemtest
|
160
188
|
homepage: https://bitbucket.org/ged/pluggability
|
@@ -165,8 +193,6 @@ post_install_message:
|
|
165
193
|
rdoc_options:
|
166
194
|
- -t
|
167
195
|
- Pluggability Toolkit
|
168
|
-
- -f
|
169
|
-
- fivefish
|
170
196
|
require_paths:
|
171
197
|
- lib
|
172
198
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -181,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
207
|
version: '0'
|
182
208
|
requirements: []
|
183
209
|
rubyforge_project: pluggability
|
184
|
-
rubygems_version: 2.
|
210
|
+
rubygems_version: 2.1.4
|
185
211
|
signing_key:
|
186
212
|
specification_version: 4
|
187
213
|
summary: Pluggability is a mixin module that turns an including class into a factory
|
metadata.gz.sig
CHANGED
Binary file
|