You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

77 lines
3.1 KiB

  1. from nilmdb.utils.printf import *
  2. import nilmdb.utils.time
  3. from nilmdb.utils.interval import Interval
  4. import fnmatch
  5. import argparse
  6. from argparse import ArgumentDefaultsHelpFormatter as def_form
  7. def setup(self, sub):
  8. cmd = sub.add_parser("intervals", help="List intervals",
  9. formatter_class = def_form,
  10. description="""
  11. List intervals in a stream, similar to
  12. 'list --detail path'.
  13. If '--diff diffpath' is provided, only
  14. interval ranges that are present in 'path'
  15. and not present in 'diffpath' are printed.
  16. """)
  17. cmd.set_defaults(verify = cmd_intervals_verify,
  18. handler = cmd_intervals)
  19. group = cmd.add_argument_group("Stream selection")
  20. group.add_argument("path", metavar="PATH",
  21. help="List intervals for this path",
  22. ).completer = self.complete.path
  23. group.add_argument("-d", "--diff", metavar="PATH",
  24. help="Subtract intervals from this path",
  25. ).completer = self.complete.path
  26. group = cmd.add_argument_group("Interval details")
  27. group.add_argument("-s", "--start",
  28. metavar="TIME", type=self.arg_time,
  29. help="Starting timestamp for intervals "
  30. "(free-form, inclusive)",
  31. ).completer = self.complete.time
  32. group.add_argument("-e", "--end",
  33. metavar="TIME", type=self.arg_time,
  34. help="Ending timestamp for intervals "
  35. "(free-form, noninclusive)",
  36. ).completer = self.complete.time
  37. group = cmd.add_argument_group("Misc options")
  38. group.add_argument("-T", "--timestamp-raw", action="store_true",
  39. help="Show raw timestamps when printing times")
  40. group.add_argument("-o", "--optimize", action="store_true",
  41. help="Optimize (merge adjacent) intervals")
  42. return cmd
  43. def cmd_intervals_verify(self):
  44. if self.args.start is not None and self.args.end is not None:
  45. if self.args.start >= self.args.end:
  46. self.parser.error("start must precede end")
  47. def cmd_intervals(self):
  48. """List intervals in a stream"""
  49. if self.args.timestamp_raw:
  50. time_string = nilmdb.utils.time.timestamp_to_string
  51. else:
  52. time_string = nilmdb.utils.time.timestamp_to_human
  53. try:
  54. intervals = ( Interval(start, end) for (start, end) in
  55. self.client.stream_intervals(self.args.path,
  56. self.args.start,
  57. self.args.end,
  58. self.args.diff) )
  59. if self.args.optimize:
  60. intervals = nilmdb.utils.interval.optimize(intervals)
  61. for i in intervals:
  62. printf("[ %s -> %s ]\n", time_string(i.start), time_string(i.end))
  63. except nilmdb.client.ClientError as e:
  64. self.die("error listing intervals: %s", str(e))