my eye

entity.py

Raw

"""

"""

import calendar
import datetime
import email

import web

from .util import Header

__all__ = [
    "Allow",
    "ContentEncoding",
    "ContentLanguage",
    "ContentLength",
    "ContentLocation",
    "ContentMD5",
    "ContentRange",
    "ContentType",
    "Expires",
    "LastModified",
]


def get_timestamp(dt, fmt="rfc822"):
    """
    return a string of datetime `dt` in common log format

        >>> get_timestamp(datetime.datetime(1970, 1, 1, 1, 1, 1))
        'Thu, 01 Jan 1970 01:01:01 GMT'

    """
    if dt is None:
        dt = datetime.UTC.localize(datetime.now())
    fmts = {"rfc822": "%a, %d %b %Y %H:%M:%S GMT", "ncsa": "%d/%b/%Y:%H:%M:%S %z"}
    return dt.strftime(fmts[fmt])


def parse_datetime(s):
    """
    parses a date/time stamp taken from an HTTP header

    """
    return datetime(*email.utils.parsedate(s)[:6])


class Entity(Header):

    """"""


class Allow(Entity):

    """"""


class ContentEncoding(Entity):

    """"""


class ContentLanguage(Entity):

    """"""


class ContentLength(Entity):

    """"""


class ContentLocation(Entity):

    """"""


class ContentMD5(Entity):

    """"""


class ContentRange(Entity):

    """"""


class ContentType(Entity):

    """"""

    @property
    def content_type(self):
        print("DEBUG", self)
        # _content_type = str(self).partition(";")[0]
        # if not _content_type:
        #     _content_type = "text/plain"
        return str(self)  # _content_type


class Expires(Entity):

    """
    formats an `Expires` header for `delta` from now

    `delta` is a `datetime.timedelta` object or a number of seconds.

    """

    def __init__(self, when):
        # FIXME either seconds a la TTL or datetime according to W3C
        now = web.dt.now()
        if isinstance(when, str):
            try:
                when = int(when)
            except ValueError:
                then = parse_datetime(when)
                when = calendar.timegm(then.utctimetuple()) - calendar.timegm(
                    now.utctimetuple()
                )
        if isinstance(when, int):
            when = datetime.timedelta(seconds=when)
        dt = now + when
        self.header = get_timestamp(dt=dt)


class LastModified(Entity):

    """"""

    # def __init__(self, when):
    #     self.header = util.format_datetime(when)