fact_checker 0.0.3 → 0.1.0

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.
@@ -1,31 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module FactChecker
4
- def self.included(klass)
5
- klass.extend ClassMethods
6
- end
7
-
8
- module ClassMethods
9
- def inherited(child)
10
- child.instance_variable_set('@fact_checker', fact_checker.dup)
11
- end
12
-
13
- def def_fact(*opts)
14
- symbolic_fact_name = fact_checker.def_fact(*opts)
15
- fact_name = symbolic_fact_name.to_s + '?'
16
- unless fact_name.start_with? '_'
17
- define_method(fact_name) { fact_accomplished?(symbolic_fact_name) }
18
- end
19
- end
20
-
21
- def fact_checker
22
- @fact_checker ||= FactChecker::Base.new
23
- end
24
- end
25
-
26
- # Delegate methods to self.class.fact_checker
27
- [:fact_accomplished?, :fact_possible?, :accomplished_facts, :possible_facts].each do |name|
28
- define_method(name) { |*opts| self.class.fact_checker.send(name, self, *opts) }
29
- end
30
- def facts; self.class.fact_checker.facts; end
31
- end
@@ -1,272 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe FactChecker::Base do
6
-
7
- describe "#initialize" do
8
- context "called with all arguments (fact_list, dependencies_hash, requirements_hash), its " do
9
- subject { FactChecker::Base.new([:f1, :f2], {:f1 => :f2}, {:f1 => :nil?}) }
10
- specify("facts == fact_list") { subject.facts.should == [:f1, :f2] }
11
- specify("dependencies == dependencies_hash") { subject.dependencies.should == {:f1 => :f2} }
12
- specify("requirements == requirements_hash") { subject.requirements.should == {:f1 => :nil?} }
13
- end
14
-
15
- context "called" do
16
- specify("without fact_list, its facts == [] by default") { subject.facts.should == [] }
17
- specify("without dependencies_hash, its dependencies == {} by default") { subject.dependencies.should == {} }
18
- specify("without requirements_hash, its requirements == {} by default") { subject.requirements.should == {} }
19
- end
20
- end
21
-
22
- describe "#requirement_satisfied_for?(context, fact)" do
23
- context "when no requirement defined for the fact" do
24
- subject { FactChecker::Base.new([:f1]) }
25
- it "returns true for any object" do
26
- subject.requirement_satisfied_for?(1, :f1).should be_true
27
- subject.requirement_satisfied_for?(nil, :f1).should be_true
28
- end
29
- end
30
-
31
- context "when requirement for the fact was defined as symbol" do
32
- subject { FactChecker::Base.new([:f1], nil, {:f1 => :nil?}) }
33
- it "returns false if fact is unknown" do
34
- subject.requirement_satisfied_for?(1, :f2).should be_false
35
- end
36
- it "returns false if context.symbol() == false" do
37
- subject.requirement_satisfied_for?(1, :f1).should be_false
38
- end
39
- it "returns true if context.symbol() == true" do
40
- subject.requirement_satisfied_for?(nil, :f1).should be_true
41
- end
42
- end
43
-
44
- context "when requirement was defined as Proc with arity == 1" do
45
- subject { FactChecker::Base.new([:f1], nil, {:f1 => lambda{|t| t.nil?}}) }
46
- it "returns false if proc(context) == false" do
47
- subject.requirement_satisfied_for?(1, :f1).should be_false
48
- end
49
- it "returns true if proc(context) == true" do
50
- subject.requirement_satisfied_for?(nil, :f1).should be_true
51
- end
52
- end
53
-
54
- context "when requirement was defined as Proc with arity == 0" do
55
- it "returns false if proc() == false" do
56
- subject = FactChecker::Base.new([:f1], nil, {:f1 => lambda{false}})
57
- subject.requirement_satisfied_for?(nil, :f1).should be_false
58
- end
59
- it "returns true if proc() == true" do
60
- subject = FactChecker::Base.new([:f1], nil, {:f1 => lambda{true}})
61
- subject.requirement_satisfied_for?(nil, :f1).should be_true
62
- end
63
- end
64
-
65
- context "when requirement was defined as something else" do
66
- subject { FactChecker::Base.new([:f1], nil, {:f1 => "wrong"}) }
67
- it "raises RuntimeError" do
68
- lambda{ subject.requirement_satisfied_for?(nil, :f1) }.should raise_error(RuntimeError)
69
- end
70
- end
71
- end
72
-
73
- describe "#fact_accomplished?" do
74
- context "when fact is unknown" do
75
- subject { FactChecker::Base.new([:f2], nil, {:f1 => :nil?}) }
76
- it("always returns false") { subject.fact_accomplished?(nil, :f1).should be_false }
77
- end
78
-
79
- context "when fact is known and" do
80
- context "has no dependencies" do
81
- subject { FactChecker::Base.new([:f1], nil, {:f1 => lambda{|o| o.size > 3}}) }
82
- it("returns true if requirement satisfied") do
83
- subject.fact_accomplished?("String", :f1).should be_true
84
- end
85
- it "returns false if requirement not satisfied" do
86
- subject.fact_accomplished?("Str", :f1).should be_false
87
- end
88
- end
89
-
90
- context "has only unsatisfied dependencies" do
91
- subject { FactChecker::Base.new([:f1, :f2], {:f1 => :f2}, {:f1 => lambda{true}, :f2 => :nil?}) }
92
- it "returns false" do
93
- subject.fact_accomplished?("something", :f1).should be_false
94
- end
95
- end
96
-
97
- context "has both satisfied and unsatisfied dependencies" do
98
- subject { FactChecker::Base.new([:f1, :f2, :f3, :f4], {:f1 => [:f2, :f3], :f3 => :f4}, {:f2 => :size, :f3 => :size, :f4 => :nil?}) }
99
- it "returns false" do
100
- subject.fact_accomplished?("something", :f1).should be_false
101
- end
102
- end
103
-
104
- context "has only satisfied dependencies" do
105
- subject {
106
- FactChecker::Base.new(
107
- [:f1, :f2, :f3, :f4],
108
- {:f1 => [:f2, :f3], :f3 => :f4},
109
- {:f1 => lambda{|o| o.size == 4}, :f2 => lambda{|o| o.size < 5}, :f3 => lambda{|o| o.size > 2} }
110
- )
111
- }
112
-
113
- it "returns true if fact has no requirements" do
114
- subject.fact_accomplished?("something", :f4).should be_true
115
- end
116
-
117
- it "returns false if requirements not satisfied" do
118
- subject.fact_accomplished?("somet", :f1).should be_false
119
- end
120
-
121
- it "returns true if all requirements are satisfied" do
122
- subject.fact_accomplished?("some", :f1).should be_true
123
- end
124
- end
125
- end
126
- end
127
-
128
- describe "#fact_possible?" do
129
- context "when fact is unknown" do
130
- it "returns true" do
131
- subject.fact_possible?(nil, :x).should be_true
132
- end
133
- end
134
-
135
- context "when fact is known" do
136
- it "returns true if dependencies satisfied (even if requirement is not satisfied)" do
137
- subject = FactChecker::Base.new([:f1, :f2], {:f1 => :f2}, {:f1 => :nil?, :f2 => :to_i})
138
- subject.fact_possible?(1, :f1).should be_true
139
- end
140
-
141
- it "returns false if dependencies unsatisfied (even if requirement is satisfied)" do
142
- subject = FactChecker::Base.new([:f1, :f2], {:f1 => :f2}, {:f1 => :to_i, :f2 => :nil?})
143
- subject.fact_possible?(1, :f1).should be_false
144
- end
145
- end
146
- end
147
-
148
- describe "#def_fact" do
149
- context "called with (:fact_name)" do
150
- it "adds :fact_name to facts" do
151
- subject.def_fact(:f1)
152
- subject.def_fact(:f2)
153
- subject.facts.should == [:f1, :f2]
154
- end
155
-
156
- it "returns :fact_name" do
157
- subject.def_fact(:f1).should be :f1
158
- end
159
- end
160
-
161
- context "called with (:fact_name, :if => :requirement)" do
162
- it "adds :fact_name to facts" do
163
- subject.def_fact(:f1)
164
- subject.def_fact(:f2, :if => :nil?)
165
- subject.facts.should == [:f1, :f2]
166
- end
167
-
168
- it "adds :requirement to requirements" do
169
- subject.def_fact(:f2, :if => :nil?)
170
- subject.requirements[:f2].should == :nil?
171
- end
172
- end
173
-
174
- context "called with (:fact_name => :dependency)" do
175
- it "adds :fact_name to facts" do
176
- subject.def_fact(:f1)
177
- subject.def_fact(:f2 => :f1)
178
- subject.facts.should == [:f1, :f2]
179
- end
180
-
181
- it "adds :dependency to dependencies" do
182
- subject.def_fact(:f2 => :f1)
183
- subject.dependencies[:f2].should == :f1
184
- end
185
- end
186
-
187
- context "called with (:fact_name => :dependency, :if => :requirement)" do
188
- subject do
189
- FactChecker::Base.new.tap do |checker|
190
- checker.def_fact(:f1)
191
- checker.def_fact(:f2 => :f1, :if => :to_i)
192
- end
193
- end
194
-
195
- it "adds :fact_name to facts" do
196
- subject.facts.should == [:f1, :f2]
197
- end
198
-
199
- it "adds :requirement to requirements" do
200
- subject.requirements[:f2].should == :to_i
201
- end
202
-
203
- it "adds :dependency to dependencies" do
204
- subject.dependencies[:f2].should == :f1
205
- end
206
- end
207
-
208
- context "called again for the same fact_name" do
209
- subject do
210
- FactChecker::Base.new.tap do |checker|
211
- checker.def_fact(:f1 => :f2, :if => :nil?)
212
- checker.def_fact(:f1)
213
- end
214
- end
215
-
216
- it "doesn't add 2nd fact_name to facts" do
217
- subject.facts.should == [:f1]
218
- end
219
-
220
- it "overwrites fact_name's dependency" do
221
- subject.dependencies[:f1].should be_nil
222
- end
223
-
224
- it "overwrites fact_name's requirement" do
225
- subject.requirements[:f1].should be_nil
226
- end
227
- end
228
-
229
- context "called with wrong arguments it RAISES ERROR, for example" do
230
- specify "#def_fact() raises error" do
231
- expect { subject.def_fact() }.to raise_error ArgumentError
232
- end
233
-
234
- specify "#def_fact(:fact_name, {:if => :requirement}, something_else) raises error" do
235
- expect { subject.def_fact(:f1, {:if => :nil?}, 1) }.to raise_error ArgumentError
236
- end
237
-
238
- specify "#def_fact(:fact_name, some_scalar_value) raises error" do
239
- expect { subject.def_fact(:f1, 1)}.to raise_error ArgumentError
240
- end
241
-
242
- specify "#def_fact({:if => :requirement}, something_else) raises error" do
243
- expect { subject.def_fact({:if => :nil?}, :f1) }.to raise_error ArgumentError
244
- end
245
-
246
- specify "#def_fact(:fact_name => :dependency, :if => :requirement, :some_other_key => something_else) raises error" do
247
- expect { subject.def_fact(:f1 => :f2, :if => :nil?, :something_else => true) }.to raise_error ArgumentError
248
- end
249
- end
250
- end
251
-
252
- context "has 3 *_facts methods, i.e." do
253
- subject { FactChecker::Base.new([:f1, :f2, :f3], {:f1 => :f2}, {:f2 => :nil?, :f3 => lambda{false} }) }
254
-
255
- describe "#accomplished_facts" do
256
- it "returns accomplished facts - ones with both dependencies and requirements satisfied" do
257
- subject.accomplished_facts(nil).should == [:f1, :f2]
258
- end
259
- end
260
-
261
- describe "#possible_facts" do
262
- it "returns possible facts - ones with dependencies but not requirements satisfied" do
263
- subject.possible_facts("SomeString").should == [:f2, :f3]
264
- end
265
- end
266
-
267
- describe "#facts" do
268
- it("returns all defined facts") { subject.facts.should == [:f1, :f2, :f3] }
269
- end
270
- end
271
-
272
- end
@@ -1,7 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe FactChecker::VERSION do
6
- it { should =~ /\A\d+\.\d+\.\d+\z/ }
7
- end
@@ -1,63 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe 'FactCheckerInheritance' do
6
- describe ChildOfClassWithFacts do
7
- subject { ChildOfClassWithFacts }
8
-
9
- it { should respond_to :def_fact }
10
- its(:fact_checker) { should be_kind_of FactChecker::Base }
11
-
12
- describe 'context for inherited facts' do
13
- let(:target) { ChildOfClassWithFacts.new }
14
-
15
- context 'inherited bare fact', fact: :bare_fact do
16
- it_behaves_like 'an accomplished fact', true
17
- it_behaves_like 'a possible fact', true
18
- end
19
-
20
- context 'inherited true fact with no dependencies', fact: :true_fact_with_no_dependencies do
21
- it_behaves_like 'an accomplished fact', true
22
- it_behaves_like 'a possible fact', true
23
- end
24
-
25
- context 'inherited true fact with true dependencies', fact: :true_fact_with_true_dependencies do
26
- it_behaves_like 'an accomplished fact', true
27
- it_behaves_like 'a possible fact', true
28
- end
29
-
30
- context 'inherited true fact with false dependencies', fact: :true_fact_with_false_dependencies do
31
- it_behaves_like 'an accomplished fact', false
32
- it_behaves_like 'a possible fact', false
33
- end
34
-
35
- context 'inherited false fact with no dependencies', fact: :false_fact_with_no_dependencies do
36
- it_behaves_like 'an accomplished fact', false
37
- it_behaves_like 'a possible fact', true
38
- end
39
-
40
- context 'inherited false fact with true dependencies', fact: :false_fact_with_true_dependencies do
41
- it_behaves_like 'an accomplished fact', false
42
- it_behaves_like 'a possible fact', true
43
- end
44
-
45
- context 'inherited false fact with false dependencies', fact: :false_fact_with_false_dependencies do
46
- it_behaves_like 'an accomplished fact', false
47
- it_behaves_like 'a possible fact', false
48
- end
49
-
50
- specify '#facts' do
51
- target.facts.size.should == 8
52
- end
53
-
54
- specify '#accomplished_facts' do
55
- target.accomplished_facts.should == [ :bare_fact, :true_fact_with_no_dependencies, :true_fact_with_true_dependencies, :_private_fact ]
56
- end
57
-
58
- specify '#possible_facts' do
59
- target.possible_facts.should == target.facts - [ :true_fact_with_false_dependencies, :false_fact_with_false_dependencies ]
60
- end
61
- end
62
- end
63
- end
@@ -1,87 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe FactChecker do
6
- describe ClassWithNoFacts do
7
- subject { ClassWithNoFacts.new }
8
-
9
- its(:facts) { should == [] }
10
- its(:possible_facts) { should == [] }
11
- its(:accomplished_facts) { should == [] }
12
-
13
- specify '#fact_possible? and #fact_accomplished?' do
14
- subject.fact_possible?(:unknown_fact).should be_true
15
- subject.fact_accomplished?(:unknown_fact).should be_false
16
- end
17
- end
18
-
19
- describe ClassWithFacts do
20
- subject { ClassWithFacts }
21
-
22
- it { should respond_to :def_fact }
23
- its(:fact_checker) { should be_kind_of FactChecker::Base }
24
-
25
- describe 'context for facts' do
26
- let(:target) { ClassWithFacts.new }
27
-
28
- context 'given private fact', fact: :_private_fact do
29
- specify 'private fact included in #facts' do
30
- target.facts.should include example.metadata[:fact]
31
- end
32
-
33
- specify 'private fact does not have a predicate method' do
34
- target.methods(true).should_not include example.metadata[:fact]
35
- -> { target.send(example.metadata[:fact].to_s + '?') }.should raise_error NoMethodError
36
- end
37
- end
38
-
39
- context 'given bare fact', fact: :bare_fact do
40
- it_behaves_like 'an accomplished fact', true
41
- it_behaves_like 'a possible fact', true
42
- end
43
-
44
- context 'given true fact with no dependencies', fact: :true_fact_with_no_dependencies do
45
- it_behaves_like 'an accomplished fact', true
46
- it_behaves_like 'a possible fact', true
47
- end
48
-
49
- context 'given true fact with true dependencies', fact: :true_fact_with_true_dependencies do
50
- it_behaves_like 'an accomplished fact', true
51
- it_behaves_like 'a possible fact', true
52
- end
53
-
54
- context 'given true fact with false dependencies', fact: :true_fact_with_false_dependencies do
55
- it_behaves_like 'an accomplished fact', false
56
- it_behaves_like 'a possible fact', false
57
- end
58
-
59
- context 'given false fact with no dependencies', fact: :false_fact_with_no_dependencies do
60
- it_behaves_like 'an accomplished fact', false
61
- it_behaves_like 'a possible fact', true
62
- end
63
-
64
- context 'given false fact with true dependencies', fact: :false_fact_with_true_dependencies do
65
- it_behaves_like 'an accomplished fact', false
66
- it_behaves_like 'a possible fact', true
67
- end
68
-
69
- context 'given false fact with false dependencies', fact: :false_fact_with_false_dependencies do
70
- it_behaves_like 'an accomplished fact', false
71
- it_behaves_like 'a possible fact', false
72
- end
73
-
74
- specify '#facts' do
75
- target.facts.size.should be 8
76
- end
77
-
78
- specify '#accomplished_facts' do
79
- target.accomplished_facts.should == [ :bare_fact, :true_fact_with_no_dependencies, :true_fact_with_true_dependencies, :_private_fact ]
80
- end
81
-
82
- specify '#possible_facts' do
83
- target.possible_facts.should == target.facts - [ :true_fact_with_false_dependencies, :false_fact_with_false_dependencies ]
84
- end
85
- end
86
- end
87
- end