blob: eb30a71efe8be26ad4d709e82002c97d159d598d [file] [edit]
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from __future__ import absolute_import
import datetime
from tracing.value import histogram
from tracing.value.diagnostics import diagnostic
class DateRange(diagnostic.Diagnostic):
__slots__ = ('_range',)
def __init__(self, ms):
super(DateRange, self).__init__()
self._range = histogram.Range()
self._range.AddValue(ms)
def __eq__(self, other):
if not isinstance(other, DateRange):
return False
return self._range == other._range
def __hash__(self):
return id(self)
@property
def min_date(self):
return datetime.datetime.utcfromtimestamp(self._range.min / 1000)
@property
def max_date(self):
return datetime.datetime.utcfromtimestamp(self._range.max / 1000)
@property
def min_timestamp(self):
return self._range.min
@property
def max_timestamp(self):
return self._range.max
@property
def duration_ms(self):
return self._range.duration
def __str__(self):
min_date = self.min_date.isoformat().replace('T', ' ')[:19]
if self.duration_ms == 0:
return min_date
max_date = self.max_date.isoformat().replace('T', ' ')[:19]
return min_date + ' - ' + max_date
def _AsDictInto(self, dct):
dct['min'] = self._range.min
if self.duration_ms == 0:
return
dct['max'] = self._range.max
def _AsProto(self):
raise NotImplementedError()
def Serialize(self, unused_serializer):
if self.duration_ms == 0:
return self._range.min
return [self._range.min, self._range.max]
@staticmethod
def Deserialize(data, unused_deserializer):
if isinstance(data, list):
dr = DateRange(data[0])
dr._range.AddValue(data[1])
return dr
return DateRange(data)
@staticmethod
def FromDict(dct):
dr = DateRange(dct['min'])
if 'max' in dct:
dr._range.AddValue(dct['max'])
return dr
@staticmethod
def FromProto(d):
raise NotImplementedError()
def CanAddDiagnostic(self, other_diagnostic):
return isinstance(other_diagnostic, DateRange)
def AddDiagnostic(self, other_diagnostic):
self._range.AddRange(other_diagnostic._range)