urltree.py
author Tero Marttila <terom@fixme.fi>
Mon, 16 Feb 2009 20:02:28 +0200
changeset 80 94c493b7c046
parent 79 747554808944
child 81 847da3c265b5
permissions -rw-r--r--
start writing urltree tests
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Tree-based URL mapping
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
import re
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
import os.path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
60
616ab1e5b593 remove unused map.py
Tero Marttila <terom@fixme.fi>
parents: 59
diff changeset
     8
from qmsk.web import handler
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
class URLError (Exception) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
        Error with an URL definition
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    pass
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
class LabelValue (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
        Represents the value of a ValueLabel... love these names
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    22
    def __init__ (self, label, value, is_default) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
            Just store
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
        self.label = label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        self.value = value
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    29
        self.is_default = is_default
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    def __str__ (self) :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
    32
        return "%s%s" % (self.label.key, "=%r" % (self.value, ) if not self.is_default else '')
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    def __repr__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        return "<%s>" % self
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
class Label (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        Base class for URL labels (i.e. the segments of the URL between /s)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    @staticmethod
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    43
    def parse (mask, defaults, config) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        """
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    45
            Parse the given label-segment, and return a *Label instance. Config is the URLConfig to use
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        # empty?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        if not mask :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
            return EmptyLabel()
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        # simple value?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        match = SimpleValueLabel.EXPR.match(mask)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
            # key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
            key = match.group('key')
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
            # type
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    60
            type_name = match.group("type")
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
            
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    62
            # lookup type, None -> default
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    63
            type = config.get_type(type_name)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
            # defaults?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
            default = defaults.get(key)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
            if not default :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
                default = match.group('default')
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
                if default :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
                    # apply type to default
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
    73
                    default = type.parse(default)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
            # build
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
    76
            return SimpleValueLabel(key, type_name, type, default)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
        # static?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
        match = StaticLabel.EXPR.match(mask)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
            return StaticLabel(match.group('name'))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
        # invalid
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        raise URLError("Invalid label: %r" % (mask, ))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
            Match this label against the given value, returning either True to match without a value, a LabelValue
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
            object, or boolean false to not match.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
            If value is None, this means that only a default value should be returned.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        abstract
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    96
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    97
    def build (self, value_dict) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    98
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    99
            Return a string representing this label, using the values in the given value_dict if needed
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   100
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   101
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   102
        abstract
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   104
    def build_default (self, value_dict) :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   105
        """
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   106
            Return an (is_default, value) tuple
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   107
        """
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   108
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   109
        abstract
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   110
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   111
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
class EmptyLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        An empty label, i.e. just a slash in the URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
            Just compares type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
        return isinstance(other, EmptyLabel)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
            Match empty string -> True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
        # no default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
        if value is None :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
            return False
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        # only empty segments
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
        if value == '' :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
            return True
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   136
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   137
    def build (self, values) :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   138
        return ''
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   139
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   140
    def build_default (self, values) :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   141
        return (False, '')
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        return ''
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
class StaticLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        A simple literal Label, used for fixed terms in the URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
79
747554808944 start writing urltree tests
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   151
    EXPR = re.compile(r'^(?P<name>[a-zA-Z0-9_.-]+)$')
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
    def __init__ (self, name) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
            The given name is the literal name of this label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
        self.name = name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
            Compares names
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
        return isinstance(other, StaticLabel) and self.name == other.name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
            Match exactly -> True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
        # no defaults
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
        if value is None :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
            return False
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
        # match name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
        if value == self.name :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
            return True
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   180
    def build (self, values) :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   181
        return self.name
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   182
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   183
    def build_default (self, values) :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   184
        return (False, self.name)
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   185
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
        return self.name
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
class ValueLabel (Label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
        A label with a key and a value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
        XXX: do we even need this?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
    def __init__ (self, key, default) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
            Set the key and default value. Default value may be None if there is no default value defined
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
        self.key = key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
        self.default = default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
    def __eq__ (self, other) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
            Compares keys
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
        return isinstance(other, ValueLabel) and self.key == other.key
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   210
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   211
    def build (self, values) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   212
        """
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   213
            Return either the assigned value from values, our default value, or raise an error
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   214
        """
48
480adab03749 fix to use URLtype for building URL ValueLabels
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   215
        
54
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   216
        # just proxy to build_default
79
747554808944 start writing urltree tests
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   217
        return self.build_default(values)[1]
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   219
    def build_default (self, values) :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   220
        """
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   221
            Check if we have a value in values, and return based on that
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   222
        """
54
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   223
 
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   224
        # state
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   225
        is_default = False
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   226
        
54
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   227
        # value given?
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   228
        if self.key not in values or values[self.key] is None :
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   229
            # error on missing non-default
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   230
            if self.default is None :
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   231
                raise URLError("No value given for label %r" % (self.key, ))
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   232
            
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   233
            # use default
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   234
            else :
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   235
                is_default = True
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   236
                value = self.default
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   237
        
54
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   238
        else :
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   239
            # lookup the value obj to use
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   240
            value = values[self.key]
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   241
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   242
        # convert value back to str
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   243
        value = self.type.build(value)
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   244
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   245
        # return
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   246
        return (is_default, value)
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   247
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
class SimpleValueLabel (ValueLabel) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
        A label that has a name and a simple string value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
58
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   253
    EXPR = re.compile(r'^\{(?P<key>[a-zA-Z_][a-zA-Z0-9_]*)(:(?P<type>[a-zA-Z_][a-zA-Z0-9_]*))?(=(?P<default>[^}]*))?\}$')
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   255
    def __init__ (self, key, type_name, type, default) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
        """
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   257
            The given key is the name of this label's value.
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   258
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   259
            The given type_name is is None for the default type, otherwise the type's name. Type is a URLType.
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
        # type
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   263
        self.type_name = type_name
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
        self.type = type
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
        # store
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
        self.key = key
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
        self.default = default
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
    def match (self, value=None) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
            Match -> LabelValue
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
        # default?
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   276
        if value is None and self.default is not None :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   277
            return LabelValue(self, self.default, True)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
        # only non-empty values!
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
        elif value :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   281
            # test
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   282
            if not self.type.test(value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   283
                return False
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   284
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
            # convert with type
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   286
            value = self.type.parse(value)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   288
            return LabelValue(self, value, False)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
        return '{%s%s%s}' % (
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
            self.key, 
79
747554808944 start writing urltree tests
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   293
            (':%s' % (self.type_name, ) if self.type_name is not None else ''),
747554808944 start writing urltree tests
Tero Marttila <terom@fixme.fi>
parents: 62
diff changeset
   294
            '=%s' % (self.default, ) if self.default is not None else '',
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
        )
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   296
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   297
class URLType (object) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   298
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   299
        Handles the type-ness of values in the URL
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   300
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   301
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   302
    def test (self, value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   303
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   304
            Tests if the given value is valid for this type.
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   305
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   306
            Defaults to calling parse(), and returning False on errors, True otherwise
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   307
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   308
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   309
        try :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   310
            self.parse(value)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   311
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   312
        except :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   313
            return False
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   314
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   315
        else :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   316
            return True
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   317
    
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   318
    def parse (self, value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   319
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   320
            Parse the given value, which was tested earlier with test(), and return the value object
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   321
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   322
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   323
        abstract
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   324
    
58
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   325
    def append (self, old_value, value) :
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   326
        """
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   327
            Handle multiple values for this type, by combining the given old value and new value (both from parse).
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   328
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   329
            Defaults to raise an error
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   330
        """
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   331
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   332
        raise URLError("Multiple values for argument")
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   333
   
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   334
    def build (self, obj) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   335
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   336
            Reverse of parse(), return an url-value built from the given object
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   337
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   338
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   339
        abstract
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   340
58
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   341
    def build_multi (self, obj) :
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   342
        """
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   343
            Return a list of string values for the given object value (as from parse/append).
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   344
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   345
            Defaults to return [self.build(obj)]
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   346
        """
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   347
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   348
        return [self.build(obj)]
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   349
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   350
class URLStringType (URLType) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   351
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   352
        The default URLType, just plain strings.
80
94c493b7c046 start writing urltree tests
Tero Marttila <terom@fixme.fi>
parents: 79
diff changeset
   353
        
94c493b7c046 start writing urltree tests
Tero Marttila <terom@fixme.fi>
parents: 79
diff changeset
   354
        XXX: decodeing here, or elsewhere?
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   355
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   356
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   357
    def parse (self, value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   358
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   359
            Identitiy
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   360
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   361
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   362
        return value
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   363
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   364
    def build (self, obj) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   365
        return str(obj)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   366
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   367
class URLIntegerType (URLType) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   368
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   369
        A URLType for simple integers
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   370
    """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   371
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   372
    def __init__ (self, allow_negative=True, allow_zero=True, max=None) :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   373
        """
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   374
            Pass in allow_negative=False to disallow negative numbers, allow_zero=False to disallow zero, or non-zero
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   375
            max to specifiy maximum value
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   376
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   377
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   378
        self.allow_negative = allow_negative
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   379
        self.allow_zero = allow_zero
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   380
        self.max = max
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   381
    
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   382
    def _validate (self, value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   383
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   384
            Test to make sure value fits our criteria
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   385
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   386
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   387
        # negative?
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   388
        if not self.allow_negative and value < 0 :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   389
            raise ValueError("value is negative")
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   390
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   391
        # zero?
50
e4fbf480fbee change templates to remove all class/staticmethods, make Helpers a context-aware class, and fix defaults/URLIntegerType bugs in URLTree
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   392
        if not self.allow_zero and value == 0 :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   393
            raise ValueError("value is zero")
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   394
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   395
        # max?
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   396
        if self.max is not None and value > max :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   397
            raise ValueError("value is too large: %d" % value)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   398
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   399
        return value
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   400
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   401
    def parse (self, value) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   402
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   403
            Convert str -> int
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   404
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   405
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   406
        return self._validate(int(value))
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   407
    
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   408
    def build (self, obj) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   409
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   410
            Convert int -> str
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   411
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   412
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   413
        return unicode(self._validate(obj))
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   414
    
58
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   415
class URLListType (URLType) :
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   416
    """
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   417
        A list of strings
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   418
    """
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   419
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   420
    def parse (self, value) :
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   421
        return [value]
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   422
    
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   423
    def append (self, old_value, value) :
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   424
        return old_value + value
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   425
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   426
    def build_multi (self, obj) :
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   427
        return obj
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   428
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   429
class URLConfig (object) :
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   430
    """
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   431
        Global configuration relevant to all URLs. This can be used to construct a set of URLs and then create an
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   432
        URLTree out of them. Simply call the url_config() instace with the normal URL arguments (except, of course,
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   433
        config), and finally just pass the url_config to URLTree (it's iterable).
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   434
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   435
        XXX: rename to URLFactory?
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   436
    """
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   437
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   438
    # built-in type codes
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   439
    BUILTIN_TYPES = {
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   440
        # default - string
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   441
        None    : URLStringType(),
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   442
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   443
        # string
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   444
        'str'   : URLStringType(),
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   445
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   446
        # integer
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   447
        'int'   : URLIntegerType(),
58
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   448
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   449
        # list of strs
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   450
        'list'  : URLListType(),
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   451
    }
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   452
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   453
    def __init__ (self, type_dict=None, ignore_extra_args=True) :
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   454
        """
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   455
            Create an URLConfig for use with URL
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   456
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   457
            If type_dict is given, it should be a dict of { type_names: URLType }, and they will be available for
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   458
            type specifications in addition to the defaults. This will call type._init_name with the key, so do
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   459
            *not* initialize the name yourself.
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   460
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   461
            If ignore_extra_args is given, unrecognized query arguments will be ignored.
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   462
        """
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   463
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   464
        # build our type_dict
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   465
        self.type_dict = self.BUILTIN_TYPES.copy()
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   466
        
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   467
        # apply the given type_dict
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   468
        if type_dict :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   469
            # merge
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   470
            self.type_dict.update(type_dict)
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   471
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   472
        # init
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   473
        self.ignore_extra_args = ignore_extra_args
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   474
        self.urls = []
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   475
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   476
    def get_type (self, type_name=None) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   477
        """
49
9b097385b463 remove name from URLType, handle it separately in SimpleValueLabel + improve query argument handling
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   478
            Lookup an URLType by type_name, None for default.
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   479
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   480
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   481
        # lookup + return
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   482
        return self.type_dict[type_name]
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   483
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   484
    def __call__ (self, *args, **kwargs) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   485
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   486
            Return new URL object with this config and the given args, adding it to our list of urls
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   487
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   488
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   489
        # build
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   490
        url = URL(self, *args, **kwargs)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   491
        
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   492
        # store
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   493
        self.urls.append(url)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   494
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   495
        # return
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   496
        return url
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   497
    
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   498
    def __iter__ (self) :
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   499
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   500
            Returns all defined URLs
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   501
        """
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   502
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   503
        return iter(self.urls)
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   504
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   505
class URL (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   506
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   507
        Represents a specific URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   508
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   509
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   510
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   511
    def __init__ (self, config, url_mask, handler, **defaults) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   512
        """
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   513
            Create an URL using the given URLConfig, with the given url mask, handler, and default values.
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   514
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   515
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   516
        # store
41
9585441a4bfb working basic logs stuff
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   517
        self.config = config
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   518
        self.url_mask = url_mask
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   519
        self.handler = handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   520
        self.defaults = defaults
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   521
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   522
        # query string
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   523
        self.query_args = dict()
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   524
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   525
        # remove prepending root /
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   526
        url_mask = url_mask.lstrip('/')
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   527
        
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   528
        # parse any query string
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   529
        # XXX: conflicts with regexp syntax
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   530
        if '/?' in url_mask :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   531
            url_mask, query_mask = url_mask.split('/?')
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   532
        
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   533
        else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   534
            query_mask = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   535
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   536
        # build our label path
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   537
        self.label_path = [Label.parse(mask, defaults, config) for mask in url_mask.split('/')]
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   538
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   539
        # build our query args list
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   540
        if query_mask :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   541
            # split into items
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   542
            for query_item in query_mask.split('&') :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   543
                # parse default
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   544
                if '=' in query_item :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   545
                    query_item, default = query_item.split('=')
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   546
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   547
                else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   548
                    default = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   549
                
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   550
                # parse type
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   551
                if ':' in query_item :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   552
                    query_item, type = query_item.split(':')
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   553
                else :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   554
                    type = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   555
                
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   556
                # parse key
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   557
                key = query_item
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   558
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   559
                # type
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   560
                type = self.config.get_type(type)
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   561
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   562
                # add to query_args as (type, default) tuple
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   563
                self.query_args[key] = (type, type.parse(default) if default else default)
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   564
         
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   565
    def get_label_path (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   566
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   567
            Returns a list containing the labels in this url
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   568
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   569
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   570
        # copy self.label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   571
        return list(self.label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   572
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   573
    def execute (self, request, label_values) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   574
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   575
            Invoke the handler, using the given label values
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   576
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   577
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   578
        # start with the defaults
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   579
        kwargs = self.defaults.copy()
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   580
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   581
        # ...dict of those label values which are set to defaults
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   582
        default_labels = {}
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   583
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   584
        # then add all the values
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   585
        for label_value in label_values :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   586
            kwargs[label_value.label.key] = label_value.value
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   587
            
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   588
            # add key to default_values?
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   589
            if label_value.is_default :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   590
                default_labels[label_value.label.key] = label_value.label
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   591
       
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   592
        # then parse all query args
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   593
        for key, value in request.get_args() :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   594
            # lookup in our defined query args
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   595
            if key in self.query_args :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   596
                # lookup spec
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   597
                type, default = self.query_args[key]
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   598
            
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   599
            # override URL params if they were not given
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   600
            elif key in default_labels :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   601
                type, default = default_labels[key].type, None
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   602
            
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   603
            # be strict about extraneous query args?
52
2136cdc95b86 fix handling of unknown query args
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   604
            elif not self.config.ignore_extra_args :
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   605
                raise URLError("Unrecognized query argument: %r" % (key, ))
52
2136cdc95b86 fix handling of unknown query args
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   606
            
2136cdc95b86 fix handling of unknown query args
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   607
            # ignore
2136cdc95b86 fix handling of unknown query args
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   608
            else :
2136cdc95b86 fix handling of unknown query args
Tero Marttila <terom@fixme.fi>
parents: 51
diff changeset
   609
                continue
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   610
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   611
            # normalize empty value to None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   612
            if not value :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   613
                value = None
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   614
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   615
            else :
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   616
                # parse value
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   617
                value = type.parse(value)
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   618
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   619
            # set default?
56
dfb1c755e972 fix bug with zero values in query args
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
   620
            if value is None :
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   621
                if default :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   622
                    value = default
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   623
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   624
                if default == '' :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   625
                    # do not pass key at all
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   626
                    continue
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   627
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   628
                # otherwise, fail
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   629
                raise URLError("No value given for required argument: %r" % (key, ))
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   630
            
62
4c96d431336f fix bug with query-args for labels with default values
Tero Marttila <terom@fixme.fi>
parents: 60
diff changeset
   631
            # already have a non-default value?
4c96d431336f fix bug with query-args for labels with default values
Tero Marttila <terom@fixme.fi>
parents: 60
diff changeset
   632
            if key in kwargs and key not in default_labels :
58
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   633
                # append to old value
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   634
                kwargs[key] = type.append(kwargs[key], value)
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   635
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   636
            else :
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   637
                # set key
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   638
                kwargs[key] = value
43
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   639
        
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   640
        # then check all query args
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   641
        for key, (type, default) in self.query_args.iteritems() :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   642
            # skip those already present
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   643
            if key in kwargs :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   644
                continue
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   645
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   646
            # apply default?
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   647
            if default is None :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   648
                raise URLError("Missing required argument: %r" % (key, ))
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   649
            
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   650
            elif default == '' :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   651
                # skip empty default
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   652
                continue
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   653
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   654
            else :
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   655
                # set default
fc11c4e86a82 implement channel_view count, the query stuff, css, layout all need some cleanup :(
Tero Marttila <terom@fixme.fi>
parents: 42
diff changeset
   656
                kwargs[key] = default
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   657
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   658
        # execute the handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   659
        return self.handler(request, **kwargs)
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   660
    
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   661
    def build (self, request, **values) :
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   662
        """
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   663
            Build an absolute URL pointing to this target, with the given values. Default values are left off if they
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   664
            are at the end of the URL.
54
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   665
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   666
            Values given as None are ignored.
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   667
        """
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   668
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   669
        # collect segments as a list of (is_default, segment) values
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   670
        segments = [(False, request.page_prefix)] + [label.build_default(values) for label in self.label_path]
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   671
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   672
        # trim default items off the end
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   673
        for is_default, segment in segments[::-1] :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   674
            if is_default :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   675
                segments.pop(-1)
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   676
            
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   677
            else :
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   678
                break
42
5a72c00c4ae4 more fiddling around with the irclogs layout/css, add query args to URL
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
   679
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   680
        assert segments
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   681
        
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   682
        # join
54
3fa90f00c0c4 implement handling of None values to URL.build
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
   683
        url = '/'.join(segment for is_default, segment in segments if segment is not None)
53
01429f140b06 add query args to build() urls if needed
Tero Marttila <terom@fixme.fi>
parents: 52
diff changeset
   684
        
58
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   685
        # build query args as { key -> [value] }
a4261592020a support empty defaults for labels, and add a URLListType for use with query strings
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
   686
        query_args = dict((key, type.build_multi(values[key])) for key, (type, default) in self.query_args.iteritems() if key in values and values[key] is not None)
53
01429f140b06 add query args to build() urls if needed
Tero Marttila <terom@fixme.fi>
parents: 52
diff changeset
   687
59
3b9a95c333e5 fix combinatorical issue
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   688
        return "%s%s" % (url, '?%s' % ('&'.join('%s=%s' % (key, value) for key, values in query_args.iteritems() for value in values)) if query_args else '')
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   689
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   690
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   691
        return '/'.join(str(label) for label in self.label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   692
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   693
    def __repr__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   694
        return "URL(%r, %r)" % (str(self), self.handler)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   695
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   696
class URLNode (object) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   697
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   698
        Represents a node in the URLTree
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   699
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   700
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   701
    def __init__ (self, parent, label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   702
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   703
            Initialize with the given parent and label, empty children dict
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   704
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   705
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   706
        # the parent URLNode
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   707
        self.parent = parent
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   708
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   709
        # this node's Label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   710
        self.label = label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   711
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   712
        # list of child URLNodes
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   713
        self.children = []
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   714
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   715
        # this node's URL, set by add_url for an empty label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   716
        self.url = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   717
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   718
    def _build_child (self, label) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   719
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   720
            Build, insert and return a new child Node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   721
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   722
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   723
        # build new child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   724
        child = URLNode(self, label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   725
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   726
        # add to children
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   727
        self.children.append(child)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   728
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   729
        # return
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   730
        return child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   731
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   732
    def add_url (self, url, label_path) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   733
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   734
            Add a URL object to this node under the given path. Uses recursion to process the path.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   735
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   736
            The label_path argument is a (partial) label path as returned by URL.get_label_path.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   737
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   738
            If label_path is empty (len zero, or begins with EmptyLabel), then the given url is assigned to this node, if no
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   739
            url was assigned before.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   740
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   741
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   742
        # matches this node?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   743
        if not label_path or isinstance(label_path[0], EmptyLabel) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   744
            if self.url :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   745
                raise URLError(url, "node already defined")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   746
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   747
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   748
                # set
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   749
                self.url = url
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   750
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   751
        else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   752
            # pop child label from label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   753
            child_label = label_path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   754
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   755
            # look for the child to recurse into
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   756
            child = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   757
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   758
            # look for an existing child with that label
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   759
            for child in self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   760
                if child.label == child_label :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   761
                    # found, use this
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   762
                    break
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   763
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   764
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   765
                # build a new child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   766
                child = self._build_child(child_label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   767
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   768
            # recurse to handle the rest of the label_path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   769
            child.add_url(url, label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   770
    
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   771
    def match (self, label_path) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   772
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   773
            Locate the URL object corresponding to the given label_path value under this node.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   774
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   775
            Returns a (url, label_values) tuple
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   776
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   777
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   778
        # determine value to use
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   779
        value = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   780
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   781
        # empty label_path?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   782
        if not label_path or label_path[0] == '' :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   783
            # the search ends at this node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   784
            if self.url :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   785
                # this URL is the best match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   786
                return (self.url, [])
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   787
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   788
            elif not self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   789
                # incomplete URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   790
                raise URLError("no URL handler defined for this Node")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   791
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   792
            else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   793
                # use default value, i.e. Label.match(None)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   794
                label = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   795
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   796
        else :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   797
            # pop the next label from the label path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   798
            label = label_path.pop(0)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   799
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   800
        # return one match...
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   801
        match = value = None
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   802
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   803
        # recurse through our children, DFS
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   804
        for child in self.children :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   805
            # match value
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   806
            value = child.label.match(label)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   807
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   808
            # skip those that don't match at all
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   809
            if not value :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   810
                continue;
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   811
            
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   812
            # already found a match? :/
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   813
            if match :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   814
                raise URLError("Ambiguous URL")
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   815
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   816
            # ok, but continue looking to make sure there's no ambiguous URLs
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   817
            match = child
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   818
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   819
        # found something?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   820
        if not match :
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   821
            raise URLError("No child found for label: %s + %s + %s" % (self.get_url(), label, '/'.join(str(l) for l in label_path)))
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   822
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   823
        # ok, recurse into the match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   824
        url, label_value = match.match(label_path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   825
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   826
        # add our value?
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   827
        if isinstance(value, LabelValue) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   828
            label_value.append(value)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   829
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   830
        # return the match
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   831
        return url, label_value
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   832
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   833
    def get_url (self) :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   834
        """
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   835
            Returns the URL for this node, by iterating over our parents
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   836
        """
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   837
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   838
        # URL segments in reverse order
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   839
        segments = ['']
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   840
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   841
        # start with ourself
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   842
        node = self
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   843
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   844
        # iterate up to root
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   845
        while node :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   846
            segments.append(str(node.label))
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   847
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   848
            node = node.parent
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   849
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   850
        # reverse
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   851
        segments.reverse()
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   852
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   853
        # return
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   854
        return '/'.join(segments)
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   855
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   856
    def dump (self, indent=0) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   857
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   858
            Returns a multi-line string representation of this Node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   859
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   860
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   861
        return '\n'.join([
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   862
            "%-45s%s" % (
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   863
                ' '*indent + str(self.label) + ('/' if self.children else ''), 
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   864
                (' -> %r' % self.url) if self.url else ''
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   865
            )
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   866
        ] + [
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   867
            child.dump(indent + 4) for child in self.children
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   868
        ])
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   869
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   870
    def __str__ (self) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   871
        return "%s/[%s]" % (self.label, ','.join(str(child) for child in self.children))
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   872
60
616ab1e5b593 remove unused map.py
Tero Marttila <terom@fixme.fi>
parents: 59
diff changeset
   873
class URLTree (handler.RequestHandler) :
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   874
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   875
        Map requests to handlers, using a defined tree of URLs
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   876
    """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   877
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   878
    def __init__ (self, url_list) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   879
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   880
            Initialize the tree using the given list of URLs
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   881
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   882
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   883
        # root node
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   884
        self.root = URLNode(None, EmptyLabel())
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   885
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   886
        # just add each URL
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   887
        for url in url_list :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   888
            self.add_url(url)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   889
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   890
    def add_url (self, url) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   891
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   892
            Adds the given URL to the tree. The URL must begin with a root slash.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   893
        """
51
a1da82870a6b implement better handling of generated URLs with default values, and let default values in urls be overriden by query arguments
Tero Marttila <terom@fixme.fi>
parents: 50
diff changeset
   894
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   895
        # get url's label path
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   896
        path = url.get_label_path()
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   897
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   898
        # add to root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   899
        self.root.add_url(url, path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   900
        
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   901
    def match (self, url) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   902
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   903
            Find the URL object best corresponding to the given url, matching any ValueLabels.
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   904
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   905
            Returns an (URL, [LabelValue]) tuple.
47
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   906
99c45fc13edc improved URLTree types (URLType), helpers.escape
Tero Marttila <terom@fixme.fi>
parents: 46
diff changeset
   907
            XXX: handle unicode on URLs
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   908
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   909
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   910
        # split it into labels
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   911
        path = url.split('/')
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   912
        
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   913
        # empty URL is empty
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   914
        if url :
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   915
            # ensure that it doesn't start with a /
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   916
            assert not self.root.label.match(path[0]), "URL must not begin with root"
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   917
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   918
        # just match starting at root
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   919
        return self.root.match(path)
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   920
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   921
    def handle_request (self, request) :
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   922
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   923
            Looks up the request's URL, and invokes its handler
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   924
        """
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   925
        
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   926
        # get the requested URL
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   927
        request_url = request.get_page_name()
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   928
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   929
        # find the URL+values to use
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   930
        url, label_values = self.match(request_url)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   931
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   932
        # let the URL handle it
40
71ab68f31a1c the handlers work now
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
   933
        return url.execute(request, label_values)
39
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   934
82df0bb66ca7 split off to urltree.py, and add support for types
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   935