1. fanstatic
  2. fanstatic
  3. fanstatic
  4. Issues
Issue #80 resolved

fanstatic-0.16: Test failures with Python 3

Arfrever Frehtes Taifersar Arahesis
created an issue

fanstatic-0.15 passes all tests with Python 3.2 and 3.3.

fanstatic-0.16 fails 4 tests with Python 3.2 and 3.3.

============================= test session starts ==============================
platform linux2 -- Python 3.2.4 -- pytest-2.3.4
collected 135 items

tests/test_bundle.py ..
tests/test_checksum.py .......
tests/test_codegen.py ...
tests/test_config.py ....
tests/test_core.py ...............................................................................
tests/test_injector.py .F.....
tests/test_publisher.py ...........
tests/test_registry.py s
tests/test_slot.py ...............
tests/test_wsgi.py FF.Fs.

=================================== FAILURES ===================================
_________________________________ test_inject __________________________________

    def test_inject():
        foo = Library('foo', '')
        x1 = Resource(foo, 'a.js')
        x2 = Resource(foo, 'b.css')
        y1 = Resource(foo, 'c.js', depends=[x1, x2])

        def app(environ, start_response):
            start_response('200 OK', [])
            needed = get_needed()
            needed.need(y1)
            needed.set_base_url('http://testapp')
            return [b'<html><head></head><body</body></html>']

        wrapped_app = Injector(app)

        request = webob.Request.blank('/')
>       response = request.get_response(wrapped_app)

tests/test_injector.py:42: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Request at 0x24c9610 GET http://localhost/>
application = <fanstatic.injector.Injector object at 0x24c9690>
catch_exc_info = False

    def send(self, application=None, catch_exc_info=False):
        """
            Like ``.call_application(application)``, except returns a
            response object with ``.status``, ``.headers``, and ``.body``
            attributes.

            This will use ``self.ResponseClass`` to figure out the class
            of the response object to return.

            If ``application`` is not given, this will send the request to
            ``self.make_default_send_app()``
            """
        if application is None:
            application = self.make_default_send_app()
        if catch_exc_info:
            status, headers, app_iter, exc_info = self.call_application(
                application, catch_exc_info=True)
            del exc_info
        else:
            status, headers, app_iter = self.call_application(
>               application, catch_exc_info=False)

/usr/lib64/python3.2/site-packages/webob/request.py:1296: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Request at 0x24c9610 GET http://localhost/>
application = <fanstatic.injector.Injector object at 0x24c9690>
catch_exc_info = False

    def call_application(self, application, catch_exc_info=False):
        """
            Call the given WSGI application, returning ``(status_string,
            headerlist, app_iter)``

            Be sure to call ``app_iter.close()`` if it's there.

            If catch_exc_info is true, then returns ``(status_string,
            headerlist, app_iter, exc_info)``, where the fourth item may
            be None, but won't be if there was an exception.  If you don't
            do this and there was an exception, the exception will be
            raised directly.
            """
        if self.is_body_seekable:
            self.body_file_raw.seek(0)
        captured = []
        output = []
        def start_response(status, headers, exc_info=None):
            if exc_info is not None and not catch_exc_info:
                reraise(exc_info)
            captured[:] = [status, headers, exc_info]
            return output.append
>       app_iter = application(self.environ, start_response)

/usr/lib64/python3.2/site-packages/webob/request.py:1260: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.injector.Injector object at 0x24c9690>
environ = {'HTTP_HOST': 'localhost:80', 'PATH_INFO': '/', 'QUERY_STRING': '', 'REQUEST_METHOD': 'GET', ...}
start_response = <function start_response at 0x24a16b0>

    def __call__(self, environ, start_response):
        request = webob.Request(environ)
        # We only continue if the request method is appropriate.
        if not request.method in ['GET', 'POST']:
            return self.app(environ, start_response)

        # Initialize a needed resources object.
        # XXX this will set the needed on the thread local data, even
        # if the wrapped framework only gets the needed from the WSGI
        # environ.
        needed = fanstatic.init_needed(
            script_name=request.environ.get('SCRIPT_NAME'), **self.config)

        # Make sure the needed resource object is put in the WSGI
        # environment as well, for frameworks that choose to use it
        # from there.
        request.environ[fanstatic.NEEDED] = needed

        # Get the response from the wrapped application:
        response = request.get_response(self.app)

        # We only continue if the content-type is appropriate.
        if not (response.content_type and
                response.content_type.lower() in CONTENT_TYPES):
            # Clean up after our behinds.
            fanstatic.del_needed()
            return response(environ, start_response)

        # The wrapped application may have `needed` resources.
        if needed.has_resources():
            # Can't use response.text because there might not be any
            # charset. body is not unicode.
