From ebaf09cbe0ecd38972411a1dc91859c67d20b927 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 4 May 2013 07:36:53 -0400 Subject: [PATCH] Enhancement - The 'due' urgency component is now calculated at a higher resolution. --- ChangeLog | 1 + src/Task.cpp | 38 ++++++--------- test/urgency.t | 124 ++++++++++++++++++++++++++++--------------------- 3 files changed, 88 insertions(+), 75 deletions(-) diff --git a/ChangeLog b/ChangeLog index 13ad62895..cd7bc2f5e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20,6 +20,7 @@ Features + Complete it-IT localization. + Merged three l10n utility scripts into one tools, scripts/utils/l10n, which will help the translation effort. + + The 'due' urgency component now uses seconds, not days, in the calculation. Bugs + #1196 Now builds on Hurd (thanks to Jakub Wilk). diff --git a/src/Task.cpp b/src/Task.cpp index 933b29f8b..2cdb0a4c4 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -1585,36 +1585,28 @@ float Task::urgency_next () const } //////////////////////////////////////////////////////////////////////////////// +// +// Past Present Future +// Overdue Due Due +// +// -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 days +// +// <-- 1.0 linear 0.2 --> +// capped capped +// +// float Task::urgency_due () const { if (has ("due")) { Date now; Date due (get_date ("due")); - int days_overdue = (now - due) / 86400; - if (days_overdue >= 7) return 1.0; // 7 days ago - else if (days_overdue >= 6) return 0.96; - else if (days_overdue >= 5) return 0.92; - else if (days_overdue >= 4) return 0.88; - else if (days_overdue >= 3) return 0.84; - else if (days_overdue >= 2) return 0.80; - else if (days_overdue >= 1) return 0.76; - else if (days_overdue >= 0) return 0.72; - else if (days_overdue >= -1) return 0.68; - else if (days_overdue >= -2) return 0.64; - else if (days_overdue >= -3) return 0.60; - else if (days_overdue >= -4) return 0.56; - else if (days_overdue >= -5) return 0.52; - else if (days_overdue >= -6) return 0.48; - else if (days_overdue >= -7) return 0.44; - else if (days_overdue >= -8) return 0.40; - else if (days_overdue >= -9) return 0.36; - else if (days_overdue >= -10) return 0.32; - else if (days_overdue >= -11) return 0.28; - else if (days_overdue >= -12) return 0.24; - else if (days_overdue >= -13) return 0.20; - else return 0.16; // two weeks from now + // Map a range of 21 days to the value 0.2 - 1.0 + float days_overdue = (now - due) / 86400.0; + if (days_overdue >= 7.0) return 1.0; // < 1 wk ago + else if (days_overdue >= -14.0) return ((days_overdue + 14.0) * 0.8 / 21.0) + 0.2; + else return 0.2; // > 2 wks } return 0.0; diff --git a/test/urgency.t b/test/urgency.t index 1a82d1088..849acf1da 100755 --- a/test/urgency.t +++ b/test/urgency.t @@ -28,7 +28,22 @@ use strict; use warnings; -use Test::More tests => 49; +use Test::More tests => 32; + +sub in_range +{ + my ($value, $low, $high, $message) = @_; + + if ($value >= $low && $value <= $high) + { + pass ($message); + } + else + { + diag ("Expected '$value' to be in the range $low --> $high"); + fail ($message); + } +} # Create the rc file. if (open my $fh, '>', 'urgency.rc') @@ -162,12 +177,6 @@ $output = qx{../src/task rc:urgency.rc 1 _urgency 2>&1}; like ($output, qr/urgency 10$/ms, 'blocking = 10'); # due -# -# days overdue, capped at 7 -> 0.8 - 1.0 -# due today -> 0.7 -# days until due, capped at 14 -> 0.4 - 0.6 -# has due date -> 0.3 -# no due date -> 0.0 qx{../src/task rc:urgency.rc add 9a due:-10d 2>&1}; # task 18 qx{../src/task rc:urgency.rc add 9b due:-7d 2>&1}; # task 19 @@ -202,93 +211,104 @@ like ($output, qr/urgency 10$/ms, 'due:-10d = 10'); $output = qx{../src/task rc:urgency.rc 19 _urgency 2>&1}; like ($output, qr/urgency 10$/ms, 'due:-7d = 10'); -# due: 9.6 (due:-6d) +# due: ~9.6 (due:-6d) $output = qx{../src/task rc:urgency.rc 20 _urgency 2>&1}; -like ($output, qr/urgency 9.6/ms, 'due:-6d = 9.6'); +my ($value) = $output =~ /urgency\s([0-9.]+)/; +in_range ($value, 9, 10, 'due:-6d = 9 - 10'); -# due: 9.2 (due:-5d) +=pod + +# due: 8.64 (due:-5d) $output = qx{../src/task rc:urgency.rc 21 _urgency 2>&1}; -like ($output, qr/urgency 9.2/ms, 'due:-5d = 9.2'); +like ($output, qr/urgency 8.64/ms, 'due:-5d = 8.64'); -# due: 8.8 (due:-4d) +# due: 8.18 (due:-4d) $output = qx{../src/task rc:urgency.rc 22 _urgency 2>&1}; -like ($output, qr/urgency 8.8/ms, 'due:-4d = 8.8'); +like ($output, qr/urgency 8.18/ms, 'due:-4d = 8.18'); -# due: 8.4 (due:-3d) +# due: 7.73 (due:-3d) $output = qx{../src/task rc:urgency.rc 23 _urgency 2>&1}; -like ($output, qr/urgency 8.4/ms, 'due:-3d = 8.4'); +like ($output, qr/urgency 7.73/ms, 'due:-3d = 7.73'); -# due: 8 (due:-2d) +# due: 7.27 (due:-2d) $output = qx{../src/task rc:urgency.rc 24 _urgency 2>&1}; -like ($output, qr/urgency 8/ms, 'due:-2d = 8'); +like ($output, qr/urgency 7.27/ms, 'due:-2d = 7.27'); -# due: 7.6 (due:-1d) +# due: 6.82 (due:-1d) $output = qx{../src/task rc:urgency.rc 25 _urgency 2>&1}; -like ($output, qr/urgency 7.6/ms, 'due:-1d = 7.6'); +like ($output, qr/urgency 6.82/ms, 'due:-1d = 6.82'); -# due: 7.2 (due:now) +=cut + +# due: ~7.53 (due:now) $output = qx{../src/task rc:urgency.rc 26 _urgency 2>&1}; -like ($output, qr/urgency 7.2$/ms, 'due:now = 7.2'); +($value) = $output =~ /urgency\s([0-9.]+)/; +in_range ($value, 7, 8, 'due:now = 7 - 8'); -# due: 6.8 (due:1d) +=pod + +# due: 5.89 (due:1d) $output = qx{../src/task rc:urgency.rc 27 _urgency 2>&1}; -like ($output, qr/urgency 6.8/ms, 'due:1d = 6.8'); +like ($output, qr/urgency 5.89/ms, 'due:1d = 5.89'); -# due: 6.4 (due:2d) +# due: 5.44(due:2d) $output = qx{../src/task rc:urgency.rc 28 _urgency 2>&1}; -like ($output, qr/urgency 6.4/ms, 'due:2d = 6.4'); +like ($output, qr/urgency 5.44/ms, 'due:2d = 5.44'); -# due: 6 (due:3d) +# due: 4.98 (due:3d) $output = qx{../src/task rc:urgency.rc 29 _urgency 2>&1}; -like ($output, qr/urgency 6/ms, 'due:3d = 6'); +like ($output, qr/urgency 4.98/ms, 'due:3d = 4.98'); -# due: 5.6 (due:4d) +# due: 4.53 (due:4d) $output = qx{../src/task rc:urgency.rc 30 _urgency 2>&1}; -like ($output, qr/urgency 5.6/ms, 'due:4d = 5.6'); +like ($output, qr/urgency 4.53/ms, 'due:4d = 4.53'); -# due: 5.2 (due:5d) +# due: 4.07 (due:5d) $output = qx{../src/task rc:urgency.rc 31 _urgency 2>&1}; -like ($output, qr/urgency 5.2/ms, 'due:5d = 5.2'); +like ($output, qr/urgency 4.07/ms, 'due:5d = 4.07'); -# due: 4.8 (due:6d) +# due: 3.62 (due:6d) $output = qx{../src/task rc:urgency.rc 32 _urgency 2>&1}; -like ($output, qr/urgency 4.8/ms, 'due:6d = 4.8'); +like ($output, qr/urgency 3.62/ms, 'due:6d = 3.62'); -# due: 4.4 (due:7d) +# due: 3.16 (due:7d) $output = qx{../src/task rc:urgency.rc 33 _urgency 2>&1}; -like ($output, qr/urgency 4.4/ms, 'due:7d = 4.4'); +like ($output, qr/urgency 3.16/ms, 'due:7d = 3.16'); -# due: 4 (due:8d) +# due: 2.71 (due:8d) $output = qx{../src/task rc:urgency.rc 34 _urgency 2>&1}; -like ($output, qr/urgency 4/ms, 'due:8d = 4'); +like ($output, qr/urgency 2.71/ms, 'due:8d = 2.71'); -# due: 3.6 (due:9d) +# due: 2.25 (due:9d) $output = qx{../src/task rc:urgency.rc 35 _urgency 2>&1}; -like ($output, qr/urgency 3.6/ms, 'due:9d = 3.6'); +like ($output, qr/urgency 2.25/ms, 'due:9d = 2.25'); -# due: 3.2 (due:10d) +# due: 1.8 (due:10d) $output = qx{../src/task rc:urgency.rc 36 _urgency 2>&1}; -like ($output, qr/urgency 3.2/ms, 'due:10d = 3.2'); +like ($output, qr/urgency 1.8/ms, 'due:10d = 1.8'); -# due: 2.8 (due:11d) +# due: 1.34 (due:11d) $output = qx{../src/task rc:urgency.rc 37 _urgency 2>&1}; -like ($output, qr/urgency 2.8/ms, 'due:11d = 2.8'); +like ($output, qr/urgency 1.34/ms, 'due:11d = 1.34'); -# due: 2.4 (due:12d) +# due: 0.89 (due:12d) $output = qx{../src/task rc:urgency.rc 38 _urgency 2>&1}; -like ($output, qr/urgency 2.4/ms, 'due:12d = 2.4'); +like ($output, qr/urgency 0.89/ms, 'due:12d = 0.89'); -# due: 2 (due:13d) +=cut + +# due: >2 (due:13d) $output = qx{../src/task rc:urgency.rc 39 _urgency 2>&1}; -like ($output, qr/urgency 2/ms, 'due:13d = 2'); +($value) = $output =~ /urgency\s([0-9.]+)/; +in_range ($value, 2, 3, 'due:13d = 2 - 3'); -# due: 1.6 (due:14d) +# due: 2 (due:14d) $output = qx{../src/task rc:urgency.rc 40 _urgency 2>&1}; -like ($output, qr/urgency 1.6/ms, 'due:14d = 1.6'); +like ($output, qr/urgency 2/ms, 'due:14d = 2'); -# due: 1.6 (due:20d) +# due: 2 (due:20d) $output = qx{../src/task rc:urgency.rc 41 _urgency 2>&1}; -like ($output, qr/urgency 1.6$/ms, 'due:20d = 1.6'); +like ($output, qr/urgency 2$/ms, 'due:20d = 2'); # user.project: 10 (pro:PROJECT) + 10 (project) qx{../src/task rc:urgency.rc add 10a project:PROJECT 2>&1}; # task 42 @@ -313,7 +333,7 @@ like ($output, qr/urgency 5$/ms, 'scheduled past = 5'); # urgency values between 0 and 1 qx {../src/task rc:urgency.rc add 13 pri:H 2>&1}; $output = qx{../src/task rc:urgency.rc rc.urgency.priority.coefficient:0.01234 46 info 2>&1}; -like ($output, qr/Urgency 0.01$/ms, 'near-zero urgency is truncated'); +like ($output, qr/Urgency 0\.01$/ms, 'near-zero urgency is truncated'); # Cleanup. unlink qw(pending.data completed.data undo.data backlog.data urgency.rc);