21
21
class UnhexMixin :
22
22
def to_url (self , value , length = None ):
23
23
length = length if length else self .length
24
+
24
25
def f (v ):
25
- v = '{:0>{length}}' .format (v [- (length ):], length = length )
26
+ v = '{:0>{length}}' .format (v [- (length ):], length = length )
26
27
return urlsafe_b64encode (unhexlify (v )).decode ('utf-8' )
27
28
28
29
if isinstance (value , str ):
@@ -31,11 +32,13 @@ def f(v):
31
32
ext = path .splitext (filename )[1 ] if filename else ''
32
33
return '{}{}' .format (f (sid ), ext )
33
34
35
+
34
36
class SREMixin :
35
37
def to_python (self , value ):
36
38
name , label = self .sre .match (value ).groups ()
37
39
return label , name
38
40
41
+
39
42
class SIDConverter (UnhexMixin , BaseConverter ):
40
43
def __init__ (self , map , length ):
41
44
super ().__init__ (map )
@@ -53,6 +56,7 @@ def to_python(self, value):
53
56
_hex = None
54
57
return _hex , name , value [:4 ]
55
58
59
+
56
60
class SHA1Converter (UnhexMixin , SREMixin , BaseConverter ):
57
61
regex = '(([A-Za-z0-9]{40})(?:[.][^/]*)?)'
58
62
@@ -61,6 +65,7 @@ def __init__(self, map):
61
65
self .sre = re .compile (self .regex )
62
66
self .length = 42
63
67
68
+
64
69
class LabelConverter (SREMixin , BaseConverter ):
65
70
regex = '(((?:~[^/.]+)|(?:[^/.]{1}))(?:[.][^/]*)?)'
66
71
@@ -75,6 +80,7 @@ def to_url(self, value, length=None):
75
80
ext = path .splitext (filename )[1 ] if filename else ''
76
81
return '{}{}' .format (label , ext )
77
82
83
+
78
84
class NamespaceConverter (LabelConverter ):
79
85
regex = '(([^/.]*)(?:[.][^/]*)?)'
80
86
weight = 120
0 commit comments