>           result = needed.render_topbottom_into_html(response.body)

fanstatic/injector.py:67: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.core.NeededResources object at 0x24c95d0>
html = b'<html><head></head><body</body></html>'

    def render_topbottom_into_html(self, html):
        """Render needed resource inclusions into HTML.

            Only bottom safe resources are included in the bottom section,
            unless ``force_bottom`` is enabled, in which case all
            Javascript resources will be included in the bottom, just
            before the ``</body>`` tag.

            :param html: The HTML string in which to insert the rendered
              resource inclusions.  This string must have a ``<head>`` and
              a ``<body>`` section.
            """
        top, bottom = self.render_topbottom()
        if top:
>           html = _head_regex.sub('\\1\n    %s\n' % (top,), html, count=1)
E           TypeError: can't use a string pattern on a bytes-like object

fanstatic/core.py:984: TypeError
_________________________________ test_inject __________________________________

    def test_inject():
        foo = Library('foo', '')
        x1 = Resource(foo, 'a.js')
        x2 = Resource(foo, 'b.css')
        y1 = Resource(foo, 'c.js', depends=[x1, x2])

        def app(environ, start_response):
            start_response('200 OK', [])
            needed = get_needed()
            needed.need(y1)
            return [b'<html><head></head><body</body></html>']

        wrapped_app = Fanstatic(app, base_url='http://testapp')

        request = webob.Request.blank('/')
        request.environ['SCRIPT_NAME'] = '/root'  # base_url is defined so SCRIPT_NAME
                                                  # shouldn't be taken into account
>       response = request.get_response(wrapped_app)

tests/test_wsgi.py:26: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Request at 0x24bd110 GET http://localhost/root/>
application = <fanstatic.publisher.Delegator object at 0x24bd9d0>
catch_exc_info = False

    def send(self, application=None, catch_exc_info=False):
        """
            Like ``.call_application(application)``, except returns a
            response object with ``.status``, ``.headers``, and ``.body``
            attributes.

            This will use ``self.ResponseClass`` to figure out the class
            of the response object to return.

            If ``application`` is not given, this will send the request to
            ``self.make_default_send_app()``
            """
        if application is None:
            application = self.make_default_send_app()
        if catch_exc_info:
            status, headers, app_iter, exc_info = self.call_application(
                application, catch_exc_info=True)
            del exc_info
        else:
            status, headers, app_iter = self.call_application(
>               application, catch_exc_info=False)

/usr/lib64/python3.2/site-packages/webob/request.py:1296: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Request at 0x24bd110 GET http://localhost/root/>
application = <fanstatic.publisher.Delegator object at 0x24bd9d0>
catch_exc_info = False

    def call_application(self, application, catch_exc_info=False):
        """
            Call the given WSGI application, returning ``(status_string,
            headerlist, app_iter)``

            Be sure to call ``app_iter.close()`` if it's there.

            If catch_exc_info is true, then returns ``(status_string,
            headerlist, app_iter, exc_info)``, where the fourth item may
            be None, but won't be if there was an exception.  If you don't
            do this and there was an exception, the exception will be
            raised directly.
            """
        if self.is_body_seekable:
            self.body_file_raw.seek(0)
        captured = []
        output = []
        def start_response(status, headers, exc_info=None):
            if exc_info is not None and not catch_exc_info:
                reraise(exc_info)
            captured[:] = [status, headers, exc_info]
            return output.append
>       app_iter = application(self.environ, start_response)

/usr/lib64/python3.2/site-packages/webob/request.py:1260: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.publisher.Delegator object at 0x24bd9d0>
environ = {'HTTP_HOST': 'localhost:80', 'PATH_INFO': '/', 'QUERY_STRING': '', 'REQUEST_METHOD': 'GET', ...}
start_response = <function start_response at 0x2767c88>

    def __call__(self, environ, start_response):
        request = webob.Request(environ)
        if not self.is_resource(request):
            # the trigger segment is not in the URL, so we delegate
            # to the original application
>           return self.app(environ, start_response)

