characterizable 0.1.1 → 0.1.2
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 +21 -21
- data/lib/characterizable/characteristic.rb +21 -9
- data/test/characterizable/test_characteristic.rb +150 -9
- data/test/helper.rb +4 -0
- data/test/support/complex_automobile.rb +35 -0
- data/test/test_characterizable.rb +13 -8
- metadata +7 -6
- data/.gitignore +0 -21
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/characterizable.gemspec
CHANGED
@@ -1,47 +1,47 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{characterizable}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Andy Rossmeissl", "Seamus Abshere"]
|
12
|
-
s.date = %q{2010-11-
|
12
|
+
s.date = %q{2010-11-18}
|
13
13
|
s.description = %q{Characterize the relationship between "attributes" (getters/setters) of instances of a class}
|
14
14
|
s.email = %q{seamus@abshere.net}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
|
-
|
17
|
+
"README.rdoc"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"characterizable.gemspec",
|
26
|
+
"lib/characterizable.rb",
|
27
|
+
"lib/characterizable/base.rb",
|
28
|
+
"lib/characterizable/better_hash.rb",
|
29
|
+
"lib/characterizable/characteristic.rb",
|
30
|
+
"lib/characterizable/snapshot.rb",
|
31
|
+
"test/characterizable/test_characteristic.rb",
|
32
|
+
"test/helper.rb",
|
33
|
+
"test/support/complex_automobile.rb",
|
34
|
+
"test/test_characterizable.rb"
|
35
35
|
]
|
36
36
|
s.homepage = %q{http://github.com/seamusabshere/characterizable}
|
37
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
38
37
|
s.require_paths = ["lib"]
|
39
38
|
s.rubygems_version = %q{1.3.7}
|
40
39
|
s.summary = %q{Characterize instances of a class}
|
41
40
|
s.test_files = [
|
42
41
|
"test/characterizable/test_characteristic.rb",
|
43
|
-
|
44
|
-
|
42
|
+
"test/helper.rb",
|
43
|
+
"test/support/complex_automobile.rb",
|
44
|
+
"test/test_characterizable.rb"
|
45
45
|
]
|
46
46
|
|
47
47
|
if s.respond_to? :specification_version then
|
@@ -46,24 +46,36 @@ module Characterizable
|
|
46
46
|
not known?(universe) and revealed? universe and not trumped? universe
|
47
47
|
end
|
48
48
|
|
49
|
-
def effective?(universe, ignoring =
|
50
|
-
known?(universe) and
|
49
|
+
def effective?(universe, ignoring = [])
|
50
|
+
known?(universe) and
|
51
|
+
revealed?(universe) and not
|
52
|
+
trumped?(universe, ignoring)
|
51
53
|
end
|
52
54
|
|
53
|
-
def trumped?(universe, ignoring =
|
55
|
+
def trumped?(universe, ignoring = [])
|
54
56
|
characteristics.each do |_, other|
|
55
|
-
if
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
57
|
+
next if ignoring.include?(other.name)
|
58
|
+
|
59
|
+
if other.can_trump? self
|
60
|
+
if can_trump?(other)
|
61
|
+
return mutually_trumped?(universe, other, ignoring)
|
62
|
+
elsif other.effective?(universe, ignoring + [name])
|
63
|
+
return true
|
61
64
|
end
|
62
65
|
end
|
63
66
|
end
|
64
67
|
false
|
65
68
|
end
|
66
69
|
|
70
|
+
def can_trump?(other)
|
71
|
+
trumps.include?(other.name)
|
72
|
+
end
|
73
|
+
|
74
|
+
def mutually_trumped?(universe, other, ignoring)
|
75
|
+
# special case: mutual trumping. current characteristic is trumped if its friend is otherwise effective and it is not otherwise effective
|
76
|
+
other.effective?(universe, ignoring + [name]) and not effective?(universe, ignoring + [other.name])
|
77
|
+
end
|
78
|
+
|
67
79
|
def revealed?(universe)
|
68
80
|
return true if prerequisite.nil?
|
69
81
|
characteristics[prerequisite].effective? universe
|
@@ -5,19 +5,160 @@ class Character
|
|
5
5
|
end
|
6
6
|
|
7
7
|
class Characterizable::CharacteristicTest < Test::Unit::TestCase
|
8
|
-
context
|
8
|
+
context Characterizable::Characteristic do
|
9
9
|
setup do
|
10
|
-
@universe =
|
10
|
+
@universe = ComplexAutomobile.new
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
context '#display' do
|
14
|
+
setup do
|
15
|
+
@universe = { :charisma => 'hearty' }
|
16
|
+
end
|
17
|
+
|
18
|
+
should 'not display a custom format if display option not given' do
|
19
|
+
char = Characterizable::Characteristic.new(Character, :charisma, {})
|
20
|
+
assert_nil char.display(@universe)
|
21
|
+
end
|
22
|
+
should 'display a custom format if display option is given' do
|
23
|
+
char = Characterizable::Characteristic.new(Character, :charisma,
|
24
|
+
{ :display => lambda { |c| "Level: #{c}" } }) {}
|
25
|
+
assert_equal 'Level: hearty', char.display(@universe)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context '#value' do
|
30
|
+
context 'universe is a hash' do
|
31
|
+
setup do
|
32
|
+
@universe = { :daily_duration => 1 }
|
33
|
+
end
|
34
|
+
should 'return the value for a characteristic' do
|
35
|
+
characteristic = Characterizable::Characteristic.new(ComplexAutomobile, :daily_duration, {})
|
36
|
+
assert_equal 1, characteristic.value(@universe)
|
37
|
+
end
|
38
|
+
should 'return nil for a nonexistent characteristic' do
|
39
|
+
characteristic = Characterizable::Characteristic.new(ComplexAutomobile, :monthly_duration, {})
|
40
|
+
assert_nil characteristic.value(@universe)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
context 'universe is a non-hash' do
|
44
|
+
setup do
|
45
|
+
@universe.daily_duration = 1
|
46
|
+
end
|
47
|
+
should 'return the value for a characteristic' do
|
48
|
+
characteristic = Characterizable::Characteristic.new(ComplexAutomobile, :daily_duration, {})
|
49
|
+
assert_equal 1, characteristic.value(@universe)
|
50
|
+
end
|
51
|
+
should 'return nil for a nonexistent characteristic' do
|
52
|
+
characteristic = Characterizable::Characteristic.new(ComplexAutomobile, :na, {})
|
53
|
+
assert_nil characteristic.value(@universe)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context '#known?' do
|
59
|
+
setup do
|
60
|
+
@characteristic = @universe.characterizable_base.characteristics[:daily_duration]
|
61
|
+
end
|
62
|
+
should 'return true if the characteristic is not nil' do
|
63
|
+
@universe.daily_duration = 1
|
64
|
+
assert @characteristic.known?(@universe)
|
65
|
+
end
|
66
|
+
should 'return false if the characteristic is nil' do
|
67
|
+
assert !@characteristic.known?(@universe)
|
68
|
+
end
|
16
69
|
end
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
70
|
+
|
71
|
+
context '#revealed?' do
|
72
|
+
should 'return true if there are no prerequisites' do
|
73
|
+
characteristic = @universe.characterizable_base.characteristics[:size_class]
|
74
|
+
assert characteristic.revealed?(@universe)
|
75
|
+
end
|
76
|
+
should 'return true if its prerequisite is effective' do
|
77
|
+
@universe.acquisition = '1'
|
78
|
+
characteristic = @universe.characterizable_base.characteristics[:retirement]
|
79
|
+
assert characteristic.revealed?(@universe)
|
80
|
+
end
|
81
|
+
should 'return false if its prerequisite is not effective' do
|
82
|
+
characteristic = @universe.characterizable_base.characteristics[:retirement]
|
83
|
+
assert !characteristic.revealed?(@universe)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context '#trumped?' do
|
88
|
+
context 'ignoring is empty' do
|
89
|
+
should 'return true if trumped by another effective characteristic' do
|
90
|
+
@universe.fuel_efficiency = '5'
|
91
|
+
char = @universe.characterizable_base.characteristics[:urbanity]
|
92
|
+
assert char.trumped?(@universe)
|
93
|
+
end
|
94
|
+
should 'return false if trumped by another ineffective characteristic' do
|
95
|
+
char = @universe.characterizable_base.characteristics[:weekly_distance_estimate]
|
96
|
+
assert !char.trumped?(@universe)
|
97
|
+
end
|
98
|
+
should 'return true if mutually trumped, other is effective, and currently not effective' do
|
99
|
+
@universe.daily_distance_estimate = '5'
|
100
|
+
char = @universe.characterizable_base.characteristics[:weekly_distance_estimate]
|
101
|
+
assert char.trumped?(@universe)
|
102
|
+
end
|
103
|
+
should 'return false if mutually trumped, other is effective, and currently am effective' do
|
104
|
+
@universe.daily_distance_estimate = '5'
|
105
|
+
@universe.weekly_distance_estimate = '6'
|
106
|
+
char = @universe.characterizable_base.characteristics[:weekly_distance_estimate]
|
107
|
+
assert !char.trumped?(@universe)
|
108
|
+
end
|
109
|
+
should 'return false if mutually trumped, other is not effective' do
|
110
|
+
char = @universe.characterizable_base.characteristics[:weekly_distance_estimate]
|
111
|
+
assert !char.trumped?(@universe)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
context 'ignoring is set' do
|
115
|
+
should 'return false if trumped by another effective characteristic that should be ignored' do
|
116
|
+
@universe.daily_distance_estimate = '5'
|
117
|
+
char = @universe.characterizable_base.characteristics[:weekly_distance_estimate]
|
118
|
+
assert !char.trumped?(@universe, [:daily_distance_estimate])
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# has :daily_distance_estimate, :trumps => [:weekly_distance_estimate, :annual_distance_estimate, :daily_duration], :measures => :length
|
124
|
+
# has :daily_duration, :trumps => [:annual_distance_estimate, :weekly_distance_estimate, :daily_distance_estimate], :measures => :time
|
125
|
+
# has :weekly_distance_estimate, :trumps => [:annual_distance_estimate, :daily_distance_estimate, :daily_duration], :measures => :length
|
126
|
+
# has :annual_distance_estimate, :trumps => [:weekly_distance_estimate, :daily_distance_estimate, :daily_duration], :measures => :length
|
127
|
+
context '#effective?' do
|
128
|
+
should 'return true if known, revealed, and not trumped' do
|
129
|
+
characteristic = @universe.characterizable_base.characteristics[:daily_duration]
|
130
|
+
@universe.daily_duration = '1'
|
131
|
+
assert characteristic.effective?(@universe)
|
132
|
+
end
|
133
|
+
should 'return false if known, reavaled, and trumped' do
|
134
|
+
@universe.annual_distance_estimate = "33796.2"
|
135
|
+
@universe.daily_duration = "3.0"
|
136
|
+
char = @universe.characterizable_base.
|
137
|
+
characteristics[:daily_duration]
|
138
|
+
assert_nothing_raised do
|
139
|
+
char.effective?(@universe)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
should 'return false if known, but not revealed' do
|
143
|
+
@universe.model_year = '2007'
|
144
|
+
char = @universe.characterizable_base.
|
145
|
+
characteristics[:model_year]
|
146
|
+
assert !char.effective?(@universe)
|
147
|
+
end
|
148
|
+
should 'return false if not known' do
|
149
|
+
char = @universe.characterizable_base.
|
150
|
+
characteristics[:model_year]
|
151
|
+
assert !char.effective?(@universe)
|
152
|
+
end
|
153
|
+
should 'not infinitely recurse if there is a 3-way mutual trumping' do
|
154
|
+
@universe.annual_distance_estimate = "33796.2"
|
155
|
+
@universe.daily_duration = "3.0"
|
156
|
+
@universe.weekly_distance_estimate = "804.672"
|
157
|
+
char = @universe.characterizable_base.characteristics[:daily_duration]
|
158
|
+
assert_nothing_raised do
|
159
|
+
char.effective?(@universe)
|
160
|
+
end
|
161
|
+
end
|
21
162
|
end
|
22
163
|
end
|
23
164
|
end
|
data/test/helper.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
class ComplexAutomobile
|
2
|
+
attr_accessor :make, :model_year, :model, :variant
|
3
|
+
attr_accessor :fuel_type, :fuel_efficiency, :urbanity
|
4
|
+
attr_accessor :hybridity
|
5
|
+
attr_accessor :daily_distance_estimate
|
6
|
+
attr_accessor :daily_duration
|
7
|
+
attr_accessor :weekly_distance_estimate
|
8
|
+
attr_accessor :annual_distance_estimate
|
9
|
+
attr_accessor :acquisition
|
10
|
+
attr_accessor :retirement
|
11
|
+
attr_accessor :size_class
|
12
|
+
attr_accessor :timeframe
|
13
|
+
include Characterizable
|
14
|
+
characterize do
|
15
|
+
has :make do |make|
|
16
|
+
make.reveals :model_year do |model_year|
|
17
|
+
model_year.reveals :model, :trumps => :size_class do |model|
|
18
|
+
model.reveals :variant, :trumps => :hybridity
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
has :fuel_type
|
23
|
+
has :fuel_efficiency, :trumps => [:urbanity, :hybridity], :measures => :length_per_volume
|
24
|
+
has :urbanity, :measures => :percentage
|
25
|
+
has :hybridity
|
26
|
+
has :daily_distance_estimate, :trumps => [:weekly_distance_estimate, :annual_distance_estimate, :daily_duration], :measures => :length
|
27
|
+
has :daily_duration, :trumps => [:annual_distance_estimate, :weekly_distance_estimate, :daily_distance_estimate], :measures => :time
|
28
|
+
has :weekly_distance_estimate, :trumps => [:annual_distance_estimate, :daily_distance_estimate, :daily_duration], :measures => :length
|
29
|
+
has :annual_distance_estimate, :trumps => [:weekly_distance_estimate, :daily_distance_estimate, :daily_duration], :measures => :length
|
30
|
+
has :acquisition
|
31
|
+
has :retirement, :prerequisite => :acquisition
|
32
|
+
has :size_class
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -23,17 +23,9 @@ class Automobile
|
|
23
23
|
end
|
24
24
|
has :record_creation_date, :hidden => true
|
25
25
|
has :size_class
|
26
|
-
# has :fuel_type
|
27
|
-
# has :fuel_efficiency, :trumps => [:urbanity, :hybridity], :measures => :length_per_volume
|
28
|
-
# has :urbanity, :measures => :percentage
|
29
26
|
has :hybridity
|
30
27
|
has :daily_distance_estimate, :trumps => [:weekly_distance_estimate, :annual_distance_estimate, :daily_duration], :measures => :length #, :weekly_fuel_cost, :annual_fuel_cost]
|
31
28
|
has :daily_distance_oracle_estimate, :trumps => :daily_distance_estimate
|
32
|
-
# has :daily_duration, :trumps => [:annual_distance_estimate, :weekly_distance_estimate, :daily_distance_estimate], :measures => :time #, :weekly_fuel_cost, :annual_fuel_cost]
|
33
|
-
# has :weekly_distance_estimate, :trumps => [:annual_distance_estimate, :daily_distance_estimate, :daily_duration], :measures => :length #, :weekly_fuel_cost, :annual_fuel_cost]
|
34
|
-
# has :annual_distance_estimate, :trumps => [:weekly_distance_estimate, :daily_distance_estimate, :daily_duration], :measures => :length #, :weekly_fuel_cost, :annual_fuel_cost]
|
35
|
-
# has :acquisition
|
36
|
-
# has :retirement
|
37
29
|
end
|
38
30
|
end
|
39
31
|
|
@@ -455,4 +447,17 @@ class TestCharacterizable < Test::Unit::TestCase
|
|
455
447
|
sa.variant = 'Extreme Edition'
|
456
448
|
assert_equal 'Featuring Extreme Edition', sa.display_characteristic(:variant)
|
457
449
|
end
|
450
|
+
|
451
|
+
context 'infinite recursion' do
|
452
|
+
should 'not happen' do
|
453
|
+
c = ComplexAutomobile.new
|
454
|
+
c.annual_distance_estimate = "33796.2"
|
455
|
+
c.daily_duration = "3.0"
|
456
|
+
c.timeframe = "2010-01-01/2011-01-01"
|
457
|
+
c.weekly_distance_estimate = "804.672"
|
458
|
+
assert_nothing_raised do
|
459
|
+
c.characteristics
|
460
|
+
end
|
461
|
+
end
|
462
|
+
end
|
458
463
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 2
|
9
|
+
version: 0.1.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Andy Rossmeissl
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-11-
|
18
|
+
date: 2010-11-18 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -72,7 +72,6 @@ extra_rdoc_files:
|
|
72
72
|
- README.rdoc
|
73
73
|
files:
|
74
74
|
- .document
|
75
|
-
- .gitignore
|
76
75
|
- LICENSE
|
77
76
|
- README.rdoc
|
78
77
|
- Rakefile
|
@@ -85,14 +84,15 @@ files:
|
|
85
84
|
- lib/characterizable/snapshot.rb
|
86
85
|
- test/characterizable/test_characteristic.rb
|
87
86
|
- test/helper.rb
|
87
|
+
- test/support/complex_automobile.rb
|
88
88
|
- test/test_characterizable.rb
|
89
89
|
has_rdoc: true
|
90
90
|
homepage: http://github.com/seamusabshere/characterizable
|
91
91
|
licenses: []
|
92
92
|
|
93
93
|
post_install_message:
|
94
|
-
rdoc_options:
|
95
|
-
|
94
|
+
rdoc_options: []
|
95
|
+
|
96
96
|
require_paths:
|
97
97
|
- lib
|
98
98
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -121,4 +121,5 @@ summary: Characterize instances of a class
|
|
121
121
|
test_files:
|
122
122
|
- test/characterizable/test_characteristic.rb
|
123
123
|
- test/helper.rb
|
124
|
+
- test/support/complex_automobile.rb
|
124
125
|
- test/test_characterizable.rb
|