aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/vk/tracking
diff options
context:
space:
mode:
Diffstat (limited to 'vk/tracking')
-rw-r--r--vk/tracking/__init__.py4
-rw-r--r--vk/tracking/db/__init__.py2
-rw-r--r--vk/tracking/db/backend/__init__.py6
-rw-r--r--vk/tracking/db/backend/log.py14
-rw-r--r--vk/tracking/db/format.py22
-rw-r--r--vk/tracking/db/timestamp.py4
-rw-r--r--vk/tracking/sessions.py104
-rw-r--r--vk/tracking/status.py48
8 files changed, 102 insertions, 102 deletions
diff --git a/vk/tracking/__init__.py b/vk/tracking/__init__.py
index d0809e7..76bc1b4 100644
--- a/vk/tracking/__init__.py
+++ b/vk/tracking/__init__.py
@@ -3,6 +3,6 @@
# See LICENSE.txt for details.
__all__ = (
- 'sessions',
- 'status',
+ "sessions",
+ "status",
)
diff --git a/vk/tracking/db/__init__.py b/vk/tracking/db/__init__.py
index 51b1a7c..7095cf3 100644
--- a/vk/tracking/db/__init__.py
+++ b/vk/tracking/db/__init__.py
@@ -5,4 +5,4 @@
from .format import Format
-__all__ = ('format',)
+__all__ = ("format",)
diff --git a/vk/tracking/db/backend/__init__.py b/vk/tracking/db/backend/__init__.py
index 0d3153f..8a1a7d7 100644
--- a/vk/tracking/db/backend/__init__.py
+++ b/vk/tracking/db/backend/__init__.py
@@ -6,7 +6,7 @@
from . import csv, log, null
__all__ = (
- 'csv',
- 'log',
- 'null',
+ "csv",
+ "log",
+ "null",
)
diff --git a/vk/tracking/db/backend/log.py b/vk/tracking/db/backend/log.py
index 0ffee5c..6f3ebaa 100644
--- a/vk/tracking/db/backend/log.py
+++ b/vk/tracking/db/backend/log.py
@@ -15,7 +15,7 @@ class Writer(meta.Writer):
handler = logging.StreamHandler(fd)
handler.setFormatter(
logging.Formatter(
- fmt='[%(asctime)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S%z'
+ fmt="[%(asctime)s] %(message)s", datefmt="%Y-%m-%d %H:%M:%S%z"
)
)
self._logger.addHandler(handler)
@@ -71,24 +71,24 @@ class Writer(meta.Writer):
@staticmethod
def _format_user_is_online(user):
- return f'{user.full_name} is ONLINE.'
+ return f"{user.full_name} is ONLINE."
@staticmethod
def _format_user_is_offline(user):
- return f'{user.full_name} is OFFLINE.'
+ return f"{user.full_name} is OFFLINE."
@staticmethod
def _format_user_last_seen(user):
- return f'{user.full_name} was last seen at {user.last_seen.time_local} using {user.last_seen.platform.descr}.'
+ return f"{user.full_name} was last seen at {user.last_seen.time_local} using {user.last_seen.platform.descr}."
@staticmethod
def _format_user_went_online(user):
- return f'{user.full_name} went ONLINE.'
+ return f"{user.full_name} went ONLINE."
@staticmethod
def _format_user_went_offline(user):
- return f'{user.full_name} went OFFLINE.'
+ return f"{user.full_name} went OFFLINE."
@staticmethod
def _format_another_connection_error(e):
- return f'Encountered a connection error which looks like the previous one: {e}'
+ return f"Encountered a connection error which looks like the previous one: {e}"
diff --git a/vk/tracking/db/format.py b/vk/tracking/db/format.py
index 5c88cb7..66d9132 100644
--- a/vk/tracking/db/format.py
+++ b/vk/tracking/db/format.py
@@ -12,9 +12,9 @@ from . import backend
class Format(Enum):
- CSV = 'csv'
- LOG = 'log'
- NULL = 'null'
+ CSV = "csv"
+ LOG = "log"
+ NULL = "null"
def __str__(self):
return self.value
@@ -26,7 +26,7 @@ class Format(Enum):
return backend.log.Writer(fd)
if self is Format.NULL:
return backend.null.Writer()
- raise NotImplementedError(f'unsupported database format: {self}')
+ raise NotImplementedError(f"unsupported database format: {self}")
def open_output_file(self, path=None):
if self is Format.CSV:
@@ -35,30 +35,30 @@ class Format(Enum):
return self._open_output_log_file(path)
if self is Format.NULL:
return self._open_output_database_file(None)
- raise NotImplementedError('unsupported database format: ' + str(self))
+ raise NotImplementedError("unsupported database format: " + str(self))
@staticmethod
def _open_output_log_file(path):
- return io.open_output_text_file(path, mode='a')
+ return io.open_output_text_file(path, mode="a")
@staticmethod
def _open_output_database_file(path):
- return io.open_output_text_file(path, mode='x')
+ return io.open_output_text_file(path, mode="x")
def create_reader(self, fd=sys.stdin):
if self is Format.CSV:
return backend.csv.Reader(fd)
if self is Format.LOG:
- return NotImplementedError('cannot read from a log file')
+ return NotImplementedError("cannot read from a log file")
if self is Format.NULL:
return backend.null.Reader()
- raise NotImplementedError('unsupported database format: ' + str(self))
+ raise NotImplementedError("unsupported database format: " + str(self))
def open_input_file(self, path=None):
if self is Format.CSV:
return io.open_input_text_file(path)
if self is Format.LOG:
- raise NotImplementedError('cannot read from a log file')
+ raise NotImplementedError("cannot read from a log file")
if self is Format.NULL:
return io.open_input_text_file(None)
- raise NotImplementedError('unsupported database format: ' + str(self))
+ raise NotImplementedError("unsupported database format: " + str(self))
diff --git a/vk/tracking/db/timestamp.py b/vk/tracking/db/timestamp.py
index 4a3892f..c9ed293 100644
--- a/vk/tracking/db/timestamp.py
+++ b/vk/tracking/db/timestamp.py
@@ -30,7 +30,7 @@ class Timestamp:
@staticmethod
def from_string(s):
- return Timestamp(datetime.strptime(s, '%Y-%m-%dT%H:%M:%SZ'))
+ return Timestamp(datetime.strptime(s, "%Y-%m-%dT%H:%M:%SZ"))
def __str__(self):
- return f'{self.dt.isoformat()}Z'
+ return f"{self.dt.isoformat()}Z"
diff --git a/vk/tracking/sessions.py b/vk/tracking/sessions.py
index 5d545f1..843977d 100644
--- a/vk/tracking/sessions.py
+++ b/vk/tracking/sessions.py
@@ -144,10 +144,10 @@ class OnlineSessionEnumerator(MutableMapping):
class GroupBy(Enum):
- USER = 'user'
- DATE = 'date'
- WEEKDAY = 'weekday'
- HOUR = 'hour'
+ USER = "user"
+ DATE = "date"
+ WEEKDAY = "weekday"
+ HOUR = "hour"
def __str__(self):
return self.value
@@ -162,7 +162,7 @@ class GroupBy(Enum):
return online_streaks.group_by_weekday(db_reader)
if self is GroupBy.HOUR:
return online_streaks.group_by_hour(db_reader)
- raise NotImplementedError(f'unsupported grouping: {self}')
+ raise NotImplementedError(f"unsupported grouping: {self}")
_OUTPUT_USER_FIELDS = (
@@ -211,7 +211,7 @@ class OutputSinkCSV(OutputSinkOnlineSessions):
@staticmethod
def _key_to_row(group_by, key):
if group_by not in OutputSinkCSV._CONVERT_KEY:
- raise NotImplementedError(f'unsupported grouping: {group_by}')
+ raise NotImplementedError(f"unsupported grouping: {group_by}")
return OutputSinkCSV._CONVERT_KEY[group_by](key)
def process_database(self, group_by, db_reader, time_from=None, time_to=None):
@@ -222,9 +222,9 @@ class OutputSinkCSV(OutputSinkOnlineSessions):
class OutputConverterJSON:
- _DATE_FIELD = 'date'
- _WEEKDAY_FIELD = 'weekday'
- _HOUR_FIELD = 'hour'
+ _DATE_FIELD = "date"
+ _WEEKDAY_FIELD = "weekday"
+ _HOUR_FIELD = "hour"
assert _DATE_FIELD not in map(str, _OUTPUT_USER_FIELDS)
assert _WEEKDAY_FIELD not in map(str, _OUTPUT_USER_FIELDS)
@@ -260,7 +260,7 @@ class OutputSinkJSON(OutputSinkOnlineSessions):
def __init__(self, fd=sys.stdout):
self._writer = io.FileWriterJSON(fd)
- _DURATION_FIELD = 'duration'
+ _DURATION_FIELD = "duration"
assert _DURATION_FIELD not in map(str, _OUTPUT_USER_FIELDS)
@@ -274,7 +274,7 @@ class OutputSinkJSON(OutputSinkOnlineSessions):
@staticmethod
def _key_to_object(group_by, key):
if group_by not in OutputSinkJSON._CONVERT_KEY:
- raise NotImplementedError(f'unsupported grouping: {group_by}')
+ raise NotImplementedError(f"unsupported grouping: {group_by}")
return OutputSinkJSON._CONVERT_KEY[group_by](key)
def process_database(self, group_by, db_reader, time_from=None, time_to=None):
@@ -289,7 +289,7 @@ class OutputSinkJSON(OutputSinkOnlineSessions):
class OutputConverterPlot:
@staticmethod
def convert_user(user):
- return f'{user.first_name}\n{user.last_name}'
+ return f"{user.first_name}\n{user.last_name}"
@staticmethod
def convert_date(date):
@@ -301,14 +301,14 @@ class OutputConverterPlot:
@staticmethod
def convert_hour(hour):
- return f'{hour}:00'
+ return f"{hour}:00"
class OutputSinkPlot(OutputSinkOnlineSessions):
def __init__(self, fd=sys.stdout):
self._fd = fd
- TITLE = 'How much time people spend online'
+ TITLE = "How much time people spend online"
_FORMAT_KEY = {
GroupBy.USER: OutputConverterPlot.convert_user,
@@ -320,7 +320,7 @@ class OutputSinkPlot(OutputSinkOnlineSessions):
@staticmethod
def _format_key(group_by, key):
if group_by not in OutputSinkPlot._FORMAT_KEY:
- raise NotImplementedError(f'unsupported grouping: {group_by}')
+ raise NotImplementedError(f"unsupported grouping: {group_by}")
return OutputSinkPlot._FORMAT_KEY[group_by](key)
@staticmethod
@@ -351,7 +351,7 @@ class OutputSinkPlot(OutputSinkOnlineSessions):
bar_chart.enable_grid_for_values()
bar_chart.only_integer_values()
bar_chart.set_property(
- bar_chart.get_values_labels(), fontsize='small', rotation=30
+ bar_chart.get_values_labels(), fontsize="small", rotation=30
)
bar_chart.set_value_label_formatter(self._format_duration)
@@ -374,9 +374,9 @@ class OutputSinkPlot(OutputSinkOnlineSessions):
class OutputFormat(Enum):
- CSV = 'csv'
- JSON = 'json'
- PLOT = 'plot'
+ CSV = "csv"
+ JSON = "json"
+ PLOT = "plot"
def __str__(self):
return self.value
@@ -388,7 +388,7 @@ class OutputFormat(Enum):
return OutputSinkJSON(fd)
if self is OutputFormat.PLOT:
return OutputSinkPlot(fd)
- raise NotImplementedError(f'unsupported output format: {self}')
+ raise NotImplementedError(f"unsupported output format: {self}")
def open_file(self, path=None):
if self is OutputFormat.PLOT:
@@ -407,17 +407,17 @@ def _parse_database_format(s):
try:
return DatabaseFormat(s)
except ValueError:
- raise argparse.ArgumentTypeError(f'invalid database format: {s}')
+ raise argparse.ArgumentTypeError(f"invalid database format: {s}")
def _parse_output_format(s):
try:
return OutputFormat(s)
except ValueError:
- raise argparse.ArgumentTypeError(f'invalid output format: {s}')
+ raise argparse.ArgumentTypeError(f"invalid output format: {s}")
-_DATE_RANGE_LIMIT_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
+_DATE_RANGE_LIMIT_FORMAT = "%Y-%m-%dT%H:%M:%SZ"
def _parse_date_range_limit(s):
@@ -435,64 +435,64 @@ def _parse_args(args=None):
args = sys.argv[1:]
parser = argparse.ArgumentParser(
- description='View/visualize the amount of time people spend online.'
+ description="View/visualize the amount of time people spend online."
)
vk.version.add_to_arg_parser(parser)
parser.add_argument(
- 'db_path',
- metavar='input',
- nargs='?',
- help='database file path (standard input by default)',
+ "db_path",
+ metavar="input",
+ nargs="?",
+ help="database file path (standard input by default)",
)
parser.add_argument(
- 'out_path',
- metavar='output',
- nargs='?',
- help='output file path (standard output by default)',
+ "out_path",
+ metavar="output",
+ nargs="?",
+ help="output file path (standard output by default)",
)
parser.add_argument(
- '-g',
- '--group-by',
+ "-g",
+ "--group-by",
type=_parse_group_by,
choices=GroupBy,
default=GroupBy.USER,
- help='group online sessions by user/date/etc.',
+ help="group online sessions by user/date/etc.",
)
parser.add_argument(
- '-i',
- '--input-format',
- dest='db_fmt',
+ "-i",
+ "--input-format",
+ dest="db_fmt",
type=_parse_database_format,
default=DatabaseFormat.CSV,
choices=DatabaseFormat,
- help='specify database format',
+ help="specify database format",
)
parser.add_argument(
- '-o',
- '--output-format',
- dest='out_fmt',
+ "-o",
+ "--output-format",
+ dest="out_fmt",
type=_parse_output_format,
choices=OutputFormat,
default=OutputFormat.CSV,
- help='specify output format',
+ help="specify output format",
)
parser.add_argument(
- '-a',
- '--from',
- dest='time_from',
+ "-a",
+ "--from",
+ dest="time_from",
type=_parse_date_range_limit,
default=None,
- help='discard online activity prior to this moment',
+ help="discard online activity prior to this moment",
)
parser.add_argument(
- '-b',
- '--to',
- dest='time_to',
+ "-b",
+ "--to",
+ dest="time_to",
type=_parse_date_range_limit,
default=None,
- help='discard online activity after this moment',
+ help="discard online activity after this moment",
)
return parser.parse_args(args)
@@ -525,5 +525,5 @@ def main(args=None):
process_online_sessions(**vars(_parse_args(args)))
-if __name__ == '__main__':
+if __name__ == "__main__":
main()
diff --git a/vk/tracking/status.py b/vk/tracking/status.py
index 7ef0b3c..8f1665e 100644
--- a/vk/tracking/status.py
+++ b/vk/tracking/status.py
@@ -155,9 +155,9 @@ def _parse_positive_integer(s):
try:
n = int(s)
except ValueError:
- raise argparse.ArgumentTypeError(f'must be a positive integer: {s}')
+ raise argparse.ArgumentTypeError(f"must be a positive integer: {s}")
if n < 1:
- raise argparse.ArgumentTypeError(f'must be a positive integer: {s}')
+ raise argparse.ArgumentTypeError(f"must be a positive integer: {s}")
return n
@@ -165,52 +165,52 @@ def _parse_database_format(s):
try:
return DatabaseFormat(s)
except ValueError:
- raise argparse.ArgumentTypeError(f'invalid database format: {s}')
+ raise argparse.ArgumentTypeError(f"invalid database format: {s}")
def _parse_args(args=None):
if args is None:
args = sys.argv[1:]
- parser = argparse.ArgumentParser(description='Track when people go online/offline.')
+ parser = argparse.ArgumentParser(description="Track when people go online/offline.")
vk.version.add_to_arg_parser(parser)
parser.add_argument(
- 'uids', metavar='UID', nargs='+', help='user IDs or "screen names"'
+ "uids", metavar="UID", nargs="+", help='user IDs or "screen names"'
)
parser.add_argument(
- '-t',
- '--timeout',
- metavar='SECONDS',
+ "-t",
+ "--timeout",
+ metavar="SECONDS",
type=_parse_positive_integer,
default=DEFAULT_TIMEOUT,
- help='set refresh interval',
+ help="set refresh interval",
)
parser.add_argument(
- '-O',
- '--only-once',
- action='store_true',
- help='query the status only once and exit',
+ "-O",
+ "--only-once",
+ action="store_true",
+ help="query the status only once and exit",
)
parser.add_argument(
- '-l',
- '--log',
- metavar='PATH',
- dest='log_path',
- help='set log file path (standard output by default)',
+ "-l",
+ "--log",
+ metavar="PATH",
+ dest="log_path",
+ help="set log file path (standard output by default)",
)
parser.add_argument(
- '-f',
- '--format',
- dest='db_fmt',
+ "-f",
+ "--format",
+ dest="db_fmt",
type=_parse_database_format,
choices=DatabaseFormat,
default=DEFAULT_DB_FORMAT,
- help='specify database format',
+ help="specify database format",
)
parser.add_argument(
- '-o', '--output', metavar='PATH', dest='db_path', help='set database file path'
+ "-o", "--output", metavar="PATH", dest="db_path", help="set database file path"
)
return parser.parse_args(args)
@@ -248,5 +248,5 @@ def main(args=None):
track_status(**vars(_parse_args(args)))
-if __name__ == '__main__':
+if __name__ == "__main__":
main()