fanstatic/publisher.py:219: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.injector.Injector object at 0x24b54d0>
environ = {'HTTP_HOST': 'localhost:80', 'PATH_INFO': '/', 'QUERY_STRING': '', 'REQUEST_METHOD': 'GET', ...}
start_response = <function start_response at 0x2767c88>

    def __call__(self, environ, start_response):
        request = webob.Request(environ)
        # We only continue if the request method is appropriate.
        if not request.method in ['GET', 'POST']:
            return self.app(environ, start_response)

        # Initialize a needed resources object.
        # XXX this will set the needed on the thread local data, even
        # if the wrapped framework only gets the needed from the WSGI
        # environ.
        needed = fanstatic.init_needed(
            script_name=request.environ.get('SCRIPT_NAME'), **self.config)

        # Make sure the needed resource object is put in the WSGI
        # environment as well, for frameworks that choose to use it
        # from there.
        request.environ[fanstatic.NEEDED] = needed

        # Get the response from the wrapped application:
        response = request.get_response(self.app)

        # We only continue if the content-type is appropriate.
        if not (response.content_type and
                response.content_type.lower() in CONTENT_TYPES):
            # Clean up after our behinds.
            fanstatic.del_needed()
            return response(environ, start_response)

        # The wrapped application may have `needed` resources.
        if needed.has_resources():
            # Can't use response.text because there might not be any
            # charset. body is not unicode.
>           result = needed.render_topbottom_into_html(response.body)

fanstatic/injector.py:67: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.core.NeededResources object at 0x268b090>
html = b'<html><head></head><body</body></html>'

    def render_topbottom_into_html(self, html):
        """Render needed resource inclusions into HTML.

            Only bottom safe resources are included in the bottom section,
            unless ``force_bottom`` is enabled, in which case all
            Javascript resources will be included in the bottom, just
            before the ``</body>`` tag.

            :param html: The HTML string in which to insert the rendered
              resource inclusions.  This string must have a ``<head>`` and
              a ``<body>`` section.
            """
        top, bottom = self.render_topbottom()
        if top:
>           html = _head_regex.sub('\\1\n    %s\n' % (top,), html, count=1)
E           TypeError: can't use a string pattern on a bytes-like object

fanstatic/core.py:984: TypeError
___________________________ test_inject_script_name ____________________________

    def test_inject_script_name():
        foo = Library('foo', '')
        x1 = Resource(foo, 'a.js')
        x2 = Resource(foo, 'b.css')
        y1 = Resource(foo, 'c.js', depends=[x1, x2])

        def app(environ, start_response):
            start_response('200 OK', [])
            needed = get_needed()
            needed.need(y1)
            return [b'<html><head></head><body</body></html>']

        wrapped_app = Fanstatic(app)

        request = webob.Request.blank('/path')
        request.environ['SCRIPT_NAME'] = '/root'
>       response = request.get_response(wrapped_app)

tests/test_wsgi.py:51: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Request at 0x26875d0 GET http://localhost/root/path>
application = <fanstatic.publisher.Delegator object at 0x2687510>
catch_exc_info = False

    def send(self, application=None, catch_exc_info=False):
        """
            Like ``.call_application(application)``, except returns a
            response object with ``.status``, ``.headers``, and ``.body``
            attributes.

            This will use ``self.ResponseClass`` to figure out the class
            of the response object to return.

            If ``application`` is not given, this will send the request to
            ``self.make_default_send_app()``
            """
        if application is None:
            application = self.make_default_send_app()
        if catch_exc_info:
            status, headers, app_iter, exc_info = self.call_application(
                application, catch_exc_info=True)
            del exc_info
        else:
            status, headers, app_iter = self.call_application(
>               application, catch_exc_info=False)

/usr/lib64/python3.2/site-packages/webob/request.py:1296: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Request at 0x26875d0 GET http://localhost/root/path>
application = <fanstatic.publisher.Delegator object at 0x2687510>
catch_exc_info = False

    def call_application(self, application, catch_exc_info=False):
        """
            Call the given WSGI application, returning ``(status_string,
            headerlist, app_iter)``

            Be sure to call ``app_iter.close()`` if it's there.

            If catch_exc_info is true, then returns ``(status_string,
            headerlist, app_iter, exc_info)``, where the fourth item may
            be None, but won't be if there was an exception.  If you don't
            do this and there was an exception, the exception will be
            raised directly.
            """
        if self.is_body_seekable:
            self.body_file_raw.seek(0)
        captured = []
        output = []
        def start_response(status, headers, exc_info=None):
            if exc_info is not None and not catch_exc_info:
                reraise(exc_info)
            captured[:] = [status, headers, exc_info]
            return output.append
