mirror of
https://github.com/GothenburgBitFactory/timewarrior.git
synced 2025-06-26 10:54:28 +02:00
Filter summary based on ids
Closes #573 Signed-off-by: Thomas Lauf <thomas.lauf@tngtech.com>
This commit is contained in:
parent
82ca6d4027
commit
bf683eedbf
5 changed files with 75 additions and 8 deletions
1
AUTHORS
1
AUTHORS
|
@ -122,3 +122,4 @@ Thanks to the following, who submitted detailed bug reports and excellent sugges
|
||||||
Beshoy Girgis
|
Beshoy Girgis
|
||||||
Sergey Zhuravlevich
|
Sergey Zhuravlevich
|
||||||
catexis
|
catexis
|
||||||
|
Aniket Meshram
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
- #494 Expand annotations in summary
|
- #494 Expand annotations in summary
|
||||||
(thanks to catexis)
|
(thanks to catexis)
|
||||||
- #566 Set table width dynamically to terminal width
|
- #566 Set table width dynamically to terminal width
|
||||||
|
- #573 Filter summary based on ids
|
||||||
|
(thanks to Aniket Meshram)
|
||||||
- #576 Fix quoting of tags in DOM output
|
- #576 Fix quoting of tags in DOM output
|
||||||
- Add ':today' hint
|
- Add ':today' hint
|
||||||
- Refactor holidays/refresh script
|
- Refactor holidays/refresh script
|
||||||
|
|
|
@ -6,10 +6,14 @@ timew-summary - display a time-tracking summary
|
||||||
== SYNOPSIS
|
== SYNOPSIS
|
||||||
[verse]
|
[verse]
|
||||||
*timew summary* [_<range>_] [_<tag>_**...**]
|
*timew summary* [_<range>_] [_<tag>_**...**]
|
||||||
|
*timew summary* [_<id>_**...**]
|
||||||
|
|
||||||
== DESCRIPTION
|
== DESCRIPTION
|
||||||
Displays a table summarizing tracked time, by default for the current day.
|
Displays a table summarizing tracked time, by default for the current day.
|
||||||
Accepts date ranges, or range hints, and tags for filtering.
|
Accepts date ranges (or range hints) and tags, or ids for filtering.
|
||||||
|
|
||||||
|
When ids are given, date ranges are ignored.
|
||||||
|
Specifying both, tags and ids, is an error.
|
||||||
|
|
||||||
== HINTS
|
== HINTS
|
||||||
Apart from range hints (see **timew-hints**(7)), the summary report adheres to the following hints:
|
Apart from range hints (see **timew-hints**(7)), the summary report adheres to the following hints:
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include <IntervalFilterAllInRange.h>
|
#include <IntervalFilterAllInRange.h>
|
||||||
|
#include <IntervalFilterAllWithIds.h>
|
||||||
#include <IntervalFilterAllWithTags.h>
|
#include <IntervalFilterAllWithTags.h>
|
||||||
#include <IntervalFilterAndGroup.h>
|
#include <IntervalFilterAndGroup.h>
|
||||||
#include <SummaryTable.h>
|
#include <SummaryTable.h>
|
||||||
|
@ -53,16 +54,57 @@ int CmdSummary (
|
||||||
Range default_range = {};
|
Range default_range = {};
|
||||||
expandIntervalHint (":" + report_hint, default_range);
|
expandIntervalHint (":" + report_hint, default_range);
|
||||||
|
|
||||||
auto range = cli.getRange (default_range);
|
auto ids = cli.getIds ();
|
||||||
auto tags = cli.getTags ();
|
auto tags = cli.getTags ();
|
||||||
|
|
||||||
// Load the data.
|
if (! ids.empty () && ! tags.empty ())
|
||||||
IntervalFilterAndGroup filtering ({
|
{
|
||||||
std::make_shared <IntervalFilterAllInRange> (range),
|
throw std::string ("You cannot filter intervals by both, ids and tags.");
|
||||||
std::make_shared <IntervalFilterAllWithTags> (tags)
|
}
|
||||||
});
|
|
||||||
|
|
||||||
auto tracked = getTracked (database, rules, filtering);
|
Range range;
|
||||||
|
|
||||||
|
std::vector <Interval> tracked;
|
||||||
|
|
||||||
|
if (! ids.empty ())
|
||||||
|
{
|
||||||
|
auto filtering = IntervalFilterAllWithIds (ids);
|
||||||
|
tracked = getTracked (database, rules, filtering);
|
||||||
|
|
||||||
|
if (tracked.size () != ids.size ())
|
||||||
|
{
|
||||||
|
for (auto& id: ids)
|
||||||
|
{
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
for (auto& interval: tracked)
|
||||||
|
{
|
||||||
|
if (interval.id == id)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (! found)
|
||||||
|
{
|
||||||
|
throw format ("ID '@{1}' does not correspond to any tracking.", id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
range = Range {tracked.begin ()->end, tracked.end ()->start};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
range = cli.getRange (default_range);
|
||||||
|
|
||||||
|
IntervalFilterAndGroup filtering ({
|
||||||
|
std::make_shared <IntervalFilterAllInRange> (range),
|
||||||
|
std::make_shared <IntervalFilterAllWithTags> (tags)
|
||||||
|
});
|
||||||
|
|
||||||
|
tracked = getTracked (database, rules, filtering);
|
||||||
|
}
|
||||||
|
|
||||||
if (tracked.empty ())
|
if (tracked.empty ())
|
||||||
{
|
{
|
||||||
|
|
|
@ -174,6 +174,24 @@ W10 2017-03-09 Thu @4 Tag1 8:43:08 9:38:15 0:55:07 0:55:07
|
||||||
0:55:07
|
0:55:07
|
||||||
""", out)
|
""", out)
|
||||||
|
|
||||||
|
def test_with_id_filter(self):
|
||||||
|
"""Summary should print data filtered by tag"""
|
||||||
|
self.t("track Tag1 2017-03-09T08:43:08 - 2017-03-09T09:38:15")
|
||||||
|
self.t("track Tag2 2017-03-09T11:38:39 - 2017-03-09T11:45:35")
|
||||||
|
self.t("track Tag2 Tag3 2017-03-09T11:46:21 - 2017-03-09T12:00:17")
|
||||||
|
self.t("track Tag2 Tag4 2017-03-09T12:01:49 - 2017-03-09T12:28:46")
|
||||||
|
|
||||||
|
code, out, err = self.t("summary @2 @4 :ids")
|
||||||
|
|
||||||
|
self.assertIn("""
|
||||||
|
Wk Date Day ID Tags Start End Time Total
|
||||||
|
--- ---------- --- -- ---------- -------- -------- ------- -------
|
||||||
|
W10 2017-03-09 Thu @4 Tag1 8:43:08 9:38:15 0:55:07
|
||||||
|
@2 Tag2, Tag3 11:46:21 12:00:17 0:13:56 1:09:03
|
||||||
|
|
||||||
|
1:09:03
|
||||||
|
""", out)
|
||||||
|
|
||||||
def test_non_contiguous_with_tag_filter(self):
|
def test_non_contiguous_with_tag_filter(self):
|
||||||
"""Summary should print data filtered by tag when tags are non-contiguous"""
|
"""Summary should print data filtered by tag when tags are non-contiguous"""
|
||||||
self.t("track Tag1 2017-03-09T08:43:08 - 2017-03-09T09:38:15")
|
self.t("track Tag1 2017-03-09T08:43:08 - 2017-03-09T09:38:15")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue