sites/irclogs.qmsk.net/urls.py
author Tero Marttila <terom@fixme.fi>
Sat, 07 Feb 2009 20:05:57 +0200
branchsites
changeset 177 578eab5dafdc
parent 176 d2a635858d74
child 37 1f13c384508e
permissions -rw-r--r--
start working on some nify URL parsing
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
"""
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
    URL mapping for the irclogs.qmsk.net site
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
"""
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
177
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
     6
import re
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
     7
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
# our own handlers
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
import handlers
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
177
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    11
# mapper
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    12
from lib import map
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
177
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    14
class URLError (Exception) :
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    """
177
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    16
        Error with an URL definition
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    """
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
177
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    19
    pass
170
532c595efa1a start prototyping some site-based code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
177
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    21
class Label (object) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    22
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    23
        Base class for URL labels (i.e. the segments of the URL between /s)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    24
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    25
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    26
    @staticmethod
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    27
    def parse (mask, defaults) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    28
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    29
            Parse the given label-segment, and return a *Label instance
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    30
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    31
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    32
        # empty?
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    33
        if not mask :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    34
            return EmptyLabel()
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    35
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    36
        # simple value?
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    37
        match = SimpleValueLabel.EXPR.match(mask)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    38
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    39
        if match :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    40
            # key
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    41
            key = match.group('key')
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    42
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    43
            # default?
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    44
            default = defaults.get(key)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    45
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    46
            # build
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    47
            return SimpleValueLabel(key, default)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    48
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    49
        # static?
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    50
        match = StaticLabel.EXPR.match(mask)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    51
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    52
        if match :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    53
            return StaticLabel(match.group('name'))
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    54
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    55
        # invalid
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    56
        raise URLError("Invalid label: %r" % (mask, ))
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    57
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    58
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    59
class EmptyLabel (Label) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    60
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    61
        An empty label, i.e. just a slash in the URL
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    62
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    63
    
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    64
    def __eq__ (self, other) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    65
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    66
            Just compares type
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    67
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    68
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    69
        return isinstance(other, EmptyLabel)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    70
    
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    71
    def __str__ (self) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    72
        return ''
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    73
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    74
class StaticLabel (Label) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    75
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    76
        A simple literal Label, used for fixed terms in the URL
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    77
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    78
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    79
    EXPR = re.compile(r'^(?P<name>[a-zA-Z_.-]+)$')
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    80
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    81
    def __init__ (self, name) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    82
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    83
            The given name is the literal name of this label
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    84
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    85
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    86
        self.name = name
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    87
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    88
    def __eq__ (self, other) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    89
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    90
            Compares names
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    91
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    92
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    93
        return isinstance(other, StaticLabel) and self.name == other.name
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    94
    
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    95
    def __str__ (self) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    96
        return self.name
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    97
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    98
class ValueLabel (Label) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
    99
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   100
        A label with a key and a value
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   101
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   102
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   103
    def __init__ (self, key, default) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   104
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   105
            Set the key and default value. Default value may be None if there is no default value defined
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   106
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   107
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   108
        self.key = key
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   109
        self.default = default
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   110
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   111
    def __eq__ (self, other) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   112
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   113
            Compares keys
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   114
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   115
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   116
        return isinstance(other, ValueLabel) and self.key == other.key
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   117
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   118
class SimpleValueLabel (ValueLabel) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   119
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   120
        A label that has a name and a simple string value
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   121
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   122
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   123
    EXPR = re.compile(r'^\{(?P<key>[a-zA-Z_][a-zA-Z0-9_]*)\}$')
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   124
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   125
    def __init__ (self, key, default) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   126
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   127
            The given key is the name of this label's value
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   128
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   129
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   130
        super(SimpleValueLabel, self).__init__(key, default)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   131
    
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   132
    def __str__ (self) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   133
        if self.default :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   134
            return '{%s=%s}' % (self.key, self.default)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   135
            
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   136
        else :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   137
            return '{%s}' % (self.key, )
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   138
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   139
class URL (object) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   140
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   141
        Represents a specific URL
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   142
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   143
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   144
    def __init__ (self, url_mask, handler, **defaults) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   145
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   146
            Create an URL with the given url mask, handler, and default values
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   147
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   148
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   149
        # store
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   150
        self.url_mask = url_mask
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   151
        self.handler = handler
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   152
        self.defaults = defaults
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   153
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   154
        # build our labels
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   155
        self.label_path = [Label.parse(mask, defaults) for mask in url_mask.split('/')]
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   156
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   157
    def get_label_path (self) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   158
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   159
            Returns a list containing the labels in this url
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   160
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   161
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   162
        # copy self.label_path
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   163
        return list(self.label_path)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   164
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   165
    def execute (self, request, xxx) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   166
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   167
            Invoke the handler with the correct parameters
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   168
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   169
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   170
        xxx
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   171
    
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   172
    def __str__ (self) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   173
        return '/'.join(str(label) for label in self.label_path)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   174
    
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   175
    def __repr__ (self) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   176
        return "URL(%r, %r)" % (str(self), self.handler)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   177
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   178
class URLNode (object) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   179
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   180
        Represents a node in the URLTree
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   181
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   182
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   183
    def __init__ (self, parent, label) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   184
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   185
            Initialize with the given parent and label, empty children dict
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   186
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   187
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   188
        # the parent URLNode
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   189
        self.parent = parent
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   190
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   191
        # this node's Label
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   192
        self.label = label
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   193
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   194
        # list of child URLNodes
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   195
        self.children = []
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   196
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   197
        # this node's URL, set by add_url for an empty label_path
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   198
        self.url = None
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   199
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   200
    def _build_child (self, label) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   201
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   202
            Build, insert and return a new child Node
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   203
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   204
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   205
        # build new child
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   206
        child = URLNode(self, label)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   207
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   208
        # add to children
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   209
        self.children.append(child)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   210
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   211
        # return
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   212
        return child
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   213
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   214
    def add_url (self, url, label_path) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   215
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   216
            Add a URL object to this node under the given path. Uses recursion to process the path.
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   217
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   218
            The label_path argument is a (partial) label path as returned by URL.get_label_path.
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   219
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   220
            If label_path is empty (len zero, or begins with EmptyLabel), then the given url is assigned to this node, if no
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   221
            url was assigned before.
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   222
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   223
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   224
        # matches this node?
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   225
        if not label_path or isinstance(label_path[0], EmptyLabel) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   226
            if self.url :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   227
                raise URLError(url, "node already defined")
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   228
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   229
            else :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   230
                # set
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   231
                self.url = url
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   232
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   233
        else :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   234
            # pop child label from label_path
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   235
            child_label = label_path.pop(0)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   236
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   237
            # look for the child to recurse into
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   238
            child = None
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   239
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   240
            # look for an existing child with that label
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   241
            for child in self.children :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   242
                if child.label == child_label :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   243
                    # found, use this
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   244
                    break
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   245
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   246
            else :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   247
                # build a new child
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   248
                child = self._build_child(child_label)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   249
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   250
            # recurse to handle the rest of the label_path
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   251
            child.add_url(url, label_path)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   252
    
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   253
    def match_label (self, label) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   254
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   255
            Match our label mask against the given label value.
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   256
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   257
            Returns either False (no match), True (matched, no value) or a (key, value) pair.
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   258
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   259
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   260
        # simple mask
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   261
        if self.label.beginswith('{') and self.label.endswith('}') :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   262
            value_name = self.label.strip('{}')
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   263
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   264
            return (value_name, label)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   265
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   266
        # literal mask
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   267
        elif self.label == label :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   268
            return True
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   269
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   270
        else :  
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   271
            return False
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   272
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   273
    def match (self, path, label_path) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   274
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   275
            Locate the URL object corresponding to the given label_path value under this node, with the given path
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   276
            containing the previously matched label values
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   277
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   278
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   279
        # empty label_path?
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   280
        if not label_path or not label_path[0] :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   281
            # we wanted this node
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   282
            if self.url :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   283
                # this URL is the best match
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   284
                return [self]
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   285
            
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   286
            elif self.children :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   287
                # continue testing our children
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   288
                label = None
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   289
            
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   290
            else :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   291
                # incomplete URL
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   292
                raise URLError(url, "no URL handler defined for this Node")
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   293
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   294
        else :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   295
            # pop our child label from the label path
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   296
            label = label_path.pop(0)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   297
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   298
            # build a list of matching children
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   299
            matches = []
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   300
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   301
            # recurse through our children
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   302
            for child in self.children :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   303
                matches.append(child.match(label_path))
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   304
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   305
            # return the list of matching children
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   306
            return matches
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   307
    
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   308
    def dump (self, indent=0) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   309
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   310
            Returns a multi-line string representation of this Node
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   311
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   312
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   313
        return '\n'.join([
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   314
            "%-45s%s" % (
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   315
                ' '*indent + str(self.label) + ('/' if self.children else ''), 
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   316
                (' -> %r' % self.url) if self.url else ''
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   317
            )
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   318
        ] + [
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   319
            child.dump(indent + 4) for child in self.children
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   320
        ])
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   321
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   322
    def __str__ (self) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   323
        return "%s/[%s]" % (self.label, ','.join(str(child) for child in self.children))
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   324
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   325
class URLTree (map.Mapper) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   326
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   327
        Map requests to handlers, using a defined tree of URLs
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   328
    """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   329
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   330
    def __init__ (self, url_list) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   331
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   332
            Initialize the tree using the given list of URLs
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   333
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   334
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   335
        # root node
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   336
        self.root = URLNode(None, EmptyLabel())
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   337
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   338
        # just add each URL
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   339
        for url in url_list :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   340
            self.add_url(url)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   341
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   342
    def add_url (self, url) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   343
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   344
            Adds the given URL to the tree. The URL must begin with a root slash.
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   345
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   346
        # get url's label path
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   347
        path = url.get_label_path()
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   348
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   349
        # should begin with root
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   350
        root_label = path.pop(0)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   351
        assert root_label == self.root.label, "URL must begin with root"
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   352
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   353
        # add to root
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   354
        self.root.add_url(url, path)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   355
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   356
    def match (self, url) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   357
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   358
            Returns the URL object best corresponding to the given url
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   359
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   360
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   361
        # normalize the URL
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   362
        url = os.path.normpath(url)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   363
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   364
        # split it into labels
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   365
        label_path = url.split('/')
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   366
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   367
        # just match starting at root
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   368
        return self.root.match(label_path)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   369
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   370
    def handle_request (self, request) :
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   371
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   372
            Looks up the request's URL, and invokes its handler
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   373
        """
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   374
        
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   375
        # get the request's URL path
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   376
        url = self.match(request.get_page_name())
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   377
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   378
        # XXX: figure out the argument values...
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   379
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   380
        # let the URL handle it
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   381
        url.execute(request, xxx)
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   382
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   383
# urls
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   384
index           = URL(  '/',                                            handlers.index                                          )
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   385
channel_view    = URL(  '/channel/{channel}',                           handlers.channel_view                                   )
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   386
channel_last    = URL(  '/channel/{channel}/last/{count}/{format}',     handlers.channel_last,      count=100, format="html"    )
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   387
channel_search  = URL(  '/channel/{channel}/search',                    handlers.channel_search                                 )
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   388
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   389
# mapper
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   390
mapper = URLTree([index, channel_view, channel_last, channel_search])
578eab5dafdc start working on some nify URL parsing
Tero Marttila <terom@fixme.fi>
parents: 176
diff changeset
   391