view weather_server/common.py @ 21:beb42c835c52

Make weather server handle arbitrary data: - Make logfile record arbitrary BSONs - Make server handlers OK with same - Make location type a normal class rather than attrs; have it handle its own logger. - Bump version number.
author Paul Fisher <paul@pfish.zone>
date Sat, 19 Oct 2019 18:40:48 -0400
parents 52ef21607b31
children
line wrap: on
line source

import datetime
import json
import typing as t

import bson
import pytz

BSON_OPTIONS = bson.DEFAULT_CODEC_OPTIONS.with_options(
    tz_aware=True, tzinfo=pytz.UTC)


def bson_encode(data: t.Dict[str, t.Any]) -> bytes:
    return bson.BSON.encode(data, codec_options=BSON_OPTIONS)


class DateEncoder(json.JSONEncoder):

    def default(self, o: t.Any) -> t.Any:
        if not isinstance(o, datetime.datetime):
            return super().default(o)
        return o.timestamp()


JSON_ENCODER = DateEncoder(sort_keys=True)


def json_dumps(data: t.Any) -> str:
    return JSON_ENCODER.encode(data)


def utc_now():
    return datetime.datetime.utcnow().replace(tzinfo=pytz.UTC)