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.
- checksums.yaml +7 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +4 -0
- data/README.md +102 -17
- data/fact_checker.gemspec +5 -4
- data/lib/fact_checker/mixin.rb +32 -0
- data/lib/fact_checker/result.rb +18 -0
- data/lib/fact_checker/version.rb +1 -1
- data/lib/fact_checker.rb +2 -2
- data/spec/mixin_spec.rb +238 -0
- data/spec/result_spec.rb +29 -0
- data/spec/spec_helper.rb +3 -3
- data/spec/version_spec.rb +9 -0
- metadata +59 -39
- data/.rvmrc +0 -1
- data/examples/README.md +0 -72
- data/examples/basic.rb +0 -60
- data/lib/fact_checker/base.rb +0 -79
- data/lib/fact_checker/boot.rb +0 -31
- data/spec/fact_checker/base_spec.rb +0 -272
- data/spec/fact_checker/version_spec.rb +0 -7
- data/spec/fact_checker_inheritance_spec.rb +0 -63
- data/spec/fact_checker_spec.rb +0 -87
- data/spec/support/classes_with_facts.rb +0 -29
- data/spec/support/shared_facts_behaviour.rb +0 -17
data/lib/fact_checker/boot.rb
DELETED
@@ -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,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
|
data/spec/fact_checker_spec.rb
DELETED
@@ -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
|