1# Copyright (c) 2009-2012 testtools developers. See LICENSE for details.
2
3"""ContentType - a MIME Content Type."""
4
5
6class ContentType(object):
7    """A content type from http://www.iana.org/assignments/media-types/
8
9    :ivar type: The primary type, e.g. "text" or "application"
10    :ivar subtype: The subtype, e.g. "plain" or "octet-stream"
11    :ivar parameters: A dict of additional parameters specific to the
12        content type.
13    """
14
15    def __init__(self, primary_type, sub_type, parameters=None):
16        """Create a ContentType."""
17        if None in (primary_type, sub_type):
18            raise ValueError("None not permitted in %r, %r" % (
19                primary_type, sub_type))
20        self.type = primary_type
21        self.subtype = sub_type
22        self.parameters = parameters or {}
23
24    def __eq__(self, other):
25        if type(other) != ContentType:
26            return False
27        return self.__dict__ == other.__dict__
28
29    def __repr__(self):
30        if self.parameters:
31            params = '; '
32            params += '; '.join(
33                sorted('%s="%s"' % (k, v) for k, v in self.parameters.items()))
34        else:
35            params = ''
36        return "%s/%s%s" % (self.type, self.subtype, params)
37
38
39JSON = ContentType('application', 'json')
40
41UTF8_TEXT = ContentType('text', 'plain', {'charset': 'utf8'})
42