Add 'nilmtool intervals' command, with --diff option
Can show the set-difference between the interval ranges in two streams.
This commit is contained in:
parent
a351bc1b10
commit
7eca587fdf
|
@ -14,7 +14,8 @@ from argparse import ArgumentDefaultsHelpFormatter as def_form
|
|||
# Valid subcommands. Defined in separate files just to break
|
||||
# things up -- they're still called with Cmdline as self.
|
||||
subcommands = [ "help", "info", "create", "list", "metadata",
|
||||
"insert", "extract", "remove", "destroy" ]
|
||||
"insert", "extract", "remove", "destroy",
|
||||
"intervals" ]
|
||||
|
||||
# Import the subcommand modules
|
||||
subcmd_mods = {}
|
||||
|
|
62
nilmdb/cmdline/intervals.py
Normal file
62
nilmdb/cmdline/intervals.py
Normal file
|
@ -0,0 +1,62 @@
|
|||
from nilmdb.utils.printf import *
|
||||
import nilmdb.utils.time
|
||||
|
||||
import fnmatch
|
||||
import argparse
|
||||
from argparse import ArgumentDefaultsHelpFormatter as def_form
|
||||
|
||||
def setup(self, sub):
|
||||
cmd = sub.add_parser("intervals", help="List intervals",
|
||||
formatter_class = def_form,
|
||||
description="""
|
||||
List intervals in a stream, similar to
|
||||
'list --detail path'.
|
||||
|
||||
If '--diff diffpath' is provided, only
|
||||
interval ranges that are present in 'path'
|
||||
and not present in 'diffpath' are printed.
|
||||
""")
|
||||
cmd.set_defaults(verify = cmd_intervals_verify,
|
||||
handler = cmd_intervals)
|
||||
|
||||
group = cmd.add_argument_group("Stream selection")
|
||||
group.add_argument("path", metavar="PATH",
|
||||
help="List intervals for this path")
|
||||
group.add_argument("-d", "--diff", metavar="PATH",
|
||||
help="Subtract intervals from this path")
|
||||
|
||||
group = cmd.add_argument_group("Interval details")
|
||||
group.add_argument("-s", "--start",
|
||||
metavar="TIME", type=self.arg_time,
|
||||
help="Starting timestamp for intervals "
|
||||
"(free-form, inclusive)")
|
||||
group.add_argument("-e", "--end",
|
||||
metavar="TIME", type=self.arg_time,
|
||||
help="Ending timestamp for intervals "
|
||||
"(free-form, noninclusive)")
|
||||
|
||||
group = cmd.add_argument_group("Misc options")
|
||||
group.add_argument("-T", "--timestamp-raw", action="store_true",
|
||||
help="Show raw timestamps when printing times")
|
||||
|
||||
return cmd
|
||||
|
||||
def cmd_intervals_verify(self):
|
||||
if self.args.start is not None and self.args.end is not None:
|
||||
if self.args.start >= self.args.end:
|
||||
self.parser.error("start must precede end")
|
||||
|
||||
def cmd_intervals(self):
|
||||
"""List intervals in a stream"""
|
||||
if self.args.timestamp_raw:
|
||||
time_string = nilmdb.utils.time.float_time_to_string
|
||||
else:
|
||||
time_string = nilmdb.utils.time.format_time
|
||||
|
||||
try:
|
||||
for (start, end) in self.client.stream_intervals(
|
||||
self.args.path, self.args.start, self.args.end, self.args.diff):
|
||||
printf("[ %s -> %s ]\n", time_string(start), time_string(end))
|
||||
except nilmdb.client.ClientError as e:
|
||||
self.die("error listing intervals: %s", str(e))
|
||||
|
|
@ -893,3 +893,56 @@ class TestCmdline(object):
|
|||
# See if we can extract it all
|
||||
self.ok("extract /newton/prep --start 2000-01-01 --end 2020-01-01")
|
||||
lines_(self.captured, 15600)
|
||||
|
||||
def test_15_intervals_diff(self):
|
||||
# Test "intervals" and "intervals --diff" command.
|
||||
os.environ['TZ'] = "UTC"
|
||||
|
||||
self.ok("create /diff/1 uint8_1")
|
||||
self.match("")
|
||||
self.ok("intervals /diff/1")
|
||||
self.match("")
|
||||
self.ok("intervals /diff/1 --diff /diff/1")
|
||||
self.match("")
|
||||
self.ok("intervals --diff /diff/1 /diff/1")
|
||||
self.match("")
|
||||
self.fail("intervals /diff/2")
|
||||
self.fail("intervals /diff/1 -d /diff/2")
|
||||
|
||||
self.ok("create /diff/2 uint8_1")
|
||||
self.ok("intervals -T /diff/1 -d /diff/2")
|
||||
self.match("")
|
||||
self.ok("insert -s 01-01-2000 -e 01-01-2001 /diff/1 /dev/null")
|
||||
|
||||
self.ok("intervals /diff/1")
|
||||
self.match("[ Sat, 01 Jan 2000 00:00:00.000000 +0000 -"
|
||||
"> Mon, 01 Jan 2001 00:00:00.000000 +0000 ]\n")
|
||||
|
||||
self.ok("intervals /diff/1 -d /diff/2")
|
||||
self.match("[ Sat, 01 Jan 2000 00:00:00.000000 +0000 -"
|
||||
"> Mon, 01 Jan 2001 00:00:00.000000 +0000 ]\n")
|
||||
|
||||
self.ok("insert -s 01-01-2000 -e 01-01-2001 /diff/2 /dev/null")
|
||||
self.ok("intervals /diff/1 -d /diff/2")
|
||||
self.match("")
|
||||
|
||||
self.ok("insert -s 01-01-2001 -e 01-01-2002 /diff/1 /dev/null")
|
||||
self.ok("insert -s 01-01-2002 -e 01-01-2003 /diff/2 /dev/null")
|
||||
self.ok("intervals /diff/1 -d /diff/2")
|
||||
self.match("[ Mon, 01 Jan 2001 00:00:00.000000 +0000 -"
|
||||
"> Tue, 01 Jan 2002 00:00:00.000000 +0000 ]\n")
|
||||
|
||||
self.ok("insert -s 01-01-2004 -e 01-01-2005 /diff/1 /dev/null")
|
||||
self.ok("intervals /diff/1 -d /diff/2")
|
||||
self.match("[ Mon, 01 Jan 2001 00:00:00.000000 +0000 -"
|
||||
"> Tue, 01 Jan 2002 00:00:00.000000 +0000 ]\n"
|
||||
"[ Thu, 01 Jan 2004 00:00:00.000000 +0000 -"
|
||||
"> Sat, 01 Jan 2005 00:00:00.000000 +0000 ]\n")
|
||||
|
||||
self.fail("intervals -s 01-01-2003 -e 01-01-2000 /diff/1 -d /diff/2")
|
||||
self.ok("intervals -s 01-01-2003 -e 01-01-2008 /diff/1 -d /diff/2")
|
||||
self.match("[ Thu, 01 Jan 2004 00:00:00.000000 +0000 -"
|
||||
"> Sat, 01 Jan 2005 00:00:00.000000 +0000 ]\n")
|
||||
|
||||
self.ok("destroy /diff/1")
|
||||
self.ok("destroy /diff/2")
|
||||
|
|
Loading…
Reference in New Issue
Block a user