rubysl-singleton 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a68b8b94eadd7fe3c8e3f30ff58b1fb1d0303481
4
+ data.tar.gz: 4f0af342cda53ce98431f81227ea3fdced184877
5
+ SHA512:
6
+ metadata.gz: 04dfdf1c1cb3776b10f8100c2d650c3aaf3d58d7224460ce800ebd3eff49d8cc251510a07367b80645617e85acd282953433fbb10d8580327e59774d6a6a085d
7
+ data.tar.gz: add0ca325e06b7e6cb6c5d46d016a7a7e7175df4db5e5e96ade43f4bfe411311c867902d8ad58bf495a84f605aaf8891bbb95c4b86644b36d4d7727e3bf0304d
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ before_install:
3
+ - gem update --system
4
+ - gem --version
5
+ - gem install rubysl-bundler
6
+ script: bundle exec mspec spec
7
+ rvm:
8
+ - rbx-nightly-18mode
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rubysl-singleton.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2013, Brian Shirai
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
+ 1. Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ 3. Neither the name of the library nor the names of its contributors may be
13
+ used to endorse or promote products derived from this software without
14
+ specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY DIRECT,
20
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
25
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Rubysl::Singleton
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rubysl-singleton'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install rubysl-singleton
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,2 @@
1
+ require "rubysl/singleton/singleton"
2
+ require "rubysl/singleton/version"
@@ -0,0 +1,313 @@
1
+ # The Singleton module implements the Singleton pattern.
2
+ #
3
+ # Usage:
4
+ # class Klass
5
+ # include Singleton
6
+ # # ...
7
+ # end
8
+ #
9
+ # * this ensures that only one instance of Klass lets call it
10
+ # ``the instance'' can be created.
11
+ #
12
+ # a,b = Klass.instance, Klass.instance
13
+ # a == b # => true
14
+ # Klass.new # NoMethodError - new is private ...
15
+ #
16
+ # * ``The instance'' is created at instantiation time, in other
17
+ # words the first call of Klass.instance(), thus
18
+ #
19
+ # class OtherKlass
20
+ # include Singleton
21
+ # # ...
22
+ # end
23
+ # ObjectSpace.each_object(OtherKlass){} # => 0.
24
+ #
25
+ # * This behavior is preserved under inheritance and cloning.
26
+ #
27
+ #
28
+ #
29
+ # This is achieved by marking
30
+ # * Klass.new and Klass.allocate - as private
31
+ #
32
+ # Providing (or modifying) the class methods
33
+ # * Klass.inherited(sub_klass) and Klass.clone() -
34
+ # to ensure that the Singleton pattern is properly
35
+ # inherited and cloned.
36
+ #
37
+ # * Klass.instance() - returning ``the instance''. After a
38
+ # successful self modifying (normally the first) call the
39
+ # method body is a simple:
40
+ #
41
+ # def Klass.instance()
42
+ # return @singleton__instance__
43
+ # end
44
+ #
45
+ # * Klass._load(str) - calling Klass.instance()
46
+ #
47
+ # * Klass._instantiate?() - returning ``the instance'' or
48
+ # nil. This hook method puts a second (or nth) thread calling
49
+ # Klass.instance() on a waiting loop. The return value
50
+ # signifies the successful completion or premature termination
51
+ # of the first, or more generally, current "instantiation thread".
52
+ #
53
+ #
54
+ # The instance method of Singleton are
55
+ # * clone and dup - raising TypeErrors to prevent cloning or duping
56
+ #
57
+ # * _dump(depth) - returning the empty string. Marshalling strips
58
+ # by default all state information, e.g. instance variables and
59
+ # taint state, from ``the instance''. Providing custom _load(str)
60
+ # and _dump(depth) hooks allows the (partially) resurrections of
61
+ # a previous state of ``the instance''.
62
+
63
+ require 'thread'
64
+
65
+ module Singleton
66
+ # disable build-in copying methods
67
+ def clone
68
+ raise TypeError, "can't clone instance of singleton #{self.class}"
69
+ end
70
+ def dup
71
+ raise TypeError, "can't dup instance of singleton #{self.class}"
72
+ end
73
+
74
+ # default marshalling strategy
75
+ def _dump(depth = -1)
76
+ ''
77
+ end
78
+
79
+ module SingletonClassMethods
80
+ # properly clone the Singleton pattern - did you know
81
+ # that duping doesn't copy class methods?
82
+ def clone
83
+ Singleton.__init__(super)
84
+ end
85
+
86
+ def _load(str)
87
+ instance
88
+ end
89
+
90
+ private
91
+
92
+ # ensure that the Singleton pattern is properly inherited
93
+ def inherited(sub_klass)
94
+ super
95
+ Singleton.__init__(sub_klass)
96
+ end
97
+ end
98
+
99
+ class << Singleton
100
+ def __init__(klass)
101
+ klass.instance_eval {
102
+ @singleton__instance__ = nil
103
+ @singleton__mutex__ = Mutex.new
104
+ }
105
+ def klass.instance
106
+ return @singleton__instance__ if @singleton__instance__
107
+ @singleton__mutex__.synchronize {
108
+ return @singleton__instance__ if @singleton__instance__
109
+ @singleton__instance__ = new()
110
+ }
111
+ @singleton__instance__
112
+ end
113
+ klass
114
+ end
115
+
116
+ private
117
+
118
+ # extending an object with Singleton is a bad idea
119
+ undef_method :extend_object
120
+
121
+ def append_features(mod)
122
+ # help out people counting on transitive mixins
123
+ unless mod.instance_of?(Class)
124
+ raise TypeError, "Inclusion of the OO-Singleton module in module #{mod}"
125
+ end
126
+ super
127
+ end
128
+
129
+ def included(klass)
130
+ super
131
+ klass.private_class_method :new, :allocate
132
+ klass.extend SingletonClassMethods
133
+ Singleton.__init__(klass)
134
+ end
135
+ end
136
+
137
+ end
138
+
139
+
140
+ if __FILE__ == $0
141
+
142
+ def num_of_instances(klass)
143
+ "#{ObjectSpace.each_object(klass){}} #{klass} instance(s)"
144
+ end
145
+
146
+ # The basic and most important example.
147
+
148
+ class SomeSingletonClass
149
+ include Singleton
150
+ end
151
+ puts "There are #{num_of_instances(SomeSingletonClass)}"
152
+
153
+ a = SomeSingletonClass.instance
154
+ b = SomeSingletonClass.instance # a and b are same object
155
+ puts "basic test is #{a == b}"
156
+
157
+ begin
158
+ SomeSingletonClass.new
159
+ rescue NoMethodError => mes
160
+ puts mes
161
+ end
162
+
163
+
164
+
165
+ puts "\nThreaded example with exception and customized #_instantiate?() hook"; p
166
+ Thread.abort_on_exception = false
167
+
168
+ class Ups < SomeSingletonClass
169
+ def initialize
170
+ self.class.__sleep
171
+ puts "initialize called by thread ##{Thread.current[:i]}"
172
+ end
173
+ end
174
+
175
+ class << Ups
176
+ def _instantiate?
177
+ @enter.push Thread.current[:i]
178
+ while false.equal?(@singleton__instance__)
179
+ @singleton__mutex__.unlock
180
+ sleep 0.08
181
+ @singleton__mutex__.lock
182
+ end
183
+ @leave.push Thread.current[:i]
184
+ @singleton__instance__
185
+ end
186
+
187
+ def __sleep
188
+ sleep(rand(0.08))
189
+ end
190
+
191
+ def new
192
+ begin
193
+ __sleep
194
+ raise "boom - thread ##{Thread.current[:i]} failed to create instance"
195
+ ensure
196
+ # simple flip-flop
197
+ class << self
198
+ remove_method :new
199
+ end
200
+ end
201
+ end
202
+
203
+ def instantiate_all
204
+ @enter = []
205
+ @leave = []
206
+ 1.upto(9) {|i|
207
+ Thread.new {
208
+ begin
209
+ Thread.current[:i] = i
210
+ __sleep
211
+ instance
212
+ rescue RuntimeError => mes
213
+ puts mes
214
+ end
215
+ }
216
+ }
217
+ puts "Before there were #{num_of_instances(self)}"
218
+ sleep 3
219
+ puts "Now there is #{num_of_instances(self)}"
220
+ puts "#{@enter.join '; '} was the order of threads entering the waiting loop"
221
+ puts "#{@leave.join '; '} was the order of threads leaving the waiting loop"
222
+ end
223
+ end
224
+
225
+
226
+ Ups.instantiate_all
227
+ # results in message like
228
+ # Before there were 0 Ups instance(s)
229
+ # boom - thread #6 failed to create instance
230
+ # initialize called by thread #3
231
+ # Now there is 1 Ups instance(s)
232
+ # 3; 2; 1; 8; 4; 7; 5 was the order of threads entering the waiting loop
233
+ # 3; 2; 1; 7; 4; 8; 5 was the order of threads leaving the waiting loop
234
+
235
+
236
+ puts "\nLets see if class level cloning really works"
237
+ Yup = Ups.clone
238
+ def Yup.new
239
+ begin
240
+ __sleep
241
+ raise "boom - thread ##{Thread.current[:i]} failed to create instance"
242
+ ensure
243
+ # simple flip-flop
244
+ class << self
245
+ remove_method :new
246
+ end
247
+ end
248
+ end
249
+ Yup.instantiate_all
250
+
251
+
252
+ puts "\n\n","Customized marshalling"
253
+ class A
254
+ include Singleton
255
+ attr_accessor :persist, :die
256
+ def _dump(depth)
257
+ # this strips the @die information from the instance
258
+ Marshal.dump(@persist,depth)
259
+ end
260
+ end
261
+
262
+ def A._load(str)
263
+ instance.persist = Marshal.load(str)
264
+ instance
265
+ end
266
+
267
+ a = A.instance
268
+ a.persist = ["persist"]
269
+ a.die = "die"
270
+ a.taint
271
+
272
+ stored_state = Marshal.dump(a)
273
+ # change state
274
+ a.persist = nil
275
+ a.die = nil
276
+ b = Marshal.load(stored_state)
277
+ p a == b # => true
278
+ p a.persist # => ["persist"]
279
+ p a.die # => nil
280
+
281
+
282
+ puts "\n\nSingleton with overridden default #inherited() hook"
283
+ class Up
284
+ end
285
+ def Up.inherited(sub_klass)
286
+ puts "#{sub_klass} subclasses #{self}"
287
+ end
288
+
289
+
290
+ class Middle < Up
291
+ include Singleton
292
+ end
293
+
294
+ class Down < Middle; end
295
+
296
+ puts "and basic \"Down test\" is #{Down.instance == Down.instance}\n
297
+ Various exceptions"
298
+
299
+ begin
300
+ module AModule
301
+ include Singleton
302
+ end
303
+ rescue TypeError => mes
304
+ puts mes #=> Inclusion of the OO-Singleton module in module AModule
305
+ end
306
+
307
+ begin
308
+ 'aString'.extend Singleton
309
+ rescue NoMethodError => mes
310
+ puts mes #=> undefined method `extend_object' for Singleton:Module
311
+ end
312
+
313
+ end
@@ -0,0 +1,5 @@
1
+ module RubySL
2
+ module Singleton
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
data/lib/singleton.rb ADDED
@@ -0,0 +1 @@
1
+ require "rubysl/singleton"
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ require './lib/rubysl/singleton/version'
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "rubysl-singleton"
6
+ spec.version = RubySL::Singleton::VERSION
7
+ spec.authors = ["Brian Shirai"]
8
+ spec.email = ["brixen@gmail.com"]
9
+ spec.description = %q{Ruby standard library singleton.}
10
+ spec.summary = %q{Ruby standard library singleton.}
11
+ spec.homepage = "https://github.com/rubysl/rubysl-singleton"
12
+ spec.license = "BSD"
13
+
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_development_dependency "bundler", "~> 1.3"
20
+ spec.add_development_dependency "rake", "~> 10.0"
21
+ spec.add_development_dependency "mspec", "~> 1.5"
22
+ spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
23
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+
3
+ describe "Singleton.allocate" do
4
+ it "is a private method" do
5
+ lambda { SingletonSpecs::MyClass.allocate }.should raise_error(NoMethodError)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+
3
+ describe "Singleton#clone" do
4
+ it "is prevented" do
5
+ lambda { SingletonSpecs::MyClass.instance.clone }.should raise_error(TypeError)
6
+ end
7
+ end
data/spec/dump_spec.rb ADDED
@@ -0,0 +1,13 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+
3
+ describe "Singleton#_dump" do
4
+
5
+ it "returns an empty string" do
6
+ SingletonSpecs::MyClass.instance.send(:_dump).should == ""
7
+ end
8
+
9
+ it "returns an empty string from a singleton subclass" do
10
+ SingletonSpecs::MyClassChild.instance.send(:_dump).should == ""
11
+ end
12
+
13
+ end
data/spec/dup_spec.rb ADDED
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+
3
+ describe "Singleton#dup" do
4
+ it "is prevented" do
5
+ lambda { SingletonSpecs::MyClass.instance.dup }.should raise_error(TypeError)
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ require 'singleton'
2
+
3
+ module SingletonSpecs
4
+ class MyClass
5
+ attr_accessor :data
6
+ include Singleton
7
+ end
8
+
9
+ class NewSpec
10
+ include Singleton
11
+ end
12
+
13
+ class MyClassChild < MyClass
14
+ end
15
+
16
+ class NotInstantiated < MyClass
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+
3
+ describe "Singleton.instance" do
4
+ it "returns an instance of the singleton class" do
5
+ SingletonSpecs::MyClass.instance.should be_kind_of(SingletonSpecs::MyClass)
6
+ end
7
+
8
+ it "returns the same instance for multiple calls to instance" do
9
+ SingletonSpecs::MyClass.instance.should equal(SingletonSpecs::MyClass.instance)
10
+ end
11
+
12
+ it "returns an instance of the singleton's subclasses" do
13
+ SingletonSpecs::MyClassChild.instance.should be_kind_of(SingletonSpecs::MyClassChild)
14
+ end
15
+
16
+ it "returns the same instance for multiple class to instance on subclasses" do
17
+ SingletonSpecs::MyClassChild.instance.should equal(SingletonSpecs::MyClassChild.instance)
18
+ end
19
+
20
+ it "returns an instance of the singleton's clone" do
21
+ klone = SingletonSpecs::MyClassChild.clone
22
+ klone.instance.should be_kind_of(klone)
23
+ end
24
+
25
+ it "returns the same instance for multiple class to instance on clones" do
26
+ klone = SingletonSpecs::MyClassChild.clone
27
+ klone.instance.should equal(klone.instance)
28
+ end
29
+ end
@@ -0,0 +1,20 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+
3
+ describe "Singleton._instantiate?" do
4
+
5
+ it "is private" do
6
+ lambda { SingletonSpecs::MyClass._instantiate? }.should raise_error(NoMethodError)
7
+ end
8
+
9
+ ruby_version_is "" ... "1.9" do
10
+ # JRuby doesn't support "_instantiate?" intentionally (JRUBY-2239)
11
+ not_compliant_on :jruby do
12
+ it "returns nil until it is instantiated" do
13
+ SingletonSpecs::NotInstantiated.send(:_instantiate?).should == nil
14
+ SingletonSpecs::NotInstantiated.instance
15
+ inst = SingletonSpecs::NotInstantiated.send(:_instantiate?)
16
+ inst.should eql(SingletonSpecs::NotInstantiated.instance)
17
+ end
18
+ end
19
+ end
20
+ end
data/spec/load_spec.rb ADDED
@@ -0,0 +1,22 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+
3
+ # TODO: change to a.should be_equal(b)
4
+ # TODO: write spec for cloning classes and calling private methods
5
+ # TODO: write spec for private_methods not showing up via extended
6
+ describe "Singleton._load" do
7
+ ruby_version_is "1.8.7".."1.9" do
8
+ it "returns the singleton instance for anything passed in" do
9
+ klass = SingletonSpecs::MyClass
10
+ klass._load("").should equal(klass.instance)
11
+ klass._load("42").should equal(klass.instance)
12
+ klass._load(42).should equal(klass.instance)
13
+ end
14
+
15
+ it "returns the singleton instance for anything passed in to subclass" do
16
+ subklass = SingletonSpecs::MyClassChild
17
+ subklass._load("").should equal(subklass.instance)
18
+ subklass._load("42").should equal(subklass.instance)
19
+ subklass._load(42).should equal(subklass.instance)
20
+ end
21
+ end
22
+ end
data/spec/new_spec.rb ADDED
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+
3
+ describe "Singleton.new" do
4
+ it "is a private method" do
5
+ lambda { SingletonSpecs::NewSpec.new }.should raise_error(NoMethodError)
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,130 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubysl-singleton
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brian Shirai
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubysl-prettyprint
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ description: Ruby standard library singleton.
70
+ email:
71
+ - brixen@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .travis.yml
78
+ - Gemfile
79
+ - LICENSE
80
+ - README.md
81
+ - Rakefile
82
+ - lib/rubysl/singleton.rb
83
+ - lib/rubysl/singleton/singleton.rb
84
+ - lib/rubysl/singleton/version.rb
85
+ - lib/singleton.rb
86
+ - rubysl-singleton.gemspec
87
+ - spec/allocate_spec.rb
88
+ - spec/clone_spec.rb
89
+ - spec/dump_spec.rb
90
+ - spec/dup_spec.rb
91
+ - spec/fixtures/classes.rb
92
+ - spec/instance_spec.rb
93
+ - spec/instantiate_spec.rb
94
+ - spec/load_spec.rb
95
+ - spec/new_spec.rb
96
+ homepage: https://github.com/rubysl/rubysl-singleton
97
+ licenses:
98
+ - BSD
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 2.0.3
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: Ruby standard library singleton.
120
+ test_files:
121
+ - spec/allocate_spec.rb
122
+ - spec/clone_spec.rb
123
+ - spec/dump_spec.rb
124
+ - spec/dup_spec.rb
125
+ - spec/fixtures/classes.rb
126
+ - spec/instance_spec.rb
127
+ - spec/instantiate_spec.rb
128
+ - spec/load_spec.rb
129
+ - spec/new_spec.rb
130
+ has_rdoc: