Beispiel #1
0
    def _find_groups(self) -> Tuple[Optional[str], Optional[int]]:
        """Returns a tuple (reverse string, group count) for a url.

        For example: Given the url pattern /([0-9]{4})/([a-z-]+)/, this method
        would return ('/%s/%s/', 2).
        """
        pattern = self.regex.pattern
        if pattern.startswith("^"):
            pattern = pattern[1:]
        if pattern.endswith("$"):
            pattern = pattern[:-1]

        if self.regex.groups != pattern.count("("):
            # The pattern is too complicated for our simplistic matching,
            # so we can't support reversing it.
            return None, None

        pieces = []
        for fragment in pattern.split("("):
            if ")" in fragment:
                paren_loc = fragment.index(")")
                if paren_loc >= 0:
                    pieces.append("%s" + fragment[paren_loc + 1:])
            else:
                try:
                    unescaped_fragment = re_unescape(fragment)
                except ValueError:
                    # If we can't unescape part of it, we can't
                    # reverse this url.
                    return (None, None)
                pieces.append(unescaped_fragment)

        return "".join(pieces), self.regex.groups
Beispiel #2
0
def _find_groups(url):
    """Returns a tuple (reverse string, group count) for a url.

    For example: Given the url pattern /([0-9]{4})/([a-z-]+)/, this method
    would return ('/%s/%s/', 2).
    """
    regex = re.compile(url)
    pattern = url
    if pattern.startswith('^'):
        pattern = pattern[1:]
    if pattern.endswith('$'):
        pattern = pattern[:-1]

    if regex.groups != pattern.count('('):
        # The pattern is too complicated for our simplistic matching,
        # so we can't support reversing it.
        return None, None

    pieces = []
    for fragment in pattern.split('('):
        if ')' in fragment:
            paren_loc = fragment.index(')')
            if paren_loc >= 0:
                pieces.append('%s' + fragment[paren_loc + 1:])
        else:
            try:
                unescaped_fragment = re_unescape(fragment)
            except ValueError:
                # If we can't unescape part of it, we can't
                # reverse this url.
                return (None, None)
            pieces.append(unescaped_fragment)
    return ''.join(pieces), regex.groups
Beispiel #3
0
    def _find_groups(self) -> Tuple[Optional[str], Optional[int]]:
        """Returns a tuple (reverse string, group count) for a url.

        For example: Given the url pattern /([0-9]{4})/([a-z-]+)/, this method
        would return ('/%s/%s/', 2).
        """
        pattern = self.regex.pattern
        if pattern.startswith("^"):
            pattern = pattern[1:]
        if pattern.endswith("$"):
            pattern = pattern[:-1]

        if self.regex.groups != pattern.count("("):
            # The pattern is too complicated for our simplistic matching,
            # so we can't support reversing it.
            return None, None

        pieces = []
        for fragment in pattern.split("("):
            if ")" in fragment:
                paren_loc = fragment.index(")")
                if paren_loc >= 0:
                    pieces.append("%s" + fragment[paren_loc + 1 :])
            else:
                try:
                    unescaped_fragment = re_unescape(fragment)
                except ValueError:
                    # If we can't unescape part of it, we can't
                    # reverse this url.
                    return (None, None)
                pieces.append(unescaped_fragment)

        return "".join(pieces), self.regex.groups
Beispiel #4
0
 def test_re_unescape(self):
     test_strings = (
         '/favicon.ico',
         'index.html',
         'Hello, World!',
         '!$@#%;',
     )
     for string in test_strings:
         self.assertEqual(string, re_unescape(re.escape(string)))
Beispiel #5
0
 def test_re_unescape(self):
     test_strings = (
         '/favicon.ico',
         'index.html',
         'Hello, World!',
         '!$@#%;',
     )
     for string in test_strings:
         self.assertEqual(string, re_unescape(re.escape(string)))
Beispiel #6
0
 def test_re_unescape_raises_error_on_invalid_input(self):
     with self.assertRaises(ValueError):
         re_unescape('\\d')
     with self.assertRaises(ValueError):
         re_unescape('\\b')
     with self.assertRaises(ValueError):
         re_unescape('\\Z')
Beispiel #7
0
 def test_re_unescape_raises_error_on_invalid_input(self):
     with self.assertRaises(ValueError):
         re_unescape("\\d")
     with self.assertRaises(ValueError):
         re_unescape("\\b")
     with self.assertRaises(ValueError):
         re_unescape("\\Z")
Beispiel #8
0
 def test_re_unescape(self):
     test_strings = ("/favicon.ico", "statistics.html", "Hello, World!",
                     "!$@#%;")
     for string in test_strings:
         self.assertEqual(string, re_unescape(re.escape(string)))
Beispiel #9
0
 def test_re_unescape(self):
     test_strings = ("/favicon.ico", "index.html", "Hello, World!", "!$@#%;")
     for string in test_strings:
         self.assertEqual(string, re_unescape(re.escape(string)))