>       app_iter = application(self.environ, start_response)

/usr/lib64/python3.2/site-packages/webob/request.py:1260: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.publisher.Delegator object at 0x2687510>
environ = {'HTTP_HOST': 'localhost:80', 'PATH_INFO': '/path', 'QUERY_STRING': '', 'REQUEST_METHOD': 'GET', ...}
start_response = <function start_response at 0x2707848>

    def __call__(self, environ, start_response):
        request = webob.Request(environ)
        if not self.is_resource(request):
            # the trigger segment is not in the URL, so we delegate
            # to the original application
>           return self.app(environ, start_response)

fanstatic/publisher.py:219: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.injector.Injector object at 0x2687490>
environ = {'HTTP_HOST': 'localhost:80', 'PATH_INFO': '/path', 'QUERY_STRING': '', 'REQUEST_METHOD': 'GET', ...}
start_response = <function start_response at 0x2707848>

    def __call__(self, environ, start_response):
        request = webob.Request(environ)
        # We only continue if the request method is appropriate.
        if not request.method in ['GET', 'POST']:
            return self.app(environ, start_response)

        # Initialize a needed resources object.
        # XXX this will set the needed on the thread local data, even
        # if the wrapped framework only gets the needed from the WSGI
        # environ.
        needed = fanstatic.init_needed(
            script_name=request.environ.get('SCRIPT_NAME'), **self.config)

        # Make sure the needed resource object is put in the WSGI
        # environment as well, for frameworks that choose to use it
        # from there.
        request.environ[fanstatic.NEEDED] = needed

        # Get the response from the wrapped application:
        response = request.get_response(self.app)

        # We only continue if the content-type is appropriate.
        if not (response.content_type and
                response.content_type.lower() in CONTENT_TYPES):
            # Clean up after our behinds.
            fanstatic.del_needed()
            return response(environ, start_response)

        # The wrapped application may have `needed` resources.
        if needed.has_resources():
            # Can't use response.text because there might not be any
            # charset. body is not unicode.
>           result = needed.render_topbottom_into_html(response.body)

fanstatic/injector.py:67: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.core.NeededResources object at 0x2687690>
html = b'<html><head></head><body</body></html>'

    def render_topbottom_into_html(self, html):
        """Render needed resource inclusions into HTML.

            Only bottom safe resources are included in the bottom section,
            unless ``force_bottom`` is enabled, in which case all
            Javascript resources will be included in the bottom, just
            before the ``</body>`` tag.

            :param html: The HTML string in which to insert the rendered
              resource inclusions.  This string must have a ``<head>`` and
              a ``<body>`` section.
            """
        top, bottom = self.render_topbottom()
        if top:
>           html = _head_regex.sub('\\1\n    %s\n' % (top,), html, count=1)
E           TypeError: can't use a string pattern on a bytes-like object

fanstatic/core.py:984: TypeError
_________________________ test_inject_unicode_base_url _________________________

    def test_inject_unicode_base_url():
        foo = Library('foo', '')
        x1 = Resource(foo, 'a.js')

        def app(environ, start_response):
            start_response('200 OK', [])
            x1.need()
            return [b'<html><head></head><body</body></html>']

        request = webob.Request.blank('/')
        wrapped = Fanstatic(app, base_url=compat.u('http://localhost'))
        # Fanstatic used to choke on unicode content.
>       request.get_response(wrapped)

tests/test_wsgi.py:81: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Request at 0x2688190 GET http://localhost/>
application = <fanstatic.publisher.Delegator object at 0x2688250>
catch_exc_info = False

    def send(self, application=None, catch_exc_info=False):
        """
            Like ``.call_application(application)``, except returns a
            response object with ``.status``, ``.headers``, and ``.body``
            attributes.

            This will use ``self.ResponseClass`` to figure out the class
            of the response object to return.

            If ``application`` is not given, this will send the request to
            ``self.make_default_send_app()``
            """
        if application is None:
            application = self.make_default_send_app()
        if catch_exc_info:
            status, headers, app_iter, exc_info = self.call_application(
                application, catch_exc_info=True)
            del exc_info
        else:
            status, headers, app_iter = self.call_application(
>               application, catch_exc_info=False)

