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