sites/irclogs.qmsk.net/urltree.py
author Tero Marttila <terom@fixme.fi>
Sun, 08 Feb 2009 02:29:23 +0200
branchsites
changeset 42 5a72c00c4ae4
parent 41 9585441a4bfb
child 43 fc11c4e86a82
permissions -rw-r--r--
more fiddling around with the irclogs layout/css, add query args to URL
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
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   268
        # integer
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   269
        'int'   : int,
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   270
    }
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   271
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   272
    def __init__ (self, type_dict=None) :
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
            Create an URLConfig for use with URL
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   275
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   276
            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
   277
            type specifications in addition to the defaults.
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
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   280
        # build our type_dict
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   281
        self.type_dict = self.BUILTIN_TYPES.copy()
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
        # apply the given type_dict
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   284
        if type_dict :
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   285
            self.type_dict.update(type_dict)
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   286
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
class URL (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
        Represents a specific URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   292
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   293
    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
   294
        """
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   295
            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
   296
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
        # store
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   299
        self.config = config
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
        self.url_mask = url_mask
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
        self.handler = handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302
        self.defaults = defaults
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   304
        # 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
   305
        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
   306
        
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   307
        # 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
   308
        # 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
   309
        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
   310
            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
   311
        
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   312
        else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   313
            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
   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
        # build our label path
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   316
        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
   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 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
   319
        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
   320
            # 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
   321
            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
   322
                # 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
   323
                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
   324
                    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
   325
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   326
                else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   327
                    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
   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
                # 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
   330
                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
   331
                    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
   332
                else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   333
                    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
   334
                
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   335
                # 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
   336
                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
   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
                # add to query_args as (type, default) tuple
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   339
                self.query_args[key] = (self.config.type_dict[type], default)
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   340
         
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   341
    def get_label_path (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   342
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   343
            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
   344
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
        # copy self.label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
        return list(self.label_path)
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
    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
   350
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
            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
   352
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   354
        # start with the defaults
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   355
        kwargs = self.defaults.copy()
39
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
        # then add all the values
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   358
        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
   359
            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
   360
       
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   361
        # 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
   362
        # XXX: catch missing arguments
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   363
        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
   364
            # 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
   365
            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
   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
            # 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
   368
            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
   369
                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
   370
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   371
            else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   372
                # 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
   373
                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
   374
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   375
            # 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
   376
            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
   377
                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
   378
                    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
   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
                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
   381
                    # 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
   382
                    continue
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   383
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   384
                # 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
   385
                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
   386
            
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   387
            # 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
   388
            kwargs[key] = value
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   389
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   390
        # execute the handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
        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
   392
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   393
    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
   394
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   395
            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
   396
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   397
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   398
        # 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
   399
        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
   400
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   401
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   402
        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
   403
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   404
    def __repr__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   405
        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
   406
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   407
class URLNode (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   408
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   409
        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
   410
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   411
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
    def __init__ (self, parent, label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   413
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   414
            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
   415
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   416
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   417
        # the parent URLNode
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   418
        self.parent = parent
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   419
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   420
        # this node's Label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   421
        self.label = label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   422
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   423
        # list of child URLNodes
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   424
        self.children = []
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   425
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   426
        # 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
   427
        self.url = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   429
    def _build_child (self, label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   430
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
            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
   432
        """
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
        # build new child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   435
        child = URLNode(self, 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
        # add to children
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   438
        self.children.append(child)
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
        # return
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   441
        return child
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
    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
   444
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   445
            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
   446
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   447
            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
   448
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   449
            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
   450
            url was assigned before.
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
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   453
        # matches this node?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   454
        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
   455
            if self.url :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   456
                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
   457
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   458
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   459
                # set
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   460
                self.url = url
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   461
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   462
        else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   463
            # 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
   464
            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
   465
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   466
            # 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
   467
            child = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   468
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   469
            # 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
   470
            for child in self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   471
                if child.label == child_label :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   472
                    # found, use this
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   473
                    break
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
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   476
                # build a new child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   477
                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
   478
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   479
            # 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
   480
            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
   481
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   482
    def match (self, label_path) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   483
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   484
            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
   485
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   486
            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
   487
        """
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
        # determine value to use
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   490
        value = 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
        # empty label_path?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   493
        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
   494
            # 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
   495
            if self.url :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   496
                # 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
   497
                return (self.url, [])
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   498
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   499
            elif not self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   500
                # incomplete URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   501
                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
   502
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   503
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   504
                # 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
   505
                label = None
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
        else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   508
            # 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
   509
            label = label_path.pop(0)
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
        # return one match...
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   512
        match = value = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   513
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   514
        # recurse through our children, DFS
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   515
        for child in self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   516
            # match value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   517
            value = child.label.match(label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   518
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   519
            # 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
   520
            if not value :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   521
                continue;
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   522
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   523
            # already found a match? :/
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   524
            if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   525
                raise URLError("Ambiguous URL")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   526
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   527
            # 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
   528
            match = child
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
        # found something?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   531
        if not match :
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   532
            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
   533
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   534
        # ok, recurse into the match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   535
        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
   536
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   537
        # add our value?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   538
        if isinstance(value, LabelValue) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   539
            label_value.append(value)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   540
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   541
        # return the match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   542
        return url, label_value
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   543
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   544
    def get_url (self) :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   545
        """
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   546
            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
   547
        """
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   548
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   549
        # URL segments in reverse order
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   550
        segments = ['']
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   551
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   552
        # start with ourself
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   553
        node = self
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   554
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   555
        # iterate up to root
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   556
        while node :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   557
            segments.append(str(node.label))
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   558
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   559
            node = node.parent
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   560
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   561
        # reverse
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   562
        segments.reverse()
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   563
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   564
        # return
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   565
        return '/'.join(segments)
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   566
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   567
    def dump (self, indent=0) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   568
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   569
            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
   570
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   571
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   572
        return '\n'.join([
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   573
            "%-45s%s" % (
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   574
                ' '*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
   575
                (' -> %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
   576
            )
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   577
        ] + [
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   578
            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
   579
        ])
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   580
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   581
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   582
        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
   583
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   584
class URLTree (map.Mapper) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   585
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   586
        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
   587
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   588
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   589
    def __init__ (self, url_list) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   590
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   591
            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
   592
        """
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
        # root node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   595
        self.root = URLNode(None, EmptyLabel())
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   596
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   597
        # just add each URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   598
        for url in url_list :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   599
            self.add_url(url)
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
    def add_url (self, url) :
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
            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
   604
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   605
        # get url's label path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   606
        path = url.get_label_path()
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   607
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   608
        # should begin with root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   609
        root_label = path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   610
        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
   611
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   612
        # add to root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   613
        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
   614
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   615
    def match (self, url) :
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
            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
   618
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   619
            Returns an (URL, [LabelValue]) tuple.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   620
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   621
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   622
        # split it into labels
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   623
        path = url.split('/')
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   624
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   625
        # empty URL is empty
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   626
        if url :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   627
            # ensure that it doesn't start with a /
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   628
            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
   629
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   630
        # just match starting at root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   631
        return self.root.match(path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   632
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   633
    def handle_request (self, request) :
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
            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
   636
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   637
        
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   638
        # get the requested URL
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   639
        request_url = request.get_page_name()
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   640
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   641
        # find the URL+values to use
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   642
        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
   643
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   644
        # let the URL handle it
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   645
        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
   646
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   647