- Add patch drop-py27.patch to get rid of six OBS-URL: https://build.opensuse.org/request/show/1167049 OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-bobo?expand=0&rev=10
435 lines
15 KiB
Diff
435 lines
15 KiB
Diff
From 5a2f2ebbbb858b663ba7b283a250fb357d5e2afb Mon Sep 17 00:00:00 2001
|
|
From: Michael Howitz <mh@gocept.com>
|
|
Date: Fri, 10 Feb 2023 10:10:12 +0100
|
|
Subject: [PATCH] Config with zope product template 2c7189fc (#23)
|
|
|
|
* Drop support for Python 2.7 up to 3.6.
|
|
|
|
* Remove not needed files.
|
|
|
|
* Bumped version for breaking release.
|
|
|
|
* Remove no necessary version pins.
|
|
---
|
|
buildout.cfg | 8 --
|
|
setup.cfg | 22 ++++-
|
|
setup.py | 18 ++---
|
|
src/bobo.py | 69 ++++++++--------
|
|
src/boboserver.py | 42 +++++-----
|
|
tox.ini | 80 ++++++++++++-------
|
|
15 files changed, 239 insertions(+), 160 deletions(-)
|
|
|
|
Index: bobo-2.4.0/src/bobo.py
|
|
===================================================================
|
|
--- bobo-2.4.0.orig/src/bobo.py
|
|
+++ bobo-2.4.0/src/bobo.py
|
|
@@ -32,15 +32,15 @@ __all__ = (
|
|
'subroute',
|
|
)
|
|
|
|
-__metaclass__ = type
|
|
|
|
import inspect
|
|
import logging
|
|
import re
|
|
import sys
|
|
+import urllib
|
|
+
|
|
import webob
|
|
-import six
|
|
-from six.moves import filter, urllib
|
|
+
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
@@ -50,7 +50,6 @@ _default_content_type = 'text/html; char
|
|
|
|
_json_content_type = re.compile('application/json;?').match
|
|
|
|
-getargspec = inspect.getargspec if six.PY2 else inspect.getfullargspec
|
|
|
|
class Application:
|
|
"""Create a WSGI application.
|
|
@@ -175,7 +174,7 @@ class Application:
|
|
self.config = config
|
|
|
|
bobo_configure = config.get('bobo_configure', '')
|
|
- if isinstance(bobo_configure, six.string_types):
|
|
+ if isinstance(bobo_configure, str):
|
|
bobo_configure = (
|
|
_get_global(name)
|
|
for name in filter(None, _uncomment(bobo_configure).split())
|
|
@@ -185,7 +184,7 @@ class Application:
|
|
|
|
bobo_errors = config.get('bobo_errors')
|
|
if bobo_errors is not None:
|
|
- if isinstance(bobo_errors, six.string_types):
|
|
+ if isinstance(bobo_errors, str):
|
|
bobo_errors = _uncomment(bobo_errors)
|
|
if ':' in bobo_errors:
|
|
bobo_errors = _get_global(bobo_errors)
|
|
@@ -198,7 +197,7 @@ class Application:
|
|
_maybe_copy(bobo_errors, 'exception', self)
|
|
|
|
bobo_resources = config.get('bobo_resources', '')
|
|
- if isinstance(bobo_resources, six.string_types):
|
|
+ if isinstance(bobo_resources, str):
|
|
bobo_resources = _uncomment(bobo_resources, True)
|
|
if bobo_resources:
|
|
self.handlers = _route_config(bobo_resources)
|
|
@@ -208,7 +207,7 @@ class Application:
|
|
self.handlers = [r.bobo_response for r in bobo_resources]
|
|
|
|
handle_exceptions = config.get('bobo_handle_exceptions', True)
|
|
- if isinstance(handle_exceptions, six.string_types):
|
|
+ if isinstance(handle_exceptions, str):
|
|
handle_exceptions = handle_exceptions.lower() == 'true'
|
|
self.reraise_exceptions = not handle_exceptions
|
|
|
|
@@ -285,9 +284,9 @@ class Application:
|
|
return response
|
|
|
|
body = data.body
|
|
- if isinstance(body, six.text_type):
|
|
+ if isinstance(body, str):
|
|
response.text = body
|
|
- elif isinstance(body, six.binary_type):
|
|
+ elif isinstance(body, bytes):
|
|
response.body = body
|
|
elif _json_content_type(content_type):
|
|
import json
|
|
@@ -328,7 +327,7 @@ def _err_response(status, method, title,
|
|
response.unicode_body = _html_template % (title, message)
|
|
return response
|
|
|
|
-_html_template = u"""<html>
|
|
+_html_template = """<html>
|
|
<head><title>%s</title></head>
|
|
<body>%s</body>
|
|
</html>
|
|
@@ -344,10 +343,7 @@ def redirect(url, status=302, body=None,
|
|
in the ``url`` argument.
|
|
"""
|
|
if body is None:
|
|
- body = u'See %s' % url
|
|
-
|
|
- # if isinstance(url, six.text_type):
|
|
- # url = url.encode('utf-8')
|
|
+ body = 'See %s' % url
|
|
|
|
response = webob.Response(status=status, headerlist=[('Location', url)])
|
|
response.content_type = content_type
|
|
@@ -378,7 +374,7 @@ def _scan_module(module_name):
|
|
return
|
|
|
|
resources = []
|
|
- for resource in six.itervalues(module.__dict__):
|
|
+ for resource in module.__dict__.values():
|
|
bobo_response = getattr(resource, 'bobo_response', None)
|
|
if bobo_response is None:
|
|
continue
|
|
@@ -457,7 +453,7 @@ def resources(resources):
|
|
"""
|
|
handlers = _MultiResource()
|
|
for resource in resources:
|
|
- if isinstance(resource, six.string_types):
|
|
+ if isinstance(resource, str):
|
|
if ':' in resource:
|
|
resource = _get_global(resource)
|
|
else:
|
|
@@ -475,13 +471,13 @@ def reroute(route, resource):
|
|
The resource can be a string, in which case it should be a global
|
|
name, of the form ``module:expression``.
|
|
"""
|
|
- if isinstance(resource, six.string_types):
|
|
+ if isinstance(resource, str):
|
|
resource = _get_global(resource)
|
|
|
|
try:
|
|
bobo_reroute = resource.bobo_reroute
|
|
except AttributeError:
|
|
- if isinstance(resource, six.class_types):
|
|
+ if isinstance(resource, type):
|
|
return Subroute(route, resource)
|
|
raise TypeError("Expected a reroutable")
|
|
return bobo_reroute(route)
|
|
@@ -498,7 +494,7 @@ def preroute(route, resource):
|
|
bobo_response function, then a resource is computed that tries
|
|
each of the resources found in the module in order.
|
|
"""
|
|
- if isinstance(resource, six.string_types):
|
|
+ if isinstance(resource, str):
|
|
if ':' in resource:
|
|
resource = _get_global(resource)
|
|
else:
|
|
@@ -583,7 +579,7 @@ def early():
|
|
"""
|
|
return order() + _early_base
|
|
|
|
-class _cached_property(object):
|
|
+class _cached_property:
|
|
def __init__(self, func):
|
|
self.func = func
|
|
def __get__(self, inst, class_):
|
|
@@ -610,7 +606,7 @@ class _Handler:
|
|
if ext:
|
|
route += '.'+ext.group(1)
|
|
self.bobo_route = route
|
|
- if isinstance(method, six.string_types):
|
|
+ if isinstance(method, str):
|
|
method = (method, )
|
|
self.bobo_methods = method
|
|
|
|
@@ -675,11 +671,11 @@ class _Handler:
|
|
|
|
@property
|
|
def func_code(self):
|
|
- return six.get_function_code(self.bobo_original)
|
|
+ return self.bobo_original.__code__
|
|
|
|
@property
|
|
def func_defaults(self):
|
|
- return six.get_function_defaults(self.bobo_original)
|
|
+ return self.bobo_original.__defaults__
|
|
|
|
@property
|
|
def __name__(self):
|
|
@@ -703,7 +699,7 @@ class _UnboundHandler:
|
|
return _BoundHandler(self.im_func, inst, self.im_class)
|
|
|
|
def __repr__(self):
|
|
- return "<unbound resource %s.%s>" % (
|
|
+ return "<unbound resource {}.{}>".format(
|
|
self.im_class.__name__,
|
|
self.im_func.__name__,
|
|
)
|
|
@@ -727,7 +723,7 @@ class _BoundHandler:
|
|
self.im_class = class_
|
|
|
|
def __repr__(self):
|
|
- return "<bound resource %s.%s of %r>" % (
|
|
+ return "<bound resource {}.{} of {!r}>".format(
|
|
self.im_class.__name__,
|
|
self.im_func.__name__,
|
|
self.im_self,
|
|
@@ -741,12 +737,12 @@ class _BoundHandler:
|
|
|
|
def _handler(route, func=None, **kw):
|
|
if func is None:
|
|
- if route is None or isinstance(route, six.string_types):
|
|
+ if route is None or isinstance(route, str):
|
|
return lambda f: _handler(route, f, **kw)
|
|
func = route
|
|
route = None
|
|
elif route is not None:
|
|
- assert isinstance(route, six.string_types)
|
|
+ assert isinstance(route, str)
|
|
if route and not route.startswith('/'):
|
|
raise ValueError("Non-empty routes must start with '/'.", route)
|
|
|
|
@@ -1192,7 +1188,7 @@ def _compile_route(route, partial=False)
|
|
if m is None:
|
|
return m
|
|
path = path[len(m.group(0)):]
|
|
- return (dict(item for item in six.iteritems(m.groupdict())
|
|
+ return (dict(item for item in m.groupdict().items()
|
|
if item[1] is not None),
|
|
path,
|
|
)
|
|
@@ -1204,7 +1200,7 @@ def _compile_route(route, partial=False)
|
|
m = match(path)
|
|
if m is None:
|
|
return m
|
|
- return dict(item for item in six.iteritems(m.groupdict())
|
|
+ return dict(item for item in m.groupdict().items()
|
|
if item[1] is not None)
|
|
|
|
return route_data
|
|
@@ -1229,7 +1225,7 @@ def _make_bobo_handle(func, original, ch
|
|
|
|
_no_jget = {}.get
|
|
def _make_caller(obj, paramsattr):
|
|
- spec = getargspec(obj)
|
|
+ spec = inspect.getfullargspec(obj)
|
|
nargs = nrequired = len(spec.args)
|
|
if spec.defaults:
|
|
nrequired -= len(spec.defaults)
|
|
@@ -1301,7 +1297,7 @@ def _subroute(route, ob, scan):
|
|
scan_class(ob)
|
|
return _subroute_class(route, ob)
|
|
|
|
- if isinstance(ob, six.class_types):
|
|
+ if isinstance(ob, type):
|
|
return _subroute_class(route, ob)
|
|
return Subroute(route, ob)
|
|
|
|
@@ -1369,7 +1365,7 @@ def subroute(route=None, scan=False, ord
|
|
|
|
if route is None:
|
|
return lambda ob: _subroute('/'+ob.__name__, ob, scan)
|
|
- if isinstance(route, six.string_types):
|
|
+ if isinstance(route, str):
|
|
return lambda ob: _subroute(route, ob, scan)
|
|
return _subroute('/'+route.__name__, route, scan)
|
|
|
|
@@ -1434,7 +1430,7 @@ def scan_class(class_):
|
|
|
|
resources = {}
|
|
for c in reversed(inspect.getmro(class_)):
|
|
- for name, resource in six.iteritems(c.__dict__):
|
|
+ for name, resource in c.__dict__.items():
|
|
br = getattr(resource, 'bobo_response', None)
|
|
if br is None:
|
|
continue
|
|
@@ -1445,7 +1441,7 @@ def scan_class(class_):
|
|
handlers = []
|
|
for (order, (name, resource)) in sorted(
|
|
(order, (name, resource))
|
|
- for (name, (order, resource)) in six.iteritems(resources)
|
|
+ for (name, (order, resource)) in resources.items()
|
|
):
|
|
route = getattr(resource, 'bobo_route', None)
|
|
if route is not None:
|
|
Index: bobo-2.4.0/src/boboserver.py
|
|
===================================================================
|
|
--- bobo-2.4.0.orig/src/boboserver.py
|
|
+++ bobo-2.4.0/src/boboserver.py
|
|
@@ -13,9 +13,6 @@
|
|
##############################################################################
|
|
"""Create WSGI-based web applications.
|
|
"""
|
|
-from __future__ import print_function
|
|
-import six
|
|
-from six.moves import map
|
|
|
|
__all__ = (
|
|
'Debug',
|
|
@@ -24,20 +21,22 @@ __all__ = (
|
|
'static',
|
|
)
|
|
|
|
-__metaclass__ = type
|
|
|
|
-import bobo
|
|
+import mimetypes
|
|
import optparse
|
|
import os
|
|
-import mimetypes
|
|
-import pdb
|
|
+import pdb # noqa: T100 import for pdb found
|
|
import re
|
|
import sys
|
|
import traceback
|
|
import types
|
|
-import webob
|
|
import wsgiref.simple_server
|
|
|
|
+import webob
|
|
+
|
|
+import bobo
|
|
+
|
|
+
|
|
mimetypes.init()
|
|
|
|
def run_server(app, port):
|
|
@@ -60,14 +59,14 @@ class Directory:
|
|
for name in sorted(os.listdir(self.path)):
|
|
if os.path.isdir(os.path.join(self.path, name)):
|
|
name += '/'
|
|
- links.append('<a href="%s">%s</a>' % (name, name))
|
|
+ links.append('<a href="{}">{}</a>'.format(name, name))
|
|
return """<html>
|
|
- <head><title>%s</title></head>
|
|
+ <head><title>{}</title></head>
|
|
<body>
|
|
- %s
|
|
+ {}
|
|
</body>
|
|
</html>
|
|
- """ % (self.path[len(self.root):], '<br>\n '.join(links))
|
|
+ """.format(self.path[len(self.root):], '<br>\n '.join(links))
|
|
|
|
@bobo.subroute('/:name')
|
|
def traverse(self, request, name):
|
|
@@ -93,7 +92,7 @@ class File:
|
|
response.content_type = content_type
|
|
try:
|
|
response.body = open(self.path, 'rb').read()
|
|
- except IOError:
|
|
+ except OSError:
|
|
raise bobo.NotFound
|
|
|
|
return response
|
|
@@ -133,11 +132,11 @@ class Reload:
|
|
mtimes[name] = (filename, os.stat(filename).st_mtime)
|
|
|
|
def __call__(self, environ, start_response):
|
|
- for name, (path, mtime) in sorted(six.iteritems(self.mtimes)):
|
|
+ for name, (path, mtime) in sorted(self.mtimes.items()):
|
|
if os.stat(path).st_mtime != mtime:
|
|
print('Reloading %s' % name)
|
|
- six.exec_(compile(open(path).read(), path, 'exec'),
|
|
- sys.modules[name].__dict__)
|
|
+ exec(compile(open(path).read(), path, 'exec'),
|
|
+ sys.modules[name].__dict__)
|
|
self.app.__init__(self.app.config)
|
|
self.mtimes[name] = path, os.stat(path).st_mtime
|
|
|
|
@@ -187,9 +186,7 @@ def server(args=None, Application=bobo.A
|
|
import logging; logging.basicConfig()
|
|
args = sys.argv[1:]
|
|
|
|
- usage = "%prog [options] name=value ..."
|
|
- if sys.version_info >= (2, 5):
|
|
- usage = 'Usage: ' + usage
|
|
+ usage = "Usage: %prog [options] name=value ..."
|
|
parser = optparse.OptionParser(usage)
|
|
parser.add_option(
|
|
'--port', '-p', type='int', dest='port', default=8080,
|
|
@@ -223,8 +220,7 @@ def server(args=None, Application=bobo.A
|
|
for path in options.file or ():
|
|
module = types.ModuleType(mname)
|
|
module.__file__ = path
|
|
- six.exec_(compile(open(module.__file__).read(),
|
|
- module.__file__, 'exec'),
|
|
+ exec(compile(open(module.__file__).read(), module.__file__, 'exec'),
|
|
module.__dict__)
|
|
sys.modules[module.__name__] = module
|
|
resources.append(module.__name__)
|
|
@@ -232,7 +228,7 @@ def server(args=None, Application=bobo.A
|
|
|
|
for s in options.static or ():
|
|
route, path = s.split('=', 1)
|
|
- resources.append("boboserver:static(%r,%r)" % (route, path))
|
|
+ resources.append("boboserver:static({!r},{!r})".format(route, path))
|
|
|
|
if not resources:
|
|
error("No resources were specified.")
|
|
@@ -255,5 +251,5 @@ def server(args=None, Application=bobo.A
|
|
if options.debug:
|
|
app = Debug(app)
|
|
|
|
- print("Serving %s on port %s..." % (resources, options.port))
|
|
+ print("Serving {} on port {}...".format(resources, options.port))
|
|
run_server(app, options.port)
|
|
Index: bobo-2.4.0/setup.py
|
|
===================================================================
|
|
--- bobo-2.4.0.orig/setup.py
|
|
+++ bobo-2.4.0/setup.py
|
|
@@ -46,7 +46,7 @@ setup(
|
|
long_description=read('README.rst') + '\n\n' + read('CHANGES.rst'),
|
|
py_modules = ['bobo', 'boboserver'],
|
|
package_dir = {'':'src'},
|
|
- install_requires = ["WebOb", "six"],
|
|
+ install_requires = ["WebOb"],
|
|
entry_points = entry_points,
|
|
tests_require = [
|
|
'bobodoctestumentation >=%s, <%s.999' % (version, version)],
|
|
Index: bobo-2.4.0/src/bobo.egg-info/requires.txt
|
|
===================================================================
|
|
--- bobo-2.4.0.orig/src/bobo.egg-info/requires.txt
|
|
+++ bobo-2.4.0/src/bobo.egg-info/requires.txt
|
|
@@ -1,2 +1 @@
|
|
WebOb
|
|
-six
|