pluggability 0.4.3 → 0.8.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 +5 -5
- checksums.yaml.gz.sig +0 -0
- data/History.md +87 -0
- data/{README.rdoc → README.md} +64 -48
- data/lib/pluggability.rb +47 -58
- data/spec/helpers.rb +1 -0
- data/spec/pluggability_spec.rb +65 -31
- data.tar.gz.sig +0 -0
- metadata +51 -130
- metadata.gz.sig +0 -0
- data/.gemtest +0 -0
- data/ChangeLog +0 -868
- data/History.rdoc +0 -54
- data/Manifest.txt +0 -8
- data/Rakefile +0 -86
data/spec/pluggability_spec.rb
CHANGED
@@ -17,6 +17,7 @@ end
|
|
17
17
|
class SubPlugin < Plugin; end
|
18
18
|
class TestingPlugin < Plugin; end
|
19
19
|
class BlackSheep < Plugin; end
|
20
|
+
class Carbon14Robot < Plugin; end
|
20
21
|
module Test
|
21
22
|
class LoadablePlugin < Plugin; end
|
22
23
|
end
|
@@ -29,16 +30,9 @@ class SubSubPlugin < SubPlugin; end
|
|
29
30
|
#
|
30
31
|
describe Pluggability do
|
31
32
|
|
32
|
-
before( :all ) do
|
33
|
-
setup_logging()
|
34
|
-
end
|
35
|
-
|
36
33
|
before( :each ) do
|
37
34
|
Plugin.plugin_exclusions = []
|
38
|
-
|
39
|
-
|
40
|
-
after( :all ) do
|
41
|
-
reset_logging()
|
35
|
+
allow( File ).to receive( :file? ).and_return( true )
|
42
36
|
end
|
43
37
|
|
44
38
|
|
@@ -47,7 +41,6 @@ describe Pluggability do
|
|
47
41
|
end
|
48
42
|
|
49
43
|
|
50
|
-
|
51
44
|
context "-extended class" do
|
52
45
|
|
53
46
|
it "knows about all of its derivatives" do
|
@@ -55,6 +48,7 @@ describe Pluggability do
|
|
55
48
|
to include( 'sub', 'subplugin', 'SubPlugin', SubPlugin )
|
56
49
|
end
|
57
50
|
|
51
|
+
|
58
52
|
it "returns derivatives directly if they're already loaded" do
|
59
53
|
class AlreadyLoadedPlugin < Plugin; end
|
60
54
|
expect( Kernel ).to_not receive( :require )
|
@@ -64,6 +58,7 @@ describe Pluggability do
|
|
64
58
|
expect( Plugin.create(AlreadyLoadedPlugin) ).to be_an_instance_of( AlreadyLoadedPlugin )
|
65
59
|
end
|
66
60
|
|
61
|
+
|
67
62
|
it "filters errors that happen when creating an instance of derivatives so they " +
|
68
63
|
"point to the right place" do
|
69
64
|
class PugilistPlugin < Plugin
|
@@ -84,6 +79,7 @@ describe Pluggability do
|
|
84
79
|
expect( exception.backtrace.first ).to match(/#{__FILE__}/)
|
85
80
|
end
|
86
81
|
|
82
|
+
|
87
83
|
it "will refuse to create an object other than one of its derivatives" do
|
88
84
|
class Doppelgaenger; end
|
89
85
|
expect {
|
@@ -95,7 +91,10 @@ describe Pluggability do
|
|
95
91
|
it "will load new plugins from the require path if they're not loaded yet" do
|
96
92
|
loaded_class = nil
|
97
93
|
|
98
|
-
expect(
|
94
|
+
expect( Gem ).to receive( :find_latest_files ).
|
95
|
+
at_least( :once ).
|
96
|
+
and_return( ['/some/path/to/plugins/dazzle.rb'] )
|
97
|
+
expect( Kernel ).to receive( :require ).with( '/some/path/to/plugins/dazzle.rb' ) do |*args|
|
99
98
|
loaded_class = Class.new( Plugin )
|
100
99
|
# Simulate a named class, since we're not really requiring
|
101
100
|
Plugin.derivatives['dazzle'] = loaded_class
|
@@ -110,8 +109,8 @@ describe Pluggability do
|
|
110
109
|
"derivative fails" do
|
111
110
|
|
112
111
|
# at least 6 -> 3 variants * 2 paths
|
113
|
-
expect(
|
114
|
-
|
112
|
+
expect( Gem ).to receive( :find_latest_files ).at_least( 6 ).times.
|
113
|
+
and_return( [] )
|
115
114
|
|
116
115
|
expect {
|
117
116
|
Plugin.create('scintillating')
|
@@ -120,8 +119,12 @@ describe Pluggability do
|
|
120
119
|
|
121
120
|
|
122
121
|
it "will output a sensible description when a require succeeds, but it loads something unintended" do
|
123
|
-
|
124
|
-
|
122
|
+
expect( Gem ).to receive( :find_latest_files ).
|
123
|
+
at_least( :once ).
|
124
|
+
and_return( ['/some/path/to/corruscating.rb'] )
|
125
|
+
expect( Kernel ).to receive( :require ).
|
126
|
+
with( '/some/path/to/corruscating.rb' ).
|
127
|
+
and_return( true )
|
125
128
|
|
126
129
|
expect {
|
127
130
|
Plugin.create('corruscating')
|
@@ -129,30 +132,48 @@ describe Pluggability do
|
|
129
132
|
end
|
130
133
|
|
131
134
|
|
132
|
-
it "
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
expect(
|
135
|
+
it "doesn't rescue LoadErrors raised when loading the plugin" do
|
136
|
+
expect( Gem ).to receive( :find_latest_files ).
|
137
|
+
at_least( :once ).
|
138
|
+
and_return( ['/some/path/to/portable.rb'] )
|
139
|
+
expect( Kernel ).to receive( :require ).
|
140
|
+
with( '/some/path/to/portable.rb' ).
|
137
141
|
and_raise( ScriptError.new("error while parsing path") )
|
138
142
|
|
139
143
|
expect {
|
140
|
-
Plugin.create('portable')
|
144
|
+
Plugin.create( 'portable' )
|
141
145
|
}.to raise_error( ScriptError, /error while parsing/ )
|
142
146
|
end
|
143
147
|
|
144
148
|
|
149
|
+
it "ignores directories when finding derivatives" do
|
150
|
+
expect( Gem ).to receive( :find_latest_files ).
|
151
|
+
at_least( :once ).
|
152
|
+
and_return( ['/some/path/to/portable', '/some/path/to/portable.rb'] )
|
153
|
+
expect( File ).to receive( :file? ).and_return( false )
|
154
|
+
|
155
|
+
expect( Kernel ).to_not receive( :require ).with( '/some/path/to/portable' )
|
156
|
+
expect( Kernel ).to receive( :require ).
|
157
|
+
with( '/some/path/to/portable.rb' ).
|
158
|
+
and_return( true )
|
159
|
+
|
160
|
+
expect {
|
161
|
+
Plugin.create( 'portable' )
|
162
|
+
}.to raise_error( Pluggability::PluginError, /Require of '\S+' succeeded, but didn't load a Plugin/i )
|
163
|
+
end
|
164
|
+
|
165
|
+
|
145
166
|
it "can preload all of its derivatives" do
|
146
167
|
expect( Gem ).to receive( :find_latest_files ).with( 'plugins/*.rb' ).
|
147
168
|
and_return([ 'plugins/first.rb' ])
|
148
169
|
expect( Gem ).to receive( :find_latest_files ).with( 'plugins/private/*.rb' ).
|
149
170
|
and_return([ 'plugins/private/second.rb', 'plugins/private/third.rb' ])
|
150
171
|
|
151
|
-
expect(
|
172
|
+
expect( Kernel ).to receive( :require ).with( 'plugins/first.rb' ).
|
152
173
|
and_return( true )
|
153
|
-
expect(
|
174
|
+
expect( Kernel ).to receive( :require ).with( 'plugins/private/second.rb' ).
|
154
175
|
and_return( true )
|
155
|
-
expect(
|
176
|
+
expect( Kernel ).to receive( :require ).with( 'plugins/private/third.rb' ).
|
156
177
|
and_return( true )
|
157
178
|
|
158
179
|
Plugin.load_all
|
@@ -161,14 +182,14 @@ describe Pluggability do
|
|
161
182
|
|
162
183
|
it "doesn't preload derivatives whose path matches a Regexp exclusion" do
|
163
184
|
expect( Gem ).to receive( :find_latest_files ).with( 'plugins/*.rb' ).
|
164
|
-
and_return([ 'plugins/first.rb' ])
|
185
|
+
and_return([ '/path/to/plugins/first.rb' ])
|
165
186
|
expect( Gem ).to receive( :find_latest_files ).with( 'plugins/private/*.rb' ).
|
166
|
-
and_return([ 'plugins/private/second.rb', 'plugins/private/third.rb' ])
|
187
|
+
and_return([ '/path/to/plugins/private/second.rb', '/path/to/plugins/private/third.rb' ])
|
167
188
|
|
168
|
-
expect(
|
189
|
+
expect( Kernel ).to receive( :require ).with( '/path/to/plugins/first.rb' ).
|
169
190
|
and_return( true )
|
170
|
-
expect(
|
171
|
-
expect(
|
191
|
+
expect( Kernel ).to_not receive( :require ).with( '/path/to/plugins/private/second.rb' )
|
192
|
+
expect( Kernel ).to_not receive( :require ).with( '/path/to/plugins/private/third.rb' )
|
172
193
|
|
173
194
|
Plugin.plugin_exclusions( %r{/private} )
|
174
195
|
Plugin.load_all
|
@@ -181,11 +202,11 @@ describe Pluggability do
|
|
181
202
|
expect( Gem ).to receive( :find_latest_files ).with( 'plugins/private/*.rb' ).
|
182
203
|
and_return([ 'plugins/private/second.rb', 'plugins/private/third.rb' ])
|
183
204
|
|
184
|
-
expect(
|
205
|
+
expect( Kernel ).to receive( :require ).with( 'plugins/first.rb' ).
|
185
206
|
and_return( true )
|
186
|
-
expect(
|
207
|
+
expect( Kernel ).to receive( :require ).with( 'plugins/private/second.rb' ).
|
187
208
|
and_return( true )
|
188
|
-
expect(
|
209
|
+
expect( Kernel ).to_not receive( :require ).with( 'plugins/private/third.rb' )
|
189
210
|
|
190
211
|
Plugin.plugin_exclusions( '**/third.rb' )
|
191
212
|
Plugin.load_all
|
@@ -200,6 +221,7 @@ describe Pluggability do
|
|
200
221
|
expect( TestingPlugin.plugin_type ).to eq( 'Plugin' )
|
201
222
|
end
|
202
223
|
|
224
|
+
|
203
225
|
it "raises a PluginError if it can't figure out what type of factory loads it" do
|
204
226
|
allow( TestingPlugin ).to receive( :ancestors ).and_return( [] )
|
205
227
|
expect {
|
@@ -207,6 +229,7 @@ describe Pluggability do
|
|
207
229
|
}.to raise_error( Pluggability::PluginError, /couldn't find plugin base/i )
|
208
230
|
end
|
209
231
|
|
232
|
+
|
210
233
|
it "knows what the simplest version of its plugin name is" do
|
211
234
|
expect( TestingPlugin.plugin_name ).to eq( 'testing' )
|
212
235
|
end
|
@@ -219,10 +242,17 @@ describe Pluggability do
|
|
219
242
|
expect( Plugin.create('blacksheep') ).to be_an_instance_of( BlackSheep )
|
220
243
|
end
|
221
244
|
|
245
|
+
|
222
246
|
it "is loadable via its underbarred name" do
|
223
247
|
expect( Plugin.create('black_sheep') ).to be_an_instance_of( BlackSheep )
|
224
248
|
end
|
225
249
|
|
250
|
+
|
251
|
+
it "works for classes with numbers in them too" do
|
252
|
+
expect( Plugin.create('carbon14_robot') ).to be_an_instance_of( Carbon14Robot )
|
253
|
+
end
|
254
|
+
|
255
|
+
|
226
256
|
it "knows what the simplest version of its plugin name is" do
|
227
257
|
expect( BlackSheep.plugin_name ).to eq( 'black_sheep' )
|
228
258
|
end
|
@@ -235,9 +265,11 @@ describe Pluggability do
|
|
235
265
|
expect( Plugin.create('loadable') ).to be_an_instance_of( Test::LoadablePlugin )
|
236
266
|
end
|
237
267
|
|
268
|
+
|
238
269
|
it "still knows what the simplest version of its plugin name is" do
|
239
270
|
expect( Test::LoadablePlugin.plugin_name ).to eq( 'loadable' )
|
240
271
|
end
|
272
|
+
|
241
273
|
end
|
242
274
|
|
243
275
|
|
@@ -247,9 +279,11 @@ describe Pluggability do
|
|
247
279
|
expect( Plugin.derivatives['subsub'] ).to eq( SubSubPlugin )
|
248
280
|
end
|
249
281
|
|
282
|
+
|
250
283
|
it "still knows what the simplest version of its plugin name is" do
|
251
284
|
expect( SubSubPlugin.plugin_name ).to eq( 'subsub' )
|
252
285
|
end
|
286
|
+
|
253
287
|
end
|
254
288
|
|
255
289
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,37 +1,40 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pluggability
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Martin Chase
|
8
7
|
- Michael Granger
|
9
|
-
|
8
|
+
- Martin Chase
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain:
|
12
12
|
- |
|
13
13
|
-----BEGIN CERTIFICATE-----
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
+
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
14
|
+
MIID+DCCAmCgAwIBAgIBBDANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
|
15
|
+
REM9RmFlcmllTVVEL0RDPW9yZzAeFw0yMjAxMDcyMzU4MTRaFw0yMzAxMDcyMzU4
|
16
|
+
MTRaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
|
17
|
+
hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
|
18
|
+
L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
|
19
|
+
M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
|
20
|
+
5PU2AEbf04GGSrmqADGWXeaslaoRdb1fu/0M5qfPTRn5V39sWD9umuDAF9qqil/x
|
21
|
+
Sl6phTvgBrG8GExHbNZpLARd3xrBYLEFsX7RvBn2UPfgsrtvpdXjsHGfpT3IPN+B
|
22
|
+
vQ66lts4alKC69TE5cuKasWBm+16A4aEe3XdZBRNmtOu/g81gvwA7fkJHKllJuaI
|
23
|
+
dXzdHqq+zbGZVSQ7pRYHYomD0IiDe1DbIouFnPWmagaBnGHwXkDT2bKKP+s2v21m
|
24
|
+
ozilJg4aar2okb/RA6VS87o+d7g6LpDDMMQjH4G9OPnJENLdhu8KnPw/ivSVvQw7
|
25
|
+
N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYD
|
26
|
+
VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DANBgkqhkiG
|
27
|
+
9w0BAQsFAAOCAYEASrm1AbEoxACZ9WXJH3R5axV3U0CA4xaETlL2YT+2nOfVBMQ9
|
28
|
+
0ZlkPx6j4ghKJgAIi1TMfDM2JyPJsppQh8tiNccDjWc62UZRY/dq26cMqf/lcI+a
|
29
|
+
6YBuEYvzZfearwVs8tHnXtwYV3WSCoCOQaB+nq2lA1O+nkKNl41WOsVbNama5jx3
|
30
|
+
8cQtVSEEmZy6jIDJ8c5TmBJ7BQUDEUEWA/A3V42Xyctoj7DvUXWE0lP+X6ypAVSr
|
31
|
+
lFh3TS64D7NTvxkmg7natUoCvobl6kGl4yMaqE4YRTlfuzhpf91TSOntClqrAOsS
|
32
|
+
K1s56WndQj3IoBocdY9mQhDZLtLHofSkymoP8btBlj5SsN24TiF0VMSZlctSCYZg
|
33
|
+
GKyHim/MMlIfGOWsgfioq5jzwmql7W4CDubbb8Lkg70v+hN2E/MnNVAcNE3gyaGc
|
34
|
+
P5YP5BAbNW+gvd3QHRiWTTuhgHrdDnGdXg93N2M5KHn1ug8BtPLQwlcFwEpKnlLn
|
35
|
+
btEP+7EplFuoiMfd
|
33
36
|
-----END CERTIFICATE-----
|
34
|
-
date:
|
37
|
+
date: 2022-12-01 00:00:00.000000000 Z
|
35
38
|
dependencies:
|
36
39
|
- !ruby/object:Gem::Dependency
|
37
40
|
name: loggability
|
@@ -39,44 +42,30 @@ dependencies:
|
|
39
42
|
requirements:
|
40
43
|
- - "~>"
|
41
44
|
- !ruby/object:Gem::Version
|
42
|
-
version: '0.
|
45
|
+
version: '0.15'
|
43
46
|
type: :runtime
|
44
47
|
prerelease: false
|
45
48
|
version_requirements: !ruby/object:Gem::Requirement
|
46
49
|
requirements:
|
47
50
|
- - "~>"
|
48
51
|
- !ruby/object:Gem::Version
|
49
|
-
version: '0.
|
52
|
+
version: '0.15'
|
50
53
|
- !ruby/object:Gem::Dependency
|
51
|
-
name:
|
54
|
+
name: rake-deveiate
|
52
55
|
requirement: !ruby/object:Gem::Requirement
|
53
56
|
requirements:
|
54
57
|
- - "~>"
|
55
58
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
59
|
+
version: '0.21'
|
57
60
|
type: :development
|
58
61
|
prerelease: false
|
59
62
|
version_requirements: !ruby/object:Gem::Requirement
|
60
63
|
requirements:
|
61
64
|
- - "~>"
|
62
65
|
- !ruby/object:Gem::Version
|
63
|
-
version: '
|
66
|
+
version: '0.21'
|
64
67
|
- !ruby/object:Gem::Dependency
|
65
|
-
name:
|
66
|
-
requirement: !ruby/object:Gem::Requirement
|
67
|
-
requirements:
|
68
|
-
- - "~>"
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version: '0.6'
|
71
|
-
type: :development
|
72
|
-
prerelease: false
|
73
|
-
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
requirements:
|
75
|
-
- - "~>"
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '0.6'
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: hoe-highline
|
68
|
+
name: rdoc-generator-sixfish
|
80
69
|
requirement: !ruby/object:Gem::Requirement
|
81
70
|
requirements:
|
82
71
|
- - "~>"
|
@@ -89,96 +78,30 @@ dependencies:
|
|
89
78
|
- - "~>"
|
90
79
|
- !ruby/object:Gem::Version
|
91
80
|
version: '0.2'
|
92
|
-
|
93
|
-
name: rdoc
|
94
|
-
requirement: !ruby/object:Gem::Requirement
|
95
|
-
requirements:
|
96
|
-
- - "~>"
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
version: '4.0'
|
99
|
-
type: :development
|
100
|
-
prerelease: false
|
101
|
-
version_requirements: !ruby/object:Gem::Requirement
|
102
|
-
requirements:
|
103
|
-
- - "~>"
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: '4.0'
|
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: hoe
|
122
|
-
requirement: !ruby/object:Gem::Requirement
|
123
|
-
requirements:
|
124
|
-
- - "~>"
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
version: '3.13'
|
127
|
-
type: :development
|
128
|
-
prerelease: false
|
129
|
-
version_requirements: !ruby/object:Gem::Requirement
|
130
|
-
requirements:
|
131
|
-
- - "~>"
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: '3.13'
|
134
|
-
description: "Pluggability is a mixin module that turns an including class into a\nfactory
|
135
|
-
for its derivatives, capable of searching for and loading them\nby name. This is
|
136
|
-
useful when you have an abstract base class which\ndefines an interface and basic
|
137
|
-
functionality for a part of a larger\nsystem, and a collection of subclasses which
|
138
|
-
implement the interface for\ndifferent underlying functionality.\n\nAn example of
|
139
|
-
where this might be useful is in a program which generates\noutput with a 'driver'
|
140
|
-
object, which provides a unified interface but\ngenerates different kinds of output.\n\nFirst
|
141
|
-
the abstract base class, which is extended with Pluggability:\n\n # in mygem/driver.rb:\n
|
142
|
-
\ require 'pluggability'\n require 'mygem' unless defined?( MyGem )\n \n
|
143
|
-
\ class MyGem::Driver\n extend Pluggability\n plugin_prefixes \"drivers\",
|
144
|
-
\"drivers/compat\"\n end\n\nWe can have one driver that outputs PDF documents:\n\n
|
145
|
-
\ # mygem/drivers/pdf.rb:\n require 'mygem/driver' unless defined?( MyGem::Driver
|
146
|
-
)\n \n class MyGem::Driver::PDF < Driver\n ...implementation...\n end\n\nand
|
147
|
-
another that outputs plain ascii text:\n\n #mygem/drivers/ascii.rb:\n require
|
148
|
-
'mygem/driver' unless defined?( MyGem::Driver )\n \n class MyGem::Driver::ASCII
|
149
|
-
< Driver\n ...implementation...\n end\n\nNow the driver is configurable
|
150
|
-
by the end-user, who can just set\nit by its short name:\n\n require 'mygem'\n
|
151
|
-
\ \n config[:driver_type] #=> \"pdf\"\n driver = MyGem::Driver.create( config[:driver_type]
|
152
|
-
)\n driver.class #=> MyGem::Driver::PDF\n\n # You can also pass arguments
|
153
|
-
to the constructor, too:\n ascii_driver = MyGem::Driver.create( :ascii, :columns
|
154
|
-
=> 80 )"
|
81
|
+
description: Pluggability is a toolkit for creating plugins.
|
155
82
|
email:
|
156
|
-
-
|
157
|
-
-
|
83
|
+
- ged@faeriemud.org
|
84
|
+
- outofculture@gmail.com
|
158
85
|
executables: []
|
159
86
|
extensions: []
|
160
|
-
extra_rdoc_files:
|
161
|
-
- History.rdoc
|
162
|
-
- Manifest.txt
|
163
|
-
- README.rdoc
|
87
|
+
extra_rdoc_files: []
|
164
88
|
files:
|
165
|
-
-
|
166
|
-
-
|
167
|
-
- History.rdoc
|
168
|
-
- Manifest.txt
|
169
|
-
- README.rdoc
|
170
|
-
- Rakefile
|
89
|
+
- History.md
|
90
|
+
- README.md
|
171
91
|
- lib/pluggability.rb
|
172
92
|
- spec/helpers.rb
|
173
93
|
- spec/pluggability_spec.rb
|
174
|
-
homepage: https://
|
94
|
+
homepage: https://hg.sr.ht/~ged/Pluggability
|
175
95
|
licenses:
|
176
|
-
- BSD
|
177
|
-
metadata:
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
96
|
+
- BSD-3-Clause
|
97
|
+
metadata:
|
98
|
+
homepage_uri: https://hg.sr.ht/~ged/Pluggability
|
99
|
+
documentation_uri: https://deveiate.org/code/pluggability
|
100
|
+
changelog_uri: https://deveiate.org/code/pluggability/History_md.html
|
101
|
+
source_uri: https://hg.sr.ht/~ged/Pluggability/browse
|
102
|
+
bug_tracker_uri: https://todo.sr.ht/~ged/Pluggability/browse
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
182
105
|
require_paths:
|
183
106
|
- lib
|
184
107
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -192,10 +115,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
115
|
- !ruby/object:Gem::Version
|
193
116
|
version: '0'
|
194
117
|
requirements: []
|
195
|
-
|
196
|
-
|
197
|
-
signing_key:
|
118
|
+
rubygems_version: 3.3.7
|
119
|
+
signing_key:
|
198
120
|
specification_version: 4
|
199
|
-
summary: Pluggability is a
|
200
|
-
for its derivatives, capable of searching for and loading them by name
|
121
|
+
summary: Pluggability is a toolkit for creating plugins.
|
201
122
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|
data/.gemtest
DELETED
File without changes
|