sites/irclogs.qmsk.net/urltree.py
author Tero Marttila <terom@fixme.fi>
Sat, 07 Feb 2009 21:02:33 +0200
branchsites
changeset 39 82df0bb66ca7
child 40 71ab68f31a1c
permissions -rw-r--r--
split off to urltree.py, and add support for types
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
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    def parse (mask, defaults) :
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
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
            if type :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
                # XXX: resolve using eval() for now, should be a module or something
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
                type = eval(type)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
                type = str
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
            # defaults?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
            default = defaults.get(key)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
            if not default :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
                default = match.group('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
                if default :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
                    # apply type to default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
                    default = type(default)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
            # build
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
            return SimpleValueLabel(key, type, default)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        # static?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        match = StaticLabel.EXPR.match(mask)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
            return StaticLabel(match.group('name'))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        # invalid
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        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
    90
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
            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
    94
            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
    95
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
            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
    97
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
        abstract
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
class EmptyLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        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
   104
    """
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
    def __eq__ (self, other) :
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
            Just compares type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        """
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
        return isinstance(other, EmptyLabel)
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
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
            Match empty string -> True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        """
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
        # no default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
        if value is None :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
            return False
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
        # only empty segments
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
        if value == '' :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
            return True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        return ''
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
class StaticLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
        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
   132
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
    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
   135
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
    def __init__ (self, name) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
            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
   139
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        self.name = name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
            Compares names
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
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        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
   149
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
            Match exactly -> True
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
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
        # no defaults
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
        if value is None :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
            return False
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
        # match name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
        if value == self.name :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
            return True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        return self.name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
class ValueLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        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
   169
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
        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
   171
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
    def __init__ (self, key, default) :
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
            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
   176
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
        self.key = key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
        self.default = default
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
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
            Compares keys
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        """
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
        return isinstance(other, ValueLabel) and self.key == other.key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
class SimpleValueLabel (ValueLabel) :
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
        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
   191
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
    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
   194
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
    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
   196
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
            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
   198
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
        # type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
        self.type = type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
        # store
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
        self.key = key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
        self.default = default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
            Match -> LabelValue
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
        """
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
        # default?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
        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
   214
            return LabelValue(self, self.default)
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
        # only non-empty values!
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
        elif value :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
            # convert with type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
            try :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
                value = self.type(value)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
            except Exception, e :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
                raise URLError("Bad value %r for type %s: %s" % (value, self.type.__name__, e))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
            return LabelValue(self, value)
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
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
        return '{%s%s%s}' % (
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
            self.key, 
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
            ':%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
   231
            '=%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
   232
        )
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
class URL (object) :
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
        Represents a specific URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
    def __init__ (self, url_mask, handler, **defaults) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
            Create an URL with the given url mask, handler, and default values
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
        # store
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
        self.url_mask = url_mask
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
        self.handler = handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
        self.defaults = defaults
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
        # build our labels
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
        self.label_path = [Label.parse(mask, defaults) for mask in url_mask.split('/')]
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
    def get_label_path (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
            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
   255
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
        # copy self.label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
        return list(self.label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
    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
   261
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
            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
   263
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
        # start with the defaults
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
        kwargs = self.defaults()
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
        # then add all the values
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
        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
   270
            kwargs[label_value.label.key] = label_value.value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
        # execute the handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
        return self.handler(request, **kwargs)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
        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
   277
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
    def __repr__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
        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
   280
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
class URLNode (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
        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
   284
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
    def __init__ (self, parent, label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
            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
   289
        """
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
        # the parent URLNode
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
        self.parent = parent
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
        # this node's Label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
        self.label = label
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
        # list of child URLNodes
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
        self.children = []
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
        # 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
   301
        self.url = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
    def _build_child (self, label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
            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
   306
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   307
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   308
        # build new child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   309
        child = URLNode(self, label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   310
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   311
        # add to children
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
        self.children.append(child)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   313
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   314
        # return
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
        return child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   316
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   317
    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
   318
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   319
            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
   320
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   321
            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
   322
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   323
            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
   324
            url was assigned before.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   325
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   326
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   327
        # matches this node?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   328
        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
   329
            if self.url :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   330
                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
   331
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   332
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   333
                # set
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   334
                self.url = url
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   335
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   336
        else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   337
            # 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
   338
            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
   339
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   340
            # 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
   341
            child = None
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
            # 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
   344
            for child in self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
                if child.label == child_label :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
                    # found, use this
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
                    break
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
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
                # build a new child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
                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
   352
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
            # 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
   354
            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
   355
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   356
    def match (self, label_path) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   357
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   358
            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
   359
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
            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
   361
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   362
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   363
        # determine value to use
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   364
        value = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   365
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   366
        # empty label_path?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   367
        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
   368
            # 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
   369
            if self.url :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   370
                # 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
   371
                return (self.url, [])
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   372
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   373
            elif not self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   374
                # incomplete URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   375
                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
   376
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   377
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   378
                # 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
   379
                label = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   380
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   381
        else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   382
            # 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
   383
            label = label_path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   384
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   385
        # return one match...
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   386
        match = value = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   387
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   388
        # recurse through our children, DFS
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   389
        for child in self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   390
            # match value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
            value = child.label.match(label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   392
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   393
            # 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
   394
            if not value :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   395
                continue;
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   396
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   397
            # already found a match? :/
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   398
            if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   399
                raise URLError("Ambiguous URL")
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
            # 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
   402
            match = child
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
        # found something?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   405
        if not match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   406
            raise URLError("No child found for label")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   407
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   408
        # ok, recurse into the match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   409
        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
   410
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   411
        # add our value?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
        if isinstance(value, LabelValue) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   413
            label_value.append(value)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   414
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   415
        # return the match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   416
        return url, label_value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   417
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   418
    def dump (self, indent=0) :
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
            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
   421
        """
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
        return '\n'.join([
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   424
            "%-45s%s" % (
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   425
                ' '*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
   426
                (' -> %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
   427
            )
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
            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
   430
        ])
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   432
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   433
        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
   434
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   435
class URLTree (map.Mapper) :
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
        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
   438
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   439
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   440
    def __init__ (self, url_list) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   441
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   442
            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
   443
        """
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
        # root node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   446
        self.root = URLNode(None, EmptyLabel())
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   447
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   448
        # just add each URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   449
        for url in url_list :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   450
            self.add_url(url)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   451
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   452
    def add_url (self, url) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   453
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   454
            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
   455
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   456
        # get url's label path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   457
        path = url.get_label_path()
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   458
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   459
        # should begin with root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   460
        root_label = path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   461
        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
   462
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   463
        # add to root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   464
        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
   465
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   466
    def match (self, url) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   467
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   468
            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
   469
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   470
            Returns an (URL, [LabelValue]) tuple.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   471
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   472
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   473
        # normalize the URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   474
        url = os.path.normpath(url)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   475
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   476
        # split it into labels
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   477
        path = url.split('/')
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
        # ensure that it starts with a /
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   480
        root_label = path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   481
        assert self.root.label.match(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
   482
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   483
        # just match starting at root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   484
        return self.root.match(path)
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
    def handle_request (self, request) :
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
            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
   489
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   490
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   491
        # get the request's URL path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   492
        url, label_values = self.match(request.get_page_name())
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   493
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   494
        # let the URL handle it
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   495
        url.execute(request, label_values)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   496
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   497