typecollection 0.0.2 → 0.0.3
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/VERSION +1 -1
- data/lib/typecollection/base.rb +23 -0
- data/lib/typecollection/class+inferred_type.rb +12 -8
- data/lib/typecollection/class_methods.rb +13 -12
- data/lib/typecollection.rb +2 -5
- data/test/test_typecollection.rb +22 -5
- data/typecollection.gemspec +2 -1
- metadata +11 -10
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module TypeCollection
|
2
|
+
module Base
|
3
|
+
|
4
|
+
module BaseClassMethods
|
5
|
+
# Returns all of the known subclass names for this collection
|
6
|
+
def all_type_names(); return __tc_members().keys(); end
|
7
|
+
# Returns all of the known subclasses for this collection
|
8
|
+
def all_types(); return __tc_members().values(); end
|
9
|
+
# Gets the type associated with the provided value (Class or Otherwise)
|
10
|
+
def get_type(type)
|
11
|
+
type = type.inferred_type() if (type.kind_of?(Class))
|
12
|
+
mems = __tc_members()
|
13
|
+
raise TypeCollection::UnknownChildType.new() unless (mems.has_key?(type))
|
14
|
+
return mems[type]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.included(base)
|
19
|
+
base.extend(TypeCollection::ClassMethods)
|
20
|
+
base.extend(TypeCollection::Base::BaseClassMethods)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,14 +1,18 @@
|
|
1
1
|
class Class
|
2
2
|
def inferred_type()
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
if (!defined?(@__tc_inferred_type))
|
4
|
+
klass_name = self.name.split("::").last
|
5
|
+
parent_klass = self.superclass
|
6
|
+
while(parent_klass != nil)
|
7
|
+
check = parent_klass.name.split("::").last
|
8
|
+
if (klass_name.end_with?(check))
|
9
|
+
@__tc_inferred_type = klass_name.gsub(/#{check}\z/, "")
|
10
|
+
break
|
11
|
+
end
|
12
|
+
parent_klass = parent_klass.superclass
|
9
13
|
end
|
10
|
-
|
14
|
+
@__tc_inferred_type = nil
|
11
15
|
end
|
12
|
-
return
|
16
|
+
return @__tc_inferred_type
|
13
17
|
end
|
14
18
|
end
|
@@ -14,17 +14,16 @@ module TypeCollection
|
|
14
14
|
# Contains the Members mapped by type
|
15
15
|
def __tc_members(); @_members ||= { }; end
|
16
16
|
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
return mems[type]
|
17
|
+
# Get similar type based on the object passed in which can be a String,
|
18
|
+
# Object (using the inferred type), or Class
|
19
|
+
def get_associated_type(associate)
|
20
|
+
if (!associate.kind_of?(String))
|
21
|
+
if (!associate.kind_of?(Class))
|
22
|
+
associate = associate.class
|
23
|
+
end
|
24
|
+
associate = associate.inferred_type()
|
25
|
+
end
|
26
|
+
return self.get_type(associate)
|
28
27
|
end
|
29
28
|
|
30
29
|
# Overrides the default behavior when being extended by a child class.
|
@@ -34,7 +33,9 @@ module TypeCollection
|
|
34
33
|
super if (defined?(super))
|
35
34
|
type = child.inferred_type()
|
36
35
|
if (type.nil?)
|
37
|
-
|
36
|
+
cname = child.name.split("::").last
|
37
|
+
pname = self.name.split("::").last
|
38
|
+
error = "Invalid Name: #{ cname }! Child class names must end with \"#{ pname }\"."
|
38
39
|
raise TypeCollection::InvalidChildType.new(error)
|
39
40
|
end
|
40
41
|
__tc_members()[type] = child
|
data/lib/typecollection.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
require 'typecollection'
|
2
2
|
require 'typecollection/class+inferred_type'
|
3
3
|
require 'typecollection/class_methods'
|
4
|
+
require 'typecollection/base'
|
4
5
|
|
5
6
|
module TypeCollection
|
6
|
-
|
7
|
-
# in your class definition.
|
8
|
-
def self.included(base)
|
9
|
-
base.extend(TypeCollection::ClassMethods)
|
10
|
-
end
|
7
|
+
|
11
8
|
end
|
data/test/test_typecollection.rb
CHANGED
@@ -1,19 +1,36 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
+
# => Define a Type Collection
|
4
|
+
class SomeType
|
5
|
+
include TypeCollection
|
6
|
+
end
|
7
|
+
# => Extend that Type Collection
|
8
|
+
class ExtendedSomeType < SomeType
|
9
|
+
|
10
|
+
end
|
11
|
+
|
3
12
|
class TestTypecollection < Test::Unit::TestCase
|
4
|
-
should "
|
5
|
-
require 'typecollection'
|
13
|
+
should "Function inside packages" do
|
6
14
|
# => Define a Type Collection
|
7
15
|
class SomeType
|
8
16
|
include TypeCollection
|
9
17
|
end
|
10
18
|
# => Extend that Type Collection
|
11
|
-
class ExtendedSomeType < SomeType
|
19
|
+
class ExtendedSomeType < TestTypecollection::SomeType
|
12
20
|
|
13
21
|
end
|
14
22
|
# => Ensure it can be retrieved
|
15
|
-
|
16
|
-
|
23
|
+
|
24
|
+
unless (TestTypecollection::SomeType.all_types().length == 1 and
|
25
|
+
TestTypecollection::SomeType.get_type("Extended") == TestTypecollection::ExtendedSomeType)
|
26
|
+
flunk "Failed to Register TestTypecollection::Extended with TestTypecollection::SomeType!"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
should "Function outside packages" do
|
31
|
+
unless(SomeType.all_types().length == 1 and
|
32
|
+
SomeType.get_type(ExtendedSomeType) == ExtendedSomeType)
|
33
|
+
raise "Failed to register ExtendedSomeType with SomeType!"
|
17
34
|
end
|
18
35
|
end
|
19
36
|
end
|
data/typecollection.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "typecollection"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["James Petty"]
|
@@ -24,6 +24,7 @@ Gem::Specification.new do |s|
|
|
24
24
|
"Rakefile",
|
25
25
|
"VERSION",
|
26
26
|
"lib/typecollection.rb",
|
27
|
+
"lib/typecollection/base.rb",
|
27
28
|
"lib/typecollection/class+inferred_type.rb",
|
28
29
|
"lib/typecollection/class_methods.rb",
|
29
30
|
"test/helper.rb",
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typecollection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-01-10 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: shoulda
|
16
|
-
requirement: &
|
16
|
+
requirement: &70345819384440 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70345819384440
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
27
|
-
requirement: &
|
27
|
+
requirement: &70345819382800 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.0.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70345819382800
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: jeweler
|
38
|
-
requirement: &
|
38
|
+
requirement: &70345819374820 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.6.4
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70345819374820
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rcov
|
49
|
-
requirement: &
|
49
|
+
requirement: &70345819373620 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70345819373620
|
58
58
|
description: Easily map subtypes into their parent type for later retrieval
|
59
59
|
email: jp@jibe.com
|
60
60
|
executables: []
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- Rakefile
|
71
71
|
- VERSION
|
72
72
|
- lib/typecollection.rb
|
73
|
+
- lib/typecollection/base.rb
|
73
74
|
- lib/typecollection/class+inferred_type.rb
|
74
75
|
- lib/typecollection/class_methods.rb
|
75
76
|
- test/helper.rb
|
@@ -90,7 +91,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
90
91
|
version: '0'
|
91
92
|
segments:
|
92
93
|
- 0
|
93
|
-
hash: -
|
94
|
+
hash: -1935067382157549222
|
94
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
96
|
none: false
|
96
97
|
requirements:
|