characterizable 0.0.14 → 0.0.15
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/characterizable.gemspec +63 -63
- data/lib/characterizable.rb +22 -12
- data/test/test_characterizable.rb +15 -0
- metadata +17 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.15
|
data/characterizable.gemspec
CHANGED
@@ -1,63 +1,63 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{characterizable}
|
8
|
-
s.version = "0.0.
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Andy Rossmeissl", "Seamus Abshere"]
|
12
|
-
s.date = %q{2010-08-
|
13
|
-
s.description = %q{Characterize the relationship between "attributes" (getters/setters) of instances of a class}
|
14
|
-
s.email = %q{seamus@abshere.net}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
".gitignore",
|
22
|
-
"LICENSE",
|
23
|
-
"README.rdoc",
|
24
|
-
"Rakefile",
|
25
|
-
"VERSION",
|
26
|
-
"characterizable.gemspec",
|
27
|
-
"lib/characterizable.rb",
|
28
|
-
"test/helper.rb",
|
29
|
-
"test/test_characterizable.rb"
|
30
|
-
]
|
31
|
-
s.homepage = %q{http://github.com/seamusabshere/characterizable}
|
32
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
33
|
-
s.require_paths = ["lib"]
|
34
|
-
s.rubygems_version = %q{1.3.
|
35
|
-
s.summary = %q{Characterize instances of a class}
|
36
|
-
s.test_files = [
|
37
|
-
"test/helper.rb",
|
38
|
-
"test/test_characterizable.rb"
|
39
|
-
]
|
40
|
-
|
41
|
-
if s.respond_to? :specification_version then
|
42
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
43
|
-
s.specification_version = 3
|
44
|
-
|
45
|
-
if Gem::Version.new(Gem::
|
46
|
-
s.add_runtime_dependency(%q<blockenspiel>, [">= 0.3.2"])
|
47
|
-
s.add_runtime_dependency(%q<activesupport>, [">= 2.3.5"])
|
48
|
-
s.add_development_dependency(%q<to_json_fix>, [">= 0.0.1"])
|
49
|
-
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
50
|
-
else
|
51
|
-
s.add_dependency(%q<blockenspiel>, [">= 0.3.2"])
|
52
|
-
s.add_dependency(%q<activesupport>, [">= 2.3.5"])
|
53
|
-
s.add_dependency(%q<to_json_fix>, [">= 0.0.1"])
|
54
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
55
|
-
end
|
56
|
-
else
|
57
|
-
s.add_dependency(%q<blockenspiel>, [">= 0.3.2"])
|
58
|
-
s.add_dependency(%q<activesupport>, [">= 2.3.5"])
|
59
|
-
s.add_dependency(%q<to_json_fix>, [">= 0.0.1"])
|
60
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{characterizable}
|
8
|
+
s.version = "0.0.15"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Andy Rossmeissl", "Seamus Abshere"]
|
12
|
+
s.date = %q{2010-08-15}
|
13
|
+
s.description = %q{Characterize the relationship between "attributes" (getters/setters) of instances of a class}
|
14
|
+
s.email = %q{seamus@abshere.net}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"characterizable.gemspec",
|
27
|
+
"lib/characterizable.rb",
|
28
|
+
"test/helper.rb",
|
29
|
+
"test/test_characterizable.rb"
|
30
|
+
]
|
31
|
+
s.homepage = %q{http://github.com/seamusabshere/characterizable}
|
32
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
33
|
+
s.require_paths = ["lib"]
|
34
|
+
s.rubygems_version = %q{1.3.7}
|
35
|
+
s.summary = %q{Characterize instances of a class}
|
36
|
+
s.test_files = [
|
37
|
+
"test/helper.rb",
|
38
|
+
"test/test_characterizable.rb"
|
39
|
+
]
|
40
|
+
|
41
|
+
if s.respond_to? :specification_version then
|
42
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
43
|
+
s.specification_version = 3
|
44
|
+
|
45
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
|
+
s.add_runtime_dependency(%q<blockenspiel>, [">= 0.3.2"])
|
47
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 2.3.5"])
|
48
|
+
s.add_development_dependency(%q<to_json_fix>, [">= 0.0.1"])
|
49
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
50
|
+
else
|
51
|
+
s.add_dependency(%q<blockenspiel>, [">= 0.3.2"])
|
52
|
+
s.add_dependency(%q<activesupport>, [">= 2.3.5"])
|
53
|
+
s.add_dependency(%q<to_json_fix>, [">= 0.0.1"])
|
54
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
55
|
+
end
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<blockenspiel>, [">= 0.3.2"])
|
58
|
+
s.add_dependency(%q<activesupport>, [">= 2.3.5"])
|
59
|
+
s.add_dependency(%q<to_json_fix>, [">= 0.0.1"])
|
60
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
data/lib/characterizable.rb
CHANGED
@@ -8,7 +8,6 @@ require 'active_support/version'
|
|
8
8
|
active_support/core_ext/object/blank
|
9
9
|
active_support/core_ext/array/wrap
|
10
10
|
active_support/core_ext/module/aliasing
|
11
|
-
active_support/core_ext/module/delegation
|
12
11
|
}.each do |active_support_3_requirement|
|
13
12
|
require active_support_3_requirement
|
14
13
|
end if ActiveSupport::VERSION::MAJOR == 3
|
@@ -74,14 +73,14 @@ module Characterizable
|
|
74
73
|
def _take_snapshot
|
75
74
|
target.characterizable_base.characteristics.each do |_, c|
|
76
75
|
if c.known?(target)
|
77
|
-
|
76
|
+
if c.effective?(target)
|
78
77
|
self[c.name] = c.value(target)
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
78
|
+
elsif !c.untrumped?(target)
|
79
|
+
trumped_keys.push c.name
|
80
|
+
elsif !c.revealed?(target)
|
81
|
+
wasted_keys.push c.name
|
82
|
+
lacking_keys.push c.prerequisite
|
83
|
+
end
|
85
84
|
end
|
86
85
|
end
|
87
86
|
end
|
@@ -99,7 +98,7 @@ module Characterizable
|
|
99
98
|
@lacking_keys ||= Array.new
|
100
99
|
end
|
101
100
|
def effective
|
102
|
-
target.characterizable_base.characteristics.select { |_, c| c.
|
101
|
+
target.characterizable_base.characteristics.select { |_, c| c.effective?(self) }
|
103
102
|
end
|
104
103
|
def potential
|
105
104
|
target.characterizable_base.characteristics.select { |_, c| c.potential?(self) }
|
@@ -120,11 +119,15 @@ module Characterizable
|
|
120
119
|
self.characterizable_base ||= Characterizable::Base.new self
|
121
120
|
Blockenspiel.invoke block, characterizable_base
|
122
121
|
end
|
123
|
-
|
122
|
+
def characteristics
|
123
|
+
characterizable_base.characteristics
|
124
|
+
end
|
124
125
|
end
|
125
126
|
|
126
127
|
class CharacteristicAlreadyDefined < ArgumentError
|
127
128
|
end
|
129
|
+
class CyclicalTrumping < ArgumentError
|
130
|
+
end
|
128
131
|
|
129
132
|
class Base
|
130
133
|
attr_reader :klass
|
@@ -166,6 +169,11 @@ module Characterizable
|
|
166
169
|
@prerequisite = options.delete(:prerequisite)
|
167
170
|
@options = options
|
168
171
|
Blockenspiel.invoke block, self if block_given?
|
172
|
+
trumps.each do |trump|
|
173
|
+
if c = characteristics[trump] and c.trumps.include? name
|
174
|
+
raise CyclicalTrumping, "On #{base.klass}, '#{c.name}' and '#{name}' trump each other"
|
175
|
+
end
|
176
|
+
end
|
169
177
|
end
|
170
178
|
def to_json(*)
|
171
179
|
{ :name => name, :trumps => trumps, :prerequisite => prerequisite, :options => options }.to_json
|
@@ -174,9 +182,11 @@ module Characterizable
|
|
174
182
|
"<Characterizable::Characteristic name=#{name.inspect} trumps=#{trumps.inspect} prerequisite=#{prerequisite.inspect} options=#{options.inspect}>"
|
175
183
|
end
|
176
184
|
def trumped_by
|
177
|
-
|
185
|
+
characteristics.select { |_, c| c.trumps.include? name }
|
186
|
+
end
|
187
|
+
def characteristics
|
188
|
+
base.characteristics
|
178
189
|
end
|
179
|
-
delegate :characteristics, :to => :base
|
180
190
|
def value(target)
|
181
191
|
case target
|
182
192
|
when Hash
|
@@ -410,4 +410,19 @@ class TestCharacterizable < Test::Unit::TestCase
|
|
410
410
|
end
|
411
411
|
end
|
412
412
|
end
|
413
|
+
|
414
|
+
# this used to cause infinite loops
|
415
|
+
should 'not let two characteristics trump each other' do
|
416
|
+
assert_raises ::Characterizable::CyclicalTrumping do
|
417
|
+
class Universe
|
418
|
+
include Characterizable
|
419
|
+
attr_accessor :matter
|
420
|
+
attr_accessor :antimatter
|
421
|
+
characterize do
|
422
|
+
has :matter, :trumps => :antimatter
|
423
|
+
has :antimatter, :trumps => :matter
|
424
|
+
end
|
425
|
+
end
|
426
|
+
end
|
427
|
+
end
|
413
428
|
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: characterizable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 1
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
9
|
+
- 15
|
10
|
+
version: 0.0.15
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Andy Rossmeissl
|
@@ -15,16 +16,18 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date: 2010-08-
|
19
|
+
date: 2010-08-15 00:00:00 -04:00
|
19
20
|
default_executable:
|
20
21
|
dependencies:
|
21
22
|
- !ruby/object:Gem::Dependency
|
22
23
|
name: blockenspiel
|
23
24
|
prerelease: false
|
24
25
|
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
25
27
|
requirements:
|
26
28
|
- - ">="
|
27
29
|
- !ruby/object:Gem::Version
|
30
|
+
hash: 23
|
28
31
|
segments:
|
29
32
|
- 0
|
30
33
|
- 3
|
@@ -36,9 +39,11 @@ dependencies:
|
|
36
39
|
name: activesupport
|
37
40
|
prerelease: false
|
38
41
|
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
39
43
|
requirements:
|
40
44
|
- - ">="
|
41
45
|
- !ruby/object:Gem::Version
|
46
|
+
hash: 9
|
42
47
|
segments:
|
43
48
|
- 2
|
44
49
|
- 3
|
@@ -50,9 +55,11 @@ dependencies:
|
|
50
55
|
name: to_json_fix
|
51
56
|
prerelease: false
|
52
57
|
requirement: &id003 !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
53
59
|
requirements:
|
54
60
|
- - ">="
|
55
61
|
- !ruby/object:Gem::Version
|
62
|
+
hash: 29
|
56
63
|
segments:
|
57
64
|
- 0
|
58
65
|
- 0
|
@@ -64,9 +71,11 @@ dependencies:
|
|
64
71
|
name: shoulda
|
65
72
|
prerelease: false
|
66
73
|
requirement: &id004 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
67
75
|
requirements:
|
68
76
|
- - ">="
|
69
77
|
- !ruby/object:Gem::Version
|
78
|
+
hash: 3
|
70
79
|
segments:
|
71
80
|
- 0
|
72
81
|
version: "0"
|
@@ -102,23 +111,27 @@ rdoc_options:
|
|
102
111
|
require_paths:
|
103
112
|
- lib
|
104
113
|
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
105
115
|
requirements:
|
106
116
|
- - ">="
|
107
117
|
- !ruby/object:Gem::Version
|
118
|
+
hash: 3
|
108
119
|
segments:
|
109
120
|
- 0
|
110
121
|
version: "0"
|
111
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
112
124
|
requirements:
|
113
125
|
- - ">="
|
114
126
|
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
115
128
|
segments:
|
116
129
|
- 0
|
117
130
|
version: "0"
|
118
131
|
requirements: []
|
119
132
|
|
120
133
|
rubyforge_project:
|
121
|
-
rubygems_version: 1.3.
|
134
|
+
rubygems_version: 1.3.7
|
122
135
|
signing_key:
|
123
136
|
specification_version: 3
|
124
137
|
summary: Characterize instances of a class
|