diff options
| -rw-r--r-- | pyproject.toml | 3 | ||||
| -rw-r--r-- | vk/api.py | 34 | ||||
| -rw-r--r-- | vk/last_seen.py | 4 | ||||
| -rw-r--r-- | vk/mutuals.py | 32 | ||||
| -rw-r--r-- | vk/platform.py | 14 | ||||
| -rw-r--r-- | vk/tracking/__init__.py | 4 | ||||
| -rw-r--r-- | vk/tracking/db/__init__.py | 2 | ||||
| -rw-r--r-- | vk/tracking/db/backend/__init__.py | 6 | ||||
| -rw-r--r-- | vk/tracking/db/backend/log.py | 14 | ||||
| -rw-r--r-- | vk/tracking/db/format.py | 22 | ||||
| -rw-r--r-- | vk/tracking/db/timestamp.py | 4 | ||||
| -rw-r--r-- | vk/tracking/sessions.py | 104 | ||||
| -rw-r--r-- | vk/tracking/status.py | 48 | ||||
| -rw-r--r-- | vk/user.py | 22 | ||||
| -rw-r--r-- | vk/utils/bar_chart.py | 30 | ||||
| -rw-r--r-- | vk/utils/io.py | 12 | ||||
| -rw-r--r-- | vk/version.py | 6 |
17 files changed, 179 insertions, 182 deletions
diff --git a/pyproject.toml b/pyproject.toml index 32b223c..b929682 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,3 @@ vk-status = "vk.tracking.status:main" vk-mutuals = "vk.mutuals:main" [tool.setuptools_scm] - -[tool.black] -skip-string-normalization = true @@ -49,29 +49,29 @@ def _build_url(scheme, host, path, params=None, empty_params=False): else: raise TypeError() path = urllib.parse.quote(path) - return urllib.parse.urlunsplit((scheme, host, path, params, '')) + return urllib.parse.urlunsplit((scheme, host, path, params, "")) def _join_param_values(values): if isinstance(values, str): return values if isinstance(values, Iterable): - return ','.join(map(str, values)) + return ",".join(map(str, values)) return values def _join_path(base, url): - if not base.endswith('/'): - base += '/' + if not base.endswith("/"): + base += "/" return urllib.parse.urljoin(base, url) -ACCESS_TOKEN = '9722cef09722cef09722cef071974b8cbe997229722cef0cbabfd816916af6c7bd37006' +ACCESS_TOKEN = "9722cef09722cef09722cef071974b8cbe997229722cef0cbabfd816916af6c7bd37006" class Version(Enum): # https://dev.vk.com/en/reference/versions - V5_199 = '5.199' + V5_199 = "5.199" DEFAULT = V5_199 def __str__(self): @@ -79,7 +79,7 @@ class Version(Enum): class Language(Enum): - EN = 'en' + EN = "en" DEFAULT = EN def __str__(self): @@ -87,24 +87,24 @@ class Language(Enum): class Method(Enum): - USERS_GET = 'users.get' - FRIENDS_GET = 'friends.get' + USERS_GET = "users.get" + FRIENDS_GET = "friends.get" def __str__(self): return self.value class CommonParameters(Enum): - ACCESS_TOKEN = 'access_token' - VERSION = 'v' - LANGUAGE = 'lang' + ACCESS_TOKEN = "access_token" + VERSION = "v" + LANGUAGE = "lang" def __str__(self): return self.value class API: - _ROOT_URL = 'https://api.vk.com/method/' + _ROOT_URL = "https://api.vk.com/method/" _SCHEME, _HOST, _ROOT_PATH = _split_url(_ROOT_URL) @@ -127,9 +127,9 @@ class API: with urlopen(url) as response: response = json.loads(response.read().decode()) # print(response) - if 'response' not in response: + if "response" not in response: raise vk.error.InvalidAPIResponseError(response) - return response['response'] + return response["response"] except (ConnectionError, URLError) as e: raise vk.error.APIConnectionError(str(e)) from e @@ -154,6 +154,6 @@ class API: response = self._call_method( Method.FRIENDS_GET, user_id=user_id, fields=_join_param_values(fields) ) - if 'items' not in response: + if "items" not in response: raise vk.error.InvalidAPIResponseError(response) - return self._filter_response_with_users(response['items'], deactivated_users) + return self._filter_response_with_users(response["items"], deactivated_users) diff --git a/vk/last_seen.py b/vk/last_seen.py index e5584eb..78d10b5 100644 --- a/vk/last_seen.py +++ b/vk/last_seen.py @@ -31,8 +31,8 @@ def _parse_platform(x): class LastSeenField(Enum): - TIME = 'time' - PLATFORM = 'platform' + TIME = "time" + PLATFORM = "platform" def __str__(self): return self.value diff --git a/vk/mutuals.py b/vk/mutuals.py index 3498632..9b687c2 100644 --- a/vk/mutuals.py +++ b/vk/mutuals.py @@ -57,8 +57,8 @@ class OutputSinkJSON(OutputSinkMutualFriends): class OutputFormat(Enum): - CSV = 'csv' - JSON = 'json' + CSV = "csv" + JSON = "json" def __str__(self): return self.value @@ -72,14 +72,14 @@ class OutputFormat(Enum): return OutputSinkCSV(fd) if self is OutputFormat.JSON: return OutputSinkJSON(fd) - raise NotImplementedError(f'unsupported output format: {self}') + raise NotImplementedError(f"unsupported output format: {self}") 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}") def _parse_args(args=None): @@ -87,29 +87,29 @@ def _parse_args(args=None): args = sys.argv[1:] parser = argparse.ArgumentParser( - description='Learn who your ex and her new boyfriend are both friends with.' + description="Learn who your ex and her new boyfriend are both friends with." ) 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( - '-f', - '--format', - dest='out_fmt', + "-f", + "--format", + dest="out_fmt", type=_parse_output_format, default=OutputFormat.CSV, choices=OutputFormat, - help='specify output format', + help="specify output format", ) parser.add_argument( - '-o', - '--output', - metavar='PATH', - dest='out_path', - help='set output file path (standard output by default)', + "-o", + "--output", + metavar="PATH", + dest="out_path", + help="set output file path (standard output by default)", ) return parser.parse_args(args) @@ -132,5 +132,5 @@ def main(args=None): write_mutual_friends(**vars(_parse_args(args))) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/vk/platform.py b/vk/platform.py index 7e22911..c7129e3 100644 --- a/vk/platform.py +++ b/vk/platform.py @@ -25,15 +25,15 @@ class Platform(Enum): @property def descr(self): - return f'the {_PLATFORM_DESCRIPTIONS[self]}' + return f"the {_PLATFORM_DESCRIPTIONS[self]}" _PLATFORM_DESCRIPTIONS = { Platform.MOBILE: '"mobile" web version (or an unrecognized mobile app)', - Platform.IPHONE: 'official iPhone app', - Platform.IPAD: 'official iPad app', - Platform.ANDROID: 'official Android app', - Platform.WINDOWS_PHONE: 'official Windows Phone app', - Platform.WINDOWS10: 'official Windows 10 app', - Platform.WEB: 'web version (or an unrecognized app)', + Platform.IPHONE: "official iPhone app", + Platform.IPAD: "official iPad app", + Platform.ANDROID: "official Android app", + Platform.WINDOWS_PHONE: "official Windows Phone app", + Platform.WINDOWS10: "official Windows 10 app", + Platform.WEB: "web version (or an unrecognized app)", } 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() @@ -37,23 +37,23 @@ def _parse_online_flag(x): class UserField(Enum): - UID = 'id' - FIRST_NAME = 'first_name' - LAST_NAME = 'last_name' - DEACTIVATED = 'deactivated' - HIDDEN = 'hidden' + UID = "id" + FIRST_NAME = "first_name" + LAST_NAME = "last_name" + DEACTIVATED = "deactivated" + HIDDEN = "hidden" - DOMAIN = 'domain' - ONLINE = 'online' - LAST_SEEN = 'last_seen' + DOMAIN = "domain" + ONLINE = "online" + LAST_SEEN = "last_seen" def __str__(self): return self.value class DeactivationReason(Enum): - DELETED = 'deleted' - BANNED = 'banned' + DELETED = "deleted" + BANNED = "banned" def __str__(self): return self.value @@ -135,7 +135,7 @@ class User(Hashable, MutableMapping): def full_name(self): if not self.has_last_name: return self.first_name - return f'{self.first_name} {self.last_name}' + return f"{self.first_name} {self.last_name}" @property def is_deactivated(self): diff --git a/vk/utils/bar_chart.py b/vk/utils/bar_chart.py index 367a301..44fac3c 100644 --- a/vk/utils/bar_chart.py +++ b/vk/utils/bar_chart.py @@ -112,7 +112,7 @@ class BarChartBuilder: self._get_categories_axis().set_ticklabels(categories) - bars = self._ax.barh(bar_offsets, values, align='center', height=bar_height) + bars = self._ax.barh(bar_offsets, values, align="center", height=bar_height) if min(values) >= 0: self.set_values_axis_limits(start=0) @@ -128,40 +128,40 @@ class BarChartBuilder: plt.show() def save(self, path): - self._fig.savefig(path, bbox_inches='tight') + self._fig.savefig(path, bbox_inches="tight") -if __name__ == '__main__': +if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() - parser.add_argument('--categories', nargs='*', metavar='LABEL', default=[]) - parser.add_argument('--values', nargs='*', metavar='N', default=[], type=float) + parser.add_argument("--categories", nargs="*", metavar="LABEL", default=[]) + parser.add_argument("--values", nargs="*", metavar="N", default=[], type=float) - parser.add_argument('--output', '-o', help='set output file path') + parser.add_argument("--output", "-o", help="set output file path") parser.add_argument( - '--align-middle', - action='store_true', - dest='labels_align_middle', - help='align labels to the middle of the bars', + "--align-middle", + action="store_true", + dest="labels_align_middle", + help="align labels to the middle of the bars", ) parser.add_argument( - '--integer-values', action='store_true', dest='only_integer_values' + "--integer-values", action="store_true", dest="only_integer_values" ) parser.add_argument( - '--any-values', action='store_false', dest='only_integer_values' + "--any-values", action="store_false", dest="only_integer_values" ) - parser.add_argument('--grid-categories', action='store_true') - parser.add_argument('--grid-values', action='store_true') + parser.add_argument("--grid-categories", action="store_true") + parser.add_argument("--grid-values", action="store_true") args = parser.parse_args() if len(args.categories) < len(args.values): - parser.error('too many bar values') + parser.error("too many bar values") if len(args.categories) > len(args.values): args.values.extend([0.0] * (len(args.categories) - len(args.values))) diff --git a/vk/utils/io.py b/vk/utils/io.py index 7588cc0..d0f4271 100644 --- a/vk/utils/io.py +++ b/vk/utils/io.py @@ -15,7 +15,7 @@ class FileWriterJSON: def write(self, something): self._fd.write(json.dumps(something, indent=3, ensure_ascii=False)) - self._fd.write('\n') + self._fd.write("\n") class FileReaderCSV: @@ -29,7 +29,7 @@ class FileReaderCSV: class FileWriterCSV: def __init__(self, fd=sys.stdout, flush=False): self._fd = fd - self._writer = csv.writer(fd, lineterminator='\n') + self._writer = csv.writer(fd, lineterminator="\n") self._flush = flush @staticmethod @@ -55,16 +55,16 @@ def _open_file(path=None, default=None, **kwargs): yield fd -_DEFAULT_ENCODING = 'utf-8' +_DEFAULT_ENCODING = "utf-8" def open_input_text_file(path=None): - return _open_file(path, default=sys.stdin, mode='r', encoding=_DEFAULT_ENCODING) + return _open_file(path, default=sys.stdin, mode="r", encoding=_DEFAULT_ENCODING) -def open_output_text_file(path=None, mode='w'): +def open_output_text_file(path=None, mode="w"): return _open_file(path, default=sys.stdout, mode=mode, encoding=_DEFAULT_ENCODING) def open_output_binary_file(path=None): - return _open_file(path, default=sys.stdout, mode='wb') + return _open_file(path, default=sys.stdout, mode="wb") diff --git a/vk/version.py b/vk/version.py index fc944ab..ecd6545 100644 --- a/vk/version.py +++ b/vk/version.py @@ -5,12 +5,12 @@ except ImportError: try: - __version__ = metadata.version('vk_scripts') + __version__ = metadata.version("vk_scripts") except Exception: - __version__ = 'unknown' + __version__ = "unknown" def add_to_arg_parser(parser): parser.add_argument( - '--version', '-V', action='version', version=f'%(prog)s {__version__}' + "--version", "-V", action="version", version=f"%(prog)s {__version__}" ) |
