Hello community, here is the log from the commit of package python-Routes for openSUSE:Factory checked in at 2016-06-07 23:49:23 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-Routes (Old) and /work/SRC/openSUSE:Factory/.python-Routes.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-Routes" Changes: -------- --- /work/SRC/openSUSE:Factory/python-Routes/python-Routes.changes 2015-08-10 09:16:41.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-Routes.new/python-Routes.changes 2016-06-07 23:49:24.000000000 +0200 @@ -1,0 +2,20 @@ +Fri Jun 3 15:51:22 UTC 2016 - [email protected] + +- update to 2.3.1: + * Backwards compatability fix - connect should work with mandatory + routename and optional path. Patch by Davanum Srinivas (PR #65). + * Fix sub_domain equivalence check. Patch by Nikita Uvarov + * Add support for protocol-relative URLs generation (i.e. starting with double + slash ``//``). PR #60. Patch by Sviatoslav Sydorenko. + * Add support for the ``middleware`` extra requirement, making possible to + depend on ``webob`` optionally. PR #59. Patch by Sviatoslav Sydorenko. + * Fix matching of an empty string route, which led to exception in earlier + versions. PR #58. Patch by Sviatoslav Sydorenko. + * Add support for the ``requirements`` option when using + mapper.resource to create routes. PR #57. Patch by Sean Dague. + * Concatenation fix when using submappers with path prefixes. Multiple + submappers combined the path prefix inside the controller argument in + non-obvious ways. The controller argument will now be properly carried + through when using submappers. PR #28. + +------------------------------------------------------------------- Old: ---- Routes-2.2.tar.gz New: ---- Routes-2.3.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-Routes.spec ++++++ --- /var/tmp/diff_new_pack.UgwVJN/_old 2016-06-07 23:49:25.000000000 +0200 +++ /var/tmp/diff_new_pack.UgwVJN/_new 2016-06-07 23:49:25.000000000 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-Routes # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: python-Routes -Version: 2.2 +Version: 2.3.1 Release: 0 Url: http://routes.groovie.org/ Summary: Routing Recognition and Generation Tools ++++++ Routes-2.2.tar.gz -> Routes-2.3.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/CHANGELOG.rst new/Routes-2.3.1/CHANGELOG.rst --- old/Routes-2.2/CHANGELOG.rst 2015-07-22 06:42:41.000000000 +0200 +++ new/Routes-2.3.1/CHANGELOG.rst 2016-03-30 16:58:46.000000000 +0200 @@ -1,6 +1,27 @@ Routes Changelog %%%%%%%%%%%%%%%% +Release 2.3.1 (March 30, 2016) +============================== +* Backwards compatability fix - connect should work with mandatory + routename and optional path. Patch by Davanum Srinivas (PR #65). + +Release 2.3 (March 28, 2016) +============================ +* Fix sub_domain equivalence check. Patch by Nikita Uvarov +* Add support for protocol-relative URLs generation (i.e. starting with double + slash ``//``). PR #60. Patch by Sviatoslav Sydorenko. +* Add support for the ``middleware`` extra requirement, making possible to + depend on ``webob`` optionally. PR #59. Patch by Sviatoslav Sydorenko. +* Fix matching of an empty string route, which led to exception in earlier + versions. PR #58. Patch by Sviatoslav Sydorenko. +* Add support for the ``requirements`` option when using + mapper.resource to create routes. PR #57. Patch by Sean Dague. +* Concatenation fix when using submappers with path prefixes. Multiple + submappers combined the path prefix inside the controller argument in + non-obvious ways. The controller argument will now be properly carried + through when using submappers. PR #28. + Release 2.2 (July 21, 2015) =========================== * Fix Python 3 support. Patch by Victor Stinner. @@ -418,7 +439,7 @@ Or:: - from routes import request_confg, Mapper + from routes import request_config, Mapper The following names are available for importing from routes:: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/LICENSE.txt new/Routes-2.3.1/LICENSE.txt --- old/Routes-2.2/LICENSE.txt 2015-07-22 06:40:34.000000000 +0200 +++ new/Routes-2.3.1/LICENSE.txt 2016-03-30 16:54:49.000000000 +0200 @@ -1,4 +1,4 @@ -Copyright (c) 2005-2015 Ben Bangert <[email protected]> +Copyright (c) 2005-2016 Ben Bangert <[email protected]> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/PKG-INFO new/Routes-2.3.1/PKG-INFO --- old/Routes-2.2/PKG-INFO 2015-07-22 06:44:43.000000000 +0200 +++ new/Routes-2.3.1/PKG-INFO 2016-03-30 17:02:17.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: Routes -Version: 2.2 +Version: 2.3.1 Summary: Routing Recognition and Generation Tools Home-page: http://routes.readthedocs.org/ Author: Ben Bangert @@ -24,6 +24,27 @@ Routes Changelog %%%%%%%%%%%%%%%% + Release 2.3.1 (March 30, 2016) + ============================== + * Backwards compatability fix - connect should work with mandatory + routename and optional path. Patch by Davanum Srinivas (PR #65). + + Release 2.3 (March 28, 2016) + ============================ + * Fix sub_domain equivalence check. Patch by Nikita Uvarov + * Add support for protocol-relative URLs generation (i.e. starting with double + slash ``//``). PR #60. Patch by Sviatoslav Sydorenko. + * Add support for the ``middleware`` extra requirement, making possible to + depend on ``webob`` optionally. PR #59. Patch by Sviatoslav Sydorenko. + * Fix matching of an empty string route, which led to exception in earlier + versions. PR #58. Patch by Sviatoslav Sydorenko. + * Add support for the ``requirements`` option when using + mapper.resource to create routes. PR #57. Patch by Sean Dague. + * Concatenation fix when using submappers with path prefixes. Multiple + submappers combined the path prefix inside the controller argument in + non-obvious ways. The controller argument will now be properly carried + through when using submappers. PR #28. + Release 2.2 (July 21, 2015) =========================== * Fix Python 3 support. Patch by Victor Stinner. @@ -441,7 +462,7 @@ Or:: - from routes import request_confg, Mapper + from routes import request_config, Mapper The following names are available for importing from routes:: @@ -483,3 +504,4 @@ Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/Routes.egg-info/PKG-INFO new/Routes-2.3.1/Routes.egg-info/PKG-INFO --- old/Routes-2.2/Routes.egg-info/PKG-INFO 2015-07-22 06:44:43.000000000 +0200 +++ new/Routes-2.3.1/Routes.egg-info/PKG-INFO 2016-03-30 17:02:17.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: Routes -Version: 2.2 +Version: 2.3.1 Summary: Routing Recognition and Generation Tools Home-page: http://routes.readthedocs.org/ Author: Ben Bangert @@ -24,6 +24,27 @@ Routes Changelog %%%%%%%%%%%%%%%% + Release 2.3.1 (March 30, 2016) + ============================== + * Backwards compatability fix - connect should work with mandatory + routename and optional path. Patch by Davanum Srinivas (PR #65). + + Release 2.3 (March 28, 2016) + ============================ + * Fix sub_domain equivalence check. Patch by Nikita Uvarov + * Add support for protocol-relative URLs generation (i.e. starting with double + slash ``//``). PR #60. Patch by Sviatoslav Sydorenko. + * Add support for the ``middleware`` extra requirement, making possible to + depend on ``webob`` optionally. PR #59. Patch by Sviatoslav Sydorenko. + * Fix matching of an empty string route, which led to exception in earlier + versions. PR #58. Patch by Sviatoslav Sydorenko. + * Add support for the ``requirements`` option when using + mapper.resource to create routes. PR #57. Patch by Sean Dague. + * Concatenation fix when using submappers with path prefixes. Multiple + submappers combined the path prefix inside the controller argument in + non-obvious ways. The controller argument will now be properly carried + through when using submappers. PR #28. + Release 2.2 (July 21, 2015) =========================== * Fix Python 3 support. Patch by Victor Stinner. @@ -441,7 +462,7 @@ Or:: - from routes import request_confg, Mapper + from routes import request_config, Mapper The following names are available for importing from routes:: @@ -483,3 +504,4 @@ Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/Routes.egg-info/requires.txt new/Routes-2.3.1/Routes.egg-info/requires.txt --- old/Routes-2.2/Routes.egg-info/requires.txt 2015-07-22 06:44:43.000000000 +0200 +++ new/Routes-2.3.1/Routes.egg-info/requires.txt 2016-03-30 17:02:17.000000000 +0200 @@ -1,2 +1,5 @@ six -repoze.lru>=0.3 \ No newline at end of file +repoze.lru>=0.3 + +[middleware] +webob \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/docs/conf.py new/Routes-2.3.1/docs/conf.py --- old/Routes-2.2/docs/conf.py 2015-07-22 06:41:30.000000000 +0200 +++ new/Routes-2.3.1/docs/conf.py 2016-03-30 16:54:28.000000000 +0200 @@ -36,15 +36,15 @@ # General substitutions. project = 'Routes' -copyright = '2005-2015, Ben Bangert, Mike Orr' +copyright = '2005-2016, Ben Bangert, Mike Orr, and numerous contributers' # The default replacements for |version| and |release|, also used in various # other places throughout the built documents. # # The short X.Y version. -version = '1.13' +version = '2.3' # The full version, including alpha/beta/rc tags. -release = '1.13' +release = '2.3.1' # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/docs/modules/middleware.rst new/Routes-2.3.1/docs/modules/middleware.rst --- old/Routes-2.2/docs/modules/middleware.rst 2015-01-17 19:44:57.000000000 +0100 +++ new/Routes-2.3.1/docs/modules/middleware.rst 2016-03-28 17:36:53.000000000 +0200 @@ -2,7 +2,6 @@ ================================================== .. automodule:: routes.middleware -.. currentmodule:: routes.middleware Module Contents --------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/routes/mapper.py new/Routes-2.3.1/routes/mapper.py --- old/Routes-2.2/routes/mapper.py 2015-07-22 06:40:34.000000000 +0200 +++ new/Routes-2.3.1/routes/mapper.py 2016-03-30 16:52:54.000000000 +0200 @@ -116,7 +116,19 @@ controller = resource_name or collection_name if path_prefix is None: - path_prefix = '/' + collection_name + if collection_name is None: + path_prefix_str = '' + else: + path_prefix_str = '/{collection_name}' + else: + if collection_name is None: + path_prefix_str = "{pre}" + else: + path_prefix_str = "{pre}/{collection_name}" + + # generate what will be the path prefix for the collection + path_prefix = path_prefix_str.format(pre=path_prefix, + collection_name=collection_name) collection = SubMapper(self, collection_name=collection_name, resource_name=resource_name, @@ -148,30 +160,44 @@ self.formatted = getattr(obj, 'formatted', None) if self.formatted is None: self.formatted = True + self.add_actions(actions or [], **kwargs) - self.add_actions(actions or []) - - def connect(self, *args, **kwargs): + def connect(self, routename, path=None, **kwargs): newkargs = {} - newargs = args + _routename = routename + _path = path for key, value in six.iteritems(self.kwargs): if key == 'path_prefix': - if len(args) > 1: - newargs = (args[0], self.kwargs[key] + args[1]) + if path is not None: + # if there's a name_prefix, add it to the route name + # and if there's a path_prefix + _path = ''.join((self.kwargs[key], path)) + else: + _path = ''.join((self.kwargs[key], routename)) + elif key == 'name_prefix': + if path is not None: + # if there's a name_prefix, add it to the route name + # and if there's a path_prefix + _routename = ''.join((self.kwargs[key], routename)) else: - newargs = (self.kwargs[key] + args[0],) + _routename = None elif key in kwargs: if isinstance(value, dict): newkargs[key] = dict(value, **kwargs[key]) # merge dicts - elif key == 'controller': - newkargs[key] = kwargs[key] else: - newkargs[key] = value + kwargs[key] + # Originally used this form: + # newkargs[key] = value + kwargs[key] + # New version avoids the inheritance concatenation issue + # with submappers. Only prefixes concatenate, everything + # else overrides in submappers. + newkargs[key] = kwargs[key] else: newkargs[key] = self.kwargs[key] for key in kwargs: if key not in self.kwargs: newkargs[key] = kwargs[key] + + newargs = (_routename, _path) return self.obj.connect(*newargs, **newkargs) def link(self, rel=None, name=None, action=None, method='GET', @@ -263,8 +289,8 @@ """Generates the "delete" action for a collection member submapper.""" return self.action(action='delete', method='DELETE', **kwargs) - def add_actions(self, actions): - [getattr(self, action)() for action in actions] + def add_actions(self, actions, **kwargs): + [getattr(self, action)(**kwargs) for action in actions] # Provided for those who prefer using the 'with' syntax in Python 2.5+ def __enter__(self): @@ -687,10 +713,10 @@ resultdict = m.match('/joe/sixpack') """ - if not url and not environ: + if url is None and not environ: raise RoutesException('URL or environ must be provided') - if not url: + if url is None: url = environ['PATH_INFO'] result = self._match(url, environ) @@ -711,10 +737,10 @@ resultdict, route_obj = m.match('/joe/sixpack') """ - if not url and not environ: + if url is None and not environ: raise RoutesException('URL or environ must be provided') - if not url: + if url is None: url = environ['PATH_INFO'] result = self._match(url, environ) if self.debug: @@ -763,7 +789,11 @@ six.text_type(kargs).encode('utf8') if self.urlcache is not None: - cache_key_script_name = '%s:%s' % (script_name, cache_key) + if six.PY3: + cache_key_script_name = b':'.join((script_name.encode('utf-8'), + cache_key)) + else: + cache_key_script_name = '%s:%s' % (script_name, cache_key) # Check the url cache to see if it exists, use it if it does val = self.urlcache.get(cache_key_script_name, self) @@ -956,6 +986,22 @@ # GET /category/7/message/1 # has named route "category_message" + ``requirements`` + + A dictionary that restricts the matching of a + variable. Can be used when matching variables with path_prefix. + + Example:: + + map.resource('message', 'messages', + path_prefix='{project_id}/', + requirements={"project_id": R"\d+"}) + # POST /01234/message + # success, project_id is set to "01234" + # POST /foo/message + # 404 not found, won't be matched by this route + + ``parent_resource`` A ``dict`` containing information about the parent resource, for creating a nested resource. It should contain @@ -1079,6 +1125,8 @@ '_parent_resource': parent_resource, '_filter': kwargs.get('_filter') } + if 'requirements' in kwargs: + options['requirements'] = kwargs['requirements'] def requirements_for(meth): """Returns a new dict to be used for all route creation as the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/routes/middleware.py new/Routes-2.3.1/routes/middleware.py --- old/Routes-2.2/routes/middleware.py 2015-01-17 19:20:18.000000000 +0100 +++ new/Routes-2.3.1/routes/middleware.py 2016-03-28 17:36:53.000000000 +0200 @@ -12,7 +12,12 @@ class RoutesMiddleware(object): """Routing middleware that handles resolving the PATH_INFO in - addition to optionally recognizing method overriding.""" + addition to optionally recognizing method overriding. + + .. Note:: + This module requires webob to be installed. To depend on it, you may + list routes[middleware] in your ``requirements.txt`` + """ def __init__(self, wsgi_app, mapper, use_method_override=True, path_info=True, singleton=True): """Create a Route middleware object diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/routes/util.py new/Routes-2.3.1/routes/util.py --- old/Routes-2.2/routes/util.py 2015-07-22 06:40:34.000000000 +0200 +++ new/Routes-2.3.1/routes/util.py 2016-03-28 17:36:53.000000000 +0200 @@ -93,10 +93,12 @@ port = '' if len(hostmatch) > 1: port += ':' + hostmatch[1] - sub_match = re.compile('^.+?\.(%s)$' % mapper.domain_match) - domain = re.sub(sub_match, r'\1', host) + + match = re.match('^(.+?)\.(%s)$' % mapper.domain_match, host) + host_subdomain, domain = match.groups() if match else (None, host) + subdomain = as_unicode(subdomain, mapper.encoding) - if subdomain and not host.startswith(subdomain) and \ + if subdomain and host_subdomain != subdomain and \ subdomain not in mapper.sub_domains_ignore: kargs['_host'] = subdomain + '.' + domain + port elif (subdomain in mapper.sub_domains_ignore or \ @@ -180,15 +182,19 @@ """ anchor = kargs.get('anchor') host = kargs.get('host') - protocol = kargs.get('protocol') + protocol = kargs.pop('protocol', None) qualified = kargs.pop('qualified', None) # Remove special words from kargs, convert placeholders - for key in ['anchor', 'host', 'protocol']: + for key in ['anchor', 'host']: if kargs.get(key): del kargs[key] if key+'_' in kargs: kargs[key] = kargs.pop(key+'_') + + if 'protocol_' in kargs: + kargs['protocol_'] = protocol + config = request_config() route = None static = False @@ -250,21 +256,23 @@ newargs = _screenargs(kargs, config.mapper, environ) anchor = newargs.pop('_anchor', None) or anchor host = newargs.pop('_host', None) or host - protocol = newargs.pop('_protocol', None) or protocol + protocol = newargs.pop('_protocol', protocol) url = config.mapper.generate(*route_args, **newargs) if anchor is not None: url += '#' + _url_quote(anchor, encoding) - if host or protocol or qualified: + if host or (protocol is not None) or qualified: if not host and not qualified: # Ensure we don't use a specific port, as changing the protocol # means that we most likely need a new port host = config.host.split(':')[0] elif not host: host = config.host - if not protocol: + if protocol is None: protocol = config.protocol + if protocol != '': + protocol += ':' if url is not None: - url = protocol + '://' + host + url + url = protocol + '//' + host + url if not ascii_characters(url) and url is not None: raise GenerationException("url_for can only return a string, got " @@ -324,16 +332,19 @@ """ anchor = kargs.get('anchor') host = kargs.get('host') - protocol = kargs.get('protocol') + protocol = kargs.pop('protocol', None) qualified = kargs.pop('qualified', None) # Remove special words from kargs, convert placeholders - for key in ['anchor', 'host', 'protocol']: + for key in ['anchor', 'host']: if kargs.get(key): del kargs[key] if key+'_' in kargs: kargs[key] = kargs.pop(key+'_') + if 'protocol_' in kargs: + kargs['protocol_'] = protocol + route = None use_current = '_use_current' in kargs and kargs.pop('_use_current') @@ -396,12 +407,13 @@ anchor = anchor or newargs.pop('_anchor', None) host = host or newargs.pop('_host', None) - protocol = protocol or newargs.pop('_protocol', None) + if protocol is None: + protocol = newargs.pop('_protocol', None) newargs['_environ'] = self.environ url = self.mapper.generate(*route_args, **newargs) if anchor is not None: url += '#' + _url_quote(anchor, encoding) - if host or protocol or qualified: + if host or (protocol is not None) or qualified: if 'routes.cached_hostinfo' not in self.environ: cache_hostinfo(self.environ) hostinfo = self.environ['routes.cached_hostinfo'] @@ -412,12 +424,14 @@ host = hostinfo['host'].split(':')[0] elif not host: host = hostinfo['host'] - if not protocol: + if protocol is None: protocol = hostinfo['protocol'] + if protocol != '': + protocol += ':' if url is not None: if host[-1] != '/': host += '/' - url = protocol + '://' + host + url.lstrip('/') + url = protocol + '//' + host + url.lstrip('/') if not ascii_characters(url) and url is not None: raise GenerationException("Can only return a string, got " diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Routes-2.2/setup.py new/Routes-2.3.1/setup.py --- old/Routes-2.2/setup.py 2015-07-22 06:42:53.000000000 +0200 +++ new/Routes-2.3.1/setup.py 2016-03-30 16:53:35.000000000 +0200 @@ -1,4 +1,4 @@ -__version__ = '2.2' +__version__ = '2.3.1' import io import os @@ -41,7 +41,8 @@ "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", - "Programming Language :: Python :: 3.4" + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5" ], keywords='routes webob dispatch', author="Ben Bangert", @@ -56,5 +57,10 @@ "six", "repoze.lru>=0.3" ], + extras_require={ + 'middleware': [ + 'webob', + ] + }, **extra_options )