/usr/lib64/python3.2/site-packages/webob/request.py:1296: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Request at 0x2688190 GET http://localhost/>
application = <fanstatic.publisher.Delegator object at 0x2688250>
catch_exc_info = False

    def call_application(self, application, catch_exc_info=False):
        """
            Call the given WSGI application, returning ``(status_string,
            headerlist, app_iter)``

            Be sure to call ``app_iter.close()`` if it's there.

            If catch_exc_info is true, then returns ``(status_string,
            headerlist, app_iter, exc_info)``, where the fourth item may
            be None, but won't be if there was an exception.  If you don't
            do this and there was an exception, the exception will be
            raised directly.
            """
        if self.is_body_seekable:
            self.body_file_raw.seek(0)
        captured = []
        output = []
        def start_response(status, headers, exc_info=None):
            if exc_info is not None and not catch_exc_info:
                reraise(exc_info)
            captured[:] = [status, headers, exc_info]
            return output.append
>       app_iter = application(self.environ, start_response)

/usr/lib64/python3.2/site-packages/webob/request.py:1260: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.publisher.Delegator object at 0x2688250>
environ = {'HTTP_HOST': 'localhost:80', 'PATH_INFO': '/', 'QUERY_STRING': '', 'REQUEST_METHOD': 'GET', ...}
start_response = <function start_response at 0x24a16b0>

    def __call__(self, environ, start_response):
        request = webob.Request(environ)
        if not self.is_resource(request):
            # the trigger segment is not in the URL, so we delegate
            # to the original application
>           return self.app(environ, start_response)

fanstatic/publisher.py:219: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.injector.Injector object at 0x26881d0>
environ = {'HTTP_HOST': 'localhost:80', 'PATH_INFO': '/', 'QUERY_STRING': '', 'REQUEST_METHOD': 'GET', ...}
start_response = <function start_response at 0x24a16b0>

    def __call__(self, environ, start_response):
        request = webob.Request(environ)
        # We only continue if the request method is appropriate.
        if not request.method in ['GET', 'POST']:
            return self.app(environ, start_response)

        # Initialize a needed resources object.
        # XXX this will set the needed on the thread local data, even
        # if the wrapped framework only gets the needed from the WSGI
        # environ.
        needed = fanstatic.init_needed(
            script_name=request.environ.get('SCRIPT_NAME'), **self.config)

        # Make sure the needed resource object is put in the WSGI
        # environment as well, for frameworks that choose to use it
        # from there.
        request.environ[fanstatic.NEEDED] = needed

        # Get the response from the wrapped application:
        response = request.get_response(self.app)

        # We only continue if the content-type is appropriate.
        if not (response.content_type and
                response.content_type.lower() in CONTENT_TYPES):
            # Clean up after our behinds.
            fanstatic.del_needed()
            return response(environ, start_response)

        # The wrapped application may have `needed` resources.
        if needed.has_resources():
            # Can't use response.text because there might not be any
            # charset. body is not unicode.
>           result = needed.render_topbottom_into_html(response.body)

fanstatic/injector.py:67: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <fanstatic.core.NeededResources object at 0x26882d0>
html = b'<html><head></head><body</body></html>'

    def render_topbottom_into_html(self, html):
        """Render needed resource inclusions into HTML.

            Only bottom safe resources are included in the bottom section,
            unless ``force_bottom`` is enabled, in which case all
            Javascript resources will be included in the bottom, just
            before the ``</body>`` tag.

            :param html: The HTML string in which to insert the rendered
              resource inclusions.  This string must have a ``<head>`` and
              a ``<body>`` section.
            """
        top, bottom = self.render_topbottom()
        if top:
>           html = _head_regex.sub('\\1\n    %s\n' % (top,), html, count=1)
E           TypeError: can't use a string pattern on a bytes-like object

fanstatic/core.py:984: TypeError
=============== 4 failed, 129 passed, 2 skipped in 7.35 seconds ================

Comments (2)

  1. Jan-Jaap Driessen

    Hi Arfrever,

    I apologize for publishing a broken release.

    When I created the fanstatic 0.16 release I was aware that some tests on python3 were failing. Sylvain Viollon asked me to create a release, so he could include it in his dependencies.

    I was in a hurry at the time and skipped the python3 tests. I don't have much python3 porting experience, so I asked Alex Grönholm, who ported fanstatic to python3, to have a look at the failing tests. Alex regularly responds very quickly; if he would have found the time to look at the tests and fix them, I would have released a 0.16.1 version soon after 0.16. Unfortunately Alex didn't respond and we are now left with broken code on python3. Perhaps you could have a go at fixing them?

  2. Log in to comment