@@ -147,18 +147,28 @@ def exclude(name):
147147 if re .search (pat , name ):
148148 return True
149149 return False
150+ def append (res , p0 , p1 , item ):
151+ if p1 .startswith ("^" ):
152+ res .append ((p0 + p1 [1 :], item ))
153+ else :
154+ res .append ((item .p0 + ".*" + p1 , item ))
150155 if not hasattr (module , 'urlpatterns' ):
151156 return []
152157 res = []
153158 for item in module .urlpatterns :
154- if isinstance (item , RegexURLResolver ) and not type (item .urlconf_module ) is list :
155- if include (item .urlconf_module .__name__ ) and not exclude (item .regex .pattern ):
156- subpatterns = get_url_patterns (item .urlconf_module )
157- for sub , subitem in subpatterns :
158- if sub .startswith ("^" ):
159- res .append ((item .regex .pattern + sub [1 :], subitem ))
159+ if isinstance (item , RegexURLResolver ):
160+ if type (item .urlconf_module ) is list :
161+ for subitem in item .urlconf_module :
162+ if isinstance (subitem , RegexURLResolver ):
163+ res += get_url_patterns (subitem .urlconf_module )
160164 else :
161- res .append ((item .regex .pattern + ".*" + sub , subitem ))
165+ sub = subitem .regex .pattern
166+ append (res , item .regex .pattern , subitem .regex .pattern , subitem )
167+ else :
168+ if include (item .urlconf_module .__name__ ) and not exclude (item .regex .pattern ):
169+ subpatterns = get_url_patterns (item .urlconf_module )
170+ for sub , subitem in subpatterns :
171+ append (res , item .regex .pattern , sub , subitem )
162172 else :
163173 res .append ((item .regex .pattern , item ))
164174 return res
@@ -287,6 +297,7 @@ def template_coverage_test(self):
287297 self .runner .coverage_data ["template" ] = {
288298 "coverage" : (1.0 * len (covered )/ len (all )) if len (all )> 0 else float ('nan' ),
289299 "covered" : dict ( (k , k in covered ) for k in all ),
300+ "format" : 1 ,
290301 }
291302 self .report_test_result ("template" )
292303 else :
@@ -296,30 +307,32 @@ def url_coverage_test(self):
296307 if self .runner .check_coverage :
297308 import ietf .urls
298309 url_patterns = get_url_patterns (ietf .urls , self .runner .test_apps )
310+ #debug.pprint('[ r for r,p in url_patterns]')
299311
300312 # skip some patterns that we don't bother with
301313 def ignore_pattern (regex , pattern ):
302314 import django .views .static
303315 return (regex in ("^_test500/$" , "^accounts/testemail/$" )
304316 or regex .startswith ("^admin/" )
317+ or re .search ('^api/v1/[^/]+/[^/]+/' , regex )
305318 or getattr (pattern .callback , "__name__" , "" ) == "RedirectView"
306319 or getattr (pattern .callback , "__name__" , "" ) == "TemplateView"
307320 or pattern .callback == django .views .static .serve )
308321
309- patterns = [(regex , re .compile (regex , re .U )) for regex , pattern in url_patterns
310- if not ignore_pattern (regex , pattern )]
311- all = [ regex for regex , compiled in patterns ]
322+ patterns = [(regex , re .compile (regex , re .U ), obj ) for regex , obj in url_patterns
323+ if not ignore_pattern (regex , obj )]
312324
313325 covered = set ()
314326 for url in visited_urls :
315- for regex , compiled in patterns :
327+ for regex , compiled , obj in patterns :
316328 if regex not in covered and compiled .match (url [1 :]): # strip leading /
317329 covered .add (regex )
318330 break
319331
320332 self .runner .coverage_data ["url" ] = {
321- "coverage" : 1.0 * len (covered )/ len (all ),
322- "covered" : dict ( (k , k in covered ) for k in all ),
333+ "coverage" : 1.0 * len (covered )/ len (patterns ),
334+ "covered" : dict ( (k , (o .lookup_str , k in covered )) for k ,p ,o in patterns ),
335+ "format" : 4 ,
323336 }
324337
325338 self .report_test_result ("url" )
@@ -475,7 +488,7 @@ def setup_test_environment(self, **kwargs):
475488 "url" : {
476489 "coverage" : 0.0 ,
477490 "covered" : {},
478- "format" : 1 ,
491+ "format" : 4 ,
479492 },
480493 "code" : {
481494 "coverage" : 0.0 ,
0 commit comments