pluggability 0.4.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- end
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( Plugin ).to receive( :require ).with( 'plugins/dazzle_plugin' ) do |*args|
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( Plugin ).to receive( :require ).at_least(6).times.
114
- and_raise( LoadError.new("path") )
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
- # at least 6 -> 3 variants * 2 paths
124
- expect( Plugin ).to receive( :require ).and_return( true )
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 "will re-raise the first exception raised when attempting to load a " +
133
- "derivative if none of the paths work" do
134
-
135
- # at least 6 -> 3 variants * 2 paths
136
- expect( Plugin ).to receive( :require ).at_least(6).times.
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( Plugin ).to receive( :require ).with( 'plugins/first.rb' ).
172
+ expect( Kernel ).to receive( :require ).with( 'plugins/first.rb' ).
152
173
  and_return( true )
153
- expect( Plugin ).to receive( :require ).with( 'plugins/private/second.rb' ).
174
+ expect( Kernel ).to receive( :require ).with( 'plugins/private/second.rb' ).
154
175
  and_return( true )
155
- expect( Plugin ).to receive( :require ).with( 'plugins/private/third.rb' ).
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( Plugin ).to receive( :require ).with( 'plugins/first.rb' ).
189
+ expect( Kernel ).to receive( :require ).with( '/path/to/plugins/first.rb' ).
169
190
  and_return( true )
170
- expect( Plugin ).to_not receive( :require ).with( 'plugins/private/second.rb' )
171
- expect( Plugin ).to_not receive( :require ).with( 'plugins/private/third.rb' )
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( Plugin ).to receive( :require ).with( 'plugins/first.rb' ).
205
+ expect( Kernel ).to receive( :require ).with( 'plugins/first.rb' ).
185
206
  and_return( true )
186
- expect( Plugin ).to receive( :require ).with( 'plugins/private/second.rb' ).
207
+ expect( Kernel ).to receive( :require ).with( 'plugins/private/second.rb' ).
187
208
  and_return( true )
188
- expect( Plugin ).to_not receive( :require ).with( 'plugins/private/third.rb' )
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.3
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
- - Martin Chase
8
7
  - Michael Granger
9
- autorequire:
8
+ - Martin Chase
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain:
12
12
  - |
13
13
  -----BEGIN CERTIFICATE-----
14
- MIIDbDCCAlSgAwIBAgIBATANBgkqhkiG9w0BAQUFADA+MQwwCgYDVQQDDANnZWQx
15
- GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
16
- HhcNMTQwMzE5MDQzNTI2WhcNMTUwMzE5MDQzNTI2WjA+MQwwCgYDVQQDDANnZWQx
17
- GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
18
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDb92mkyYwuGBg1oRxt2tkH
19
- +Uo3LAsaL/APBfSLzy8o3+B3AUHKCjMUaVeBoZdWtMHB75X3VQlvXfZMyBxj59Vo
20
- cDthr3zdao4HnyrzAIQf7BO5Y8KBwVD+yyXCD/N65TTwqsQnO3ie7U5/9ut1rnNr
21
- OkOzAscMwkfQxBkXDzjvAWa6UF4c5c9kR/T79iA21kDx9+bUMentU59aCJtUcbxa
22
- 7kcKJhPEYsk4OdxR9q2dphNMFDQsIdRO8rywX5FRHvcb+qnXC17RvxLHtOjysPtp
23
- EWsYoZMxyCDJpUqbwoeiM+tAHoz2ABMv3Ahie3Qeb6+MZNAtMmaWfBx3dg2u+/WN
24
- AgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBSZ0hCV
25
- qoHr122fGKelqffzEQBhszAcBgNVHREEFTATgRFnZWRARmFlcmllTVVELm9yZzAc
26
- BgNVHRIEFTATgRFnZWRARmFlcmllTVVELm9yZzANBgkqhkiG9w0BAQUFAAOCAQEA
27
- TuL1Bzl6TBs1YEzEubFHb9XAPgehWzzUudjDKzTRd+uyZmxnomBqTCQjT5ucNRph
28
- 3jZ6bhLNooLQxTjIuHodeGcEMHZdt4Yi7SyPmw5Nry12z6wrDp+5aGps3HsE5WsQ
29
- Zq2EuyEOc96g31uoIvjNdieKs+1kE+K+dJDjtw+wTH2i63P7r6N/NfPPXpxsFquo
30
- wcYRRrHdR7GhdJeT+V8Q8Bi5bglCUGdx+8scMgkkePc98k9osQHypbACmzO+Bqkv
31
- c7ZKPJcWBv0sm81+FCZXNACn2f9jfF8OQinxVs0O052KbGuEQaaiGIYeuuwQE2q6
32
- ggcrPfcYeTwWlfZPu2LrBg==
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: 2015-03-04 00:00:00.000000000 Z
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.8'
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.8'
52
+ version: '0.15'
50
53
  - !ruby/object:Gem::Dependency
51
- name: hoe-mercurial
54
+ name: rake-deveiate
52
55
  requirement: !ruby/object:Gem::Requirement
53
56
  requirements:
54
57
  - - "~>"
55
58
  - !ruby/object:Gem::Version
56
- version: '1.4'
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: '1.4'
66
+ version: '0.21'
64
67
  - !ruby/object:Gem::Dependency
65
- name: hoe-deveiate
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
- - !ruby/object:Gem::Dependency
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
- - stillflame@FaerieMUD.org
157
- - ged@FaerieMUD.org
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
- - ".gemtest"
166
- - ChangeLog
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://bitbucket.org/ged/pluggability
94
+ homepage: https://hg.sr.ht/~ged/Pluggability
175
95
  licenses:
176
- - BSD
177
- metadata: {}
178
- post_install_message:
179
- rdoc_options:
180
- - "-t"
181
- - Pluggability Toolkit
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
- rubyforge_project:
196
- rubygems_version: 2.4.5
197
- signing_key:
118
+ rubygems_version: 3.3.7
119
+ signing_key:
198
120
  specification_version: 4
199
- summary: Pluggability is a mixin module that turns an including class into a factory
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