Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 18 additions & 4 deletions lib/fbe/regularly.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,23 @@ def Fbe.regularly(area, p_every_days, p_since_days = nil, fb: Fbe.fb, judge: $ju
end
raise(Fbe::Error, 'The $judge is not set') if judge.nil?
raise(Fbe::Error, 'The $loog is not set') if loog.nil?
to_days = lambda do |value, property|
number = Float(value)
unless number.finite? && number % 1 == 0
raise(Fbe::Error, "The PMP property '#{property}' must be a whole number of days")
end
number.to_i
rescue ArgumentError, TypeError, RangeError
raise(Fbe::Error, "The PMP property '#{property}' must be a whole number of days")
end
pmp = fb.query("(and (eq what 'pmp') (eq area '#{area.gsub("'", "\\\\'")}'))").each.to_a
interval = pmp.filter_map { |f| f[p_every_days]&.first }.first || 7
interval = to_days.call(pmp.filter_map { |f| f[p_every_days]&.first }.first || 7, p_every_days)
since_days =
if p_since_days.nil?
nil
else
to_days.call(pmp.filter_map { |f| f[p_since_days]&.first }.first || 28, p_since_days)
end
recent = fb.query(
"(and
(eq what 'regularly')
Expand All @@ -56,9 +71,8 @@ def Fbe.regularly(area, p_every_days, p_since_days = nil, fb: Fbe.fb, judge: $ju
f.what = 'regularly'
f.judge = judge
f.when = Time.now
unless p_since_days.nil?
days = pmp.filter_map { |f| f[p_since_days]&.first }.first || 28
since = Time.now - (days * 24 * 60 * 60)
unless since_days.nil?
since = Time.now - (since_days * 24 * 60 * 60)
f.since = since
end
yield(f)
Expand Down
37 changes: 37 additions & 0 deletions test/fbe/test_regularly.rb
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,43 @@ def test_uses_default_since_days_when_pmp_lacks_property
refute_nil(fact.since)
end

def test_coerces_string_pmp_day_values
fb = Factbase.new
fb.txn do |fbt|
f = fbt.insert
f.what = 'pmp'
f.area = 'custom'
f.interval = '3'
f.days = '28'
end
loog = Loog::NULL
judge = 'test'
Fbe.regularly('custom', 'interval', 'days', fb:, loog:, judge:) do |f|
f.foo = 42
end
fact = fb.query("(and (eq what '#{judge}'))").each.first
assert_in_delta(Time.now - (28 * 24 * 60 * 60), fact.since, 1)
Fbe.regularly('custom', 'interval', 'days', fb:, loog:, judge:) do |f|
f.foo = 42
end
assert_equal(2, fb.size)
end

def test_rejects_invalid_string_pmp_day_values
fb = Factbase.new
fb.txn do |fbt|
f = fbt.insert
f.what = 'pmp'
f.area = 'custom'
f.interval = 3
f.days = 'invalid'
end
assert_raises(Fbe::Error) do
Fbe.regularly('custom', 'interval', 'days', fb:, loog: Loog::NULL, judge: 'test') { |_f| }
end
assert_equal(1, fb.size)
end

def test_does_not_mistake_a_conclusion_fact_for_its_own_marker
fb = Factbase.new
judge = 'my-judge'
Expand Down
Loading