is_a_collection 0.0.1
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/lib/is_a_collection.rb +40 -0
- data/spec/is_a_collection_spec.rb +61 -0
- metadata +77 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
class Class
|
2
|
+
|
3
|
+
def is_a_collection(id_method=:id)
|
4
|
+
id_method = id_method.to_sym
|
5
|
+
|
6
|
+
include InstanceMethods
|
7
|
+
extend ClassMethods
|
8
|
+
|
9
|
+
define_method :add_to_collection do
|
10
|
+
self.class.__collection[send id_method] = self
|
11
|
+
end
|
12
|
+
define_method :remove_from_collection do
|
13
|
+
self.class.__collection.delete(send id_method)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module InstanceMethods
|
18
|
+
def initialize(*args, &block)
|
19
|
+
super
|
20
|
+
add_to_collection
|
21
|
+
end
|
22
|
+
def destroy(*args, &block)
|
23
|
+
remove_from_collection
|
24
|
+
super if self.class.superclass.instance_methods.include?(:destroy)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module ClassMethods
|
29
|
+
def __collection
|
30
|
+
@__collection ||= {}
|
31
|
+
end
|
32
|
+
def all
|
33
|
+
__collection.values
|
34
|
+
end
|
35
|
+
def find(identifier)
|
36
|
+
@__collection[identifier]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require File.join( File.expand_path(File.dirname(__FILE__)), '../lib/is_a_collection' )
|
2
|
+
|
3
|
+
class A
|
4
|
+
is_a_collection
|
5
|
+
|
6
|
+
def initialize(*args)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def id
|
11
|
+
object_id
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
class B
|
17
|
+
attr_reader :name
|
18
|
+
is_a_collection :name
|
19
|
+
|
20
|
+
def initialize(name)
|
21
|
+
@name = name
|
22
|
+
add_to_collection
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "is_a_collection" do
|
28
|
+
describe "#all" do
|
29
|
+
describe "without any instances" do
|
30
|
+
it "should be empty" do
|
31
|
+
A.all.should be_empty
|
32
|
+
end
|
33
|
+
end
|
34
|
+
describe "with some instances" do
|
35
|
+
it "should return these instances" do
|
36
|
+
a1 = A.new
|
37
|
+
a2 = A.new
|
38
|
+
A.all.should == [a1,a2]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
describe "#find" do
|
43
|
+
it "should return the instance by default identifier (#object_id)" do
|
44
|
+
a = A.new
|
45
|
+
A.find(a.object_id).should == a
|
46
|
+
end
|
47
|
+
it "should return the instance by custom identifier" do
|
48
|
+
b = B.new('foobar')
|
49
|
+
B.find('foobar').should == b
|
50
|
+
end
|
51
|
+
end
|
52
|
+
describe "#destroy" do
|
53
|
+
before(:each) do
|
54
|
+
@b = B.new('doomed')
|
55
|
+
end
|
56
|
+
it "should remove the instances" do
|
57
|
+
@b.destroy
|
58
|
+
B.find('doomed').should be_nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: is_a_collection
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Niko Dittmann
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-11-09 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
type: :development
|
32
|
+
version_requirements: *id001
|
33
|
+
description: "A small gem that adds #find, #all and #destroy to a class to keep track of its instances."
|
34
|
+
email: mail@niko-dittmann.com
|
35
|
+
executables: []
|
36
|
+
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files: []
|
40
|
+
|
41
|
+
files:
|
42
|
+
- lib/is_a_collection.rb
|
43
|
+
- spec/is_a_collection_spec.rb
|
44
|
+
has_rdoc: true
|
45
|
+
homepage: http://github.com/niko/is_a_collection
|
46
|
+
licenses: []
|
47
|
+
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project: nowarning
|
72
|
+
rubygems_version: 1.3.7
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: "A small gem that adds #find, #all and #destroy to a class to keep track of its instances."
|
76
|
+
test_files:
|
77
|
+
- spec/is_a_collection_spec.rb
|