sites/irclogs.qmsk.net/urltree.py
author Tero Marttila <terom@fixme.fi>
Sun, 08 Feb 2009 02:55:53 +0200
branchsites
changeset 43 fc11c4e86a82
parent 42 5a72c00c4ae4
permissions -rw-r--r--
implement channel_view count, the query stuff, css, layout all need some cleanup :(
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Tree-based URL mapping
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
import re
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
import os.path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
# for Mapper
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
from lib import map
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
class URLError (Exception) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
        Error with an URL definition
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    pass
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
class LabelValue (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        Represents the value of a ValueLabel... love these names
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    def __init__ (self, label, value) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
            Just store
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        self.label = label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        self.value = value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        return "%s=%r" % (self.label.key, self.value)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    def __repr__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        return "<%s>" % self
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
class Label (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        Base class for URL labels (i.e. the segments of the URL between /s)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    @staticmethod
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    43
    def parse (mask, defaults, types) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
            Parse the given label-segment, and return a *Label instance
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        # empty?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        if not mask :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
            return EmptyLabel()
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        # simple value?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        match = SimpleValueLabel.EXPR.match(mask)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
            # key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
            key = match.group('key')
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
            # type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
            type = match.group("type")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
            
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    62
            # lookup type, None for default
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
    63
            type = types[type]
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
            # defaults?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
            default = defaults.get(key)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
            if not default :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
                default = match.group('default')
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
                if default :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
                    # apply type to default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
                    default = type(default)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
            # build
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
            return SimpleValueLabel(key, type, default)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
        # static?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
        match = StaticLabel.EXPR.match(mask)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
            return StaticLabel(match.group('name'))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
        # invalid
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        raise URLError("Invalid label: %r" % (mask, ))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
            Match this label against the given value, returning either True to match without a value, a LabelValue
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
            object, or boolean false to not match.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
            If value is None, this means that only a default value should be returned.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        abstract
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    96
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    97
    def build (self, value_dict) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    98
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    99
            Return a string representing this label, using the values in the given value_dict if needed
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   100
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   101
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   102
        abstract
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
class EmptyLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        An empty label, i.e. just a slash in the URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
            Just compares type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        return isinstance(other, EmptyLabel)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
            Match empty string -> True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
        # no default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
        if value is None :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
            return False
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
        # only empty segments
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
        if value == '' :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
            return True
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   128
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   129
    def build (self, values) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   130
        return str(self)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        return ''
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
class StaticLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
        A simple literal Label, used for fixed terms in the URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
    EXPR = re.compile(r'^(?P<name>[a-zA-Z_.-]+)$')
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
    def __init__ (self, name) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
            The given name is the literal name of this label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        self.name = name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
            Compares names
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        return isinstance(other, StaticLabel) and self.name == other.name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
            Match exactly -> True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        # no defaults
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
        if value is None :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
            return False
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
        # match name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
        if value == self.name :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
            return True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   169
    def build (self, values) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   170
        return str(self)
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   171
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
        return self.name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
class ValueLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
        A label with a key and a value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
        XXX: do we even need this?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
    def __init__ (self, key, default) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
            Set the key and default value. Default value may be None if there is no default value defined
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
        self.key = key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
        self.default = default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
            Compares keys
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
        return isinstance(other, ValueLabel) and self.key == other.key
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   196
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   197
    def build (self, values) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   198
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   199
            Return either the assigned value from values, our default value, or raise an error
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   200
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   201
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   202
        value = values.get(self.key)
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   203
        
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   204
        if not value and self.default :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   205
            value = self.default
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   206
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   207
        elif not value :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   208
            raise URLError("No value given for label %r" % (self.key, ))
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   209
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   210
        return value
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
class SimpleValueLabel (ValueLabel) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
        A label that has a name and a simple string value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
    EXPR = re.compile(r'^\{(?P<key>[a-zA-Z_][a-zA-Z0-9_]*)(:(?P<type>[a-zA-Z_][a-zA-Z0-9_]*))?(=(?P<default>[^}]+))?\}$')
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
    def __init__ (self, key, type=str, default=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
            The given key is the name of this label's value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
        # type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
        self.type = type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
        # store
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
        self.key = key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
        self.default = default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
            Match -> LabelValue
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
        # default?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
        if value is None and self.default :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
            return LabelValue(self, self.default)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
        # only non-empty values!
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
        elif value :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
            # convert with type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
            try :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
                value = self.type(value)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
            except Exception, e :
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   247
                raise URLError("Bad value %r for type %s: %s: %s" % (value, self.type.__name__, type(e).__name__, e))
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
            return LabelValue(self, value)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
        return '{%s%s%s}' % (
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
            self.key, 
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
            ':%s' % (self.type.__name__ ) if self.type != str else '',
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
            '=%s' % (self.default, ) if self.default else '',
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
        )
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   257
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   258
class URLConfig (object) :
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   259
    """
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   260
        Global configuration relevant to all URLs
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   261
    """
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   262
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   263
    # built-in type codes
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   264
    BUILTIN_TYPES = {
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   265
        # default
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   266
        None    : str,
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   267
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   268
        # string
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   269
        'str'   : str,
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   270
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   271
        # integer
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   272
        'int'   : int,
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   273
    }
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   274
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   275
    def __init__ (self, type_dict=None) :
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   276
        """
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   277
            Create an URLConfig for use with URL
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   278
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   279
            If type_dict is given, it should be a mapping of type names -> callables, and they will be available for
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   280
            type specifications in addition to the defaults.
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   281
        """
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   282
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   283
        # build our type_dict
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   284
        self.type_dict = self.BUILTIN_TYPES.copy()
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   285
        
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   286
        # apply the given type_dict
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   287
        if type_dict :
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   288
            self.type_dict.update(type_dict)
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   289
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
class URL (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
        Represents a specific URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   295
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   296
    def __init__ (self, config, url_mask, handler, type_dict=None, **defaults) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
        """
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   298
            Create an URL using the given URLConfig, with the given url mask, handler, and default values.
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
        # store
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   302
        self.config = config
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
        self.url_mask = url_mask
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
        self.handler = handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
        self.defaults = defaults
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   306
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   307
        # query string
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   308
        self.query_args = dict()
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   309
        
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   310
        # parse any query string
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   311
        # XXX: conflicts with regexp syntax
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   312
        if '/?' in url_mask :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   313
            url_mask, query_mask = url_mask.split('/?')
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   314
        
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   315
        else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   316
            query_mask = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   317
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   318
        # build our label path
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   319
        self.label_path = [Label.parse(mask, defaults, config.type_dict) for mask in url_mask.split('/')]
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   320
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   321
        # build our query args list
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   322
        if query_mask :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   323
            # split into items
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   324
            for query_item in query_mask.split('&') :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   325
                # parse default
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   326
                if '=' in query_item :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   327
                    query_item, default = query_item.split('=')
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   328
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   329
                else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   330
                    default = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   331
                
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   332
                # parse type
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   333
                if ':' in query_item :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   334
                    query_item, type = query_item.split(':')
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   335
                else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   336
                    type = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   337
                
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   338
                # parse key
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   339
                key = query_item
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   340
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   341
                # type
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   342
                type = self.config.type_dict[type]
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   343
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   344
                # add to query_args as (type, default) tuple
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   345
                self.query_args[key] = (type, type(default) if default else default)
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   346
         
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
    def get_label_path (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   348
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   349
            Returns a list containing the labels in this url
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   352
        # copy self.label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
        return list(self.label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   354
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   355
    def execute (self, request, label_values) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   356
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   357
            Invoke the handler, using the given label values
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   358
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   359
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
        # start with the defaults
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   361
        kwargs = self.defaults.copy()
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   362
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   363
        # then add all the values
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   364
        for label_value in label_values :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   365
            kwargs[label_value.label.key] = label_value.value
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   366
       
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   367
        # then parse all query args
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   368
        for key, value in request.get_args() :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   369
            # lookup spec
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   370
            type, default = self.query_args[key]
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   371
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   372
            # normalize empty value to None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   373
            if not value :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   374
                value = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   375
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   376
            else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   377
                # process value
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   378
                value = type(value)
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   379
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   380
            # set default?
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   381
            if not value :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   382
                if default :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   383
                    value = default
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   384
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   385
                if default == '' :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   386
                    # do not pass key at all
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   387
                    continue
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   388
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   389
                # otherwise, fail
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   390
                raise URLError("No value given for required argument: %r" % (key, ))
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
            
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   392
            # set key
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   393
            kwargs[key] = value
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   394
        
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   395
        # then check all query args
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   396
        for key, (type, default) in self.query_args.iteritems() :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   397
            # skip those already present
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   398
            if key in kwargs :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   399
                continue
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   400
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   401
            # apply default?
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   402
            if default is None :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   403
                raise URLError("Missing required argument: %r" % (key, ))
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   404
            
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   405
            elif default == '' :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   406
                # skip empty default
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   407
                continue
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   408
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   409
            else :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   410
                # set default
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   411
                kwargs[key] = default
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   412
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   413
        # execute the handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   414
        return self.handler(request, **kwargs)
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   415
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   416
    def build (self, request, **values) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   417
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   418
            Build an absolute URL pointing to this target, with the given values
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   419
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   420
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   421
        # build URL from request page prefix and our labels
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   422
        return request.page_prefix + '/'.join(label.build(values) for label in self.label_path)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   423
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   424
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   425
        return '/'.join(str(label) for label in self.label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   426
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
    def __repr__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
        return "URL(%r, %r)" % (str(self), self.handler)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   429
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   430
class URLNode (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   432
        Represents a node in the URLTree
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   433
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   434
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   435
    def __init__ (self, parent, label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   436
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   437
            Initialize with the given parent and label, empty children dict
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   438
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   439
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   440
        # the parent URLNode
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   441
        self.parent = parent
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   442
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   443
        # this node's Label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   444
        self.label = label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   445
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   446
        # list of child URLNodes
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   447
        self.children = []
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   448
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   449
        # this node's URL, set by add_url for an empty label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   450
        self.url = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   451
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   452
    def _build_child (self, label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   453
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   454
            Build, insert and return a new child Node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   455
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   456
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   457
        # build new child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   458
        child = URLNode(self, label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   459
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   460
        # add to children
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   461
        self.children.append(child)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   462
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   463
        # return
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   464
        return child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   465
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   466
    def add_url (self, url, label_path) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   467
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   468
            Add a URL object to this node under the given path. Uses recursion to process the path.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   469
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   470
            The label_path argument is a (partial) label path as returned by URL.get_label_path.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   471
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   472
            If label_path is empty (len zero, or begins with EmptyLabel), then the given url is assigned to this node, if no
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   473
            url was assigned before.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   474
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   475
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   476
        # matches this node?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   477
        if not label_path or isinstance(label_path[0], EmptyLabel) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   478
            if self.url :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   479
                raise URLError(url, "node already defined")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   480
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   481
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   482
                # set
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   483
                self.url = url
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   484
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   485
        else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   486
            # pop child label from label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   487
            child_label = label_path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   488
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   489
            # look for the child to recurse into
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   490
            child = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   491
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   492
            # look for an existing child with that label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   493
            for child in self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   494
                if child.label == child_label :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   495
                    # found, use this
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   496
                    break
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   497
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   498
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   499
                # build a new child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   500
                child = self._build_child(child_label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   501
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   502
            # recurse to handle the rest of the label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   503
            child.add_url(url, label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   504
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   505
    def match (self, label_path) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   506
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   507
            Locate the URL object corresponding to the given label_path value under this node.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   508
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   509
            Returns a (url, label_values) tuple
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   510
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   511
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   512
        # determine value to use
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   513
        value = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   514
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   515
        # empty label_path?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   516
        if not label_path or label_path[0] == '' :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   517
            # the search ends at this node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   518
            if self.url :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   519
                # this URL is the best match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   520
                return (self.url, [])
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   521
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   522
            elif not self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   523
                # incomplete URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   524
                raise URLError("no URL handler defined for this Node")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   525
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   526
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   527
                # use default value, i.e. Label.match(None)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   528
                label = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   529
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   530
        else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   531
            # pop the next label from the label path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   532
            label = label_path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   533
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   534
        # return one match...
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   535
        match = value = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   536
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   537
        # recurse through our children, DFS
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   538
        for child in self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   539
            # match value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   540
            value = child.label.match(label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   541
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   542
            # skip those that don't match at all
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   543
            if not value :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   544
                continue;
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   545
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   546
            # already found a match? :/
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   547
            if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   548
                raise URLError("Ambiguous URL")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   549
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   550
            # ok, but continue looking to make sure there's no ambiguous URLs
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   551
            match = child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   552
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   553
        # found something?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   554
        if not match :
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   555
            raise URLError("No child found for label: %s + %s + %s" % (self.get_url(), label, '/'.join(str(l) for l in label_path)))
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   556
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   557
        # ok, recurse into the match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   558
        url, label_value = match.match(label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   559
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   560
        # add our value?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   561
        if isinstance(value, LabelValue) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   562
            label_value.append(value)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   563
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   564
        # return the match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   565
        return url, label_value
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   566
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   567
    def get_url (self) :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   568
        """
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   569
            Returns the URL for this node, by iterating over our parents
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   570
        """
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   571
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   572
        # URL segments in reverse order
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   573
        segments = ['']
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   574
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   575
        # start with ourself
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   576
        node = self
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   577
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   578
        # iterate up to root
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   579
        while node :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   580
            segments.append(str(node.label))
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   581
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   582
            node = node.parent
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   583
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   584
        # reverse
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   585
        segments.reverse()
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   586
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   587
        # return
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   588
        return '/'.join(segments)
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   589
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   590
    def dump (self, indent=0) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   591
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   592
            Returns a multi-line string representation of this Node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   593
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   594
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   595
        return '\n'.join([
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   596
            "%-45s%s" % (
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   597
                ' '*indent + str(self.label) + ('/' if self.children else ''), 
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   598
                (' -> %r' % self.url) if self.url else ''
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   599
            )
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   600
        ] + [
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   601
            child.dump(indent + 4) for child in self.children
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   602
        ])
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   603
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   604
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   605
        return "%s/[%s]" % (self.label, ','.join(str(child) for child in self.children))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   606
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   607
class URLTree (map.Mapper) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   608
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   609
        Map requests to handlers, using a defined tree of URLs
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   610
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   611
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   612
    def __init__ (self, url_list) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   613
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   614
            Initialize the tree using the given list of URLs
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   615
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   616
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   617
        # root node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   618
        self.root = URLNode(None, EmptyLabel())
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   619
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   620
        # just add each URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   621
        for url in url_list :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   622
            self.add_url(url)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   623
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   624
    def add_url (self, url) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   625
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   626
            Adds the given URL to the tree. The URL must begin with a root slash.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   627
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   628
        # get url's label path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   629
        path = url.get_label_path()
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   630
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   631
        # should begin with root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   632
        root_label = path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   633
        assert root_label == self.root.label, "URL must begin with root"
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   634
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   635
        # add to root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   636
        self.root.add_url(url, path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   637
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   638
    def match (self, url) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   639
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   640
            Find the URL object best corresponding to the given url, matching any ValueLabels.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   641
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   642
            Returns an (URL, [LabelValue]) tuple.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   643
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   644
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   645
        # split it into labels
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   646
        path = url.split('/')
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   647
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   648
        # empty URL is empty
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   649
        if url :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   650
            # ensure that it doesn't start with a /
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   651
            assert not self.root.label.match(path[0]), "URL must not begin with root"
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   652
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   653
        # just match starting at root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   654
        return self.root.match(path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   655
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   656
    def handle_request (self, request) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   657
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   658
            Looks up the request's URL, and invokes its handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   659
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   660
        
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   661
        # get the requested URL
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   662
        request_url = request.get_page_name()
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   663
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   664
        # find the URL+values to use
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   665
        url, label_values = self.match(request_url)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   666
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   667
        # let the URL handle it
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   668
        return url.execute(request, label_values)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   669
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   670