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