#2977: Better handling of regular expressions for reverse urlresolver
---------------------------+------------------------------------------------
   Reporter:  SmileyChris  |                Owner:  nobody        
     Status:  new          |            Component:  Core framework
    Version:               |           Resolution:                
   Keywords:               |                Stage:  Accepted      
  Has_patch:  1            |           Needs_docs:  0             
Needs_tests:  0            |   Needs_better_patch:  1             
---------------------------+------------------------------------------------
Changes (by Matthew Flanagan <[EMAIL PROTECTED]>):

 * cc: [EMAIL PROTECTED] (added)
  * needs_better_patch:  0 => 1

Comment:

 this patch does not work for me. Even after manually applying it to latest
 trunk it fails with the following complex regexp:

 {{{
 IP4_RE =
 r'(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}'
 IP6_HEX_RE = r'(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}'
 IP6_HEX_COMPRESSED_RE = r'((?:[0-9A-Fa-f]{1,4}(?::[0-9A-
 Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)'
 IP6_IP4_COMPAT_RE = r'((?:[0-9A-
 
Fa-f]{1,4}:){6,6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}'
 IP6_IP4_COMPAT_COMPRESSED_RE = r'((?:[0-9A-Fa-f]{1,4}(?::[0-9A-
 Fa-f]{1,4})*)?)::((?:[0-9A-
 
Fa-f]{1,4}:)*)(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}'
 IP6_RE = '%s|%s|%s|%s' % (IP6_HEX_RE, IP6_HEX_COMPRESSED_RE,
     IP6_IP4_COMPAT_RE, IP6_IP4_COMPAT_COMPRESSED_RE)
 IP6_RE_COMPILED = re.compile('^(%s|%s|%s|%s)$' % (IP6_HEX_RE,
     IP6_HEX_COMPRESSED_RE, IP6_IP4_COMPAT_RE,
 IP6_IP4_COMPAT_COMPRESSED_RE))
 IP_RE = "(%s|%s)" % (IP4_RE, IP6_RE)


 urlpatterns = patterns('',
     url(r'^(?P<ipsupernetwork>%s)/$' % IP_RE, ipnetwork_list,
 IPNETWORK_LIST,
         name='ipnetwork_list'),

 )
 }}}

 Running django.core.urlresolvers.reverse results in:

 {{{
 In [6]: reverse('ipnetwork_list', urlconf='nong.ip.urls',args=(),
 kwargs={'ipsupernetwork': '10.0.0.0'})
 ---------------------------------------------------------------------------
 sre_constants.error                                     Traceback (most
 recent call last)

 /srv/dev/mpf/nong/third-party/django/tests/<ipython console>

 /srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
 reverse(viewname, urlconf, args, kwargs)
     399 def reverse(viewname, urlconf=None, args=None, kwargs=None):
     400     args = args or []
     401     kwargs = kwargs or {}
 --> 402     return iri_to_uri(u'/' +
 get_resolver(urlconf).reverse(viewname, *args, **kwargs))
     403

 /srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
 reverse(self, lookup_view, *args, **kwargs)
     383         except (ImportError, AttributeError):
     384             raise NoReverseMatch
 --> 385         if lookup_view in self.reverse_dict:
     386             return u''.join([reverse_helper(part.regex, *args,
 **kwargs) for part in self.reverse_dict[lookup_view]])
     387         raise NoReverseMatch

 /srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
 _get_reverse_dict(self)
     317
     318     def _get_reverse_dict(self):
 --> 319         if not self._reverse_dict and hasattr(self.urlconf_module,
 'urlpatterns'):
     320             for pattern in
 reversed(self.urlconf_module.urlpatterns):
     321                 if isinstance(pattern, RegexURLResolver):

 /srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
 _get_urlconf_module(self)
     353         except AttributeError:
     354             try:
 --> 355                 self._urlconf_module =
 __import__(self.urlconf_name, {}, {}, [''])
     356             except ValueError, e:
     357                 # Invalid urlconf_name, such as "foo.bar." (note
 trailing period)

 /srv/dev/mpf/nong/third-party/django/tests/nong/ip/urls.py
      13     (r'^url_tag/', include('regressiontests.templates.urls')),
      14
      15     # django built-in views
      16     (r'^views/', include('regressiontests.views.urls')),
      17 )

 /srv/dev/mpf/nong/third-party/django/django/conf/urls/defaults.py in
 url(regex, view, kwargs, name, prefix)
      28                 raise ImproperlyConfigured('Empty URL pattern view
 name not permitted (for pattern %r)' % regex)
      29             if prefix:
      30                 view = prefix + '.' + view
 ---> 31         return RegexURLPattern(regex, view, kwargs, name)
      32

 /srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
 __init__(self, regex, callback, default_args, name)
     239         # callable object (view).
     240         self.regex = re.compile(regex, re.UNICODE)
 --> 241         self.reverse_regex_lookup = ReverseRegexLookup(regex)
     242         if callable(callback):
     243             self._callback = callback

 /srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
 __init__(self, text)
     194 class ReverseRegexLookup(object):
     195     def __init__(self, text):
 --> 196         self.tokens, self.minimum_arguments, self.error =
 tokenize(text)
     197
     198     def check(self, args=[], kwargs={}):

 /srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
 tokenize(text)
     179         if isinstance(bit, list):
     180             # Build the regex here so it only has to be compiled
 once.
 --> 181             bit = re.compile('%s$' % build_re(bit))
     182             count += 1
     183         else:

 /usr/local/lib/python2.4/sre.py in compile(pattern, flags)
     178 def compile(pattern, flags=0):
     179     "Compile a regular expression pattern, returning a pattern
 object."
 --> 180     return _compile(pattern, flags)
     181
     182 def purge():

 /usr/local/lib/python2.4/sre.py in _compile(*key)
     225         p = sre_compile.compile(pattern, flags)
     226     except error, v:
 --> 227         raise error, v # invalid expression
     228     if len(_cache) >= _MAXCACHE:
     229         _cache.clear()

 error: multiple repeat
 }}}

-- 
Ticket URL: <http://code.djangoproject.com/ticket/2977#comment:22>
Django Code <http://code.djangoproject.com/>
The web framework for perfectionists with deadlines
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to