From 3806d178e1f90754c77ed1b3ffd7d216a6869bde Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 16:22:50 -0800 Subject: [PATCH 001/157] 2to3-3.4 --- benchmarks/json_string_tokenizer.py | 6 +- doc/conf.py | 16 +- .../part00/listings/echothing/echobox.py | 2 +- .../part01/listings/chatthing/chatterbox.py | 2 +- .../advanced_manualform.py | 6 +- examples/athenademo/benchmark.py | 4 +- examples/athenademo/calculator.py | 10 +- examples/athenademo/typeahead.py | 18 +- examples/athenademo/widgets.py | 6 +- examples/blogengine/axiomstore.py | 8 +- examples/blogengine/email_client.py | 6 +- examples/blogengine/frontend.py | 28 +- examples/blogengine/smtpserver.py | 22 +- examples/canvas/canvas.py | 5 +- examples/children/childrenhtml.py | 2 +- examples/customform/customform.py | 2 +- examples/db/db.py | 2 +- examples/formbuilder/formbuilder.py | 2 +- examples/formpost/formpost2.py | 2 +- examples/guarded/guarded.py | 2 +- examples/guarded/guarded2.py | 2 +- examples/i18n/xmli18n.py | 2 +- examples/image_uploader/images.py | 2 +- examples/image_uploader/imagination.py | 2 +- examples/logout_guard/logout_guard.py | 2 +- examples/logout_guard/logout_guard2.py | 4 +- examples/macros/macros.py | 6 +- examples/manualform/manualform.py | 2 +- examples/pastebin/pastebin/service.py | 2 +- examples/pastebin/pastebin/web/pages.py | 2 +- examples/postit/store.py | 10 +- examples/todo/dispatcher.py | 3 +- examples/tree/tree.py | 7 +- examples/with_axiom/powerups.py | 8 +- formless/annotate.py | 27 +- formless/configurable.py | 4 +- formless/formutils.py | 8 +- formless/processors.py | 16 +- formless/test/test_formless.py | 226 +++++++------- formless/test/test_freeform.py | 40 +-- formless/webform.py | 6 +- nevow/_flat.py | 23 +- nevow/_version.py | 20 +- nevow/accessors.py | 2 +- nevow/appserver.py | 8 +- nevow/athena.py | 81 ++--- nevow/blocks.py | 2 +- nevow/canvas.py | 14 +- nevow/compy.py | 5 +- nevow/context.py | 6 +- nevow/dirlist.py | 8 +- nevow/entities.py | 3 +- nevow/events.py | 10 +- nevow/failure.py | 14 +- nevow/flat/flatmdom.py | 4 +- nevow/flat/flatsax.py | 6 +- nevow/flat/flatstan.py | 14 +- nevow/flat/ten.py | 4 +- nevow/flat/twist.py | 2 +- nevow/guard.py | 25 +- nevow/i18n.py | 2 +- nevow/json.py | 76 ++--- nevow/livetrial/runner.py | 6 +- nevow/livetrial/testcase.py | 8 +- nevow/page.py | 2 +- nevow/query.py | 6 +- nevow/rend.py | 23 +- nevow/scripts/nit.py | 2 +- nevow/scripts/xmlgettext.py | 16 +- nevow/stan.py | 22 +- nevow/static.py | 6 +- nevow/test/acceptance/reconnect.py | 4 +- nevow/test/acceptance/tabbedpane.py | 4 +- nevow/test/livetest_athena.py | 114 +++---- nevow/test/livetest_runtime.py | 22 +- nevow/test/test_accessors.py | 24 +- nevow/test/test_appserver.py | 14 +- nevow/test/test_athena.py | 277 +++++++++--------- nevow/test/test_compression.py | 2 +- nevow/test/test_context.py | 22 +- nevow/test/test_disktemplate.py | 22 +- nevow/test/test_element.py | 12 +- nevow/test/test_errorhandler.py | 25 +- nevow/test/test_flatsax.py | 30 +- nevow/test/test_flatstan.py | 126 ++++---- nevow/test/test_flatten.py | 46 +-- nevow/test/test_guard.py | 168 +++++------ nevow/test/test_howtolistings.py | 45 +-- nevow/test/test_i18n.py | 56 ++-- nevow/test/test_json.py | 76 ++--- nevow/test/test_later.py | 30 +- nevow/test/test_loaders.py | 72 ++--- nevow/test/test_newflat.py | 36 +-- nevow/test/test_nit.py | 2 +- nevow/test/test_passobj.py | 4 +- nevow/test/test_query.py | 38 +-- nevow/test/test_rend.py | 90 +++--- nevow/test/test_stan.py | 34 +-- nevow/test/test_static.py | 40 +-- nevow/test/test_tags.py | 10 +- nevow/test/test_testutil.py | 4 +- nevow/test/test_url.py | 220 +++++++------- nevow/test/test_utils.py | 58 ++-- nevow/testutil.py | 10 +- nevow/url.py | 33 +-- nevow/useragent.py | 14 +- nevow/vhost.py | 4 +- versioneer.py | 50 ++-- 108 files changed, 1404 insertions(+), 1386 deletions(-) diff --git a/benchmarks/json_string_tokenizer.py b/benchmarks/json_string_tokenizer.py index 65f7059c..0b0b9000 100644 --- a/benchmarks/json_string_tokenizer.py +++ b/benchmarks/json_string_tokenizer.py @@ -22,7 +22,7 @@ def postOptions(self): self['scale'] = int(self['scale']) -BASE = u'Hello, world. "Quotes".' +BASE = 'Hello, world. "Quotes".' def benchmark(iterations, scale): """ Deserialize a string C{iterations} times. Make the string longer based @@ -32,10 +32,10 @@ def benchmark(iterations, scale): """ s = serialize(BASE * scale) before = time() - for i in xrange(iterations): + for i in range(iterations): parse(s) after = time() - print (after - before) / iterations, 'per call' + print((after - before) / iterations, 'per call') diff --git a/doc/conf.py b/doc/conf.py index fd28eef3..dbf48205 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -52,8 +52,8 @@ master_doc = 'index' # General information about the project. -project = u'Nevow' -copyright = u'2014, Twisted developers' +project = 'Nevow' +copyright = '2014, Twisted developers' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -205,8 +205,8 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - ('index', 'Nevow.tex', u'Nevow Documentation', - u'Twisted developers', 'manual'), + ('index', 'Nevow.tex', 'Nevow Documentation', + 'Twisted developers', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of @@ -235,8 +235,8 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'nevow', u'Nevow Documentation', - [u'Twisted developers'], 1) + ('index', 'nevow', 'Nevow Documentation', + ['Twisted developers'], 1) ] # If true, show URL addresses after external links. @@ -249,8 +249,8 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'Nevow', u'Nevow Documentation', - u'Twisted developers', 'Nevow', 'One line description of project.', + ('index', 'Nevow', 'Nevow Documentation', + 'Twisted developers', 'Nevow', 'One line description of project.', 'Miscellaneous'), ] diff --git a/doc/howto/chattutorial/part00/listings/echothing/echobox.py b/doc/howto/chattutorial/part00/listings/echothing/echobox.py index 8d20556d..0846fbe7 100644 --- a/doc/howto/chattutorial/part00/listings/echothing/echobox.py +++ b/doc/howto/chattutorial/part00/listings/echothing/echobox.py @@ -5,7 +5,7 @@ class EchoElement(LiveElement): docFactory = xmlfile(sibpath(__file__, 'template.html')) - jsClass = u'EchoThing.EchoWidget' + jsClass = 'EchoThing.EchoWidget' def say(self, message): self.callRemote('addText', message) diff --git a/doc/howto/chattutorial/part01/listings/chatthing/chatterbox.py b/doc/howto/chattutorial/part01/listings/chatthing/chatterbox.py index 2e2b6461..511ea132 100644 --- a/doc/howto/chattutorial/part01/listings/chatthing/chatterbox.py +++ b/doc/howto/chattutorial/part01/listings/chatthing/chatterbox.py @@ -26,7 +26,7 @@ def makeChatter(self): class ChatterElement(LiveElement): docFactory = xmlfile(sibpath(__file__, 'template.html')) - jsClass = u'ChatThing.ChatterWidget' + jsClass = 'ChatThing.ChatterWidget' def __init__(self, room): self.room = room diff --git a/examples/advanced_manualform/advanced_manualform.py b/examples/advanced_manualform/advanced_manualform.py index 3a472174..a1d84688 100644 --- a/examples/advanced_manualform/advanced_manualform.py +++ b/examples/advanced_manualform/advanced_manualform.py @@ -61,7 +61,7 @@ def redirectAfterPost(aspects): magicCookie = str(now()) refpath = refpath.replace('_nevow_carryover_', magicCookie) _CARRYOVER[magicCookie] = C = tpc.Componentized() - for k, v in aspects.iteritems(): + for k, v in aspects.items(): C.setComponent(k, v) request.redirect(str(refpath)) from nevow import static @@ -99,8 +99,8 @@ class Page(ManualFormMixin, rend.Page): def form_post_btn1(self, what=None): # 'what' is a keyword argument, and must be the same name that you # give to the widget. - print "btn1:", what + print("btn1:", what) def form_post_btn2(self, what=None): # see above for 'what'. - print "btn2:", what + print("btn2:", what) diff --git a/examples/athenademo/benchmark.py b/examples/athenademo/benchmark.py index 34d7f9d8..710df9f6 100644 --- a/examples/athenademo/benchmark.py +++ b/examples/athenademo/benchmark.py @@ -1,5 +1,5 @@ -from __future__ import division + from twisted.python import filepath @@ -31,7 +31,7 @@ def render_body(self, ctx, data): yield top class InitializationBenchmark(athena.LiveFragment): - jsClass = u'Nevow.Benchmarks.InitializationBenchmark' + jsClass = 'Nevow.Benchmarks.InitializationBenchmark' docFactory = loaders.stan( tags.div(render=tags.directive('liveFragment'))[ diff --git a/examples/athenademo/calculator.py b/examples/athenademo/calculator.py index 21d1fdbe..996caf35 100644 --- a/examples/athenademo/calculator.py +++ b/examples/athenademo/calculator.py @@ -28,8 +28,8 @@ class Calculator(object): entered into the calculator. For example, if the buttons '3', '5', and '+' have been pressed (in that order), C{expression} will be C{'35+'}. """ - defaultExpression = u'0' - errorExpression = u'E' + defaultExpression = '0' + errorExpression = 'E' def __init__(self): self.expression = self.defaultExpression @@ -57,7 +57,7 @@ def buttonClicked(self, symbol): # Evaluate the expression if symbol == '=': try: - self.expression = unicode(eval(self.expression)) + self.expression = str(eval(self.expression)) except ZeroDivisionError: self.expression = self.errorExpression return self.expression @@ -86,7 +86,7 @@ class CalculatorElement(LiveElement): """ docFactory = xmlfile(sibling('calculator.html').path, 'CalculatorPattern') - jsClass = u"CalculatorDemo.Calculator" + jsClass = "CalculatorDemo.Calculator" validSymbols = '0123456789/*-=+.C' @@ -123,7 +123,7 @@ def __init__(self, *a, **kw): # Update the mapping of known JavaScript modules so that the # client-side code for this example can be found and served to the # browser. - self.jsModules.mapping[u'CalculatorDemo'] = sibling( + self.jsModules.mapping['CalculatorDemo'] = sibling( 'calculator.js').path diff --git a/examples/athenademo/typeahead.py b/examples/athenademo/typeahead.py index e738cf18..9e8c523b 100644 --- a/examples/athenademo/typeahead.py +++ b/examples/athenademo/typeahead.py @@ -3,10 +3,10 @@ from formless import annotate, webform from twisted.python import util -animals = {u'elf' : u'Pointy ears. Bad attitude regarding trees.', - u'chipmunk': u'Cute. Fuzzy. Sings horribly.', - u'chupacabra': u'It sucks goats.', - u'ninja': u'Stealthy and invisible, and technically an animal.', +animals = {'elf' : 'Pointy ears. Bad attitude regarding trees.', + 'chipmunk': 'Cute. Fuzzy. Sings horribly.', + 'chupacabra': 'It sucks goats.', + 'ninja': 'Stealthy and invisible, and technically an animal.', } @@ -26,8 +26,8 @@ class TypeAheadFieldFragment(athena.LiveFragment): ]) def loadDescription(self, typed): - if typed == u'': - return None, u'--' + if typed == '': + return None, '--' matches = [] for key in animals: if key.startswith(typed): @@ -35,9 +35,9 @@ def loadDescription(self, typed): if len(matches) == 1: return matches[0], animals[matches[0]] elif len(matches) > 1: - return None, u"(Multiple found)" + return None, "(Multiple found)" else: - return None, u'--' + return None, '--' athena.expose(loadDescription) class DataEntry(rend.Page): @@ -75,7 +75,7 @@ def animals(self, animal, description): return url.here def data_animals(self, ctx, data): - return animals.keys() + return list(animals.keys()) def child_typeahead(self, ctx): return TypeAheadPage(None, None) diff --git a/examples/athenademo/widgets.py b/examples/athenademo/widgets.py index 8669f948..6cc8bedd 100644 --- a/examples/athenademo/widgets.py +++ b/examples/athenademo/widgets.py @@ -7,7 +7,7 @@ from nevow import athena, loaders, static class Clock(athena.LiveFragment): - jsClass = u"WidgetDemo.Clock" + jsClass = "WidgetDemo.Clock" docFactory = loaders.xmlstr('''\
",t.strong[inside_counter.next()+1],"<==="] + t.p(style="text-align: center")["===>",t.strong[next(inside_counter)+1],"<==="] ] class Root(Base): @@ -21,7 +21,7 @@ class Root(Base): def macro_content(self, ctx): return t.invisible[ t.p["This macro has been called ", - counter1.next()+1, + next(counter1)+1, " time(s)"], loaders.xmlfile(util.sibpath(__file__,'root_macro.html'), ignoreDocType=True).load() ] @@ -35,7 +35,7 @@ class Child(Base): def macro_content(self, ctx): return t.invisible[ t.p["This macro has been called ", - counter2.next()+1, + next(counter2)+1, " time(s)"], loaders.xmlfile(util.sibpath(__file__,'child_macro.html'), ignoreDocType=True).load() ] diff --git a/examples/manualform/manualform.py b/examples/manualform/manualform.py index 8019d86c..4a4ce8c4 100644 --- a/examples/manualform/manualform.py +++ b/examples/manualform/manualform.py @@ -17,7 +17,7 @@ def locateChild(self, ctx, segments): # Handle the form post if segments[0] == SUBMIT: # Just print out the name - print '*** name:', ctx.arg('name') + print('*** name:', ctx.arg('name')) # Redirect away from the POST return url.URL.fromContext(ctx), () diff --git a/examples/pastebin/pastebin/service.py b/examples/pastebin/pastebin/service.py index fcae84eb..816b42f0 100644 --- a/examples/pastebin/pastebin/service.py +++ b/examples/pastebin/pastebin/service.py @@ -1,4 +1,4 @@ -import cPickle as pickle +import pickle as pickle import os.path import time from zope.interface import implements diff --git a/examples/pastebin/pastebin/web/pages.py b/examples/pastebin/pastebin/web/pages.py index 23bd662b..251886d2 100644 --- a/examples/pastebin/pastebin/web/pages.py +++ b/examples/pastebin/pastebin/web/pages.py @@ -1,4 +1,4 @@ -from cStringIO import StringIO +from io import StringIO import time from zope.interface import implements diff --git a/examples/postit/store.py b/examples/postit/store.py index 13c0ecdb..5630ba06 100644 --- a/examples/postit/store.py +++ b/examples/postit/store.py @@ -37,11 +37,11 @@ def initialize(): s = store.Store('postit.axiom') postit = IPostit(s, None) if not postit: - Application(store=s, name=u'Postit').installOn(s) + Application(store=s, name='Postit').installOn(s) Post(store=s, - title=u"This is the title", - url=u"http://www.divmod.org", - content=u"Here is the content for the link", - author=u"dialtone", + title="This is the title", + url="http://www.divmod.org", + content="Here is the content for the link", + author="dialtone", created=Time()) return s diff --git a/examples/todo/dispatcher.py b/examples/todo/dispatcher.py index 4254f1f2..85a3a592 100644 --- a/examples/todo/dispatcher.py +++ b/examples/todo/dispatcher.py @@ -1,6 +1,7 @@ from nevow import rend import itodo import controller +import imp # All this is only useful to dynamically update the web page code # without restarting the server each time. As you can see below, you can @@ -9,5 +10,5 @@ class Dispatch(rend.Page): def locateChild(self, ctx, segments): if itodo.IEnv(ctx).development: - reload(controller) + imp.reload(controller) return controller.root.locateChild(ctx,segments) diff --git a/examples/tree/tree.py b/examples/tree/tree.py index 9abc3254..d1f956f0 100644 --- a/examples/tree/tree.py +++ b/examples/tree/tree.py @@ -13,7 +13,7 @@ def __init__(self, name, description, *children): self.add(child) def add(self, child): self[child.name] = child - def __nonzero__(self): + def __bool__(self): return True class ITreeEdit(annotate.TypedInterface): @@ -55,7 +55,7 @@ def deleteChild(self, name): def data_description(self, context, data): return self.original.description def data_children(self, context, data): - return self.original.items() + return list(self.original.items()) def render_childLink(self, context, data): return T.a(href='subtree_%s/'%data[0])[data[1].description] def childFactory(self, ctx, name): @@ -63,7 +63,8 @@ def childFactory(self, ctx, name): return self.original[name[len('subtree_'):]] def render_descriptionForm(self, context, data): return webform.renderForms() - def render_childDel(self, context, (name, _)): + def render_childDel(self, context, xxx_todo_changeme): + (name, _) = xxx_todo_changeme ret = T.form(action="./freeform_post!!deleteChild", enctype="multipart/form-data", method="POST")[ T.input(type="hidden", name="name", value=name), diff --git a/examples/with_axiom/powerups.py b/examples/with_axiom/powerups.py index 61f617e4..f3264d56 100644 --- a/examples/with_axiom/powerups.py +++ b/examples/with_axiom/powerups.py @@ -28,16 +28,16 @@ def addNewBook(self, title): newBook = Book(store=self.store, title=title) def getBookByTitle(self, title): - books = self.store.query(Book, Book.title == unicode(title)) + books = self.store.query(Book, Book.title == str(title)) for book in books: return book def initialize(dbdir): # This is store initialization. s = store.Store(dbdir) - l = Library(store=s, name=u"Great Library") + l = Library(store=s, name="Great Library") l.installOn(s) - descr = u"""This book is totally useless, in fact nobody would + descr = """This book is totally useless, in fact nobody would borrow it""" - Book(store=s, title=u"Title: 1", description=descr) + Book(store=s, title="Title: 1", description=descr) return s diff --git a/formless/annotate.py b/formless/annotate.py index 385b4332..0b503618 100644 --- a/formless/annotate.py +++ b/formless/annotate.py @@ -17,16 +17,17 @@ from formless import iformless +import collections class count(object): def __init__(self): self.id = 0 - def next(self): + def __next__(self): self.id += 1 return self.id -nextId = count().next +nextId = count().__next__ class InputError(Exception): @@ -102,7 +103,7 @@ class Typed(Attribute): required = False requiredFailMessage = 'Please enter a value' null = None - unicode = False + str = False __name__ = '' @@ -114,7 +115,7 @@ def __init__( required=None, requiredFailMessage=None, null=None, - unicode=None, + str=None, **attributes): self.id = nextId() @@ -130,15 +131,15 @@ def __init__( self.requiredFailMessage = requiredFailMessage if null is not None: self.null = null - if unicode is not None: - self.unicode = unicode + if str is not None: + self.str = str self.attributes = attributes def getAttribute(self, name, default=None): return self.attributes.get(name, default) def coerce(self, val, configurable): - raise NotImplementedError, "Implement in %s" % util.qual(self.__class__) + raise NotImplementedError("Implement in %s" % util.qual(self.__class__)) ####################################### @@ -209,7 +210,7 @@ def coerce(self, val, configurable): except ValueError: if sys.version_info < (2,3): # Long/Int aren't integrated try: - return long(val) + return int(val) except ValueError: raise InputError("'%s' is not an integer." % val) @@ -540,7 +541,7 @@ def getViewName(self): return self.original.__class__.__name__.lower() def configure(self, boundTo, results): - raise NotImplementedError, "Implement in %s" % util.qual(self.__class__) + raise NotImplementedError("Implement in %s" % util.qual(self.__class__)) def coerce(self, val, configurable): if hasattr(self.original, 'coerce'): @@ -617,7 +618,7 @@ def __init__(self, name, typedValue, id=0): self.complexType = typedValue.complexType def configure(self, boundTo, group): - print "CONFIGURING GROUP BINDING", boundTo, group + print("CONFIGURING GROUP BINDING", boundTo, group) def _sorter(x, y): @@ -670,7 +671,7 @@ def nameToLabel(mname): def labelAndDescriptionFromDocstring(docstring): if docstring is None: docstring = '' - docs = filter(lambda x: x, [x.strip() for x in docstring.split('\n')]) + docs = [x for x in [x.strip() for x in docstring.split('\n')] if x] if len(docs) > 1: return docs[0], '\n'.join(docs[1:]) else: @@ -723,7 +724,7 @@ def __new__(cls, name, bases, dct): cls.complexType = True possibleActions = [] actionAttachers = [] - for key, value in dct.items(): + for key, value in list(dct.items()): if key[0] == '_': continue if isinstance(value, MetaTypedInterface): @@ -733,7 +734,7 @@ def __new__(cls, name, bases, dct): ## zope.interface doesn't like these del dct[key] setattr(cls, key, value) - elif callable(value): + elif isinstance(value, collections.Callable): names, _, _, typeList = inspect.getargspec(value) _testCallArgs = () diff --git a/formless/configurable.py b/formless/configurable.py index f2904d1f..6d12cce5 100644 --- a/formless/configurable.py +++ b/formless/configurable.py @@ -66,7 +66,7 @@ def getBinding(self, context, name): try: binding = self.bindingDict[name] except KeyError: - raise RuntimeError, "%s is not an exposed binding on object %s." % (name, self.boundTo) + raise RuntimeError("%s is not an exposed binding on object %s." % (name, self.boundTo)) binding.boundTo = self.boundTo return binding @@ -125,7 +125,7 @@ def summary(self): class NotFoundConfigurable(Configurable): def getBinding(self, context, name): - raise RuntimeError, self.original + raise RuntimeError(self.original) class TypedInterfaceConfigurable(Configurable): diff --git a/formless/formutils.py b/formless/formutils.py index 3e327159..11f0dda9 100644 --- a/formless/formutils.py +++ b/formless/formutils.py @@ -1,7 +1,7 @@ # Copyright (c) 2004 Divmod. # See LICENSE for details. -from __future__ import generators + from zope.interface import implements @@ -20,7 +20,7 @@ def enumerate(collection): i = 0 it = iter(collection) while 1: - yield (i, it.next()) + yield (i, next(it)) i += 1 @@ -48,7 +48,7 @@ def __getitem__(self, key): return self.errors[pfxkey] def update(self, other): - for key, value in other.items(): + for key, value in list(other.items()): self[key] = value @@ -107,7 +107,7 @@ def updateErrors(self, formName, errors): PrefixerDict(formName, self.errors).update(errors) def clearErrors(self, formName): - for key in self.errors.keys(): + for key in list(self.errors.keys()): if key.startswith(formName): del self.errors[key] diff --git a/formless/processors.py b/formless/processors.py index 10e807f5..69f6904e 100644 --- a/formless/processors.py +++ b/formless/processors.py @@ -21,7 +21,7 @@ def exceptblock(f, handler, exception, *a, **kw): try: result = f(*a, **kw) - except exception, e: + except exception as e: return handler(e) if isinstance(result, Deferred): def _(fail): @@ -91,7 +91,7 @@ def process(self, context, boundTo, data, autoConfigure = True): typedValue = self.original.typedValue results = {} failures = {} - if data.has_key('----'): + if '----' in data: ## ---- is the "direct object", the one argument you can specify using the command line without saying what the argument name is data[typedValue.arguments[0].name] = data['----'] del data['----'] @@ -101,7 +101,7 @@ def process(self, context, boundTo, data, autoConfigure = True): context = WovenContext(context, faketag) context.remember(binding, iformless.IBinding) results[name] = iformless.IInputProcessor(binding.typedValue).process(context, boundTo, data.get(name, [''])) - except formless.InputError, e: + except formless.InputError as e: results[name] = data.get(name, [''])[0] failures[name] = e.reason @@ -130,14 +130,14 @@ def process(self, context, boundTo, data, autoConfigure = True): result = {} try: result[binding.name] = iformless.IInputProcessor(binding.typedValue).process(context, boundTo, data.get(binding.name, [''])) - except formless.InputError, e: + except formless.InputError as e: result[binding.name] = data.get(binding.name, ['']) raise formless.ValidateError({binding.name: e.reason}, e.reason, result) if autoConfigure: try: return self.original.configure(boundTo, result) - except formless.InputError, e: + except formless.InputError as e: result[binding.name] = data.get(binding.name, ['']) raise formless.ValidateError({binding.name: e.reason}, e.reason, result) return result @@ -150,7 +150,7 @@ def process(self, context, boundTo, data): """ typed = self.original val = data[0] - if typed.unicode: + if typed.str: try: val = val.decode(getPOSTCharset(context), 'replace') except LookupError: @@ -164,7 +164,7 @@ def process(self, context, boundTo, data): return typed.null try: return typed.coerce(val, boundTo) - except TypeError, e: + except TypeError as e: warnings.warn('Typed.coerce takes two values now, the value to coerce and the configurable in whose context the coerce is taking place. %s %s' % (typed.__class__, typed)) return typed.coerce(val) @@ -190,7 +190,7 @@ def process(self, context, boundTo, data): else: return typed.null val = data[0] - if typed.unicode: + if typed.str: try: val = val.decode(getPOSTCharset(context), 'replace') except LookupError: diff --git a/formless/test/test_formless.py b/formless/test/test_formless.py index 146acbf9..74d54038 100644 --- a/formless/test/test_formless.py +++ b/formless/test/test_formless.py @@ -16,60 +16,60 @@ def process(typed, value): class Typed(TestCase): def testString(self): s = formless.String() - self.assertEquals(process(s, ''), None) - self.assertEquals(process(s, "Fooo"), "Fooo") - self.assertEquals(process(s, "This is a string"), "This is a string") - self.assertEquals(process(s, 'C\xc3\xa9sar'), 'C\xc3\xa9sar') + self.assertEqual(process(s, ''), None) + self.assertEqual(process(s, "Fooo"), "Fooo") + self.assertEqual(process(s, "This is a string"), "This is a string") + self.assertEqual(process(s, 'C\xc3\xa9sar'), 'C\xc3\xa9sar') - s = formless.String(unicode=True) - self.assertEquals(process(s, 'C\xc3\xa9sar'), u'C\u00e9sar') + s = formless.String(str=True) + self.assertEqual(process(s, 'C\xc3\xa9sar'), 'C\u00e9sar') s = formless.String(required=True) self.assertRaises(formless.InputError, process, s, "") s = formless.String(required=False) - self.assertEquals(process(s, "Bar"), "Bar") - self.assertEquals(process(s, ""), None) + self.assertEqual(process(s, "Bar"), "Bar") + self.assertEqual(process(s, ""), None) s = formless.String() - self.assertEquals(process(s, ' abc '), ' abc ') + self.assertEqual(process(s, ' abc '), ' abc ') s = formless.String(strip=True, required=True) - self.assertEquals(process(s, ' abc '), 'abc') - self.assertEquals(process(s, '\t abc \t \n '), 'abc') + self.assertEqual(process(s, ' abc '), 'abc') + self.assertEqual(process(s, '\t abc \t \n '), 'abc') self.assertRaises(formless.InputError, process, s, ' ') s = formless.String(required=False, strip=True) - self.assertEquals(process(s, ' abc '), 'abc') - self.assertEquals(process(s, ' '), None) + self.assertEqual(process(s, ' abc '), 'abc') + self.assertEqual(process(s, ' '), None) def testText(self): s = formless.Text() - self.assertEquals(process(s, ""), None) - self.assertEquals(process(s, "Fooo"), "Fooo") - self.assertEquals(process(s, "This is a string"), "This is a string") - self.assertEquals(process(s, 'C\xc3\xa9sar'), 'C\xc3\xa9sar') + self.assertEqual(process(s, ""), None) + self.assertEqual(process(s, "Fooo"), "Fooo") + self.assertEqual(process(s, "This is a string"), "This is a string") + self.assertEqual(process(s, 'C\xc3\xa9sar'), 'C\xc3\xa9sar') - s = formless.Text(unicode=True) - self.assertEquals(process(s, 'C\xc3\xa9sar'), u'C\u00e9sar') + s = formless.Text(str=True) + self.assertEqual(process(s, 'C\xc3\xa9sar'), 'C\u00e9sar') s = formless.Text(required=True) self.assertRaises(formless.InputError, process, s, "") s = formless.Text(required=False) - self.assertEquals(process(s, "Bar"), "Bar") - self.assertEquals(process(s, ""), None) + self.assertEqual(process(s, "Bar"), "Bar") + self.assertEqual(process(s, ""), None) s = formless.Text() - self.assertEquals(process(s, ' abc '), ' abc ') + self.assertEqual(process(s, ' abc '), ' abc ') s = formless.Text(strip=True, required=True) - self.assertEquals(process(s, ' abc '), 'abc') + self.assertEqual(process(s, ' abc '), 'abc') self.assertRaises(formless.InputError, process, s, ' ') s = formless.Text(required=False, strip=True) - self.assertEquals(process(s, ' abc '), 'abc') - self.assertEquals(process(s, ' '), None) + self.assertEqual(process(s, ' abc '), 'abc') + self.assertEqual(process(s, ' '), None) def testPassword(self): @@ -80,64 +80,64 @@ def process(pw, val, val2=None): {'password': [val], 'password____2': [val2]})['password'] s = formless.Password() - self.assertEquals(process(s, "Fooo"), "Fooo") - self.assertEquals(process(s, "This is a string"), "This is a string") - self.assertEquals(process(s, "This is a string"), "This is a string") - self.assertEquals(process(s, 'C\xc3\xa9sar'), 'C\xc3\xa9sar') + self.assertEqual(process(s, "Fooo"), "Fooo") + self.assertEqual(process(s, "This is a string"), "This is a string") + self.assertEqual(process(s, "This is a string"), "This is a string") + self.assertEqual(process(s, 'C\xc3\xa9sar'), 'C\xc3\xa9sar') - s = formless.Password(unicode=True) - self.assertEquals(process(s, 'C\xc3\xa9sar'), u'C\u00e9sar') + s = formless.Password(str=True) + self.assertEqual(process(s, 'C\xc3\xa9sar'), 'C\u00e9sar') s = formless.Password(required=True) self.assertRaises(formless.ValidateError, process, s, "") s = formless.Password(required=False) - self.assertEquals(process(s, "Bar"), "Bar") - self.assertEquals(process(s, ""), None) + self.assertEqual(process(s, "Bar"), "Bar") + self.assertEqual(process(s, ""), None) s = formless.Password() - self.assertEquals(process(s, ' abc '), ' abc ') + self.assertEqual(process(s, ' abc '), ' abc ') s = formless.Password(strip=True, required=True) - self.assertEquals(process(s, ' abc '), 'abc') + self.assertEqual(process(s, ' abc '), 'abc') self.assertRaises(formless.ValidateError, process, s, ' ') s = formless.Password(required=False, strip=True) - self.assertEquals(process(s, ' abc '), 'abc') - self.assertEquals(process(s, ' '), None) + self.assertEqual(process(s, ' abc '), 'abc') + self.assertEqual(process(s, ' '), None) def testPasswordEntry(self): s = formless.PasswordEntry() - self.assertEquals(process(s, ''), None) - self.assertEquals(process(s, 'abc'), 'abc') - self.assertEquals(process(s, ' blah blah blah '), ' blah blah blah ') - self.assertEquals(process(s, 'C\xc3\xa9sar'), 'C\xc3\xa9sar') + self.assertEqual(process(s, ''), None) + self.assertEqual(process(s, 'abc'), 'abc') + self.assertEqual(process(s, ' blah blah blah '), ' blah blah blah ') + self.assertEqual(process(s, 'C\xc3\xa9sar'), 'C\xc3\xa9sar') - s = formless.PasswordEntry(unicode=True) - self.assertEquals(process(s, 'C\xc3\xa9sar'), u'C\u00e9sar') + s = formless.PasswordEntry(str=True) + self.assertEqual(process(s, 'C\xc3\xa9sar'), 'C\u00e9sar') s = formless.PasswordEntry(strip=True) - self.assertEquals(process(s, ''), None) - self.assertEquals(process(s, 'abc'), 'abc') - self.assertEquals(process(s, ' blah blah blah '), 'blah blah blah') + self.assertEqual(process(s, ''), None) + self.assertEqual(process(s, 'abc'), 'abc') + self.assertEqual(process(s, ' blah blah blah '), 'blah blah blah') s = formless.PasswordEntry(strip=True, required=True) self.assertRaises(formless.InputError, process, s, '') self.assertRaises(formless.InputError, process, s, ' ') - self.assertEquals(process(s, 'abc'), 'abc') - self.assertEquals(process(s, ' blah blah blah '), 'blah blah blah') + self.assertEqual(process(s, 'abc'), 'abc') + self.assertEqual(process(s, ' blah blah blah '), 'blah blah blah') def testInteger(self): i = formless.Integer(required=True) - self.assertEquals(process(i, "0"), 0) - self.assertEquals(process(i, "3409823098"), 3409823098) + self.assertEqual(process(i, "0"), 0) + self.assertEqual(process(i, "3409823098"), 3409823098) self.assertRaises(formless.InputError, process, i, "") self.assertRaises(formless.InputError, process, i, "a string") self.assertRaises(formless.InputError, process, i, "1.5") i = formless.Integer(required=False) - self.assertEquals(process(i, "1234567"), 1234567) - self.assertEquals(process(i, ""), None) + self.assertEqual(process(i, "1234567"), 1234567) + self.assertEqual(process(i, ""), None) def testReal(self): i = formless.Real(required=True) @@ -149,7 +149,7 @@ def testReal(self): i = formless.Real(required=False) self.assertApproximates(process(i, "1234.567"), 1234.567, 1e-10) - self.assertEquals(process(i, ""), None) + self.assertEqual(process(i, ""), None) def testBoolean(self): b = formless.Boolean(required=True) @@ -157,19 +157,19 @@ def testBoolean(self): self.assertRaises(formless.InputError, process, b, True) self.assertRaises(formless.InputError, process, b, 54) self.assertRaises(formless.InputError, process, b, "") - self.assertEquals(process(b, "True"), True) - self.assertEquals(process(b, "False"), False) + self.assertEqual(process(b, "True"), True) + self.assertEqual(process(b, "False"), False) b = formless.Boolean(required=False) self.assertRaises(formless.InputError, process, b, "zoom") - self.assertEquals(process(b, ""), None) - self.assertEquals(process(b, "True"), True) - self.assertEquals(process(b, "False"), False) + self.assertEqual(process(b, ""), None) + self.assertEqual(process(b, "True"), True) + self.assertEqual(process(b, "False"), False) def testFixedDigitInteger(self): d = formless.FixedDigitInteger(3, required=True) - self.assertEquals(process(d, "123"), 123) - self.assertEquals(process(d, "567"), 567) + self.assertEqual(process(d, "123"), 123) + self.assertEqual(process(d, "567"), 567) self.assertRaises(formless.InputError, process, d, "12") self.assertRaises(formless.InputError, process, d, "1234") self.assertRaises(formless.InputError, process, d, "012") @@ -178,9 +178,9 @@ def testFixedDigitInteger(self): self.assertRaises(formless.InputError, process, d, "") d = formless.FixedDigitInteger(3, required=False) - self.assertEquals(process(d, "123"), 123) + self.assertEqual(process(d, "123"), 123) self.assertRaises(formless.InputError, process, d, "foo") - self.assertEquals(process(d, ""), None) + self.assertEqual(process(d, ""), None) def testDirectory(self): p1 = self.mktemp() @@ -188,14 +188,14 @@ def testDirectory(self): p2 = self.mktemp() d = formless.Directory(required=True) - self.assertEquals(process(d, p1), p1) + self.assertEqual(process(d, p1), p1) self.assertRaises(formless.InputError, process, d, p2) self.assertRaises(formless.InputError, process, d, "") d = formless.Directory(required=False) - self.assertEquals(process(d, p1), p1) + self.assertEqual(process(d, p1), p1) self.assertRaises(formless.InputError, process, d, p2) - self.assertEquals(process(d, ""), None) + self.assertEqual(process(d, ""), None) class Annotation(TestCase): @@ -209,20 +209,20 @@ class Test(formless.TypedInterface): baz = formless.Integer() quux = formless.Object(interface=_indirectOther()) - self.assertEquals(Test.__properties__, Test.__spec__) + self.assertEqual(Test.__properties__, Test.__spec__) bfoo, bbar, bbaz, quux = Test.__properties__ - self.assertEquals(bfoo.name, 'foo') - self.assertEquals(bbar.name, 'bar') - self.assertEquals(bbaz.name, 'baz') + self.assertEqual(bfoo.name, 'foo') + self.assertEqual(bbar.name, 'bar') + self.assertEqual(bbaz.name, 'baz') - self.assertEquals(bfoo.typedValue.__class__, formless.String) - self.assertEquals(bbar.typedValue.__class__, formless.Text) - self.assertEquals(bbaz.typedValue.__class__, formless.Integer) - self.assertEquals(quux.typedValue.__class__, formless.Object) + self.assertEqual(bfoo.typedValue.__class__, formless.String) + self.assertEqual(bbar.typedValue.__class__, formless.Text) + self.assertEqual(bbaz.typedValue.__class__, formless.Integer) + self.assertEqual(quux.typedValue.__class__, formless.Object) - self.assertEquals(quux.typedValue.iface, Other) + self.assertEqual(quux.typedValue.iface, Other) def testTypedInterfaceMethods(self): @@ -249,47 +249,47 @@ def baz(bazfoo=formless.Boolean(label="The Foo", description="The foo to baz.")) return IFoo baz = formless.autocallable(baz) - self.assertEquals(Test2.__methods__, Test2.__spec__) + self.assertEqual(Test2.__methods__, Test2.__spec__) bfoo, bbar, bbaz = Test2.__methods__ - self.assertEquals(bfoo.name, 'foo') - self.assertEquals(bbar.name, 'bar') - self.assertEquals(bbar.getAttribute('someAttribute'), "Hello") - self.assertEquals(bbaz.name, 'baz') + self.assertEqual(bfoo.name, 'foo') + self.assertEqual(bbar.name, 'bar') + self.assertEqual(bbar.getAttribute('someAttribute'), "Hello") + self.assertEqual(bbaz.name, 'baz') - self.assertEquals(bfoo.label, 'Foo') - self.assertEquals(bfoo.description, 'This is a description of foo') + self.assertEqual(bfoo.label, 'Foo') + self.assertEqual(bfoo.description, 'This is a description of foo') - self.assertEquals(bbar.label, 'Bar') - self.assertEquals(bbar.description, '') + self.assertEqual(bbar.label, 'Bar') + self.assertEqual(bbar.description, '') - self.assertEquals(bbaz.label, 'The Label') - self.assertEquals(bbaz.description, 'The description') + self.assertEqual(bbaz.label, 'The Label') + self.assertEqual(bbaz.description, 'The description') def getArgTypes(mbinding): return [x.typedValue.__class__ for x in mbinding.arguments] - self.assertEquals(getArgTypes(bfoo), [formless.String]) - self.assertEquals(bfoo.returnValue.iface, None) + self.assertEqual(getArgTypes(bfoo), [formless.String]) + self.assertEqual(bfoo.returnValue.iface, None) - self.assertEquals(getArgTypes(bbar), [formless.Integer]) - self.assertEquals(bbar.returnValue.__class__, formless.String) + self.assertEqual(getArgTypes(bbar), [formless.Integer]) + self.assertEqual(bbar.returnValue.__class__, formless.String) - self.assertEquals(getArgTypes(bbaz), [formless.Boolean]) - self.assertEquals(bbaz.returnValue.iface, IFoo) + self.assertEqual(getArgTypes(bbaz), [formless.Boolean]) + self.assertEqual(bbaz.returnValue.iface, IFoo) def firstArg(mbinding): return mbinding.arguments[0] - self.assertEquals(firstArg(bfoo).label, 'Foobar') - self.assertEquals(firstArg(bfoo).description, '') + self.assertEqual(firstArg(bfoo).label, 'Foobar') + self.assertEqual(firstArg(bfoo).description, '') - self.assertEquals(firstArg(bbar).label, 'The Baz') - self.assertEquals(firstArg(bbar).description, '') + self.assertEqual(firstArg(bbar).label, 'The Baz') + self.assertEqual(firstArg(bbar).description, '') - self.assertEquals(firstArg(bbaz).label, 'The Foo') - self.assertEquals(firstArg(bbaz).description, 'The foo to baz.') + self.assertEqual(firstArg(bbaz).label, 'The Foo') + self.assertEqual(firstArg(bbaz).description, 'The foo to baz.') def testTypedInterfaceMethods_actionLabel(self): """When no label was given, docstring is given preference compared to action.""" @@ -302,13 +302,13 @@ def foo(foobar=formless.String()): pass foo = formless.autocallable(foo, action="Do something!") - self.assertEquals(Test.__methods__, Test.__spec__) + self.assertEqual(Test.__methods__, Test.__spec__) (bfoo,) = Test.__methods__ - self.assertEquals(bfoo.name, 'foo') + self.assertEqual(bfoo.name, 'foo') - self.assertEquals(bfoo.label, 'Label for foo') - self.assertEquals(bfoo.description, 'Description for foo') + self.assertEqual(bfoo.label, 'Label for foo') + self.assertEqual(bfoo.description, 'Description for foo') def testTypedInterfaceMethods_explicitLabel(self): """When a label was given, it is given preference compared to docstring.""" @@ -324,13 +324,13 @@ def foo(foobar=formless.String()): label="Explicit label for foo", ) - self.assertEquals(Test.__methods__, Test.__spec__) + self.assertEqual(Test.__methods__, Test.__spec__) (bfoo,) = Test.__methods__ - self.assertEquals(bfoo.name, 'foo') + self.assertEqual(bfoo.name, 'foo') - self.assertEquals(bfoo.label, 'Explicit label for foo') - self.assertEquals(bfoo.description, 'Description for foo') + self.assertEqual(bfoo.label, 'Explicit label for foo') + self.assertEqual(bfoo.description, 'Description for foo') def testTypedInterfaceMethods_deprecated(self): class Test(formless.TypedInterface): @@ -342,19 +342,19 @@ def oneArg(self, someParam=formless.String()): pass oneArg = formless.autocallable(oneArg) - self.assertEquals(Test.__methods__, Test.__spec__) + self.assertEqual(Test.__methods__, Test.__spec__) m_noArgs, m_oneArg = Test.__methods__ - self.assertEquals(len(m_noArgs.arguments), 0) - self.assertEquals(len(m_oneArg.arguments), 1) + self.assertEqual(len(m_noArgs.arguments), 0) + self.assertEqual(len(m_oneArg.arguments), 1) def testTypedInterfaceMethods_nonAutocallable(self): class Test(formless.TypedInterface): def notAutocallable(arg1, arg2): pass - self.assertEquals(Test.__methods__, Test.__spec__) - self.assertEquals(Test.__methods__, []) + self.assertEqual(Test.__methods__, Test.__spec__) + self.assertEqual(Test.__methods__, []) class IListWithActions(formless.TypedInterface): def actionOne(theSubset = formless.List()): @@ -370,8 +370,8 @@ def test_listActionMetadata(self): ## IListWithActions only has one binding, a Property binding ## of theListOfStuff to a List with some actions. actions = IListWithActions.__spec__[0].typedValue.actions - self.failUnless(reduce, (lambda x: x.name == 'actionOne', actions)) - self.failUnless(reduce, (lambda x: x.name == 'actionTwo', actions)) + self.assertTrue(reduce, (lambda x: x.name == 'actionOne', actions)) + self.assertTrue(reduce, (lambda x: x.name == 'actionTwo', actions)) class TestPropertyGroups(TestCase): @@ -386,5 +386,5 @@ class Inner(formless.TypedInterface): """ anInnerProperty = formless.Integer() - self.assertEquals(Outer.__spec__[1].typedValue.iface, Outer.Inner) + self.assertEqual(Outer.__spec__[1].typedValue.iface, Outer.Inner) inn = Outer.__spec__[1].typedValue.iface diff --git a/formless/test/test_freeform.py b/formless/test/test_freeform.py index 3bba7522..9e088d0b 100644 --- a/formless/test/test_freeform.py +++ b/formless/test/test_freeform.py @@ -285,7 +285,7 @@ def password(self, pword, integer): D = self.postForm(ctx, theObj, "password", {"pword": ["these passwords"], "pword____2": ["don't match"], 'integer': ['Not integer']}) def after(result): - self.assertEquals(theObj.matched, False) + self.assertEqual(theObj.matched, False) def later(val): self.assertSubstring("Passwords do not match. Please reenter.", val) self.assertSubstring('value="Not integer"', val) @@ -344,10 +344,10 @@ def later(val): def after(result): - self.assertEquals(impl.one, 1) - self.assertEquals(impl.two, 2) - self.assertEquals(impl.buckled, False) - self.assertEquals(impl.buried, False) + self.assertEqual(impl.one, 1) + self.assertEqual(impl.two, 2) + self.assertEqual(impl.buckled, False) + self.assertEqual(impl.buried, False) def evenlater(moreval): self.assertSubstring("is not an integer", moreval) @@ -355,10 +355,10 @@ def evenlater(moreval): #self.assertSubstring('value="Not an integer"', moreval) DD = self.postForm(ctx, impl, "Inner", {'one': ['11'], 'two': ['22']}) def afterafter(ign): - self.assertEquals(impl.one, 11) - self.assertEquals(impl.two, 22) - self.assertEquals(impl.buckled, True) - self.assertEquals(impl.buried, True) + self.assertEqual(impl.one, 11) + self.assertEqual(impl.two, 22) + self.assertEqual(impl.buckled, True) + self.assertEqual(impl.buried, True) return DD.addCallback(afterafter) return self.renderForms(impl, ctx).addCallback(evenlater) return D.addCallback(after) @@ -444,9 +444,9 @@ def theFunc(self, test): ctx = self.setupContext() D = self.postForm(ctx, inst, 'theFunc', {'test': ['a test value']}) def after(result): - self.assertEquals(typedinst.passed, True) - self.assertEquals(typedinst.wasBoundTo, inst) - self.assertEquals(inst.called, True) + self.assertEqual(typedinst.passed, True) + self.assertEqual(typedinst.wasBoundTo, inst) + self.assertEqual(inst.called, True) return D.addCallback(after) @@ -513,8 +513,8 @@ def foo(self): ctx = self.setupContext() D = self.postForm(ctx, inst, 'foo', {}) def after(result): - self.assertEquals(ctx.locate(inevow.IHand), returnResult) - self.assertEquals(ctx.locate(inevow.IStatusMessage), "'foo' success.") + self.assertEqual(ctx.locate(inevow.IHand), returnResult) + self.assertEqual(ctx.locate(inevow.IStatusMessage), "'foo' success.") return D.addCallback(after) def test_handFactory(self): @@ -532,8 +532,8 @@ def setupRequest(r): return r ctx = self.setupContext(setupRequest=setupRequest) - self.assertEquals(ctx.locate(inevow.IHand), returnResult) - self.assertEquals(ctx.locate(inevow.IStatusMessage), status) + self.assertEqual(ctx.locate(inevow.IHand), returnResult) + self.assertEqual(ctx.locate(inevow.IStatusMessage), status) class TestCharsetDetectionSupport(Base): @@ -594,7 +594,7 @@ class TestUnicode(Base): def test_property(self): class IThing(formless.TypedInterface): - aString = formless.String(unicode=True) + aString = formless.String(str=True) class Impl(object): implements(IThing) @@ -603,7 +603,7 @@ class Impl(object): inst = Impl() ctx = self.setupContext() D = self.postForm(ctx, inst, 'aString', {'aString':['\xc2\xa3']}) - return D.addCallback(lambda result: self.assertEquals(inst.aString, u'\xa3')) + return D.addCallback(lambda result: self.assertEqual(inst.aString, '\xa3')) class TestChoice(Base): """Test various behaviors of submitting values to a Choice Typed. @@ -628,7 +628,7 @@ def choiceyFunc(innerSelf, arg): inst = Impl() ctx = self.setupContext() D = self.postForm(ctx, inst, 'choiceyFunc', {}) - return D.addCallback(lambda result: self.assertEquals(self.called, [])) + return D.addCallback(lambda result: self.assertEqual(self.called, [])) class mg(Base): @@ -652,7 +652,7 @@ class Impl: impl = Impl() ctx = self.setupContext() def later(val): - self.assertEquals(val.count('fooFOOfoo'), 1) + self.assertEqual(val.count('fooFOOfoo'), 1) return self.renderForms(impl, ctx) diff --git a/formless/webform.py b/formless/webform.py index 3293ffa7..7a71bf9a 100644 --- a/formless/webform.py +++ b/formless/webform.py @@ -4,7 +4,7 @@ # See LICENSE for details. -from __future__ import generators + import warnings from zope.interface import implements, Interface @@ -66,7 +66,7 @@ def rend(self, context, data): return context.tag def input(self, context, slot, data, name, value): - raise NotImplementedError, "Implement in subclass" + raise NotImplementedError("Implement in subclass") class PasswordRenderer(BaseInputRenderer): def input(self, context, slot, data, name, value): @@ -437,7 +437,7 @@ def _innerFormRenderIt(context, data): if bindingDefaults is None: available = configurable.getBindingNames(context) else: - available = bindingDefaults.iterkeys() + available = iter(bindingDefaults.keys()) def _callback(binding): renderer = iformless.IBindingRenderer(binding, defaultBindingRenderer) diff --git a/nevow/_flat.py b/nevow/_flat.py index b43265ce..08fe9ffa 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -61,7 +61,7 @@ def _formatRoot(self, obj): @return: A string representation of C{obj}. @rtype: L{str} """ - if isinstance(obj, (str, unicode)): + if isinstance(obj, str): # It's somewhat unlikely that there will ever be a str in the roots # list. However, something like a MemoryError during a str.replace # call (eg, replacing " with ") could possibly cause this. @@ -175,7 +175,7 @@ def _ctxForRequest(request, slotData, renderFactory, inAttribute): ctx.remember(request, IRequest) for slotGroup in slotData: if slotGroup is not None: - for k, v in slotGroup.items(): + for k, v in list(slotGroup.items()): ctx.fillSlots(k, v) if renderFactory is not None: ctx.remember(_OldRendererFactory(renderFactory), IRendererFactory) @@ -224,7 +224,7 @@ def _flatten(request, root, slotData, renderFactory, inAttribute, inXML): @return: An iterator which yields C{str}, L{Deferred}, and more iterators of the same type. """ - if isinstance(root, unicode): + if isinstance(root, str): root = root.encode('utf-8') elif isinstance(root, WovenContext): # WovenContext is supported via the getFlattener case, but that is a @@ -269,13 +269,13 @@ def _flatten(request, root, slotData, renderFactory, inAttribute, inXML): yield element else: yield '<' - if isinstance(root.tagName, unicode): + if isinstance(root.tagName, str): tagName = root.tagName.encode('ascii') else: tagName = str(root.tagName) yield tagName - for k, v in sorted(root.attributes.iteritems()): - if isinstance(k, unicode): + for k, v in sorted(root.attributes.items()): + if isinstance(k, str): k = k.encode('ascii') yield " " + k + "=\"" for element in _flatten(request, v, slotData, @@ -313,7 +313,7 @@ def _flatten(request, root, slotData, renderFactory, inAttribute, inXML): yield root.num yield ';' elif isinstance(root, xml): - if isinstance(root.content, unicode): + if isinstance(root.content, str): yield root.content.encode('utf-8') else: yield root.content @@ -412,10 +412,10 @@ def flatten(request, root, inAttribute, inXML): # In Python 2.5, after an exception, a generator's gi_frame is # None. frame = stack[-1].gi_frame - element = stack[-1].next() + element = next(stack[-1]) except StopIteration: stack.pop() - except Exception, e: + except Exception as e: stack.pop() roots = [] for generator in stack: @@ -426,7 +426,8 @@ def flatten(request, root, inAttribute, inXML): if type(element) is str: yield element elif isinstance(element, Deferred): - def cbx((original, toFlatten)): + def cbx(xxx_todo_changeme): + (original, toFlatten) = xxx_todo_changeme stack.append(toFlatten) return original yield element.addCallback(cbx) @@ -459,7 +460,7 @@ def _flattensome(state, write, schedule, result): """ while True: try: - element = state.next() + element = next(state) except StopIteration: result.callback(None) except: diff --git a/nevow/_version.py b/nevow/_version.py index 98b57788..db6b1195 100644 --- a/nevow/_version.py +++ b/nevow/_version.py @@ -33,19 +33,19 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False): if e.errno == errno.ENOENT: continue if verbose: - print("unable to run %s" % args[0]) + print(("unable to run %s" % args[0])) print(e) return None else: if verbose: - print("unable to find command, tried %s" % (commands,)) + print(("unable to find command, tried %s" % (commands,))) return None stdout = p.communicate()[0].strip() if sys.version >= '3': stdout = stdout.decode() if p.returncode != 0: if verbose: - print("unable to run %s (error)" % args[0]) + print(("unable to run %s (error)" % args[0])) return None return stdout @@ -97,15 +97,15 @@ def versions_from_expanded_variables(variables, tag_prefix, verbose=False): # "stabilization", as well as "HEAD" and "master". tags = set([r for r in refs if re.search(r'\d', r)]) if verbose: - print("discarding '%s', no digits" % ",".join(refs-tags)) + print(("discarding '%s', no digits" % ",".join(refs-tags))) if verbose: - print("likely tags: %s" % ",".join(sorted(tags))) + print(("likely tags: %s" % ",".join(sorted(tags)))) for ref in sorted(tags): # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): r = ref[len(tag_prefix):] if verbose: - print("picking %s" % r) + print(("picking %s" % r)) return { "version": r, "full": variables["full"].strip() } # no suitable tags, so we use the full revision id @@ -122,7 +122,7 @@ def versions_from_vcs(tag_prefix, root, verbose=False): if not os.path.exists(os.path.join(root, ".git")): if verbose: - print("no .git in %s" % root) + print(("no .git in %s" % root)) return {} GITS = ["git"] @@ -134,7 +134,7 @@ def versions_from_vcs(tag_prefix, root, verbose=False): return {} if not stdout.startswith(tag_prefix): if verbose: - print("tag '%s' doesn't start with prefix '%s'" % (stdout, tag_prefix)) + print(("tag '%s' doesn't start with prefix '%s'" % (stdout, tag_prefix))) return {} tag = stdout[len(tag_prefix):] stdout = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) @@ -152,8 +152,8 @@ def versions_from_parentdir(parentdir_prefix, root, verbose=False): dirname = os.path.basename(root) if not dirname.startswith(parentdir_prefix): if verbose: - print("guessing rootdir is '%s', but '%s' doesn't start with prefix '%s'" % - (root, dirname, parentdir_prefix)) + print(("guessing rootdir is '%s', but '%s' doesn't start with prefix '%s'" % + (root, dirname, parentdir_prefix))) return None return {"version": dirname[len(parentdir_prefix):], "full": ""} diff --git a/nevow/accessors.py b/nevow/accessors.py index 2a991ce8..ac212595 100644 --- a/nevow/accessors.py +++ b/nevow/accessors.py @@ -48,7 +48,7 @@ def get(self, context): data = context.locate(IData) container = IContainer(data, None) if container is None: - raise NoAccessor, "%r does not implement IContainer, and there is no registered adapter." % data + raise NoAccessor("%r does not implement IContainer, and there is no registered adapter." % data) child = container.child(context, self.original.name) return child diff --git a/nevow/appserver.py b/nevow/appserver.py index 3d511bce..c73d9c90 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -9,7 +9,7 @@ import cgi import warnings from collections import MutableMapping -from urllib import unquote +from urllib.parse import unquote from zope.interface import implements, classImplements @@ -94,7 +94,7 @@ def copy(self): Return a C{dict} mapping each header name to the last corresponding header value. """ - return dict(self.items()) + return dict(list(self.items())) def has_key(self, key): @@ -234,7 +234,7 @@ def process(self): # Resource Identification self.prepath = [] - self.postpath = map(unquote, self.path[1:].split('/')) + self.postpath = list(map(unquote, self.path[1:].split('/'))) self.sitepath = [] self.deferred = defer.Deferred() @@ -444,7 +444,7 @@ def handleSegment(self, result, request, path, pageContext): assert len(newpath) < len(path), "Infinite loop impending..." ## We found a Resource... update the request.prepath and postpath - for x in xrange(len(path) - len(newpath)): + for x in range(len(path) - len(newpath)): if request.postpath: request.prepath.append(request.postpath.pop(0)) diff --git a/nevow/athena.py b/nevow/athena.py index 75da15e2..76241c4a 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -49,7 +49,7 @@ class LivePageError(Exception): """ Base exception for LivePage errors. """ - jsClass = u'Divmod.Error' + jsClass = 'Divmod.Error' @@ -58,7 +58,7 @@ class NoSuchMethod(LivePageError): Raised when an attempt is made to invoke a method which is not defined or exposed. """ - jsClass = u'Nevow.Athena.NoSuchMethod' + jsClass = 'Nevow.Athena.NoSuchMethod' def __init__(self, objectID, methodName): self.objectID = objectID @@ -186,7 +186,7 @@ def _getDeps(self, jsFile): Calculate our dependencies given the path to our source. """ depgen = self._extractImports(file(jsFile, 'rU')) - return self.packageDeps + dict.fromkeys(depgen).keys() + return self.packageDeps + list(dict.fromkeys(depgen).keys()) def dependencies(self): @@ -300,7 +300,7 @@ def _collectPackageBelow(baseDir, extension): path = os.path.join(root, dir, '__init__.' + extension) if not os.path.exists(path): path = EMPTY - mapping[unicode(name, 'ascii')] = path + mapping[str(name, 'ascii')] = path _revMap[os.path.join(root, dir)] = name + '.' for fn in filenames: @@ -315,7 +315,7 @@ def _collectPackageBelow(baseDir, extension): name = stem + fn[:-(len(extension) + 1)] path = os.path.join(root, fn) - mapping[unicode(name, 'ascii')] = path + mapping[str(name, 'ascii')] = path return mapping @@ -540,11 +540,11 @@ def getJSFailure(exc, modules): """ Convert a serialized client-side exception to a Failure. """ - text = '%s: %s' % (exc[u'name'], exc[u'message']) + text = '%s: %s' % (exc['name'], exc['message']) frames = [] - if u'stack' in exc: - frames = parseStack(exc[u'stack']) + if 'stack' in exc: + frames = parseStack(exc['stack']) return failure.Failure(JSException(text), exc_tb=buildTraceback(frames, modules)) @@ -618,8 +618,8 @@ class ConnectionLost(Exception): pass -CLOSE = u'close' -UNLOAD = u'unload' +CLOSE = 'close' +UNLOAD = 'unload' class ReliableMessageDelivery(object): """ @@ -775,8 +775,8 @@ def close(self): def _unregisterDeferredAsOutputChannel(self, deferred): - for i in xrange(len(self.outputs)): - if self.outputs[i][0].im_self is deferred: + for i in range(len(self.outputs)): + if self.outputs[i][0].__self__ is deferred: output, timeout = self.outputs.pop(i) timeout.cancel() break @@ -1007,7 +1007,7 @@ class LivePage(rend.Page, _HasJSClass, _HasCSSModule): @ivar _localObjectIDCounter: A callable that will return a new locally-unique object ID each time it is called. """ - jsClass = u'Nevow.Athena.PageWidget' + jsClass = 'Nevow.Athena.PageWidget' cssModule = None factory = LivePageFactory() @@ -1140,7 +1140,7 @@ def _becomeLive(self, location): if self.cssModuleRoot is None: self.cssModuleRoot = location.child(self.clientID).child('cssmodule') - self._requestIDCounter = itertools.count().next + self._requestIDCounter = itertools.count().__next__ self._messageDeliverer = ReliableMessageDelivery( self, @@ -1151,7 +1151,7 @@ def _becomeLive(self, location): connectionMade=self._connectionMade) self._remoteCalls = {} self._localObjects = {} - self._localObjectIDCounter = itertools.count().next + self._localObjectIDCounter = itertools.count().__next__ self.addLocalObject(self) @@ -1252,7 +1252,7 @@ def _connectionMade(self): """ Invoke connectionMade on all attached widgets. """ - for widget in self._localObjects.values(): + for widget in list(self._localObjects.values()): widget.connectionMade() self._didConnect = True @@ -1274,10 +1274,10 @@ def _disconnected(self, reason): d.errback(reason) calls = self._remoteCalls self._remoteCalls = {} - for (reqID, resD) in calls.iteritems(): + for (reqID, resD) in calls.items(): resD.errback(reason) if self._didConnect: - for widget in self._localObjects.values(): + for widget in list(self._localObjects.values()): widget.connectionLost(reason) self.factory.removeClient(self.clientID) @@ -1316,8 +1316,8 @@ def removeLocalObject(self, objID): def callRemote(self, methodName, *args): - requestID = u's2c%i' % (self._requestIDCounter(),) - message = (u'call', (unicode(methodName, 'ascii'), requestID, args)) + requestID = 's2c%i' % (self._requestIDCounter(),) + message = ('call', (str(methodName, 'ascii'), requestID, args)) resultD = defer.Deferred() self._remoteCalls[requestID] = resultD self.addMessage(message) @@ -1439,12 +1439,13 @@ def locateMethod(self, ctx, methodName): raise AttributeError(methodName) - def liveTransportMessageReceived(self, ctx, (action, args)): + def liveTransportMessageReceived(self, ctx, xxx_todo_changeme): """ A message was received from the reliable transport layer. Process it by dispatching it first to myself, then later to application code if applicable. """ + (action, args) = xxx_todo_changeme method = getattr(self, 'action_' + action) method(ctx, *args) @@ -1472,11 +1473,11 @@ def _cbCall(result): result.value.args) else: result = ( - u'Divmod.Error', - [u'%s: %s' % ( + 'Divmod.Error', + ['%s: %s' % ( result.type.__name__.decode('ascii'), result.getErrorMessage().decode('ascii'))]) - message = (u'respond', (unicode(requestId), success, result)) + message = ('respond', (str(requestId), success, result)) self.addMessage(message) result.addBoth(_cbCall) @@ -1517,7 +1518,7 @@ def _rewriteEventHandlerToAttribute(tag): """ if isinstance(tag, stan.Tag): extraAttributes = {} - for i in xrange(len(tag.children) - 1, -1, -1): + for i in range(len(tag.children) - 1, -1, -1): if isinstance(tag.children[i], stan.Tag) and tag.children[i].tagName == 'athena:handler': info = tag.children.pop(i) name = info.attributes['event'].encode('ascii') @@ -1565,7 +1566,7 @@ def _rewriteAthenaId(tag): if headers is not None: ids = headers.split() headers = [_mangleId(headerId) for headerId in ids] - for n in xrange(len(headers) - 1, 0, -1): + for n in range(len(headers) - 1, 0, -1): headers.insert(n, ' ') tag.attributes['headers'] = headers return tag @@ -1580,7 +1581,7 @@ def rewriteAthenaIds(root): class _LiveMixin(_HasJSClass, _HasCSSModule): - jsClass = u'Nevow.Athena.Widget' + jsClass = 'Nevow.Athena.Widget' cssModule = None preprocessors = [rewriteEventHandlerNodes, rewriteAthenaIds] @@ -1633,7 +1634,7 @@ def _prepare(self, tag): C{self.page}, add this object to the page and fill the I{athena:id} slot with this object's Athena identifier. """ - assert isinstance(self.jsClass, unicode), "jsClass must be a unicode string" + assert isinstance(self.jsClass, str), "jsClass must be a unicode string" if self.page is None: raise OrphanedFragment(self) @@ -1710,15 +1711,15 @@ def _structured(self): del children[0] self._structuredCache = { - u'requiredModules': [(name, flat.flatten(url).decode('utf-8')) + 'requiredModules': [(name, flat.flatten(url).decode('utf-8')) for (name, url) in requiredModules], - u'requiredCSSModules': [flat.flatten(url).decode('utf-8') + 'requiredCSSModules': [flat.flatten(url).decode('utf-8') for url in requiredCSSModules], - u'class': self.jsClass, - u'id': self._athenaID, - u'initArguments': tuple(self.getInitialArguments()), - u'markup': markup, - u'children': children} + 'class': self.jsClass, + 'id': self._athenaID, + 'initArguments': tuple(self.getInitialArguments()), + 'markup': markup, + 'children': children} return self._structuredCache @@ -1738,9 +1739,9 @@ def liveElement(self, request, tag): # This will only be set if _structured() is being run. if context.get('children') is not None: context.get('children').append({ - u'class': self.jsClass, - u'id': self._athenaID, - u'initArguments': self.getInitialArguments()}) + 'class': self.jsClass, + 'id': self._athenaID, + 'initArguments': self.getInitialArguments()}) context.get('requiredModules').extend(requiredModules) context.get('requiredCSSModules').extend(requiredCSSModules) return tag @@ -1789,7 +1790,7 @@ def callRemote(self, methodName, *varargs): return self.page.callRemote( "Nevow.Athena.callByAthenaID", self._athenaID, - unicode(methodName, 'ascii'), + str(methodName, 'ascii'), varargs) @@ -1995,7 +1996,7 @@ class IntrospectionFragment(LiveFragment): the state of a live page. """ - jsClass = u'Nevow.Athena.IntrospectionWidget' + jsClass = 'Nevow.Athena.IntrospectionWidget' docFactory = loaders.stan( tags.span(render=tags.directive('liveFragment'))[ diff --git a/nevow/blocks.py b/nevow/blocks.py index c2a9f76a..26623a3b 100644 --- a/nevow/blocks.py +++ b/nevow/blocks.py @@ -140,7 +140,7 @@ def __call__(self, **kw): _class=self.className, style='; '.join( [': '.join((k.replace('_', '-'), v)) - for (k, v) in kw.items()])) + for (k, v) in list(kw.items())])) block = _Blocks(tags.span, 'nevow-blocks-block') diff --git a/nevow/canvas.py b/nevow/canvas.py index 2d32e0ed..37916def 100755 --- a/nevow/canvas.py +++ b/nevow/canvas.py @@ -11,7 +11,7 @@ from nevow.stan import Proto, Tag from itertools import count -cn = count().next +cn = count().__next__ cookie = lambda: str(cn()) _hookup = {} @@ -193,7 +193,7 @@ def gradient(self, type, colors, alphas, ratios, matrix): l[[a(v=x) for x in colors]], l[[a(v=x) for x in alphas]], l[[a(v=x) for x in ratios]], - d[[i(k=k, v=v) for (k, v) in matrix.items()]]) + d[[i(k=k, v=v) for (k, v) in list(matrix.items())]]) def text(self, text, x, y, height, width): """Place the given text on the canvas using the given x, y, height and width. @@ -212,7 +212,7 @@ def image(self, where): cook = cookie() I = Image(cook, self) self.call('image', cook, where) - print "IMAGE", where + print("IMAGE", where) return I def sound(self, where, stream=True): @@ -354,18 +354,18 @@ def handle_onKeyUp(self, info): def handle_onMouseUp(self, info): if self.delegate.onMouseUp: - self.delegate.onMouseUp(self, *map(int, map(float, info.split()))) + self.delegate.onMouseUp(self, *list(map(int, list(map(float, info.split()))))) def handle_onMouseDown(self, info): if self.delegate.onMouseDown: - self.delegate.onMouseDown(self, *map(int, map(float, info.split()))) + self.delegate.onMouseDown(self, *list(map(int, list(map(float, info.split()))))) def handle_onMouseMove(self, info): if self.delegate.onMouseMove: - self.delegate.onMouseMove(self, *map(int, map(float, info.split()))) + self.delegate.onMouseMove(self, *list(map(int, list(map(float, info.split()))))) def handle_diagnostic(self, info): - print "Trace", info + print("Trace", info) canvasServerMessage = loaders.stan(tags.html["This server dispatches for nevow canvas events."]) diff --git a/nevow/compy.py b/nevow/compy.py index 4f894e5e..391a490f 100644 --- a/nevow/compy.py +++ b/nevow/compy.py @@ -35,8 +35,7 @@ def registerAdapter(adapterFactory, origInterface, *interfaceClasses): origInterface = _namedAnyWithBuiltinTranslation(origInterface) interfaceClasses = [_namedAnyWithBuiltinTranslation(x) for x in interfaceClasses] - if 'nevow.inevow.ISerializable' in interfaceClasses or filter( - lambda o: getattr(o, '__name__', None) == 'ISerializable', interfaceClasses): + if 'nevow.inevow.ISerializable' in interfaceClasses or [o for o in interfaceClasses if getattr(o, '__name__', None) == 'ISerializable']: warnings.warn("ISerializable is deprecated. Please use nevow.flat.registerFlattener instead.", stacklevel=2) from nevow import flat flat.registerFlattener(adapterFactory, origInterface) @@ -53,7 +52,7 @@ class Componentized(_Componentized): def __init__(self, adapterCache=None): _Componentized.__init__(self) if adapterCache: - for k, v in adapterCache.items(): + for k, v in list(adapterCache.items()): self.setComponent(k, v) diff --git a/nevow/context.py b/nevow/context.py index f3fc4b0c..33a4eebf 100644 --- a/nevow/context.py +++ b/nevow/context.py @@ -2,7 +2,7 @@ # Copyright (c) 2004 Divmod. # See LICENSE for details. -from __future__ import generators + import warnings @@ -109,7 +109,7 @@ def locate(self, interface, depth=1, _default=object()): contextParent = currentContext.parent if contextParent is None: - raise KeyError, "Interface %s was not remembered." % key + raise KeyError("Interface %s was not remembered." % key) currentContext = contextParent @@ -151,7 +151,7 @@ def locateSlotData(self, name): if data is not Unset: return data if currentContext.parent is None: - raise KeyError, "Slot named '%s' was not filled." % name + raise KeyError("Slot named '%s' was not filled." % name) currentContext = currentContext.parent def clone(self, deep=True, cloneTags=True): diff --git a/nevow/dirlist.py b/nevow/dirlist.py index 9fe64df7..27f657b4 100644 --- a/nevow/dirlist.py +++ b/nevow/dirlist.py @@ -5,7 +5,7 @@ # system imports import os -import urllib +import urllib.request, urllib.parse, urllib.error import stat # twisted imports @@ -49,7 +49,7 @@ def data_listing(self, context, data): files = []; dirs = [] for path in directory: - url = urllib.quote(path, '/') + url = urllib.parse.quote(path, '/') if os.path.isdir(os.path.join(self.path, path)): url = url + '/' dirs.append({ @@ -65,7 +65,7 @@ def data_listing(self, context, data): self.contentTypes, self.contentEncodings, self.defaultType) try: filesize = os.stat(os.path.join(self.path, path))[stat.ST_SIZE] - except OSError, x: + except OSError as x: if x.errno != 2 and x.errno != 13: raise x else: @@ -80,7 +80,7 @@ def data_listing(self, context, data): def data_header(self, context, data): request = context.locate(inevow.IRequest) - return "Directory listing for %s" % urllib.unquote(request.uri) + return "Directory listing for %s" % urllib.parse.unquote(request.uri) def render_tableLink(self, context, data): return tags.a(href=data['link'])[data['linktext']] diff --git a/nevow/entities.py b/nevow/entities.py index 5d0e3dbb..688bd64c 100644 --- a/nevow/entities.py +++ b/nevow/entities.py @@ -10,7 +10,8 @@ __by_number = {} -def makeEntity((name, num, description)): +def makeEntity(xxx_todo_changeme): + (name, num, description) = xxx_todo_changeme from nevow.stan import Entity e = Entity(name, num, description) __by_number[types.IntType(num)] = e diff --git a/nevow/events.py b/nevow/events.py index f43d6680..433dbcc3 100644 --- a/nevow/events.py +++ b/nevow/events.py @@ -16,7 +16,7 @@ def subscribe(self, identifier, subscriber): Returns a token which should be passed to unsubscribe when done. """ if DEBUG: - print "SUBSCRIBE", self, identifier, subscriber + print("SUBSCRIBE", self, identifier, subscriber) self._subscribers.setdefault(identifier, []).append(subscriber) return identifier, subscriber @@ -24,7 +24,7 @@ def unsubscribe(self, token): """Unsubscribe the given token from events. """ if DEBUG: - print "UNSUBSCRIBE", token + print("UNSUBSCRIBE", token) identifier, reference = token self._subscribers[identifier].remove(reference) @@ -32,14 +32,14 @@ def publish(self, identifier, *args): """Notify the listeners on a given identifier that an event has occurred. """ if DEBUG: - print "PUBLISH", self, identifier, + print("PUBLISH", self, identifier, end=' ') subscribers = self._subscribers.get(identifier, []) for sub in subscribers: sub(*args) if DEBUG: - print "NOTIFY SUBSCRIBER", sub + print("NOTIFY SUBSCRIBER", sub) if DEBUG: - print "done" + print("done") def nextId(self): self._currentId += 1 diff --git a/nevow/failure.py b/nevow/failure.py index c805f1dc..7c5e9b40 100644 --- a/nevow/failure.py +++ b/nevow/failure.py @@ -164,7 +164,7 @@ def htmlDict(d): t.td(_class="dictKey")[ k == '__builtins__' and 'builtin dictionary' or htmlrepr(k) ], t.td(_class="dictValue")[ htmlrepr(v) ] ] - for k, v in d.items() + for k, v in list(d.items()) ]] ] @@ -189,13 +189,13 @@ def htmlString(s): def htmlFunc(f): return t.div(_class="function")[ - "Function %s in file %s at line %s" % (f.__name__, f.func_code.co_filename, f.func_code.co_firstlineno) + "Function %s in file %s at line %s" % (f.__name__, f.__code__.co_filename, f.__code__.co_firstlineno) ] def htmlMeth(m): return t.div(_class="method")[ - "Method %s in file %s at line %s" % (m.im_func.__name__, m.im_func.func_code.co_filename, m.im_func.func_code.co_firstlineno) + "Method %s in file %s at line %s" % (m.__func__.__name__, m.__func__.__code__.co_filename, m.__func__.__code__.co_firstlineno) ] def htmlUnknown(u): @@ -205,10 +205,10 @@ def htmlUnknown(u): htmlReprTypes = { - types.DictType: htmlDict, - types.ListType: htmlList, + dict: htmlDict, + list: htmlList, types.InstanceType: htmlInst, - types.StringType: htmlString, + bytes: htmlString, types.FunctionType: htmlFunc, types.MethodType: htmlMeth, } @@ -282,7 +282,7 @@ def formatFailure(myFailure): # Instance variables for name, var in localVars: if name == 'self' and hasattr(var, '__dict__'): - usedVars = [ (key, value) for (key, value) in var.__dict__.items() + usedVars = [ (key, value) for (key, value) in list(var.__dict__.items()) if re.search(r'\Wself.%s\W' % (re.escape(key),), textSnippet) ] if usedVars: frame[ diff --git a/nevow/flat/flatmdom.py b/nevow/flat/flatmdom.py index 09572b57..261917d0 100644 --- a/nevow/flat/flatmdom.py +++ b/nevow/flat/flatmdom.py @@ -1,7 +1,7 @@ # Copyright (c) 2004 Divmod. # See LICENSE for details. -from __future__ import generators + from nevow.flat import serialize, precompile from nevow.stan import Tag, xml, directive, slot, cdata @@ -50,7 +50,7 @@ def MicroDomElementSerializer(element, context): specials = {} attributes = attributeList directives = directiveMapping - for k, v in attrs.items(): + for k, v in list(attrs.items()): # I know, this is totally not the way to do xml namespaces but who cares right now ## I'll fix it later -dp ### no you won't *I'll* fix it later -glyph diff --git a/nevow/flat/flatsax.py b/nevow/flat/flatsax.py index 30202d92..39e54710 100644 --- a/nevow/flat/flatsax.py +++ b/nevow/flat/flatsax.py @@ -132,7 +132,7 @@ def startElementNS(self, ns_and_name, qname, attrs): specials = {} attributes = self.attributeList directives = self.directiveMapping - for k, v in attrs.items(): + for k, v in list(attrs.items()): att_ns, nons = k if att_ns != nevow.namespace: continue @@ -145,7 +145,7 @@ def startElementNS(self, ns_and_name, qname, attrs): del attrs[k] no_ns_attrs = {} - for (attrNs, attrName), v in attrs.items(): + for (attrNs, attrName), v in list(attrs.items()): nsPrefix = self.prefixMap.get(attrNs) if nsPrefix is None: no_ns_attrs[attrName] = v @@ -248,5 +248,5 @@ def parse(fl, ignoreDocType=False, ignoreComment=False): return s.document def parseString(t, ignoreDocType=False, ignoreComment=False): - from cStringIO import StringIO + from io import StringIO return parse(StringIO(t), ignoreDocType, ignoreComment) diff --git a/nevow/flat/flatstan.py b/nevow/flat/flatstan.py index ac952c55..f56923e7 100644 --- a/nevow/flat/flatstan.py +++ b/nevow/flat/flatstan.py @@ -1,9 +1,9 @@ # Copyright (c) 2004 Divmod. # See LICENSE for details. -from __future__ import generators -import urllib, warnings + +import urllib.request, urllib.parse, urllib.error, warnings from twisted.python import log, failure @@ -38,7 +38,7 @@ def TagSerializer(original, context, contextIsMine=False): visible = bool(original.tagName) if visible and context.isAttrib: - raise RuntimeError, "Tried to render tag '%s' in an tag attribute context." % (original.tagName) + raise RuntimeError("Tried to render tag '%s' in an tag attribute context." % (original.tagName)) if context.precompile and original.macro: toBeRenderedBy = original.macro @@ -53,7 +53,7 @@ def TagSerializer(original, context, contextIsMine=False): ## TODO: Do we really need to bypass precompiling for *all* specials? ## Perhaps just render? if context.precompile and ( - [x for x in original._specials.values() + [x for x in list(original._specials.values()) if x is not None and x is not Unset] or original.slotData): ## The tags inside this one get a "fresh" parent chain, because @@ -111,7 +111,7 @@ def TagSerializer(original, context, contextIsMine=False): yield '<%s' % original.tagName if original.attributes: attribContext = WovenContext(parent=context, precompile=context.precompile, isAttrib=True) - for (k, v) in sorted(original.attributes.iteritems()): + for (k, v) in sorted(original.attributes.items()): if v is None: continue yield ' %s="' % k @@ -155,7 +155,7 @@ def StringSerializer(original, context): if context.inURL: # The magic string "-_.!*'()" also appears in url.py. Thinking about # changing this? Change that, too. - return urllib.quote(original, safe="-_.!*'()") + return urllib.parse.quote(original, safe="-_.!*'()") ## quote it if context.inJS: original = _jsSingleQuoteQuote(original) @@ -235,7 +235,7 @@ def FunctionSerializer(original, context, nocontextfun=FunctionSerializer_nocont else: result = original(context, data) except StopIteration: - raise RuntimeError, "User function %r raised StopIteration." % original + raise RuntimeError("User function %r raised StopIteration." % original) return serialize(result, context) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index 9db7f3ab..eed79033 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -1,7 +1,7 @@ # Copyright (c) 2004 Divmod. # See LICENSE for details. -from __future__ import generators + import types import warnings @@ -83,7 +83,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): for item in gen: if isinstance(item, str): straccum.append(item) - elif isinstance(item, unicode): + elif isinstance(item, str): straccum.append(item.encode('utf8')) elif isinstance(item, (list, types.GeneratorType)): # stop iterating this generator and put it back on the stack diff --git a/nevow/flat/twist.py b/nevow/flat/twist.py index d1afba2b..cec262e4 100644 --- a/nevow/flat/twist.py +++ b/nevow/flat/twist.py @@ -21,7 +21,7 @@ def _drive(iterable, finished): it after those Deferreds fire. """ try: - next = iterable.next() + next = next(iterable) except StopIteration: finished.callback('') except: diff --git a/nevow/guard.py b/nevow/guard.py index aeea480f..08062088 100644 --- a/nevow/guard.py +++ b/nevow/guard.py @@ -16,7 +16,7 @@ from hashlib import md5 except ImportError: from md5 import md5 -import StringIO +import io from zope.interface import implements @@ -68,7 +68,7 @@ def getLoggedInRoot(self): # XXX TODO: need to actually sort avatars by login order! if len(self.portals) != 1: raise RuntimeError("Ambiguous request for current avatar.") - return self.portals.values()[0][0] + return list(self.portals.values())[0][0] def resourceForPortal(self, port): return self.portals.get(port) @@ -86,7 +86,7 @@ def setDefaultResource(self, rsrc, logout): raise RuntimeError("Ambiguous request for current avatar.") self.setResourceForPortal( rsrc, - self.portals.keys()[0], + list(self.portals.keys())[0], logout) def setResourceForPortal(self, rsrc, port, logout): @@ -148,7 +148,7 @@ def expire(self): del self.guard.sessions[self.uid] # Logout of all portals - for portal in self.portals.keys(): + for portal in list(self.portals.keys()): self.portalLogout(portal) for c in self.expireCallbacks: @@ -170,7 +170,7 @@ def checkExpired(self): self.checkExpiredID = None # If I haven't been touched in 15 minutes: if time.time() - self.lastModified > self.lifetime / 2: - if self.guard.sessions.has_key(self.uid): + if self.uid in self.guard.sessions: self.expire() else: log.msg("no session to expire: %s" % str(self.uid)) @@ -180,7 +180,7 @@ def checkExpired(self): self.checkExpired) def __getstate__(self): d = self.__dict__.copy() - if d.has_key('checkExpiredID'): + if 'checkExpiredID' in d: del d['checkExpiredID'] return d @@ -196,7 +196,7 @@ def urlToChild(ctx, *ar, **kw): u = u.child(stan.xml(segment)) if inevow.IRequest(ctx).method == 'POST': u = u.clear() - for k,v in kw.items(): + for k,v in list(kw.items()): u = u.replace(k, v) return u @@ -272,7 +272,8 @@ def __init__(self, portal, cookieKey=None, mindFactory=None, credInterface=None, def renderHTTP(self, ctx): request = inevow.IRequest(ctx) d = defer.maybeDeferred(self._delegate, ctx, []) - def _cb((resource, segments), ctx): + def _cb(xxx_todo_changeme1, ctx): + (resource, segments) = xxx_todo_changeme1 assert not segments res = inevow.IResource(resource) return res.renderHTTP(ctx) @@ -425,7 +426,7 @@ def checkLogin(self, ctx, session, segments, sessionURL=None, httpAuthCredential if spoof and hasattr(session, 'args'): request.args = session.args request.fields = session.fields - request.content = StringIO.StringIO() + request.content = io.StringIO() request.content.close() request.method = session.method request.received_headers = session.received_headers @@ -450,9 +451,10 @@ def checkLogin(self, ctx, session, segments, sessionURL=None, httpAuthCredential if authCommand == LOGIN_AVATAR: subSegments = segments[1:] - def unmangleURL((res,segs)): + def unmangleURL(xxx_todo_changeme): # Tell the session that we just logged in so that it will # remember form values for us. + (res,segs) = xxx_todo_changeme session.justLoggedIn = True # Then, generate a redirect back to where we're supposed to be # by looking at the root of the site and calculating the path @@ -533,7 +535,8 @@ def login(self, request, session, credentials, segments): self._cbLoginSuccess, session, segments ) - def _cbLoginSuccess(self, (iface, res, logout), session, segments): + def _cbLoginSuccess(self, xxx_todo_changeme2, session, segments): + (iface, res, logout) = xxx_todo_changeme2 session.setResourceForPortal(res, self.portal, logout) return res, segments diff --git a/nevow/i18n.py b/nevow/i18n.py index 68b876cd..e2ae0a21 100644 --- a/nevow/i18n.py +++ b/nevow/i18n.py @@ -209,7 +209,7 @@ def _render(page, ctx, data): children = ctx.tag.children ctx.tag.clear() for child in children: - if isinstance(child, basestring): + if isinstance(child, str): child = translator(child) ctx.tag[child] return ctx.tag diff --git a/nevow/json.py b/nevow/json.py index 4338c1c7..235a6485 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -43,12 +43,12 @@ def match(self, s): SLASH = "\\" IT = iter(s) - bits = [IT.next()] + bits = [next(IT)] for char in IT: bits.append(char) if char == SLASH: try: - bits.append(IT.next()) + bits.append(next(IT)) except StopIteration: return None if char == '"': @@ -82,9 +82,9 @@ class WhitespaceToken(object): def jsonlong(s): if 'e' in s: - m, e = map(long, s.split('e', 1)) + m, e = list(map(int, s.split('e', 1))) else: - m, e = long(s), 0 + m, e = int(s), 0 return m * 10 ** e # list of tuples, the first element is a compiled regular expression the second @@ -115,7 +115,7 @@ def tokenise(s): tok, tokstr = action(m.group(0)) break else: - raise ValueError, "Invalid Input, %r" % (s[:10],) + raise ValueError("Invalid Input, %r" % (s[:10],)) if tok is not WhitespaceToken: tokens.append(tok) @@ -126,7 +126,7 @@ def tokenise(s): def accept(want, tokens): t = tokens.pop(0) if want != t: - raise ParseError, "Unexpected %r, %s expected" % (t , want) + raise ParseError("Unexpected %r, %s expected" % (t , want)) def parseValue(tokens): if tokens[0] == '{': @@ -141,28 +141,28 @@ def parseValue(tokens): if type(tokens[0]) == StringToken: return parseString(tokens) - if type(tokens[0]) in (int, float, long): + if type(tokens[0]) in (int, float, int): return tokens.pop(0), tokens - raise ParseError, "Unexpected %r" % tokens[0] + raise ParseError("Unexpected %r" % tokens[0]) _stringExpr = re.compile( - ur'(?:\\x(?P[a-fA-F0-9]{2})) # Match hex-escaped unicode' u'\n' - ur'|' u'\n' - ur'(?:\\u(?P[a-fA-F0-9]{4})) # Match hex-escaped high unicode' u'\n' - ur'|' u'\n' - ur'(?P\\[fbntr\\"]) # Match escaped control characters' u'\n', + r'(?:\\x(?P[a-fA-F0-9]{2})) # Match hex-escaped unicode' '\n' + r'|' '\n' + r'(?:\\u(?P[a-fA-F0-9]{4})) # Match hex-escaped high unicode' '\n' + r'|' '\n' + r'(?P\\[fbntr\\"]) # Match escaped control characters' '\n', re.VERBOSE) _controlMap = { - u'\\f': u'\f', - u'\\b': u'\b', - u'\\n': u'\n', - u'\\t': u'\t', - u'\\r': u'\r', - u'\\"': u'"', - u'\\\\': u'\\', + '\\f': '\f', + '\\b': '\b', + '\\n': '\n', + '\\t': '\t', + '\\r': '\r', + '\\"': '"', + '\\\\': '\\', } def _stringSub(m): @@ -170,14 +170,14 @@ def _stringSub(m): if u is None: u = m.group('unicode2') if u is not None: - return unichr(int(u, 16)) + return chr(int(u, 16)) c = m.group('control') return _controlMap[c] def parseString(tokens): if type(tokens[0]) is not StringToken: - raise ParseError, "Unexpected %r" % tokens[0] + raise ParseError("Unexpected %r" % tokens[0]) s = _stringExpr.sub(_stringSub, tokens.pop(0)[1:-1].decode('utf-8')) return s, tokens @@ -229,27 +229,27 @@ def parse(s): tokens = tokenise(s) value, tokens = parseValue(tokens) if tokens: - raise ParseError, "Unexpected %r" % tokens[0] + raise ParseError("Unexpected %r" % tokens[0]) return value class CycleError(Exception): pass -_translation = dict([(o, u'\\x%02x' % (o,)) for o in range(0x20)]) +_translation = dict([(o, '\\x%02x' % (o,)) for o in range(0x20)]) # Characters which cannot appear as literals in the output _translation.update({ - ord(u'\\'): u'\\\\', - ord(u'"'): ur'\"', - ord(u'\f'): ur'\f', - ord(u'\b'): ur'\b', - ord(u'\n'): ur'\n', - ord(u'\t'): ur'\t', - ord(u'\r'): ur'\r', + ord('\\'): '\\\\', + ord('"'): r'\"', + ord('\f'): r'\f', + ord('\b'): r'\b', + ord('\n'): r'\n', + ord('\t'): r'\t', + ord('\r'): r'\r', # The next two are sneaky, see # http://timelessrepo.com/json-isnt-a-javascript-subset - ord(u'\u2028'): u'\\u2028', - ord(u'\u2029'): u'\\u2029', + ord('\u2028'): '\\u2028', + ord('\u2029'): '\\u2029', }) def stringEncode(s): @@ -259,18 +259,18 @@ def stringEncode(s): def _serialize(obj, w, seen): from nevow import athena - if isinstance(obj, types.BooleanType): + if isinstance(obj, bool): if obj: w('true') else: w('false') - elif isinstance(obj, (int, long, float)): + elif isinstance(obj, (int, float)): w(str(obj)) - elif isinstance(obj, unicode): + elif isinstance(obj, str): w('"') w(stringEncode(obj)) w('"') - elif isinstance(obj, types.NoneType): + elif isinstance(obj, type(None)): w('null') elif id(obj) in seen: raise CycleError(type(obj)) @@ -283,7 +283,7 @@ def _serialize(obj, w, seen): w(']') elif isinstance(obj, dict): w('{') - for n, (k, v) in enumerate(obj.iteritems()): + for n, (k, v) in enumerate(obj.items()): _serialize(k, w, seen) w(':') _serialize(v, w, seen) diff --git a/nevow/livetrial/runner.py b/nevow/livetrial/runner.py index f0c94f57..5130a3f5 100644 --- a/nevow/livetrial/runner.py +++ b/nevow/livetrial/runner.py @@ -5,7 +5,7 @@ staticData = filepath.FilePath(__file__).parent().child('static') class TestSuiteFragment(athena.LiveFragment): - jsClass = u'Nevow.Athena.Test.TestSuite' + jsClass = 'Nevow.Athena.Test.TestSuite' docFactory = loaders.stan(tags.invisible(render=tags.directive('tests'))) def __init__(self, suite): @@ -34,7 +34,7 @@ def gather(testInstances): else: head.append(test.head()) gather(self.testInstances) - return filter(None, head) + return [_f for _f in head if _f] def render_tests(self, ctx, data): @@ -43,7 +43,7 @@ def render_tests(self, ctx, data): class TestRunner(TestSuiteFragment): - jsClass = u'Nevow.Athena.Test.TestRunner' + jsClass = 'Nevow.Athena.Test.TestRunner' docFactory = loaders.stan( tags.div(_class='test-runner', render=tags.directive('liveFragment'))[ tags.form(action='#')[ diff --git a/nevow/livetrial/testcase.py b/nevow/livetrial/testcase.py index 123dec66..b344fce8 100644 --- a/nevow/livetrial/testcase.py +++ b/nevow/livetrial/testcase.py @@ -62,7 +62,7 @@ def getWidgetDocument(self): Subclasses may want to override this. """ - return u'' + return '' def head(self): @@ -150,11 +150,11 @@ def loadByName(self, name, recurse=False): def loadMethod(self, method): - raise NotImplementedError, 'livetests must be classes' + raise NotImplementedError('livetests must be classes') def loadClass(self, klass): - if not (isinstance(klass, type) or isinstance(klass, types.ClassType)): + if not (isinstance(klass, type) or isinstance(klass, type)): raise TypeError("%r is not a class" % (klass,)) if not self.isTestCase(klass): raise ValueError("%r is not a test case" % (klass,)) @@ -171,7 +171,7 @@ def loadModule(self, module): def isTestCase(self, obj): - return isinstance(obj, (type, types.ClassType)) and issubclass(obj, TestCase) and obj is not TestCase + return isinstance(obj, type) and issubclass(obj, TestCase) and obj is not TestCase def _findTestClasses(self, module): diff --git a/nevow/page.py b/nevow/page.py index b7109714..6828024c 100644 --- a/nevow/page.py +++ b/nevow/page.py @@ -97,7 +97,7 @@ def render(self, request): Load and return C{self.docFactory}. """ rend = self.rend - if rend.im_func is not Element.__dict__['rend']: + if rend.__func__ is not Element.__dict__['rend']: context = _ctxForRequest(request, [], self, False) return rend(context, None) diff --git a/nevow/query.py b/nevow/query.py index a1eb97f3..1e140121 100644 --- a/nevow/query.py +++ b/nevow/query.py @@ -47,7 +47,7 @@ def _locatePatterns(self, pattern, default, loop=True): yield x.clone(deep=False, clearPattern=True) if default is None: - raise stan.NodeNotFound, ("pattern", pattern) + raise stan.NodeNotFound("pattern", pattern) if hasattr(default, 'clone'): while True: yield default.clone(deep=False) else: @@ -86,13 +86,13 @@ def __init__(self, original): class QueryNeverFind(tpc.Adapter): def patternGenerator(self, pattern, default=None): - raise stan.NodeNotFound, ('pattern', pattern) + raise stan.NodeNotFound('pattern', pattern) def allPatterns(self, pattern): return [] def onePattern(self, pattern): - raise stan.NodeNotFound, ('pattern', pattern) + raise stan.NodeNotFound('pattern', pattern) def _locatePatterns(self, pattern, default, loop=True): return [] diff --git a/nevow/rend.py b/nevow/rend.py index 549f0939..15326794 100644 --- a/nevow/rend.py +++ b/nevow/rend.py @@ -18,7 +18,7 @@ """ from time import time as now -from cStringIO import StringIO +from io import StringIO import random import warnings @@ -33,6 +33,7 @@ import formless from formless import iformless, annotate +import collections def _getPreprocessors(inst): @@ -210,7 +211,7 @@ def getBinding(self, ctx, name): described in the ConfigurableMixin class docstring. """ def _get_binding(binding): - if callable(binding): + if isinstance(binding, collections.Callable): binding = util.maybeDeferred(binding, ctx) return binding @@ -298,7 +299,7 @@ def configurable_(self, context): ... ... docFactory = stan(render_forms). """ - if filter(lambda x: issubclass(x, annotate.TypedInterface), providedBy(self)): + if [x for x in providedBy(self) if issubclass(x, annotate.TypedInterface)]: warnings.warn("[0.5] Subclassing TypedInterface to declare annotations is deprecated. Please provide bind_* methods on your Page or Fragment subclass instead.", DeprecationWarning) from formless import configurable return configurable.TypedInterfaceConfigurable(self) @@ -329,7 +330,7 @@ def defaultsFactory(ctx): defaults = webform.FormDefaults() if co is not None: e = iformless.IFormErrors(co, {}) - for k, v in e.items(): + for k, v in list(e.items()): defaults.getAllDefaults(k).update(v.partialForm) return defaults @@ -341,7 +342,7 @@ def errorsFactory(ctx): errs = webform.FormErrors() if co is not None: e = iformless.IFormErrors(co, {}) - for k, v in e.items(): + for k, v in list(e.items()): errs.updateErrors(k, v.errors) errs.setError(k, v.formErrorMessage) return errs @@ -408,7 +409,7 @@ def rend(self, context, data): finally: self.docFactory.pattern = old self.docFactory.precompiledDoc = None - except TypeError, e: + except TypeError as e: # Avert your eyes now! I don't want to catch anything but IQ # adaption exceptions here but all I get is TypeError. This whole # section of code is a complete hack anyway so one more won't @@ -546,7 +547,7 @@ def _renderHTTP(self, ctx): def finishRequest(): carryover = request.args.get('_nevow_carryover_', [None])[0] - if carryover is not None and _CARRYOVER.has_key(carryover): + if carryover is not None and carryover in _CARRYOVER: del _CARRYOVER[carryover] if self.afterRender is not None: return util.maybeDeferred(self.afterRender,ctx) @@ -668,7 +669,7 @@ def redirectAfterPost(aspects): magicCookie = '%s%s%s' % (now(),request.getClientIP(),random.random()) refpath = refpath.replace('_nevow_carryover_', magicCookie) _CARRYOVER[magicCookie] = C = tpc.Componentized() - for k, v in aspects.iteritems(): + for k, v in aspects.items(): C.setComponent(k, v) destination = flat.flatten(refpath, ctx) @@ -768,7 +769,7 @@ def mapping(context, data): """ - for k, v in data.items(): + for k, v in list(data.items()): context.fillSlots(k, v) return context.tag @@ -799,7 +800,7 @@ def renderHTTP(self, ctx): # Look for an application-remembered handler try: notFoundHandler = ctx.locate(inevow.ICanHandleNotFound) - except KeyError, e: + except KeyError as e: return self.notFound # Call the application-remembered handler but if there are any errors # then log it and fallback to the standard message. @@ -809,7 +810,7 @@ def renderHTTP(self, ctx): log.err() return self.notFound - def __nonzero__(self): + def __bool__(self): return False diff --git a/nevow/scripts/nit.py b/nevow/scripts/nit.py index b9ab4c2c..f4e93ee8 100644 --- a/nevow/scripts/nit.py +++ b/nevow/scripts/nit.py @@ -50,7 +50,7 @@ def run(): config = NitOptions() try: config.parseOptions() - except UsageError, ue: + except UsageError as ue: raise SystemExit("%s: %s" % (sys.argv[0], ue)) else: if not config['testmodules']: diff --git a/nevow/scripts/xmlgettext.py b/nevow/scripts/xmlgettext.py index a286edd0..0fd3d235 100644 --- a/nevow/scripts/xmlgettext.py +++ b/nevow/scripts/xmlgettext.py @@ -1,5 +1,5 @@ from xml.dom import pulldom -from cStringIO import StringIO +from io import StringIO from twisted.python import usage import nevow @@ -38,14 +38,14 @@ def read(self, bufsize): def getMsgID(node): out = StringIO() - print >>out, 'msgid ""' + print('msgid ""', file=out) for child in node.childNodes: s = child.toxml('utf-8') s = s.replace('\\', '\\\\') s = s.replace('"', '\\"') s = s.replace('\n', '\\n') - print >>out, '"%s"' % s - print >>out, 'msgstr ""' + print('"%s"' % s, file=out) + print('msgstr ""', file=out) return out.getvalue() def process(filename, messages): @@ -67,14 +67,14 @@ def process(filename, messages): def report(messages): - for msgid, locations in messages.items(): + for msgid, locations in list(messages.items()): for line in locations: - print line - print msgid + print(line) + print(msgid) class GettextOptions(usage.Options): def opt_version(self): - print 'Nevow version:', nevow.__version__ + print('Nevow version:', nevow.__version__) usage.Options.opt_version(self) def parseArgs(self, *files): diff --git a/nevow/stan.py b/nevow/stan.py index fc6f689b..86f915bd 100644 --- a/nevow/stan.py +++ b/nevow/stan.py @@ -21,7 +21,7 @@ prototypes for all of the XHTML element types. """ -from __future__ import generators + from zope.interface import implements from nevow import inevow @@ -147,7 +147,7 @@ def __iter__(self): """Prevent an infinite loop if someone tries to do for x in slot('foo'): """ - raise NotImplementedError, "Stan slot instances are not iterable." + raise NotImplementedError("Stan slot instances are not iterable.") @@ -362,11 +362,11 @@ def __call__(self, **kw): return self for name in self.specials: - if kw.has_key(name): + if name in kw: setattr(self, name, kw[name]) del kw[name] - for k, v in kw.iteritems(): + for k, v in kw.items(): if k[-1] == '_': k = k[:-1] elif k[0] == '_': @@ -403,7 +403,7 @@ def __iter__(self): """Prevent an infinite loop if someone tries to do for x in stantaginstance: """ - raise NotImplementedError, "Stan tag instances are not iterable." + raise NotImplementedError("Stan tag instances are not iterable.") def _clearSpecials(self): """Clears all the specials in this tag. For use by flatstan. @@ -496,7 +496,7 @@ def forever(): class UnsetClass: - def __nonzero__(self): + def __bool__(self): return False def __repr__(self): return "Unset" @@ -546,18 +546,18 @@ class PatternTag(object): through a sequence of matching patterns.''' def __init__(self, patterner): - self.pat = patterner.next() + self.pat = next(patterner) self.patterner = patterner - def next(self): + def __next__(self): if self.pat: p, self.pat = self.pat, None return p - return self.patterner.next() + return next(self.patterner) def makeForwarder(name): - return lambda self, *args, **kw: getattr(self.next(), name)(*args, **kw) + return lambda self, *args, **kw: getattr(next(self), name)(*args, **kw) for forward in ['__call__', '__getitem__', 'fillSlots']: setattr(PatternTag, forward, makeForwarder(forward)) @@ -591,7 +591,7 @@ def _locatePatterns(tag, pattern, default, loop=True): yield cloned if default is None: - raise NodeNotFound, ("pattern", pattern) + raise NodeNotFound("pattern", pattern) if hasattr(default, 'clone'): while True: yield default.clone(deep=False) else: diff --git a/nevow/static.py b/nevow/static.py index 9853b446..75e10c13 100644 --- a/nevow/static.py +++ b/nevow/static.py @@ -7,7 +7,7 @@ # System Imports import os, string, time -import cStringIO +import io import traceback import warnings StringIO = cStringIO @@ -144,7 +144,7 @@ def loadMimeTypes(mimetype_locations=['/etc/mime.types']): def getTypeAndEncoding(filename, types, encodings, defaultType): p, ext = os.path.splitext(filename) ext = ext.lower() - if encodings.has_key(ext): + if ext in encodings: enc = encodings[ext] ext = os.path.splitext(p)[1].lower() else: @@ -300,7 +300,7 @@ def renderHTTP(self, ctx): try: f = self.openForReading() - except IOError, e: + except IOError as e: import errno if e[0] == errno.EACCES: return ForbiddenResource().render(request) diff --git a/nevow/test/acceptance/reconnect.py b/nevow/test/acceptance/reconnect.py index 1c73db4d..39e9a524 100644 --- a/nevow/test/acceptance/reconnect.py +++ b/nevow/test/acceptance/reconnect.py @@ -26,7 +26,7 @@ class ReconnectableElementRenderingLivePage(OriginalPage): that API. We should not attempt to keep this working as-is; if you do find it in a broken state, just update it to use newer, better documented APIs. """ - jsClass = u'Nevow.Test.ReconnectAcceptanceTest.ReconnectingPage' + jsClass = 'Nevow.Test.ReconnectAcceptanceTest.ReconnectingPage' def __init__(self, *a, **k): """ Make sure our interface allows the particular method we want to expose. @@ -52,7 +52,7 @@ def giveElementID(self, newID): import itertools -counter = itertools.count().next +counter = itertools.count().__next__ class ReconnectableElement(LiveElement): """ diff --git a/nevow/test/acceptance/tabbedpane.py b/nevow/test/acceptance/tabbedpane.py index 41be3855..2a51275b 100644 --- a/nevow/test/acceptance/tabbedpane.py +++ b/nevow/test/acceptance/tabbedpane.py @@ -17,12 +17,12 @@ def tabbedPaneFragment(): C{

} node containing the tab's number. """ return TabbedPaneFragment( - [('Page ' + str(i), tags.h1[str(i)]) for i in xrange(4)]) + [('Page ' + str(i), tags.h1[str(i)]) for i in range(4)]) class TabbedPaneFetcher(athena.LiveElement): - jsClass = u'Nevow.Test.TestTabbedPane.TabbedPaneFetcher' + jsClass = 'Nevow.Test.TestTabbedPane.TabbedPaneFetcher' docFactory = loaders.xmlstr("""
') @@ -569,7 +569,7 @@ def test_handlerMacroAgainstList(self): macro is. """ tag = ["hello", " ", "world"] - self.assertEquals( + self.assertEqual( athena._rewriteEventHandlerToAttribute(tag), tag) @@ -618,7 +618,7 @@ def test_elementPreprocessors(self): renderDeferred = renderPage(page) def rendered(result): page.action_close(None) - self.assertEquals(preprocessed, [[tag]]) + self.assertEqual(preprocessed, [[tag]]) renderDeferred.addCallback(rendered) return renderDeferred @@ -681,7 +681,7 @@ def setUp(self): def _importTest(self, moduleName): mod = self.deps.getModuleForName(moduleName) inspect = [dep for dep in mod.allDependencies() if dep.name == moduleName] - self.failUnless(inspect) + self.assertTrue(inspect) def test_divmodImport(self): @@ -775,14 +775,14 @@ def testFragmentNesting(self): tf1.setFragmentParent(lp) tf2.setFragmentParent(tf1) - self.assertEquals(lp.liveFragmentChildren, [tf1]) - self.assertEquals(tf1.liveFragmentChildren, [tf2]) - self.assertEquals(tf2.liveFragmentChildren, []) - self.assertEquals(tf2.fragmentParent, tf1) - self.assertEquals(tf1.fragmentParent, lp) + self.assertEqual(lp.liveFragmentChildren, [tf1]) + self.assertEqual(tf1.liveFragmentChildren, [tf2]) + self.assertEqual(tf2.liveFragmentChildren, []) + self.assertEqual(tf2.fragmentParent, tf1) + self.assertEqual(tf1.fragmentParent, lp) - self.assertEquals(tf2.page, lp) - self.assertEquals(tf1.page, lp) + self.assertEqual(tf2.page, lp) + self.assertEqual(tf1.page, lp) def testInsideOutFragmentNesting(self): @@ -797,13 +797,13 @@ def testInsideOutFragmentNesting(self): innerFragment.setFragmentParent(outerFragment) outerFragment.setFragmentParent(page) - self.assertEquals(page.liveFragmentChildren, [outerFragment]) - self.assertEquals(outerFragment.fragmentParent, page) - self.assertEquals(outerFragment.page, page) + self.assertEqual(page.liveFragmentChildren, [outerFragment]) + self.assertEqual(outerFragment.fragmentParent, page) + self.assertEqual(outerFragment.page, page) - self.assertEquals(outerFragment.liveFragmentChildren, [innerFragment]) - self.assertEquals(innerFragment.fragmentParent, outerFragment) - self.assertEquals(innerFragment.page, page) + self.assertEqual(outerFragment.liveFragmentChildren, [innerFragment]) + self.assertEqual(innerFragment.fragmentParent, outerFragment) + self.assertEqual(innerFragment.page, page) @@ -814,14 +814,14 @@ class Tracebacks(unittest.TestCase): stack = '\n'.join(['%s@%s:%d' % frame for frame in frames]) - exc = {u'name': 'SomeError', - u'message': 'An error occurred.', - u'stack': stack} + exc = {'name': 'SomeError', + 'message': 'An error occurred.', + 'stack': stack} def testStackParsing(self): p = athena.parseStack(self.stack) - for iframe, oframe in izip(self.frames[::-1], p): - self.assertEquals(oframe, iframe) + for iframe, oframe in zip(self.frames[::-1], p): + self.assertEqual(oframe, iframe) def testStackLengthAndOrder(self): f = athena.getJSFailure(self.exc, {}) @@ -840,7 +840,8 @@ def cancel(self): def mappend(transport): - def send((ack, messages)): + def send(xxx_todo_changeme): + (ack, messages) = xxx_todo_changeme transport.append(messages[:]) return send @@ -898,9 +899,9 @@ def testSendMessageImmediately(self): """ self.rdm.addOutput(mappend(self.transport)) self.rdm.addMessage(self.theMessage) - self.assertEquals(self.transport, [[(0, self.theMessage)]]) + self.assertEqual(self.transport, [[(0, self.theMessage)]]) self.rdm.addMessage(self.theMessage) - self.assertEquals(self.transport, [[(0, self.theMessage)]]) + self.assertEqual(self.transport, [[(0, self.theMessage)]]) def testSendMessageQueued(self): @@ -910,7 +911,7 @@ def testSendMessageQueued(self): """ self.rdm.addMessage(self.theMessage) self.rdm.addOutput(mappend(self.transport)) - self.assertEquals(self.transport, [[(0, self.theMessage)]]) + self.assertEqual(self.transport, [[(0, self.theMessage)]]) def testMultipleQueuedMessages(self): @@ -921,7 +922,7 @@ def testMultipleQueuedMessages(self): self.rdm.addMessage(self.theMessage) self.rdm.addMessage(self.theMessage.encode('hex')) self.rdm.addOutput(mappend(self.transport)) - self.assertEquals(self.transport, [[(0, self.theMessage), (1, self.theMessage.encode('hex'))]]) + self.assertEqual(self.transport, [[(0, self.theMessage), (1, self.theMessage.encode('hex'))]]) def testMultipleQueuedOutputs(self): @@ -933,8 +934,8 @@ def testMultipleQueuedOutputs(self): self.rdm.addOutput(mappend(self.transport)) self.rdm.addOutput(mappend(secondTransport)) self.rdm.addMessage(self.theMessage) - self.assertEquals(self.transport, [[(0, self.theMessage)]]) - self.assertEquals(secondTransport, []) + self.assertEqual(self.transport, [[(0, self.theMessage)]]) + self.assertEqual(secondTransport, []) def testMessageRedelivery(self): @@ -949,15 +950,15 @@ def testMessageRedelivery(self): self.rdm.addMessage(self.theMessage) self.rdm.addMessage(secondMessage) self.rdm.addOutput(mappend(self.transport)) - self.assertEquals(self.transport, [[(0, self.theMessage), (1, secondMessage)]]) + self.assertEqual(self.transport, [[(0, self.theMessage), (1, secondMessage)]]) self.rdm.addOutput(mappend(secondTransport)) - self.assertEquals(secondTransport, [[(0, self.theMessage), (1, secondMessage)]]) + self.assertEqual(secondTransport, [[(0, self.theMessage), (1, secondMessage)]]) self.rdm.basketCaseReceived(None, [0, []]) self.rdm.addOutput(mappend(thirdTransport)) - self.assertEquals(thirdTransport, [[(1, secondMessage)]]) + self.assertEqual(thirdTransport, [[(1, secondMessage)]]) self.rdm.basketCaseReceived(None, [1, []]) self.rdm.addOutput(mappend(fourthTransport)) - self.assertEquals(fourthTransport, []) + self.assertEqual(fourthTransport, []) def testConnectTimeout(self): @@ -967,15 +968,15 @@ def testConnectTimeout(self): established. """ n, f, a, kw = self.scheduled.pop() - self.failIf(self.scheduled, "Too many tasks scheduled.") + self.assertFalse(self.scheduled, "Too many tasks scheduled.") - self.assertEquals(n, self.connectTimeout) + self.assertEqual(n, self.connectTimeout) f(*a, **kw) - self.assertEquals(len(self.events), 1) + self.assertEqual(len(self.events), 1) self.events[0].trap(athena.ConnectFailed) - self.failIf(self.scheduled, "Unexpected task scheduled after connect failed.") + self.assertFalse(self.scheduled, "Unexpected task scheduled after connect failed.") def testConnectSucceeds(self): @@ -983,12 +984,12 @@ def testConnectSucceeds(self): Test that the connection timeout is cancelled when an output channel is added. """ - self.failUnless(self.scheduled, "No connect timeout scheduled.") # Sanity check + self.assertTrue(self.scheduled, "No connect timeout scheduled.") # Sanity check self.rdm.addOutput(mappend(self.transport)) n, f, a, kw = self.scheduled.pop() - self.assertEquals(n, self.idleTimeout) - self.failIf(self.scheduled, "Output channel added but there is still a task pending.") - self.assertEquals(self.transport, [], "Received unexpected output.") + self.assertEqual(n, self.idleTimeout) + self.assertFalse(self.scheduled, "Output channel added but there is still a task pending.") + self.assertEqual(self.transport, [], "Received unexpected output.") def test_connectionMade(self): @@ -1014,15 +1015,15 @@ def testOutputConsumedMessageTimeout(self): self.rdm.addOutput(mappend(self.transport)) n, f, a, kw = self.scheduled.pop() - self.failIf(self.scheduled, "Too many tasks scheduled.") + self.assertFalse(self.scheduled, "Too many tasks scheduled.") - self.assertEquals(n, self.transportlessTimeout) + self.assertEqual(n, self.transportlessTimeout) f(*a, **kw) - self.assertEquals(len(self.events), 1) + self.assertEqual(len(self.events), 1) self.events[0].trap(athena.ConnectionLost) - self.failIf(self.scheduled, "Unexpected task scheduled after connection lost.") + self.assertFalse(self.scheduled, "Unexpected task scheduled after connection lost.") def testMessageConsumedOutputTimeout(self): @@ -1035,15 +1036,15 @@ def testMessageConsumedOutputTimeout(self): self.rdm.addMessage(self.theMessage) n, f, a, kw = self.scheduled.pop() - self.failIf(self.scheduled, "Too many tasks scheduled.") + self.assertFalse(self.scheduled, "Too many tasks scheduled.") - self.assertEquals(n, self.transportlessTimeout) + self.assertEqual(n, self.transportlessTimeout) f(*a, **kw) - self.assertEquals(len(self.events), 1) + self.assertEqual(len(self.events), 1) self.events[0].trap(athena.ConnectionLost) - self.failIf(self.scheduled, "Unexpected task scheduled after connection lost.") + self.assertFalse(self.scheduled, "Unexpected task scheduled after connection lost.") def testOutputConnectionAdded(self): @@ -1054,17 +1055,17 @@ def testOutputConnectionAdded(self): self.rdm.addMessage(self.theMessage) self.rdm.addOutput(mappend(self.transport)) - self.assertEquals(len(self.scheduled), 1, "Transportless timeout not created.") + self.assertEqual(len(self.scheduled), 1, "Transportless timeout not created.") n, f, a, kw = self.scheduled[0] - self.assertEquals(n, self.transportlessTimeout, "Unexpected task still scheduled after output added.") + self.assertEqual(n, self.transportlessTimeout, "Unexpected task still scheduled after output added.") self.rdm.basketCaseReceived(None, [0, []]) n, f, a, kw = self.scheduled.pop() - self.assertEquals(n, self.idleTimeout) + self.assertEqual(n, self.idleTimeout) - self.failIf(self.scheduled, "Unexpected task still scheduled after output added.") - self.failIf(self.events, "Unexpectedly received some kind of event.") + self.assertFalse(self.scheduled, "Unexpected task still scheduled after output added.") + self.assertFalse(self.events, "Unexpectedly received some kind of event.") def testIdleOutputTimeout(self): @@ -1075,12 +1076,12 @@ def testIdleOutputTimeout(self): self.rdm.addOutput(mappend(self.transport)) n, f, a, kw = self.scheduled.pop() - self.assertEquals(n, self.idleTimeout) - self.failIf(self.scheduled, "Unexpected tasks still scheduled in addition to idle timeout task.") + self.assertEqual(n, self.idleTimeout) + self.assertFalse(self.scheduled, "Unexpected tasks still scheduled in addition to idle timeout task.") f(*a, **kw) - self.assertEquals(self.transport, [[]]) + self.assertEqual(self.transport, [[]]) def testIdleTimeoutStartsOutputlessTimeout(self): @@ -1091,16 +1092,16 @@ def testIdleTimeoutStartsOutputlessTimeout(self): self.rdm.addOutput(mappend(self.transport)) n, f, a, kw = self.scheduled.pop() - self.assertEquals(n, self.idleTimeout) + self.assertEqual(n, self.idleTimeout) f(*a, **kw) - self.failIf(self.events, "Unexpectedly received some events.") + self.assertFalse(self.events, "Unexpectedly received some events.") n, f, a, kw = self.scheduled.pop() - self.assertEquals(n, self.transportlessTimeout) + self.assertEqual(n, self.transportlessTimeout) f(*a, **kw) - self.assertEquals(len(self.events), 1) + self.assertEqual(len(self.events), 1) self.events[0].trap(athena.ConnectionLost) @@ -1114,15 +1115,15 @@ def testPreConnectPause(self): # The connection timeout should have been cancelled and # replaced with an idle timeout. - self.assertEquals(len(self.scheduled), 1) + self.assertEqual(len(self.scheduled), 1) n, f, a, kw = self.scheduled[0] - self.assertEquals(n, self.idleTimeout) + self.assertEqual(n, self.idleTimeout) self.rdm.addMessage(self.theMessage) - self.assertEquals(self.transport, []) + self.assertEqual(self.transport, []) self.rdm.unpause() - self.assertEquals(self.transport, [[(0, self.theMessage)]]) + self.assertEqual(self.transport, [[(0, self.theMessage)]]) def testTransportlessPause(self): @@ -1135,10 +1136,10 @@ def testTransportlessPause(self): self.rdm.pause() self.rdm.addMessage(self.theMessage) - self.assertEquals(self.transport, []) + self.assertEqual(self.transport, []) self.rdm.unpause() - self.assertEquals(self.transport, [[(0, self.theMessage)]]) + self.assertEqual(self.transport, [[(0, self.theMessage)]]) def testMessagelessPause(self): @@ -1151,10 +1152,10 @@ def testMessagelessPause(self): self.rdm.pause() self.rdm.addMessage(self.theMessage) - self.assertEquals(self.transport, []) + self.assertEqual(self.transport, []) self.rdm.unpause() - self.assertEquals(self.transport, [[(0, self.theMessage)]]) + self.assertEqual(self.transport, [[(0, self.theMessage)]]) def testStaleMessages(self): @@ -1168,7 +1169,7 @@ def testStaleMessages(self): [-1, [[0, self.theMessage], [1, self.theMessage + "-1"], [2, self.theMessage + "-2"]]]) - self.assertEquals( + self.assertEqual( self.outgoingMessages, [(None, self.theMessage), (None, self.theMessage + "-1"), @@ -1178,14 +1179,14 @@ def testStaleMessages(self): self.rdm.basketCaseReceived( None, [-1, [[1, self.theMessage + "-1"]]]) - self.assertEquals( + self.assertEqual( self.outgoingMessages, []) self.rdm.basketCaseReceived( None, [-1, [[2, self.theMessage + "-2"]]]) - self.assertEquals( + self.assertEqual( self.outgoingMessages, []) @@ -1200,11 +1201,11 @@ def testClosing(self): self.rdm.addOutput(mappend(self.transport)) self.rdm.addOutput(mappend(self.transport)) self.rdm.close() - self.assertEquals(self.transport, [[(0, (athena.CLOSE, []))], [(0, (athena.CLOSE, []))]]) + self.assertEqual(self.transport, [[(0, (athena.CLOSE, []))], [(0, (athena.CLOSE, []))]]) self.transport = [] self.rdm.addOutput(mappend(self.transport)) - self.assertEquals(self.transport, [[(0, (athena.CLOSE, []))]]) + self.assertEqual(self.transport, [[(0, (athena.CLOSE, []))]]) def testCloseBeforeConnect(self): @@ -1213,7 +1214,7 @@ def testCloseBeforeConnect(self): ever established properly cleans up any timeouts. """ self.rdm.close() - self.failIf(self.scheduled, "Expected no scheduled calls.") + self.assertFalse(self.scheduled, "Expected no scheduled calls.") def test_closeExcessOnReceived(self): @@ -1224,9 +1225,9 @@ def test_closeExcessOnReceived(self): self.rdm.addOutput(mappend(self.transport)) self.rdm.addOutput(mappend(secondTransport)) d = self.rdm.basketCaseReceived(None, [0, []]) - self.assertEquals(self.transport, [[]]) - self.assertEquals(secondTransport, [[]]) - self.failIf(d.called) + self.assertEqual(self.transport, [[]]) + self.assertEqual(secondTransport, [[]]) + self.assertFalse(d.called) def test_closeExcessOnUnpaused(self): @@ -1459,7 +1460,7 @@ def test_glueIncludesStylesheets(self): Our element's glue should include inline stylesheet references. """ element = self.elementFactory() - element.cssModule = u'TestCSSModuleDependencies.Dependor' + element.cssModule = 'TestCSSModuleDependencies.Dependor' element.docFactory = loaders.stan( tags.div(render=tags.directive(self.liveGlueRenderer))) @@ -1470,8 +1471,8 @@ def test_glueIncludesStylesheets(self): def cbRendered(result): expected = flat.flatten( page.getStylesheetStan( - [page.getCSSModuleURL(u'TestCSSModuleDependencies.Dependee'), - page.getCSSModuleURL(u'TestCSSModuleDependencies.Dependor')])) + [page.getCSSModuleURL('TestCSSModuleDependencies.Dependee'), + page.getCSSModuleURL('TestCSSModuleDependencies.Dependor')])) self.assertIn(expected, result) D.addCallback(cbRendered) return D @@ -1482,7 +1483,7 @@ def test_glueIncludesStylesheetsOnce(self): Our element's glue shouldn't include redundant stylesheet references. """ element = self.elementFactory() - element.cssModule = u'TestCSSModuleDependencies.Dependor' + element.cssModule = 'TestCSSModuleDependencies.Dependor' element.docFactory = loaders.stan( tags.div(render=tags.directive(self.liveGlueRenderer))) @@ -1497,8 +1498,8 @@ def test_glueIncludesStylesheetsOnce(self): def cbRendered(result): expected = flat.flatten( page.getStylesheetStan( - [page.getCSSModuleURL(u'TestCSSModuleDependencies.Dependee'), - page.getCSSModuleURL(u'TestCSSModuleDependencies.Dependor')])) + [page.getCSSModuleURL('TestCSSModuleDependencies.Dependee'), + page.getCSSModuleURL('TestCSSModuleDependencies.Dependor')])) self.assertIn(expected, result) D.addCallback(cbRendered) return D @@ -1567,7 +1568,7 @@ def test_bootstrapCall(self): calling a single JavaScript function. """ bc = self.page._bootstrapCall( - "SomeModule.someMethod", [u"one", 2, {u"three": 4.1}]) + "SomeModule.someMethod", ["one", 2, {"three": 4.1}]) self.assertEqual( bc, 'SomeModule.someMethod("one", 2, {"three":4.1});') @@ -1577,14 +1578,14 @@ def test_pageJsClassDependencies(self): L{LivePage.render_liveglue} should include modules that the L{LivePage}'s jsClass depends on. """ - self.page.jsClass = u'PythonTestSupport.Dependor.PageTest' + self.page.jsClass = 'PythonTestSupport.Dependor.PageTest' freq = FakeRequest() self.page._becomeLive(url.URL.fromRequest(freq)) ctx = WovenContext(tag=tags.div()) ctx.remember(freq, IRequest) self.assertEqual(self.page.render_liveglue(ctx, None), ctx.tag) - expectDependor = flat.flatten(self.page.getImportStan(u'PythonTestSupport.Dependor')) - expectDependee = flat.flatten(self.page.getImportStan(u'PythonTestSupport.Dependee')) + expectDependor = flat.flatten(self.page.getImportStan('PythonTestSupport.Dependor')) + expectDependee = flat.flatten(self.page.getImportStan('PythonTestSupport.Dependee')) result = flat.flatten(ctx.tag, ctx) self.assertIn(expectDependor, result) self.assertIn(expectDependee, result) @@ -1595,7 +1596,7 @@ def test_pageCSSModuleDependencies(self): L{athena.LivePage.render_liveglue} should include CSS modules that the top-level C{cssModule} depends on. """ - self.page.cssModule = u'TestCSSModuleDependencies.Dependor' + self.page.cssModule = 'TestCSSModuleDependencies.Dependor' self.page.cssModules = self._makeCSSRegistry() self.page._becomeLive(url.URL()) @@ -1604,8 +1605,8 @@ def test_pageCSSModuleDependencies(self): self.assertEqual(self.page.render_liveglue(ctx, None), ctx.tag) expected = flat.flatten( self.page.getStylesheetStan( - [self.page.getCSSModuleURL(u'TestCSSModuleDependencies.Dependee'), - self.page.getCSSModuleURL(u'TestCSSModuleDependencies.Dependor')])) + [self.page.getCSSModuleURL('TestCSSModuleDependencies.Dependee'), + self.page.getCSSModuleURL('TestCSSModuleDependencies.Dependor')])) self.assertIn(expected, flat.flatten(ctx.tag, ctx)) @@ -1629,9 +1630,9 @@ class to instantiate and the URL to instantiate it with. # Nevow's URL quoting rules are weird, but this is the URL # flattener's fault, not mine. Adjust to taste if that changes # (it won't) -glyph - [u"http://localhost/'%22"]), + ["http://localhost/'%22"]), ("Nevow.Athena.bootstrap", - [u'Nevow.Athena.PageWidget', u'asdf'])]) + ['Nevow.Athena.PageWidget', 'asdf'])]) def test_renderReconnect(self): @@ -1681,7 +1682,7 @@ def test_cssModuleRoot(self): page = athena.LivePage( cssModuleRoot=theCSSModuleRoot) self.assertEqual( - page.getCSSModuleURL(u'X.Y'), + page.getCSSModuleURL('X.Y'), theCSSModuleRoot.child('X.Y')) @@ -1855,7 +1856,7 @@ def test_widgetOption(self): """ options = widgetServiceMaker.options() options.parseOptions(['--element', qual(DummyLiveElement)]) - self.assertEquals(options['element'], DummyLiveElement) + self.assertEqual(options['element'], DummyLiveElement) def test_invalidWidgetOption(self): @@ -1895,8 +1896,8 @@ def test_providesInterfaces(self): Verify that the necessary interfaces for the object to be found as a twistd subcommand plugin are provided. """ - self.failUnless(IPlugin.providedBy(widgetServiceMaker)) - self.failUnless(IServiceMaker.providedBy(widgetServiceMaker)) + self.assertTrue(IPlugin.providedBy(widgetServiceMaker)) + self.assertTrue(IServiceMaker.providedBy(widgetServiceMaker)) def test_makeService(self): @@ -1908,11 +1909,11 @@ def test_makeService(self): 'element': DummyLiveElement, 'port': 8080, }) - self.failUnless(isinstance(service, TCPServer)) + self.assertTrue(isinstance(service, TCPServer)) self.assertEqual(service.args[0], 8080) - self.failUnless(isinstance(service.args[1], NevowSite)) - self.failUnless(isinstance(service.args[1].resource, WidgetPluginRoot)) - self.failUnless(isinstance(service.args[1].resource.elementFactory(), + self.assertTrue(isinstance(service.args[1], NevowSite)) + self.assertTrue(isinstance(service.args[1].resource, WidgetPluginRoot)) + self.assertTrue(isinstance(service.args[1].resource.elementFactory(), DummyLiveElement)) @@ -1922,7 +1923,7 @@ def test_livePageRendering(self): particular LiveElement properly renders that element. """ element = DummyLiveElement() - element.jsClass = u'Dummy.ClassName' + element.jsClass = 'Dummy.ClassName' element.docFactory = stan('the element') page = ElementRenderingLivePage(element) renderDeferred = renderLivePage(page) @@ -1949,8 +1950,8 @@ def test_multipleRendersMultipleWidgets(self): page2, seg = w.locateChild(None, ['']) # Make sure the pages aren't the same. - self.failUnless(isinstance(page1, ElementRenderingLivePage)) - self.failUnless(isinstance(page2, ElementRenderingLivePage)) + self.assertTrue(isinstance(page1, ElementRenderingLivePage)) + self.assertTrue(isinstance(page2, ElementRenderingLivePage)) self.assertNotIdentical(page1, page2) # Make sure the elements aren't the same. @@ -1972,7 +1973,7 @@ def test_transportHookup(self): w = WidgetPluginRoot(DummyLiveElement) page1, seg = w.locateChild(None, ['']) page1.element.docFactory = stan('the element') - page1.element.jsClass = u'Dummy.ClassName' + page1.element.jsClass = 'Dummy.ClassName' def cbCheckPageByClientID(result): req = FakeRequest() ctx = WovenContext() diff --git a/nevow/test/test_compression.py b/nevow/test/test_compression.py index 02da83a6..7d19285d 100644 --- a/nevow/test/test_compression.py +++ b/nevow/test/test_compression.py @@ -1,7 +1,7 @@ """ Tests for on-the-fly content compression encoding. """ -from StringIO import StringIO +from io import StringIO from gzip import GzipFile from zope.interface import implements diff --git a/nevow/test/test_context.py b/nevow/test/test_context.py index c2b02470..ab9561f5 100644 --- a/nevow/test/test_context.py +++ b/nevow/test/test_context.py @@ -24,31 +24,31 @@ def test_basic(self): middle = context.WovenContext(top, tags.invisible()) bottom = context.WovenContext(middle, tags.invisible()) top.remember(0, IStuff) - self.assertEquals(bottom.locate(IStuff), 0) + self.assertEqual(bottom.locate(IStuff), 0) middle.remember(1, IStuff) - self.assertEquals(bottom.locate(IStuff), 1) - self.assertEquals(bottom.locate(IStuff, depth=2), 0) + self.assertEqual(bottom.locate(IStuff), 1) + self.assertEqual(bottom.locate(IStuff, depth=2), 0) def test_reverse(self): top = context.WovenContext().remember(0, IStuff) bottom = context.WovenContext(top, tags.invisible()).remember(1, IStuff) - self.assertEquals(bottom.locate(IStuff, depth=-1), 0) + self.assertEqual(bottom.locate(IStuff, depth=-1), 0) def test_page(self): page = context.PageContext(tag=1) page.remember(1, inevow.IData) ctx = context.WovenContext(page, tags.invisible()) - self.assertEquals(ctx.locate(inevow.IData), 1) - self.assertEquals(ctx.locate(inevow.IData, depth=-1), 1) + self.assertEqual(ctx.locate(inevow.IData), 1) + self.assertEqual(ctx.locate(inevow.IData, depth=-1), 1) def test_factoryContext(self): ctx = TestContext() - self.assertEquals(IFoo(ctx), True) + self.assertEqual(IFoo(ctx), True) def test_factoryContextFromLocate(self): factory = TestContext() ctx = context.WovenContext(parent=factory) - self.assertEquals(IFoo(ctx), True) + self.assertEqual(IFoo(ctx), True) def test_factoryContextRemembers(self): basectx = TestContext() @@ -72,7 +72,7 @@ def test_slots(self): ctx = context.WovenContext() ctx.fillSlots('foo', 'bar') ctx = context.WovenContext(parent=ctx) - self.assertEquals( + self.assertEqual( ctx.locateSlotData('foo'), 'bar') @@ -94,7 +94,7 @@ def benchmark_longContextChainArg(self): loops = 1e4 before = time.clock() - for x in xrange(loops): + for x in range(loops): ignored = ctx.arg('foo') ignored = ctx.arg('bar') after = time.clock() @@ -122,7 +122,7 @@ class IBar(zi.Interface): nextBar = itertools.count() def barFactory(ctx): - return nextBar.next() + return next(nextBar) registerAdapter(barFactory, TestContext, IBar) diff --git a/nevow/test/test_disktemplate.py b/nevow/test/test_disktemplate.py index 5e027454..9f2c7cff 100644 --- a/nevow/test/test_disktemplate.py +++ b/nevow/test/test_disktemplate.py @@ -45,14 +45,14 @@ class TestHTMLRenderer(testutil.TestCase): def test_stringTemplate(self): r = rend.Page(docFactory=loaders.htmlstr(self.xhtml)) return deferredRender(r).addCallback( - lambda result: self.assertEquals(result, self.xhtml)) + lambda result: self.assertEqual(result, self.xhtml)) def test_diskTemplate(self): temp = self.mktemp() setContent(temp, self.xhtml) r = rend.Page(docFactory=loaders.htmlfile(temp)) return deferredRender(r).addCallback( - lambda result: self.assertEquals(result, self.xhtml)) + lambda result: self.assertEqual(result, self.xhtml)) class TestStandardRenderers(testutil.TestCase): @@ -100,7 +100,7 @@ def render_replaceNode(self, context, data): tr = TemplateRenderer(docFactory=loaders.htmlfile(temp)) return deferredRender(tr).addCallback( - lambda result: self.assertEquals( + lambda result: self.assertEqual( result, 'THE TITLE

THE HEADER

SOME DUMMY TEXT' )) @@ -119,7 +119,7 @@ def data_aList(self,context,data): return deferredRender(tr).addCallback( lambda result: - self.assertEquals( + self.assertEqual( result, '
  1. one
  2. two
  3. three
', "Whoops. We didn't get what we expected!" )) @@ -138,7 +138,7 @@ def data_aList(self,context,data): return deferredRender(tr).addCallback( lambda result: - self.assertEquals( + self.assertEqual( result, '
  1. one
  2. two
  3. three
', "Whoops. We didn't get what we expected!" )) @@ -158,13 +158,13 @@ class Renderer(rend.Page): def data_aDict(self,context,data): return {'1':'one','2':'two','3':'three','4':'four'} def render_slots(self,context,data): - for name,value in data.items(): + for name,value in list(data.items()): context.fillSlots(name, value) return context.tag return deferredRender(Renderer(docFactory=loaders.htmlfile(temp))).addCallback( lambda result: - self.assertEquals( + self.assertEqual( result, "
onetwo
threefour
", "Whoops. We didn't get what we expected!")) @@ -183,11 +183,11 @@ def render_foo(self, context, data): return defer.DeferredList([ deferredRender(Mine("one", docFactory=loaders.htmlfile(temp))).addCallback( - lambda result: self.assertEquals(result, 'ONE')), + lambda result: self.assertEqual(result, 'ONE')), deferredRender(Mine("two", docFactory=loaders.htmlfile(temp))).addCallback( - lambda result: self.assertEquals(result, 'TWO')), + lambda result: self.assertEqual(result, 'TWO')), deferredRender(Mine("three", docFactory=loaders.htmlfile(temp))).addCallback( - lambda result: self.assertEquals(result, 'THREE')) + lambda result: self.assertEqual(result, 'THREE')) ], fireOnOneErrback=True) @@ -214,7 +214,7 @@ def render_world(self, context, data): def after(result): self.assertSubstring('hello', result) self.assertSubstring('world', result) - self.assertEquals(result, + self.assertEqual(result, "
hello
world") return D.addCallback(after) diff --git a/nevow/test/test_element.py b/nevow/test/test_element.py index 1b862321..1bb8ba40 100644 --- a/nevow/test/test_element.py +++ b/nevow/test/test_element.py @@ -182,7 +182,7 @@ def test_simpleStanRendering(self): """ f = Element(docFactory=stan(p["Hello, world."])) return self._render(f).addCallback( - self.assertEquals, "

Hello, world.

") + self.assertEqual, "

Hello, world.

") def test_docFactoryClassAttribute(self): @@ -194,7 +194,7 @@ def test_docFactoryClassAttribute(self): class SubElement(Element): docFactory = stan(p["Hello, world."]) return self._render(SubElement()).addCallback( - self.assertEquals, "

Hello, world.

") + self.assertEqual, "

Hello, world.

") def test_simpleXHTMLRendering(self): @@ -204,7 +204,7 @@ def test_simpleXHTMLRendering(self): """ f = Element(docFactory=xmlstr("

Hello, world.

")) return self._render(f).addCallback( - self.assertEquals, "

Hello, world.

") + self.assertEqual, "

Hello, world.

") def test_stanDirectiveRendering(self): @@ -242,7 +242,7 @@ def renderMethod(self, request, tag): docFactory=stan(p(render=directive('renderMethod'))[ "Goodbye, world."])) return self._render(f).addCallback( - self.assertEquals, "Hello, world.") + self.assertEqual, "Hello, world.") def test_elementContainingStaticElement(self): @@ -257,7 +257,7 @@ def renderMethod(self, request, tag): f = RenderfulElement( docFactory=stan(p(render=directive('renderMethod')))) return self._render(f).addCallback( - self.assertEquals, "

Hello, world.

") + self.assertEqual, "

Hello, world.

") def test_elementContainingDynamicElement(self): @@ -277,7 +277,7 @@ def innerMethod(self, request, tag): f = OuterElement( docFactory=stan(p(render=directive('outerMethod')))) return self._render(f).addCallback( - self.assertEquals, "

Hello, world.

") + self.assertEqual, "

Hello, world.

") def test_synchronousFlatten(self): diff --git a/nevow/test/test_errorhandler.py b/nevow/test/test_errorhandler.py index 6a4b2e1b..938b542e 100644 --- a/nevow/test/test_errorhandler.py +++ b/nevow/test/test_errorhandler.py @@ -61,25 +61,28 @@ def test_standard404(self): """ root = Root() def later(resource): - self.failUnless(isinstance(resource, rend.FourOhFour)) - def morelater((code, html)): - self.assertEquals(rend.FourOhFour.notFound, html) - self.assertEquals(code, 404) + self.assertTrue(isinstance(resource, rend.FourOhFour)) + def morelater(xxx_todo_changeme): + (code, html) = xxx_todo_changeme + self.assertEqual(rend.FourOhFour.notFound, html) + self.assertEqual(code, 404) return renderResource('/foo').addCallback(morelater) return getResource(root, '/foo').addCallback(later) def test_remembered404Handler(self): - def later((code, html)): - self.assertEquals(html, NotFoundHandler.html) - self.assertEquals(code, 404) + def later(xxx_todo_changeme1): + (code, html) = xxx_todo_changeme1 + self.assertEqual(html, NotFoundHandler.html) + self.assertEqual(code, 404) return renderResource('/foo', notFoundHandler=NotFoundHandler()).addCallback(later) def test_keyErroringNotFoundHandler(self): - def later((code, html)): - self.assertEquals(rend.FourOhFour.notFound, html) - self.assertEquals(code, 404) + def later(xxx_todo_changeme2): + (code, html) = xxx_todo_changeme2 + self.assertEqual(rend.FourOhFour.notFound, html) + self.assertEqual(code, 404) fe = self.flushLoggedErrors(BrokenException) - self.assertEquals(len(fe), 1) + self.assertEqual(len(fe), 1) return renderResource('/foo', notFoundHandler=BadNotFoundHandler()).addCallback(later) diff --git a/nevow/test/test_flatsax.py b/nevow/test/test_flatsax.py index 9c3e19c4..0b2f062e 100644 --- a/nevow/test/test_flatsax.py +++ b/nevow/test/test_flatsax.py @@ -104,38 +104,38 @@ def test_slotLocation(self): def test_parseString(self): xml = '''''' - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_attrs(self): xml = '''

''' - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_xmlns(self): xml = '''''' - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_processingInstruction(self): xml = '''''' - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_doctype(self): xml = ( '\n' '') - self.failUnlessEqual(norm(xml), norm(flatten(parseString(xml)))) + self.assertEqual(norm(xml), norm(flatten(parseString(xml)))) def test_entities(self): xml = """

&

""" - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_cdata(self): xml = '' - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_comment(self): xml = '' - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_commentWhereSpacingMatters(self): """ @@ -150,19 +150,19 @@ def test_commentWhereSpacingMatters(self): """ - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_unicodeComment(self): xml = '' - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_xmlAttr(self): xml = '' - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_badNamespace(self): xml = 'xyz' - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) test_badNamespace.skip = ( 'the standard 2.3 sax parser likes all namespaces to be defined ' 'so this test fails. it does pass with python-xml') @@ -173,7 +173,7 @@ def test_switchns(self): '

in default namespace

' '' 'in foo namespace') - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_otherns(self): xml = ( @@ -181,7 +181,7 @@ def test_otherns(self): 'xmlns:xf="http://www.w3.org/2002/xforms">

' 'in default namespace

' 'in another namespace') - self.failUnlessEqual(xml, flatten(parseString(xml))) + self.assertEqual(xml, flatten(parseString(xml))) def test_invisiblens(self): """ @@ -190,4 +190,4 @@ def test_invisiblens(self): xml = ( '

' '123

') - self.failUnlessEqual('

123

', flatten(parseString(xml))) + self.assertEqual('

123

', flatten(parseString(xml))) diff --git a/nevow/test/test_flatstan.py b/nevow/test/test_flatstan.py index 026d108c..20d59e68 100644 --- a/nevow/test/test_flatstan.py +++ b/nevow/test/test_flatstan.py @@ -49,21 +49,21 @@ def render(self, tag, precompile=False, data=None, setupRequest=lambda r: r, set class TestSimpleSerialization(Base): def test_serializeProto(self): - self.assertEquals(self.render(proto), '') + self.assertEqual(self.render(proto), '') def test_serializeTag(self): tag = proto(someAttribute="someValue") - self.assertEquals(self.render(tag), '') + self.assertEqual(self.render(tag), '') def test_serializeChildren(self): tag = proto(someAttribute="someValue")[ proto ] - self.assertEquals(self.render(tag), '') + self.assertEqual(self.render(tag), '') def test_serializeWithData(self): tag = proto(data=5) - self.assertEquals(self.render(tag), '') + self.assertEqual(self.render(tag), '') def test_adaptRenderer(self): ## This is an implementation of the "adapt" renderer @@ -72,19 +72,19 @@ def _(context, data): data ] tag = proto(data=5, render=_) - self.assertEquals(self.render(tag), '5') + self.assertEqual(self.render(tag), '5') def test_serializeDataWithRenderer(self): tag = proto(data=5, render=str) - self.assertEquals(self.render(tag), '5') + self.assertEqual(self.render(tag), '5') def test_noContextRenderer(self): def _(data): return data tag = proto(data=5, render=_) - self.assertEquals(self.render(tag), '5') + self.assertEqual(self.render(tag), '5') tag = proto(data=5, render=lambda data: data) - self.assertEquals(self.render(tag), '5') + self.assertEqual(self.render(tag), '5') def test_aBunchOfChildren(self): tag = proto[ @@ -92,28 +92,28 @@ def test_aBunchOfChildren(self): 5, "A friend in need is a friend indeed" ] - self.assertEquals(self.render(tag), 'A Child5A friend in need is a friend indeed') + self.assertEqual(self.render(tag), 'A Child5A friend in need is a friend indeed') def test_basicPythonTypes(self): tag = proto(data=5)[ "A string; ", - u"A unicode string; ", + "A unicode string; ", 5, " (An integer) ", 1.0, " (A float) ", - 1L, " (A long) ", + 1, " (A long) ", True, " (A bool) ", ["A ", "List; "], stan.xml(" Some xml; "), lambda data: "A function" ] if self.hasBools: - self.assertEquals(self.render(tag), "A string; A unicode string; 5 (An integer) 1.0 (A float) 1 (A long) True (A bool) A List; Some xml; A function") + self.assertEqual(self.render(tag), "A string; A unicode string; 5 (An integer) 1.0 (A float) 1 (A long) True (A bool) A List; Some xml; A function") else: - self.assertEquals(self.render(tag), "A string; A unicode string; 5 (An integer) 1.0 (A float) 1 (A long) 1 (A bool) A List; Some xml; A function") + self.assertEqual(self.render(tag), "A string; A unicode string; 5 (An integer) 1.0 (A float) 1 (A long) 1 (A bool) A List; Some xml; A function") def test_escaping(self): tag = proto(foo="<>&\"'")["<>&\"'"] - self.assertEquals(self.render(tag), '<>&"\'') + self.assertEqual(self.render(tag), '<>&"\'') class TestComplexSerialization(Base): @@ -127,11 +127,11 @@ def test_precompileWithRenderer(self): ] ] prelude, context, postlude = self.render(tag, precompile=True) - self.assertEquals(prelude, "

Here's a string

") - self.assertEquals(context.tag.tagName, "p") - self.assertEquals(context.tag.data, 5) - self.assertEquals(context.tag.render, str) - self.assertEquals(postlude, '
') + self.assertEqual(prelude, "

Here's a string

") + self.assertEqual(context.tag.tagName, "p") + self.assertEqual(context.tag.data, 5) + self.assertEqual(context.tag.render, str) + self.assertEqual(postlude, '
') def test_precompileSlotData(self): """Test that tags with slotData are not precompiled out of the @@ -140,7 +140,7 @@ def test_precompileSlotData(self): tag = tags.p[tags.slot('foo')] tag.fillSlots('foo', 'bar') precompiled = self.render(tag, precompile=True) - self.assertEquals(self.render(precompiled), '

bar

') + self.assertEqual(self.render(precompiled), '

bar

') def test_precompiledSlotLocation(self): @@ -186,7 +186,7 @@ def render_same(context, data): result1 = self.render(doc, precompile=True) result2 = self.render(doc, precompile=True) rendered = self.render(result2) - self.assertEquals(rendered, "

Hello

5

") + self.assertEqual(rendered, "

Hello

5

") def test_precompilePrecompiled(self): def render_same(context, data): @@ -203,7 +203,7 @@ def render_same(context, data): result1 = self.render(doc, precompile=True) result2 = self.render(result1, precompile=True) rendered = self.render(result2) - self.assertEquals(rendered, "

Hello

5

") + self.assertEqual(rendered, "

Hello

5

") def test_precompileDoesntChangeOriginal(self): doc = tags.html(data="foo")[tags.p['foo'], tags.p['foo']] @@ -211,37 +211,37 @@ def test_precompileDoesntChangeOriginal(self): result = self.render(doc, precompile=True) rendered = self.render(result) - self.assertEquals(len(doc.children), 2) - self.assertEquals(rendered, "

foo

foo

") + self.assertEqual(len(doc.children), 2) + self.assertEqual(rendered, "

foo

foo

") def test_precompileNestedDynamics(self): tag = self.makeComplex() prelude, dynamic, postlude = self.render(tag, precompile=True) - self.assertEquals(prelude, '') + self.assertEqual(prelude, '') - self.assertEquals(dynamic.tag.tagName, 'table') - self.failUnless(dynamic.tag.children) - self.assertEquals(dynamic.tag.data, 5) + self.assertEqual(dynamic.tag.tagName, 'table') + self.assertTrue(dynamic.tag.children) + self.assertEqual(dynamic.tag.data, 5) childPrelude, childDynamic, childPostlude = dynamic.tag.children - self.assertEquals(childPrelude, '') - self.assertEquals(childDynamic.tag.tagName, 'span') - self.assertEquals(childDynamic.tag.render, str) - self.assertEquals(childPostlude, '') + self.assertEqual(childPrelude, '') + self.assertEqual(childDynamic.tag.tagName, 'span') + self.assertEqual(childDynamic.tag.render, str) + self.assertEqual(childPostlude, '') - self.assertEquals(postlude, '') + self.assertEqual(postlude, '') def test_precompileThenRender(self): tag = self.makeComplex() prerendered = self.render(tag, precompile=True) - self.assertEquals(self.render(prerendered), '
5
') + self.assertEqual(self.render(prerendered), '
5
') def test_precompileThenMultipleRenders(self): tag = self.makeComplex() prerendered = self.render(tag, precompile=True) - self.assertEquals(self.render(prerendered), '
5
') - self.assertEquals(self.render(prerendered), '
5
') + self.assertEqual(self.render(prerendered), '
5
') + self.assertEqual(self.render(prerendered), '
5
') def test_patterns(self): tag = tags.html[ @@ -253,12 +253,12 @@ def test_patterns(self): ] ] ] - self.assertEquals(self.render(tag), "
  1. one
  2. two
  3. three
") + self.assertEqual(self.render(tag), "
  1. one
  2. two
  3. three
") def test_precompilePatternWithNoChildren(self): tag = tags.img(pattern='item') pc = flat.precompile(tag) - self.assertEquals(pc[0].tag.children, []) + self.assertEqual(pc[0].tag.children, []) def test_slots(self): tag = tags.html[ @@ -272,7 +272,7 @@ def test_slots(self): ] ] ] - self.assertEquals(self.render(tag), "
Header one.Header two.
One: 1Two: 2
") + self.assertEqual(self.render(tag), "
Header one.Header two.
One: 1Two: 2
") def test_slotAttributeEscapingWhenPrecompiled(self): @@ -291,7 +291,7 @@ def render_searchResults(ctx, remoteCursor): # this test passes if the precompile test is skipped. precompiled = self.render(tag, precompile=True) - self.assertEquals(self.render(precompiled), '') + self.assertEqual(self.render(precompiled), '') def test_nestedpatterns(self): @@ -309,7 +309,7 @@ def data_header(context, data): return ['col1', 'col2', 'col3'] ] ] ] - self.assertEquals(self.render(tag), "
col1col2col3
123
456
") + self.assertEqual(self.render(tag), "
col1col2col3
123
456
") def test_cloning(self): def data_foo(context, data): return [{'foo':'one'}, {'foo':'two'}] @@ -334,24 +334,24 @@ def render_test(context, data): ] ] document=self.render(document, precompile=True) - self.assertEquals(self.render(document), '
  • fooone
  • footwo
') + self.assertEqual(self.render(document), '
  • fooone
  • footwo
') def test_singletons(self): for x in ('img', 'br', 'hr', 'base', 'meta', 'link', 'param', 'area', 'input', 'col', 'basefont', 'isindex', 'frame'): - self.assertEquals(self.render(tags.Proto(x)()), '<%s />' % x) + self.assertEqual(self.render(tags.Proto(x)()), '<%s />' % x) def test_nosingleton(self): for x in ('div', 'span', 'script', 'iframe'): - self.assertEquals(self.render(tags.Proto(x)()), '<%(tag)s>' % {'tag': x}) + self.assertEqual(self.render(tags.Proto(x)()), '<%(tag)s>' % {'tag': x}) def test_nested_data(self): def checkContext(ctx, data): - self.assertEquals(data, "inner") - self.assertEquals(ctx.locate(inevow.IData, depth=2), "outer") + self.assertEqual(data, "inner") + self.assertEqual(ctx.locate(inevow.IData, depth=2), "outer") return 'Hi' tag = tags.html(data="outer")[tags.span(render=lambda ctx,data: ctx.tag, data="inner")[checkContext]] - self.assertEquals(self.render(tag), "Hi") + self.assertEqual(self.render(tag), "Hi") def test_nested_remember(self): class IFoo(Interface): @@ -360,11 +360,11 @@ class Foo(str): implements(IFoo) def checkContext(ctx, data): - self.assertEquals(ctx.locate(IFoo), Foo("inner")) - self.assertEquals(ctx.locate(IFoo, depth=2), Foo("outer")) + self.assertEqual(ctx.locate(IFoo), Foo("inner")) + self.assertEqual(ctx.locate(IFoo, depth=2), Foo("outer")) return 'Hi' tag = tags.html(remember=Foo("outer"))[tags.span(render=lambda ctx,data: ctx.tag, remember=Foo("inner"))[checkContext]] - self.assertEquals(self.render(tag), "Hi") + self.assertEqual(self.render(tag), "Hi") def test_deferredRememberInRenderer(self): class IFoo(Interface): @@ -376,7 +376,7 @@ def locateIt(ctx, data): return IFoo(ctx) tag = tags.invisible(render=rememberIt)[tags.invisible(render=locateIt)] self.render(tag, wantDeferred=True).addCallback( - lambda result: self.assertEquals(result, "bar")) + lambda result: self.assertEqual(result, "bar")) def test_deferredFromNestedFunc(self): def outer(ctx, data): @@ -384,14 +384,14 @@ def inner(ctx, data): return defer.succeed(tags.p['Hello']) return inner self.render(tags.invisible(render=outer), wantDeferred=True).addCallback( - lambda result: self.assertEquals(result, '

Hello

')) + lambda result: self.assertEqual(result, '

Hello

')) def test_dataContextCreation(self): data = {'foo':'oof', 'bar':'rab'} doc = tags.p(data=data)[tags.slot('foo'), tags.slot('bar')] doc.fillSlots('foo', tags.invisible(data=tags.directive('foo'), render=str)) doc.fillSlots('bar', lambda ctx,data: data['bar']) - self.assertEquals(flat.flatten(doc), '

oofrab

') + self.assertEqual(flat.flatten(doc), '

oofrab

') def test_leaky(self): def foo(ctx, data): @@ -403,7 +403,7 @@ def foo(ctx, data): tags.slot("bar"), tags.invisible(render=str)]) - self.assertEquals(result, '
one
') + self.assertEqual(result, '
one
') class TestMultipleRenderWithDirective(Base): @@ -433,37 +433,37 @@ def count(self, context, data): class TestEntity(Base): def test_it(self): val = self.render(entities.nbsp) - self.assertEquals(val, ' ') + self.assertEqual(val, ' ') def test_nested(self): val = self.render(tags.html(src=entities.quot)[entities.amp]) - self.assertEquals(val, '&') + self.assertEqual(val, '&') def test_xml(self): val = self.render([entities.lt, entities.amp, entities.gt]) - self.assertEquals(val, '<&>') + self.assertEqual(val, '<&>') class TestNoneAttribute(Base): def test_simple(self): val = self.render(tags.html(foo=None)["Bar"]) - self.assertEquals(val, "Bar") + self.assertEqual(val, "Bar") def test_slot(self): val = self.render(tags.html().fillSlots('bar', None)(foo=tags.slot('bar'))["Bar"]) - self.assertEquals(val, "Bar") + self.assertEqual(val, "Bar") test_slot.skip = "Attribute name flattening must happen later for this to work" def test_deepSlot(self): val = self.render(tags.html().fillSlots('bar', lambda c,d: None)(foo=tags.slot('bar'))["Bar"]) - self.assertEquals(val, "Bar") + self.assertEqual(val, "Bar") test_deepSlot.skip = "Attribute name flattening must happen later for this to work" def test_deferredSlot(self): self.render(tags.html().fillSlots('bar', defer.succeed(None))(foo=tags.slot('bar'))["Bar"], wantDeferred=True).addCallback( - lambda val: self.assertEquals(val, "Bar")) + lambda val: self.assertEqual(val, "Bar")) test_deferredSlot.skip = "Attribute name flattening must happen later for this to work" @@ -478,7 +478,7 @@ def appendKey(ctx, data): tags.div(key="two", render=appendKey)[ tags.div(render=appendKey)[ tags.div(key="four", render=appendKey)]]]) - self.assertEquals(val, ["one", "one.two", "one.two", "one.two.four"]) + self.assertEqual(val, ["one", "one.two", "one.two", "one.two.four"]) @@ -507,7 +507,7 @@ def gen(ctx, data): # The actual test notquiteglobals = {} def finished(spam): - print 'FINISHED' + print('FINISHED') def error(failure): notquiteglobals['exception'] = failure.value def checker(result): diff --git a/nevow/test/test_flatten.py b/nevow/test/test_flatten.py index 1d270fd9..a5d66149 100644 --- a/nevow/test/test_flatten.py +++ b/nevow/test/test_flatten.py @@ -9,25 +9,25 @@ class TestSerialization(TestCase): def test_someTypes(self): - self.assertEquals(ten.flatten(1), '1') - self.assertEquals(ten.flatten([1,2,3]), '123') + self.assertEqual(ten.flatten(1), '1') + self.assertEqual(ten.flatten([1,2,3]), '123') def test_nestedTags(self): - self.assertEquals( + self.assertEqual( ten.flatten( tags.html(hi='there')[ tags.body[ 42 ]]), '42') def test_dynamic(self): - self.assertEquals( + self.assertEqual( ten.flatten( tags.html[ tags.body(render=lambda c, d: 'body!')]), 'body!') def test_reallyDynamic(self): - self.assertEquals( + self.assertEqual( ten.flatten( tags.html[ lambda c, d: tags.body[ @@ -35,24 +35,24 @@ def test_reallyDynamic(self): 'stuff') def test_serializeString(self): - self.assertEquals(ten.flatten('one'), 'one') - self.assertEquals(type(ten.flatten('<>')), tags.raw) - self.assertEquals(ten.flatten('123'), '<abc&&>123') - self.assertEquals(ten.flatten(tags.xml('<>&')), '<>&') - self.assertEquals(ten.flatten(tags.xml(u'\xc2\xa3')), '\xc3\x82\xc2\xa3') + self.assertEqual(ten.flatten('one'), 'one') + self.assertEqual(type(ten.flatten('<>')), tags.raw) + self.assertEqual(ten.flatten('123'), '<abc&&>123') + self.assertEqual(ten.flatten(tags.xml('<>&')), '<>&') + self.assertEqual(ten.flatten(tags.xml('\xc2\xa3')), '\xc3\x82\xc2\xa3') def test_flattenTwice(self): """Test that flattening a string twice does not encode it twice. """ - self.assertEquals(ten.flatten(ten.flatten('&')), '&') + self.assertEqual(ten.flatten(ten.flatten('&')), '&') class TestPrecompile(TestCase): def test_simple(self): - self.assertEquals(ten.precompile(1), ['1']) + self.assertEqual(ten.precompile(1), ['1']) def test_complex(self): - self.assertEquals(ten.precompile( + self.assertEqual(ten.precompile( tags.html[ tags.head[ tags.title["Hi"]], @@ -66,10 +66,10 @@ def test_dynamic(self): tags.html[ render]) prelude, dynamic, postlude = result - self.assertEquals(prelude, '') - self.assertEquals(dynamic.tag.render, render) - self.assertEquals(postlude, '') - self.assertEquals(ten.flatten(result), 'one') + self.assertEqual(prelude, '') + self.assertEqual(dynamic.tag.render, render) + self.assertEqual(postlude, '') + self.assertEqual(ten.flatten(result), 'one') def test_tagWithRender(self): render = lambda c, d: 'body' @@ -77,10 +77,10 @@ def test_tagWithRender(self): tags.html[ tags.body(render=render)]) prelude, dynamic, postlude = result - self.assertEquals(prelude, '') - self.assertEquals(dynamic.tag.render, render) - self.assertEquals(postlude, '') - self.assertEquals(ten.flatten(result), 'body') + self.assertEqual(prelude, '') + self.assertEqual(dynamic.tag.render, render) + self.assertEqual(postlude, '') + self.assertEqual(ten.flatten(result), 'body') import unicodedata @@ -90,10 +90,10 @@ def test_tagWithRender(self): class TestUnicode(TestCase): def test_it(self): - self.assertEquals(ten.flatten(u), u.encode('utf8')) + self.assertEqual(ten.flatten(u), u.encode('utf8')) def test_unescaped(self): - self.assertEquals(ten.flatten(tags.xml(u'<<<%s>>>' % u)), (u'<<<%s>>>' % u).encode('utf8')) + self.assertEqual(ten.flatten(tags.xml('<<<%s>>>' % u)), ('<<<%s>>>' % u).encode('utf8')) class Registration(TestCase): def testBadRegister(self): diff --git a/nevow/test/test_guard.py b/nevow/test/test_guard.py index 42a27f52..d8820f56 100644 --- a/nevow/test/test_guard.py +++ b/nevow/test/test_guard.py @@ -70,7 +70,7 @@ def __init__(self, *args, **kw): appserver.NevowRequest.__init__(self, *args, **kw) self._pchn = self.channel self._cookieCache = {} - from cStringIO import StringIO + from io import StringIO self.content = StringIO() self.received_headers['host'] = 'fake.com' self.written = StringIO() @@ -91,7 +91,7 @@ def followAllRedirects(self): R = self MAX_REDIRECTS = 5 I = 1 - while R.headers.has_key('location'): + while 'location' in R.headers: assert I < MAX_REDIRECTS, "Too many redirects (to %s)" % R.headers['location'] R = R.followRedirect() I += 1 @@ -103,7 +103,7 @@ def write(self, data): def addCookie(self, k, v, *args,**kw): appserver.NevowRequest.addCookie(self,k,v,*args,**kw) - assert not self._cookieCache.has_key(k), "Should not be setting duplicate cookies!" + assert k not in self._cookieCache, "Should not be setting duplicate cookies!" self._cookieCache[k] = (v, args, kw) self.channel.received_cookies[k] = v @@ -197,7 +197,7 @@ class GuardTestSuper(TestCase): sessions = {} def tearDown(self): - for sz in self.sessions.values(): + for sz in list(self.sessions.values()): sz.expire() def createPortal(self, realmFactory=None): @@ -223,7 +223,7 @@ def getGuard(channel): resource = channel.site.resource while isinstance(resource, ParentPage): assert len(resource.children) == 1 - resource = resource.children.values()[0] + resource = list(resource.children.values())[0] return resource @@ -240,7 +240,7 @@ def renderHTTP(self, ctx): class GetLoggedInAnonymous(rend.Page): def child_(self, ctx): return self def renderHTTP(self, ctx): - raise RuntimeError, "We weren't supposed to get here." + raise RuntimeError("We weren't supposed to get here.") class GetLoggedInRealm: implements(IRealm) @@ -293,8 +293,8 @@ def test_httpAuthInit(self): # each time, and there should only ever be one session. for x in range(3): req = chan.makeFakeRequest('%s/' % self.getGuardPath(), "test", "test") - self.assertEquals(req.written.getvalue(), "Yes") - self.assertEquals(len(self.sessions), 1) + self.assertEqual(req.written.getvalue(), "Yes") + self.assertEqual(len(self.sessions), 1) def test_sessionInit(self): @@ -312,27 +312,27 @@ def test_sessionInit(self): # The first thing that happens when we attempt to browse with no session # is a cookie being set and a redirect being issued to the session url req = chan.makeFakeRequest('%s/xxx/yyy/' % self.getGuardPath()) - self.assertEquals( len(req._cookieCache.values()), 1, "Bad number of cookies in response.") + self.assertEqual( len(list(req._cookieCache.values())), 1, "Bad number of cookies in response.") # The redirect is set immediately and should have a path segment at the beginning matching our cookie - self.failUnless(req.headers.has_key('location')) - cookie = req._cookieCache.values()[0][0] + self.assertTrue('location' in req.headers) + cookie = list(req._cookieCache.values())[0][0] # The URL should have the cookie segment in it and the correct path segments at the end - self.assertEquals(req.headers['location'], + self.assertEqual(req.headers['location'], 'http://fake.com%s/%s/xxx/yyy/' % (self.getGuardPath(), guard.SESSION_KEY+cookie, )) # Now, let's follow the redirect req = req.followRedirect() # Our session should now be set up and we will be redirected to our final destination - self.assertEquals(req.headers['location'].split('?')[0], + self.assertEqual(req.headers['location'].split('?')[0], 'http://fake.com%s/xxx/yyy/' % self.getGuardPath()) # Let's follow the redirect to the final page req = req.followRedirect() - self.failIf(req.headers.has_key('location')) + self.assertFalse('location' in req.headers) # We should have the final resource, which is an anonymous resource - self.assertEquals(req.written.getvalue(), "No") + self.assertEqual(req.written.getvalue(), "No") def test_sessionInit_noCookies(self): @@ -352,23 +352,23 @@ def test_sessionInit_noCookies(self): # is a cookie being set and a redirect being issued to the session url req = chan.makeFakeRequest('%s/xxx/yyy/' % self.getGuardPath(), requestClass=FakeHTTPRequest_noCookies) # The redirect is set immediately and should have a path segment at the beginning matching our session id - self.failUnless(req.headers.has_key('location')) + self.assertTrue('location' in req.headers) # The URL should have the session id segment in it and the correct path segments at the end location = req.headers['location'] prefix = 'http://fake.com%s/%s' % (self.getGuardPath(), guard.SESSION_KEY) suffix = '/xxx/yyy/' - self.failUnless(location.startswith(prefix)) - self.failUnless(location.endswith(suffix)) + self.assertTrue(location.startswith(prefix)) + self.assertTrue(location.endswith(suffix)) for c in location[len(prefix):-len(suffix)]: - self.failUnless(c in '0123456789abcdef') + self.assertTrue(c in '0123456789abcdef') # Now, let's follow the redirect req = req.followRedirect() - self.failIf(req.headers.has_key('location')) + self.assertFalse('location' in req.headers) # We should have the final resource, which is an anonymous resource - self.assertEquals(req.written.getvalue(), "No") + self.assertEqual(req.written.getvalue(), "No") def testUsernamePassword(self): @@ -378,18 +378,18 @@ def testUsernamePassword(self): # Check the anonymous page req = chan.makeFakeRequest('%s/' % self.getGuardPath()).followAllRedirects() - self.assertEquals(req.written.getvalue(), "No") + self.assertEqual(req.written.getvalue(), "No") # Check the logged in page req = chan.makeFakeRequest('%s/__login__/?username=test&password=test' % self.getGuardPath()).followAllRedirects() - self.assertEquals(req.written.getvalue(), "Yes") + self.assertEqual(req.written.getvalue(), "Yes") # Log out chan.makeFakeRequest("%s/__logout__" % self.getGuardPath()).followRedirect() # Get the anonymous page again k = chan.makeFakeRequest("%s/" % self.getGuardPath()) - self.assertEquals(k.written.getvalue(), "No") + self.assertEqual(k.written.getvalue(), "No") def testLoginWithNoSession(self): @@ -398,7 +398,7 @@ def testLoginWithNoSession(self): chan = self.createGuard(p) req = chan.makeFakeRequest('%s/__login__/?username=test&password=test' % self.getGuardPath()).followAllRedirects() - self.assertEquals(req.written.getvalue(), "Yes") + self.assertEqual(req.written.getvalue(), "Yes") def test_sessionNegotiationSavesRequestParameters(self): @@ -416,7 +416,7 @@ def test_sessionNegotiationSavesRequestParameters(self): request = channel.makeFakeRequest( '%s/?foo=1&bar=2' % self.getGuardPath()).followAllRedirects() - self.assertEquals(request.written.getvalue(), '') + self.assertEqual(request.written.getvalue(), '') self.assertEqual( renders, [({'foo': ['1'], 'bar': ['2']}, None, @@ -458,7 +458,7 @@ def test_loginRestoresRequestParameters(self): self.getGuardPath() + '/__login__?username=test&password=test') request = request.followAllRedirects() - self.assertEquals(request.written.getvalue(), '') + self.assertEqual(request.written.getvalue(), '') self.assertEqual( renders, [({'foo': ['1'], 'bar': ['2']}, None, @@ -491,7 +491,7 @@ def test_oldRequestParametersIgnored(self): self.getGuardPath() + '/__login__?username=test&password=test') request = request.followAllRedirects() - self.assertEquals(request.written.getvalue(), '') + self.assertEqual(request.written.getvalue(), '') self.assertEqual( renders, [({'username': ['test'], 'password': ['test']}, None, @@ -507,16 +507,16 @@ def testNoSlash(self): req = chan.makeFakeRequest('%s/' % self.getGuardPath(), requestClass=FakeHTTPRequest_noCookies).followAllRedirects() # We should have the final resource, which is an anonymous resource - self.assertEquals(req.written.getvalue(), "No") + self.assertEqual(req.written.getvalue(), "No") # now try requesting just the guard path - self.failUnless(req.path.startswith('%s/%s' % (self.getGuardPath(), guard.SESSION_KEY))) - self.failUnless(req.path.endswith('/')) + self.assertTrue(req.path.startswith('%s/%s' % (self.getGuardPath(), guard.SESSION_KEY))) + self.assertTrue(req.path.endswith('/')) req = chan.makeFakeRequest(req.path[:-1], requestClass=FakeHTTPRequest_noCookies).followAllRedirects() # it should work just as well as with the slash # (not actually the same page, but SillyPage always says the same thing here) - self.assertEquals(req.written.getvalue(), "No") + self.assertEqual(req.written.getvalue(), "No") def testTrailingSlashMatters_noCookies(self): class TrailingSlashPage(rend.Page): @@ -548,15 +548,15 @@ def requestAvatar(self, avatarId, mind, *interfaces): req = chan.makeFakeRequest('%s/' % self.getGuardPath(), requestClass=FakeHTTPRequest_noCookies).followAllRedirects() # We should have the final resource, which is an anonymous resource - self.assertEquals(req.written.getvalue(), "Anonymous %s/" % self.getGuardPath()) + self.assertEqual(req.written.getvalue(), "Anonymous %s/" % self.getGuardPath()) # now try requesting just the guard path - self.failUnless(req.path.startswith('%s/%s' % (self.getGuardPath(), guard.SESSION_KEY))) - self.failUnless(req.path.endswith('/')) + self.assertTrue(req.path.startswith('%s/%s' % (self.getGuardPath(), guard.SESSION_KEY))) + self.assertTrue(req.path.endswith('/')) req = chan.makeFakeRequest(req.path[:-1], requestClass=FakeHTTPRequest_noCookies).followAllRedirects() # it should no longer have the trailing slash - self.assertEquals(req.written.getvalue(), "Anonymous %s" % self.getGuardPath()) + self.assertEqual(req.written.getvalue(), "Anonymous %s" % self.getGuardPath()) def testTrailingSlashMatters_withCookies(self): # omitting the trailing slash when not using session keys can @@ -593,21 +593,21 @@ def requestAvatar(self, avatarId, mind, *interfaces): req = chan.makeFakeRequest('%s/' % self.getGuardPath()).followAllRedirects() # We should have the final resource, which is an anonymous resource - self.assertEquals(req.written.getvalue(), "Anonymous %s/" % self.getGuardPath()) + self.assertEqual(req.written.getvalue(), "Anonymous %s/" % self.getGuardPath()) req = chan.makeFakeRequest('%s' % self.getGuardPath()).followAllRedirects() # We should have the final resource, which is an anonymous resource - self.assertEquals(req.written.getvalue(), "Anonymous %s" % self.getGuardPath()) + self.assertEqual(req.written.getvalue(), "Anonymous %s" % self.getGuardPath()) def testPlainTextCookie(self): """Cookies from non-SSL sites have no secure attribute.""" p = self.createPortal() chan = self.createGuard(p) req = chan.makeFakeRequest('%s/xxx/yyy/' % self.getGuardPath()) - self.assertEquals( len(req._cookieCache.values()), 1, "Bad number of cookies in response.") - cookie, a, kw = req._cookieCache.values()[0] + self.assertEqual( len(list(req._cookieCache.values())), 1, "Bad number of cookies in response.") + cookie, a, kw = list(req._cookieCache.values())[0] secure = kw.get('secure', None) - self.failIf(secure) + self.assertFalse(secure) def testPlainTextCookie_evenWithSecureCookies(self): """Cookies from non-SSL sites have no secure attribute, even if secureCookie is true.""" @@ -616,10 +616,10 @@ def testPlainTextCookie_evenWithSecureCookies(self): gu = getGuard(chan) gu.secureCookies = False req = chan.makeFakeRequest('%s/xxx/yyy/' % self.getGuardPath()) - self.assertEquals( len(req._cookieCache.values()), 1, "Bad number of cookies in response.") - cookie, a, kw = req._cookieCache.values()[0] + self.assertEqual( len(list(req._cookieCache.values())), 1, "Bad number of cookies in response.") + cookie, a, kw = list(req._cookieCache.values())[0] secure = kw.get('secure', None) - self.failIf(secure) + self.assertFalse(secure) def testSecureCookie_secureCookies(self): """Cookies from SSL sites have secure=True.""" @@ -627,10 +627,10 @@ def testSecureCookie_secureCookies(self): chan = self.createGuard(p) req = chan.makeFakeRequest('%s/xxx/yyy/' % self.getGuardPath(), requestClass=FakeHTTPRequest_forceSSL) - self.assertEquals( len(req._cookieCache.values()), 1, "Bad number of cookies in response.") - cookie, a, kw = req._cookieCache.values()[0] + self.assertEqual( len(list(req._cookieCache.values())), 1, "Bad number of cookies in response.") + cookie, a, kw = list(req._cookieCache.values())[0] secure = kw.get('secure', None) - self.failUnless(secure) + self.assertTrue(secure) def testSecureCookie_noSecureCookies(self): """Cookies from SSL sites do not have secure=True if secureCookies is false.""" @@ -640,10 +640,10 @@ def testSecureCookie_noSecureCookies(self): gu.secureCookies = False req = chan.makeFakeRequest('%s/xxx/yyy/' % self.getGuardPath(), requestClass=FakeHTTPRequest_forceSSL) - self.assertEquals( len(req._cookieCache.values()), 1, "Bad number of cookies in response.") - cookie, a, kw = req._cookieCache.values()[0] + self.assertEqual( len(list(req._cookieCache.values())), 1, "Bad number of cookies in response.") + cookie, a, kw = list(req._cookieCache.values())[0] secure = kw.get('secure', None) - self.failIf(secure) + self.assertFalse(secure) def testPersistentCookie_persistentCookies(self): """Cookies from sites are saved to disk because SessionWrapper.persistentCookies=True.""" @@ -653,8 +653,8 @@ def testPersistentCookie_persistentCookies(self): gu.persistentCookies = True req = chan.makeFakeRequest('%s/xxx/yyy/' % self.getGuardPath(), requestClass=FakeHTTPRequest) - self.assertEquals( len(req._cookieCache.values()), 1, "Bad number of cookies in response.") - cookie, a, kw = req._cookieCache.values()[0] + self.assertEqual( len(list(req._cookieCache.values())), 1, "Bad number of cookies in response.") + cookie, a, kw = list(req._cookieCache.values())[0] expires = kw.get('expires', None) self.failIfIdentical(expires, None) @@ -664,8 +664,8 @@ def testPersistentCookie_noPersistentCookies(self): chan = self.createGuard(p) req = chan.makeFakeRequest('%s/xxx/yyy/' % self.getGuardPath(), requestClass=FakeHTTPRequest) - self.assertEquals( len(req._cookieCache.values()), 1, "Bad number of cookies in response.") - cookie, a, kw = req._cookieCache.values()[0] + self.assertEqual( len(list(req._cookieCache.values())), 1, "Bad number of cookies in response.") + cookie, a, kw = list(req._cookieCache.values())[0] expires = kw.get('expires', None) self.failUnlessIdentical(expires, None) @@ -676,13 +676,13 @@ def testCookiePath(self): p = self.createPortal() chan = self.createGuard(p) req = chan.makeFakeRequest('%s/xxx/yyy/' % self.getGuardPath()) - self.assertEquals( len(req._cookieCache.values()), 1, "Bad number of cookies in response.") - cookie, a, kw = req._cookieCache.values()[0] + self.assertEqual( len(list(req._cookieCache.values())), 1, "Bad number of cookies in response.") + cookie, a, kw = list(req._cookieCache.values())[0] path = kw.get('path', None) wanted = self.getGuardPath() if wanted == '': wanted = '/' - self.failUnlessEqual(path, wanted) + self.assertEqual(path, wanted) def test_defaultCookieDomain(self): @@ -692,7 +692,7 @@ def test_defaultCookieDomain(self): portal = self.createPortal() channel = self.createGuard(portal) request = channel.makeFakeRequest('%s/abc' % (self.getGuardPath(),)) - cookie, args, kwargs = request._cookieCache.values()[0] + cookie, args, kwargs = list(request._cookieCache.values())[0] self.assertEqual(kwargs['domain'], None) @@ -714,7 +714,7 @@ def cookieDomainForRequest(self, request): channel = self.createGuard(portal) request = channel.makeFakeRequest('%s/abc' % (self.getGuardPath(),)) - cookie, args, kwargs = request._cookieCache.values()[0] + cookie, args, kwargs = list(request._cookieCache.values())[0] self.assertEqual(kwargs['domain'], 'example.com') self.assertEqual(requests, [request]) @@ -725,8 +725,8 @@ def testLoginExtraPath(self): chan = self.createGuard(p) req = chan.makeFakeRequest('%s/__login__/sub/path?username=test&password=test' % self.getGuardPath()).followAllRedirects() - self.assertEquals(req.written.getvalue(), "Yes") - self.assertEquals(req.path, '%s/sub/path' % self.getGuardPath()) + self.assertEqual(req.written.getvalue(), "Yes") + self.assertEqual(req.path, '%s/sub/path' % self.getGuardPath()) def testLoginExtraPath_withSlash(self): p = self.createPortal() @@ -734,8 +734,8 @@ def testLoginExtraPath_withSlash(self): chan = self.createGuard(p) req = chan.makeFakeRequest('%s/__login__/sub/path/?username=test&password=test' % self.getGuardPath()).followAllRedirects() - self.assertEquals(req.written.getvalue(), "Yes") - self.assertEquals(req.path, '%s/sub/path/' % self.getGuardPath()) + self.assertEqual(req.written.getvalue(), "Yes") + self.assertEqual(req.path, '%s/sub/path/' % self.getGuardPath()) def testLogoutExtraPath(self): p = self.createPortal() @@ -743,12 +743,12 @@ def testLogoutExtraPath(self): chan = self.createGuard(p) req = chan.makeFakeRequest('%s/__login__?username=test&password=test' % self.getGuardPath()).followAllRedirects() - self.assertEquals(req.written.getvalue(), "Yes") + self.assertEqual(req.written.getvalue(), "Yes") # Log out req2 = chan.makeFakeRequest("%s/__logout__/sub/path" % self.getGuardPath()).followRedirect() - self.assertEquals(req2.written.getvalue(), "No") - self.assertEquals(req2.path, '%s/sub/path' % self.getGuardPath()) + self.assertEqual(req2.written.getvalue(), "No") + self.assertEqual(req2.path, '%s/sub/path' % self.getGuardPath()) def testLogoutExtraPath_withSlash(self): p = self.createPortal() @@ -756,12 +756,12 @@ def testLogoutExtraPath_withSlash(self): chan = self.createGuard(p) req = chan.makeFakeRequest('%s/__login__?username=test&password=test' % self.getGuardPath()).followAllRedirects() - self.assertEquals(req.written.getvalue(), "Yes") + self.assertEqual(req.written.getvalue(), "Yes") # Log out req2 = chan.makeFakeRequest("%s/__logout__/sub/path/" % self.getGuardPath()).followRedirect() - self.assertEquals(req2.written.getvalue(), "No") - self.assertEquals(req2.path, '%s/sub/path/' % self.getGuardPath()) + self.assertEqual(req2.written.getvalue(), "No") + self.assertEqual(req2.path, '%s/sub/path/' % self.getGuardPath()) def testGetLoggedInRoot_getLogin(self): p = self.createPortal(realmFactory=GetLoggedInRealm) @@ -769,7 +769,7 @@ def testGetLoggedInRoot_getLogin(self): chan = self.createGuard(p) req = chan.makeFakeRequest('%s/__login__?username=test&password=test' % self.getGuardPath()).followAllRedirects() - self.assertEquals(req.written.getvalue(), "GetLoggedInAvatar") + self.assertEqual(req.written.getvalue(), "GetLoggedInAvatar") def testGetLoggedInRoot_httpAuthLogin(self): @@ -778,8 +778,8 @@ def testGetLoggedInRoot_httpAuthLogin(self): chan = self.createGuard(p) for x in range(4): req = chan.makeFakeRequest('%s/' % self.getGuardPath(), "test", "test") - self.assertEquals(req.written.getvalue(), "GetLoggedInAvatar") - self.assertEquals(len(self.sessions),1) + self.assertEqual(req.written.getvalue(), "GetLoggedInAvatar") + self.assertEqual(len(self.sessions),1) def testErrorPage_httpAuth(self): """Failed HTTP Auth results in a 403 error.""" @@ -790,13 +790,13 @@ def testErrorPage_httpAuth(self): req = chan.makeFakeRequest('%s' % self.getGuardPath(), "test", "invalid-password") - self.assertEquals(req.headers.get('location', None), None) - self.assertEquals(req.code, 403) - self.assertEquals(req.written.getvalue(), + self.assertEqual(req.headers.get('location', None), None) + self.assertEqual(req.code, 403) + self.assertEqual(req.written.getvalue(), 'Forbidden' +'

Forbidden

Request was forbidden.' +'') - self.assertEquals(req.path, self.getGuardPath()) + self.assertEqual(req.path, self.getGuardPath()) def testErrorPage_httpAuth_deep(self): """Failed HTTP Auth results in a 403 error.""" @@ -807,13 +807,13 @@ def testErrorPage_httpAuth_deep(self): req = chan.makeFakeRequest('%s/quux/thud' % self.getGuardPath(), "test", "invalid-password") - self.assertEquals(req.headers.get('location', None), None) - self.assertEquals(req.code, 403) - self.assertEquals(req.written.getvalue(), + self.assertEqual(req.headers.get('location', None), None) + self.assertEqual(req.code, 403) + self.assertEqual(req.written.getvalue(), 'Forbidden' +'

Forbidden

Request was forbidden.' +'') - self.assertEquals(req.path, '%s/quux/thud' % self.getGuardPath()) + self.assertEqual(req.path, '%s/quux/thud' % self.getGuardPath()) def testErrorPage_getLogin(self): """Failed normal login results in anonymous view of the same page.""" @@ -825,11 +825,11 @@ def testErrorPage_getLogin(self): req = chan.makeFakeRequest( '%s/__login__?username=test&password=invalid-password' % self.getGuardPath()).followAllRedirects() - self.assertEquals(req.written.getvalue(), 'No') + self.assertEqual(req.written.getvalue(), 'No') wanted = self.getGuardPath() if wanted == '': wanted = '/' - self.assertEquals(req.path, wanted) + self.assertEqual(req.path, wanted) def testErrorPage_getLogin_deep(self): """Failed normal login results in anonymous view of the same page.""" @@ -841,8 +841,8 @@ def testErrorPage_getLogin_deep(self): req = chan.makeFakeRequest( '%s/__login__/quux/thud?username=test&password=invalid-password' % self.getGuardPath()).followAllRedirects() - self.assertEquals(req.written.getvalue(), 'No') - self.assertEquals(req.path, '%s/quux/thud' % self.getGuardPath()) + self.assertEqual(req.written.getvalue(), 'No') + self.assertEqual(req.path, '%s/quux/thud' % self.getGuardPath()) class ParentPage(rend.Page): diff --git a/nevow/test/test_howtolistings.py b/nevow/test/test_howtolistings.py index 965f01e3..b3c55636 100644 --- a/nevow/test/test_howtolistings.py +++ b/nevow/test/test_howtolistings.py @@ -13,6 +13,7 @@ from nevow.athena import jsDeps, expose from nevow import plugins +import imp class ExampleTestBase(object): @@ -53,7 +54,7 @@ def setUp(self): jsDeps._loadPlugins = True # Even more horrible! nevow.plugins.__path__ needs to be recomputed # each time for the new value of sys.path. - reload(plugins) + imp.reload(plugins) def tearDown(self): @@ -64,7 +65,7 @@ def tearDown(self): sys.modules.clear() sys.modules.update(self.originalModules) sys.path[:] = self.originalPath - reload(plugins) + imp.reload(plugins) @@ -83,7 +84,7 @@ def run(self, result): base.examplePath = self.examplePath try: base.setUp() - except SkipTest, e: + except SkipTest as e: result.startTest(self) result.addSkip(self, str(e)) result.stopTest(self) @@ -152,8 +153,8 @@ def test_echoTellsClient(self): eb = EchoElement() echoed = [] eb.callRemote = lambda method, message: echoed.append((method, message)) - eb.say(u'HELLO... Hello... hello...') - self.assertEquals(echoed, [('addText', u'HELLO... Hello... hello...')]) + eb.say('HELLO... Hello... hello...') + self.assertEqual(echoed, [('addText', 'HELLO... Hello... hello...')]) @@ -205,8 +206,8 @@ def test_username(self): from chatthing.chatterbox import ChatterElement, ChatRoom cb = ChatterElement(ChatRoom()) setUsername = expose.get(cb, 'setUsername') - setUsername(u'jethro') - self.assertIdentical(u'jethro', cb.username) + setUsername('jethro') + self.assertIdentical('jethro', cb.username) def test_loginThenWall(self): @@ -220,14 +221,14 @@ def test_loginThenWall(self): cr = ChatRoom() user1 = cr.makeChatter() user1.wall = lambda msg: jethroHeard.append(msg) - user1.setUsername(u'jethro') + user1.setUsername('jethro') user2 = cr.makeChatter() user2.wall = lambda msg: cletusHeard.append(msg) - user2.setUsername(u'cletus') - self.assertEquals(jethroHeard, - [u' * user jethro has joined the room', - u' * user cletus has joined the room']) - self.assertEquals(cletusHeard, [u' * user cletus has joined the room']) + user2.setUsername('cletus') + self.assertEqual(jethroHeard, + [' * user jethro has joined the room', + ' * user cletus has joined the room']) + self.assertEqual(cletusHeard, [' * user cletus has joined the room']) def test_sayThenHear(self): @@ -239,18 +240,18 @@ def test_sayThenHear(self): cr = ChatRoom() user1 = cr.makeChatter() user1.wall = lambda msg: msg - user1.setUsername(u'jethro') + user1.setUsername('jethro') user2 = cr.makeChatter() user2.wall = lambda msg: msg - user2.setUsername(u'cletus') + user2.setUsername('cletus') jethroHeard = [] cletusHeard = [] user1.hear = lambda who, what: jethroHeard.append((who,what)) user2.hear = lambda who, what: cletusHeard.append((who,what)) say = expose.get(user1, 'say') - say(u'Hey, Cletus!') - self.assertEquals(jethroHeard, cletusHeard) - self.assertEquals(cletusHeard, [(u'jethro', u'Hey, Cletus!')]) + say('Hey, Cletus!') + self.assertEqual(jethroHeard, cletusHeard) + self.assertEqual(cletusHeard, [('jethro', 'Hey, Cletus!')]) def test_wallTellsClient(self): @@ -262,8 +263,8 @@ def test_wallTellsClient(self): cb = ChatRoom().makeChatter() heard = [] cb.callRemote = lambda method, msg: heard.append((method, msg)) - cb.wall(u'Message for everyone...') - self.assertEquals(heard, [('displayMessage', u'Message for everyone...')]) + cb.wall('Message for everyone...') + self.assertEqual(heard, [('displayMessage', 'Message for everyone...')]) def test_hearTellsClient(self): """ @@ -274,6 +275,6 @@ def test_hearTellsClient(self): cb = ChatRoom().makeChatter() heard = [] cb.callRemote = lambda method, who, what: heard.append((method, who, what)) - cb.hear(u'Hello', u'Chat') - self.assertEquals(heard, [('displayUserMessage', u'Hello', u'Chat')]) + cb.hear('Hello', 'Chat') + self.assertEqual(heard, [('displayUserMessage', 'Hello', 'Chat')]) diff --git a/nevow/test/test_i18n.py b/nevow/test/test_i18n.py index 768583b1..7339e6e7 100644 --- a/nevow/test/test_i18n.py +++ b/nevow/test/test_i18n.py @@ -1,7 +1,7 @@ from zope.interface import implements from twisted.trial import unittest -from cStringIO import StringIO +from io import StringIO from nevow import inevow, flat, context, tags, loaders, rend from nevow import i18n from nevow.testutil import FakeRequest @@ -11,7 +11,7 @@ def mockTranslator(s, languages=None, domain=None): if domain is not None: args['domain'] = domain return 'MOCK(%s)[%s]' % (', '.join(['%s=%r' % (k,v) - for k,v in args.items()]), + for k,v in list(args.items())]), s) class Misc(unittest.TestCase): @@ -21,13 +21,13 @@ def test_simple(self): def test_simple_flat(self): s = i18n._('foo') r = flat.ten.flatten(s, None) - self.assertEquals(r, 'foo') + self.assertEqual(r, 'foo') def test_translator(self): _ = i18n.Translator(translator=mockTranslator) s = _('foo') r = flat.ten.flatten(s, None) - self.assertEquals(r, 'MOCK()[foo]') + self.assertEqual(r, 'MOCK()[foo]') class Config(unittest.TestCase): def test_remember(self): @@ -41,13 +41,13 @@ def test_classInit(self): domain='bar') s = _('foo') r = flat.ten.flatten(s, None) - self.assertEquals(r, "MOCK(domain='bar')[foo]") + self.assertEqual(r, "MOCK(domain='bar')[foo]") def test_runTime(self): _ = i18n.Translator(translator=mockTranslator) s = _('foo', domain='baz') r = flat.ten.flatten(s, None) - self.assertEquals(r, "MOCK(domain='baz')[foo]") + self.assertEqual(r, "MOCK(domain='baz')[foo]") def test_context(self): _ = i18n.Translator(translator=mockTranslator) @@ -56,7 +56,7 @@ def test_context(self): ctx.remember(cfg) s = _('foo') r = flat.ten.flatten(s, ctx) - self.assertEquals(r, "MOCK(domain='thud')[foo]") + self.assertEqual(r, "MOCK(domain='thud')[foo]") def test_runTime_beats_all(self): _ = i18n.Translator(translator=mockTranslator, @@ -66,7 +66,7 @@ def test_runTime_beats_all(self): ctx.remember(cfg) s = _('foo', domain='baz') r = flat.ten.flatten(s, None) - self.assertEquals(r, "MOCK(domain='baz')[foo]") + self.assertEqual(r, "MOCK(domain='baz')[foo]") def test_classInit_beats_context(self): @@ -77,14 +77,14 @@ def test_classInit_beats_context(self): ctx.remember(cfg) s = _('foo') r = flat.ten.flatten(s, None) - self.assertEquals(r, "MOCK(domain='baz')[foo]") + self.assertEqual(r, "MOCK(domain='baz')[foo]") class Format(unittest.TestCase): def test_simple(self): _ = i18n.Translator(translator=mockTranslator) s = _('foo %s') % 'bar' r = flat.ten.flatten(s, None) - self.assertEquals(r, "MOCK()[foo bar]") + self.assertEqual(r, "MOCK()[foo bar]") def test_multiple(self): _ = i18n.Translator(translator=mockTranslator) @@ -92,7 +92,7 @@ def test_multiple(self): s = s % 'bar %s' s = s % 'baz' r = flat.ten.flatten(s, None) - self.assertEquals(r, "MOCK()[foo bar baz]") + self.assertEqual(r, "MOCK()[foo bar baz]") @@ -101,7 +101,7 @@ def test_noLanguages(self): request = FakeRequest(headers={}) ctx = context.RequestContext(tag=request) r = inevow.ILanguages(ctx) - self.assertEquals(r, []) + self.assertEqual(r, []) def test_oneLanguage(self): request = FakeRequest(headers={ @@ -109,7 +109,7 @@ def test_oneLanguage(self): }) ctx = context.RequestContext(tag=request) r = inevow.ILanguages(ctx) - self.assertEquals(r, ['fo']) + self.assertEqual(r, ['fo']) def test_multipleLanguages(self): request = FakeRequest(headers={ @@ -117,7 +117,7 @@ def test_multipleLanguages(self): }) ctx = context.RequestContext(tag=request) r = inevow.ILanguages(ctx) - self.assertEquals(r, ['fo', 'ba', 'th']) + self.assertEqual(r, ['fo', 'ba', 'th']) def test_quality_simple(self): request = FakeRequest(headers={ @@ -125,7 +125,7 @@ def test_quality_simple(self): }) ctx = context.RequestContext(tag=request) r = inevow.ILanguages(ctx) - self.assertEquals(r, ['fo']) + self.assertEqual(r, ['fo']) def test_quality_sort(self): request = FakeRequest(headers={ @@ -133,7 +133,7 @@ def test_quality_sort(self): }) ctx = context.RequestContext(tag=request) r = inevow.ILanguages(ctx) - self.assertEquals(r, ['xy', 'fo', 'ba']) + self.assertEqual(r, ['xy', 'fo', 'ba']) def test_quality_invalid_notQ(self): request = FakeRequest(headers={ @@ -141,7 +141,7 @@ def test_quality_invalid_notQ(self): }) ctx = context.RequestContext(tag=request) r = inevow.ILanguages(ctx) - self.assertEquals(r, ['ba', 'fo']) + self.assertEqual(r, ['ba', 'fo']) def test_quality_invalid_notFloat(self): request = FakeRequest(headers={ @@ -149,7 +149,7 @@ def test_quality_invalid_notFloat(self): }) ctx = context.RequestContext(tag=request) r = inevow.ILanguages(ctx) - self.assertEquals(r, ['ba', 'fo']) + self.assertEqual(r, ['ba', 'fo']) class Render(unittest.TestCase): def makePage(self, content): @@ -172,15 +172,15 @@ def finisher(result): def test_empty(self): return self.makePage(['']).addCallback( - lambda r: self.assertEquals(r, 'MOCK()[]')) + lambda r: self.assertEqual(r, 'MOCK()[]')) def test_simple(self): return self.makePage(['foo']).addCallback( - lambda r: self.assertEquals(r, 'MOCK()[foo]')) + lambda r: self.assertEqual(r, 'MOCK()[foo]')) def test_stan(self): return self.makePage([tags.p['You should really avoid tags in i18n input.']]).addCallback( - lambda r: self.assertEquals(r, 'MOCK()[

You should really avoid tags in i18n input.

]')) + lambda r: self.assertEqual(r, 'MOCK()[

You should really avoid tags in i18n input.

]')) class InterpolateTests: def test_mod_string(self): @@ -188,7 +188,7 @@ def test_mod_string(self): 'foo bar') def test_mod_unicode(self): - self.check('foo %s', u'bar', + self.check('foo %s', 'bar', 'foo bar') def test_mod_int(self): @@ -255,7 +255,7 @@ def setUp(self): self._ = i18n.Translator(translator=mockTranslator) def mangle(self, s): - raise NotImplementedError, 'override mangle somewhere' + raise NotImplementedError('override mangle somewhere') def check(self, fmt, args, *wants): got = self.mangle(self._(fmt) % args) @@ -296,24 +296,24 @@ def test_simple(self): def test_simple_flat_one(self): s = i18n.ungettext('%d foo', '%d foos', 1) r = flat.ten.flatten(s, None) - self.assertEquals(r, '%d foo') + self.assertEqual(r, '%d foo') def test_simple_flat_many(self): s = i18n.ungettext('%d foo', '%d foos', 42) r = flat.ten.flatten(s, None) - self.assertEquals(r, '%d foos') + self.assertEqual(r, '%d foos') def test_simple_flat_many(self): s = i18n.ungettext('%d foo', '%d foos', 42) r = flat.ten.flatten(s, None) - self.assertEquals(r, '%d foos') + self.assertEqual(r, '%d foos') def test_format_one(self): s = i18n.ungettext('%d foo', '%d foos', 1) % 1 r = flat.ten.flatten(s, None) - self.assertEquals(r, "1 foo") + self.assertEqual(r, "1 foo") def test_format_many(self): s = i18n.ungettext('%d foo', '%d foos', 42) % 42 r = flat.ten.flatten(s, None) - self.assertEquals(r, "42 foos") + self.assertEqual(r, "42 foos") diff --git a/nevow/test/test_json.py b/nevow/test/test_json.py index e41b87cf..b9154c4f 100644 --- a/nevow/test/test_json.py +++ b/nevow/test/test_json.py @@ -21,31 +21,31 @@ [0], [0, 1, 2], [None, 1, 2], - [None, u'one', 2], - [True, False, u'string', 10], + [None, 'one', 2], + [True, False, 'string', 10], [[1, 2], [3, 4]], [[1.5, 2.5], [3.5, 4.5]], - [0, [1, 2], [u'hello'], [u'world'], [True, None, False]], + [0, [1, 2], ['hello'], ['world'], [True, None, False]], {}, - {u'foo': u'bar'}, - {u'foo': None}, - {u'bar': True}, - {u'baz': [1, 2, 3]}, - {u'quux': {u'bar': u'foo'}}, + {'foo': 'bar'}, + {'foo': None}, + {'bar': True}, + {'baz': [1, 2, 3]}, + {'quux': {'bar': 'foo'}}, ] TEST_STRINGLIKE_OBJECTS = [ - u'', - u'string', - u'string with "embedded" quotes', - u"string with 'embedded' single-quotes", - u'string with \\"escaped embedded\\" quotes', - u"string with \\'escaped embedded\\' single-quotes", - u"string with backslashes\\\\", - u"string with trailing accented vowels: \xe1\xe9\xed\xf3\xfa\xfd\xff", - u"string with trailing control characters: \f\b\n\t\r", - u'string with high codepoint characters: \u0111\u2222\u3333\u4444\uffff', - u'string with very high codepoint characters: \U00011111\U00022222\U00033333\U00044444\U000fffff', + '', + 'string', + 'string with "embedded" quotes', + "string with 'embedded' single-quotes", + 'string with \\"escaped embedded\\" quotes', + "string with \\'escaped embedded\\' single-quotes", + "string with backslashes\\\\", + "string with trailing accented vowels: \xe1\xe9\xed\xf3\xfa\xfd\xff", + "string with trailing control characters: \f\b\n\t\r", + 'string with high codepoint characters: \u0111\u2222\u3333\u4444\uffff', + 'string with very high codepoint characters: \U00011111\U00022222\U00033333\U00044444\U000fffff', ] @@ -93,7 +93,7 @@ def testRoundtrip(self): for struct in TEST_OBJECTS: bytes = json.serialize(struct) unstruct = json.parse(bytes) - self.assertEquals( + self.assertEqual( unstruct, struct, "Failed to roundtrip %r: %r (through %r)" % ( struct, unstruct, bytes)) @@ -103,7 +103,7 @@ def test_undefined(self): """ C{undefined} is parsed as Python C{None}. """ - self.assertEquals(None, json.parse(b'undefined')) + self.assertEqual(None, json.parse(b'undefined')) def testStringlikeRountrip(self): @@ -112,8 +112,8 @@ def testStringlikeRountrip(self): unstruct = json.parse(bytes) failMsg = "Failed to roundtrip %r: %r (through %r)" % ( struct, unstruct, bytes) - self.assertEquals(unstruct, struct, failMsg) - self.assert_(isinstance(unstruct, unicode), failMsg) + self.assertEqual(unstruct, struct, failMsg) + self.assertTrue(isinstance(unstruct, str), failMsg) def test_lineTerminators(self): @@ -127,30 +127,30 @@ def test_lineTerminators(self): handle them properly. """ # These are the four line terminators currently in Unicode. - self.assertEqual('"\\r"', json.serialize(u"\r")) - self.assertEqual('"\\n"', json.serialize(u"\n")) - self.assertEqual('"\\u2028"', json.serialize(u"\u2028")) - self.assertEqual('"\\u2029"', json.serialize(u"\u2029")) + self.assertEqual('"\\r"', json.serialize("\r")) + self.assertEqual('"\\n"', json.serialize("\n")) + self.assertEqual('"\\u2028"', json.serialize("\u2028")) + self.assertEqual('"\\u2029"', json.serialize("\u2029")) def testScientificNotation(self): - self.assertEquals(json.parse('1e10'), 10**10) - self.assertEquals(json.parse('1e0'), 1) + self.assertEqual(json.parse('1e10'), 10**10) + self.assertEqual(json.parse('1e0'), 1) def testHexEscapedCodepoints(self): - self.assertEquals( + self.assertEqual( json.parse('"\\xe1\\xe9\\xed\\xf3\\xfa\\xfd"'), - u"\xe1\xe9\xed\xf3\xfa\xfd") + "\xe1\xe9\xed\xf3\xfa\xfd") def testEscapedControls(self): - self.assertEquals( + self.assertEqual( json.parse('"\\f\\b\\n\\t\\r"'), - u"\f\b\n\t\r") + "\f\b\n\t\r") def _rendererTest(self, cls): - self.assertEquals( + self.assertEqual( json.serialize( cls( docFactory=loaders.stan(tags.p['Hello, world.']))), @@ -276,18 +276,18 @@ def __init__(self, jsClass, initialArgs): self.getInitialArguments = lambda: initialArgs self.assertEqual( - json.serialize(Transportable(u"Foo", ())), + json.serialize(Transportable("Foo", ())), "(new Foo())") self.assertEqual( - json.serialize(Transportable(u"Bar", (None,))), + json.serialize(Transportable("Bar", (None,))), "(new Bar(null))") self.assertEqual( - json.serialize(Transportable(u"Baz.Quux", (1, 2))), + json.serialize(Transportable("Baz.Quux", (1, 2))), "(new Baz.Quux(1,2))") # The style of the quotes in this assertion is basically irrelevant. # If, for some reason, the serializer changes to use ' instead of ", # there's no reason not to change this test to reflect that. -exarkun self.assertEqual( - json.serialize(Transportable(u"Quux", (u"Foo",))), + json.serialize(Transportable("Quux", ("Foo",))), '(new Quux("Foo"))') diff --git a/nevow/test/test_later.py b/nevow/test/test_later.py index 59ca9b71..44cc6c93 100644 --- a/nevow/test/test_later.py +++ b/nevow/test/test_later.py @@ -43,29 +43,29 @@ def setUp(self): def test_deferredSupport(self): req = self.renderIt() - self.assertEquals(req.v, 'Hello ') + self.assertEqual(req.v, 'Hello ') self.d.callback("world") - self.assertEquals(req.v, 'Hello world') + self.assertEqual(req.v, 'Hello world') self.d2.callback(".") - self.assertEquals(req.v, 'Hello world.') + self.assertEqual(req.v, 'Hello world.') def test_deferredSupport2(self): req = self.renderIt() - self.assertEquals(req.v, 'Hello ') + self.assertEqual(req.v, 'Hello ') self.d2.callback(".") - self.assertEquals(req.v, 'Hello ') + self.assertEqual(req.v, 'Hello ') self.d.callback("world") - self.assertEquals(req.v, 'Hello world.') + self.assertEqual(req.v, 'Hello world.') def test_deferredSupport3(self): self.r.buffered = True req = self.renderIt() - self.assertEquals(req.v, '') + self.assertEqual(req.v, '') self.d.callback("world") - self.assertEquals(req.v, '') + self.assertEqual(req.v, '') self.d2.callback(".") - self.assertEquals(req.v, 'Hello world.') + self.assertEqual(req.v, 'Hello world.') def test_renderNestedDeferredCallables(self): """ @@ -84,7 +84,7 @@ def render_outer(ctx, data): out = [] d = twist.deferflatten(render_outer, ctx, out.append) def flattened(ign): - self.assertEquals(out, ['']) + self.assertEqual(out, ['']) d.addCallback(flattened) return d @@ -130,11 +130,11 @@ def setUp(self): def test_deferredSupport(self): req = self.renderIt() - self.assertEquals(req.v, '') + self.assertEqual(req.v, '') self.d.callback("world") - self.assertEquals(req.v, 'Hello world and goodbye world') + self.assertEqual(req.v, 'Hello world and goodbye world') self.d2.callback(".") - self.assertEquals(req.v, 'Hello world and goodbye world.') + self.assertEqual(req.v, 'Hello world and goodbye world.') class SuperLaterDataTest(RenderHelper): @@ -148,7 +148,7 @@ def test_reusedDeferredSupport(self): doc.fillSlots('foo', defer.succeed(tags.span['Foo!!!'])) self.r = rend.Page(docFactory=loaders.stan(doc)) req = self.renderIt() - self.assertEquals(req.v, 'Foo!!!Foo!!!') + self.assertEqual(req.v, 'Foo!!!Foo!!!') def test_rendererCalledOnce(self): @@ -167,4 +167,4 @@ def render_renderer(self, ctx, data): return defer.succeed(recorder) self.r = RendererPage() req = self.renderIt() - self.assertEquals(req.v, '1') + self.assertEqual(req.v, '1') diff --git a/nevow/test/test_loaders.py b/nevow/test/test_loaders.py index d604f845..c4a17b52 100644 --- a/nevow/test/test_loaders.py +++ b/nevow/test/test_loaders.py @@ -15,17 +15,17 @@ class TestDocFactories(unittest.TestCase): def _preprocessorTest(self, docFactory): def preprocessor(uncompiled): - self.assertEquals(len(uncompiled), 1) + self.assertEqual(len(uncompiled), 1) uncompiled = uncompiled[0] - self.assertEquals(uncompiled.tagName, 'div') - self.assertEquals(len(uncompiled.children), 2) - self.assertEquals(uncompiled.children[0].tagName, 'span') - self.assertEquals(uncompiled.children[0].children, ['Hello']) - self.assertEquals(uncompiled.children[1].tagName, 'span') - self.assertEquals(uncompiled.children[1].children, ['world']) + self.assertEqual(uncompiled.tagName, 'div') + self.assertEqual(len(uncompiled.children), 2) + self.assertEqual(uncompiled.children[0].tagName, 'span') + self.assertEqual(uncompiled.children[0].children, ['Hello']) + self.assertEqual(uncompiled.children[1].tagName, 'span') + self.assertEqual(uncompiled.children[1].children, ['world']) return t.div['goodbye.'] doc = docFactory.load(preprocessors=[preprocessor]) - self.assertEquals(doc, ['
goodbye.
']) + self.assertEqual(doc, ['
goodbye.
']) def test_stanPreprocessors(self): @@ -41,7 +41,7 @@ def test_stanPreprocessors(self): def test_stan(self): doc = t.ul(id='nav')[t.li['one'], t.li['two'], t.li['three']] df = loaders.stan(doc) - self.assertEquals(df.load()[0], '') + self.assertEqual(df.load()[0], '') def test_stanPrecompiled(self): @@ -55,7 +55,7 @@ def test_stanPrecompiled(self): df = loaders.stan(doc) loaded = df.load() self.assertEqual(loaded[0], '') @@ -63,7 +63,7 @@ def test_stanPrecompiled(self): def test_htmlstr(self): doc = '' df = loaders.htmlstr(doc) - self.assertEquals(df.load()[0], doc) + self.assertEqual(df.load()[0], doc) test_htmlstr.suppress = [ util.suppress(message= r"\[v0.8\] htmlstr is deprecated because it's buggy. " @@ -77,7 +77,7 @@ def test_htmlfile(self): f.write(doc) f.close() df = loaders.htmlfile(temp) - self.assertEquals(df.load()[0], doc) + self.assertEqual(df.load()[0], doc) test_htmlfile.suppress = [ util.suppress(message= r"\[v0.8\] htmlfile is deprecated because it's buggy. " @@ -91,7 +91,7 @@ def test_htmlfile_slots(self): f.write(doc) f.close() df = loaders.htmlfile(temp) - self.assertEquals(df.load()[0].children, ['Hi there']) + self.assertEqual(df.load()[0].children, ['Hi there']) test_htmlfile_slots.suppress = [ util.suppress(message= r"\[v0.8\] htmlfile is deprecated because it's buggy. " @@ -101,7 +101,7 @@ def test_htmlfile_slots(self): def test_xmlstr(self): doc = '' df = loaders.xmlstr(doc) - self.assertEquals(df.load()[0], doc) + self.assertEqual(df.load()[0], doc) def test_xmlstrPreprocessors(self): @@ -121,7 +121,7 @@ def test_xmlfile(self): f.write(doc) f.close() df = loaders.xmlfile(temp) - self.assertEquals(df.load()[0], doc) + self.assertEqual(df.load()[0], doc) def test_xmlfilePreprocessors(self): @@ -142,19 +142,19 @@ def test_patterned(self): """ doc = t.div[t.p[t.span(pattern='inner')['something']]] df = loaders.stan(doc, pattern='inner') - self.assertEquals(df.load()[0].tagName, 'span') - self.assertEquals(df.load()[0].children[0], 'something') + self.assertEqual(df.load()[0].tagName, 'span') + self.assertEqual(df.load()[0].children[0], 'something') def test_ignoreDocType(self): doc = '''\n

Hello.

''' df = loaders.xmlstr(doc, ignoreDocType=True) - self.assertEquals(flat.flatten(df), '

Hello.

') + self.assertEqual(flat.flatten(df), '

Hello.

') def test_ignoreComment(self): doc = '

Hello.

' df = loaders.xmlstr(doc, ignoreComment=True) - self.assertEquals(flat.flatten(df), '

Hello.

') + self.assertEqual(flat.flatten(df), '

Hello.

') class TestDocFactoriesCache(unittest.TestCase): @@ -178,10 +178,10 @@ class TestDocFactoriesCache(unittest.TestCase): def test_stan(self): loader = loaders.stan(self.stan) - self.assertEquals( id(loader.load()), id(loader.load()) ) + self.assertEqual( id(loader.load()), id(loader.load()) ) loader = loaders.stan(self.stan, pattern='1') - self.assertEquals( id(loader.load()), id(loader.load()) ) + self.assertEqual( id(loader.load()), id(loader.load()) ) l1 = loaders.stan(self.stan, pattern='1') l2 = loaders.stan(self.stan, pattern='1') @@ -194,10 +194,10 @@ def test_stan(self): def test_htmlstr(self): loader = loaders.htmlstr(self.doc) - self.assertEquals( id(loader.load()), id(loader.load()) ) + self.assertEqual( id(loader.load()), id(loader.load()) ) loader = loaders.htmlstr(self.doc, pattern='1') - self.assertEquals( id(loader.load()), id(loader.load()) ) + self.assertEqual( id(loader.load()), id(loader.load()) ) l1 = loaders.htmlstr(self.doc, pattern='1') l2 = loaders.htmlstr(self.doc, pattern='1') @@ -219,7 +219,7 @@ def test_htmlfile(self): f.close() loader = loaders.htmlfile(temp) - self.assertEquals( id(loader.load()), id(loader.load()) ) + self.assertEqual( id(loader.load()), id(loader.load()) ) l1 = loaders.htmlfile(temp, pattern='1') l2 = loaders.htmlfile(temp, pattern='1') @@ -242,7 +242,7 @@ def test_htmlfileReload(self): loader = loaders.htmlfile(temp) r = loader.load() - self.assertEquals(id(r), id(loader.load())) + self.assertEqual(id(r), id(loader.load())) os.utime(temp, (os.path.getatime(temp), os.path.getmtime(temp)+5)) self.assertNotEqual(id(r), id(loader.load())) test_htmlfileReload.suppress = [ @@ -255,10 +255,10 @@ def test_htmlfileReload(self): def test_xmlstr(self): loader = loaders.xmlstr(self.nsdoc) - self.assertEquals( id(loader.load()), id(loader.load()) ) + self.assertEqual( id(loader.load()), id(loader.load()) ) loader = loaders.xmlstr(self.nsdoc, pattern='1') - self.assertEquals( id(loader.load()), id(loader.load()) ) + self.assertEqual( id(loader.load()), id(loader.load()) ) l1 = loaders.xmlstr(self.nsdoc, pattern='1') l2 = loaders.xmlstr(self.nsdoc, pattern='1') @@ -283,8 +283,8 @@ def test_xmlSlotDefault(self): ''' loader = loaders.xmlstr(slotsdoc) loaded = loader.load() - self.assertEquals(loaded[1].default, None) - self.assertEquals(loaded[3].default, "3") + self.assertEqual(loaded[1].default, None) + self.assertEqual(loaded[3].default, "3") def test_xmlfile(self): @@ -295,10 +295,10 @@ def test_xmlfile(self): f.close() loader = loaders.xmlfile(temp) - self.assertEquals( id(loader.load()), id(loader.load()) ) + self.assertEqual( id(loader.load()), id(loader.load()) ) loader = loaders.xmlfile(temp, pattern='1') - self.assertEquals( id(loader.load()), id(loader.load()) ) + self.assertEqual( id(loader.load()), id(loader.load()) ) l1 = loaders.xmlfile(temp, pattern='1') l2 = loaders.xmlfile(temp, pattern='1') @@ -317,7 +317,7 @@ def test_xmlfileReload(self): loader = loaders.xmlfile(temp) r = loader.load() - self.assertEquals(id(r), id(loader.load())) + self.assertEqual(id(r), id(loader.load())) os.utime(temp, (os.path.getatime(temp), os.path.getmtime(temp)+5)) self.assertNotEqual(id(r), id(loader.load())) @@ -351,7 +351,7 @@ def test_reloadAfterPrecompile(self): self.assertIn('foo', before) self.assertIn('bar', after) - self.failIfEqual(before, after) + self.assertNotEqual(before, after) test_reloadAfterPrecompile.todo = \ 'Fix so that disk templates are reloaded even after a precompile. ' \ 'Probably just a matter of making the DocSerializer really lazy' @@ -398,8 +398,8 @@ def test_htmlfile(self): def _withAndWithout(self, loader): ctx = context.WovenContext() - self.assertEquals(loader.load(), ['

hello

']) - self.assertEquals(loader.load(ctx), ['

hello

']) + self.assertEqual(loader.load(), ['

hello

']) + self.assertEqual(loader.load(ctx), ['

hello

']) class TestParsing(unittest.TestCase): @@ -411,4 +411,4 @@ def test_missingSpace(self): ## hard to fix. If you need this, switch to xmlstr. result = loaders.xmlstr(doc).load() # There should be a space between the two slots - self.assertEquals(result[2], ' ') + self.assertEqual(result[2], ' ') diff --git a/nevow/test/test_newflat.py b/nevow/test/test_newflat.py index c3e42d1d..01fa96cb 100644 --- a/nevow/test/test_newflat.py +++ b/nevow/test/test_newflat.py @@ -33,7 +33,7 @@ # lambda to avoid adding anything else to this namespace. The result will # be a string which agrees with the one the traceback module will put into a # traceback for frames associated with functions defined in this file. -HERE = (lambda: None).func_code.co_filename +HERE = (lambda: None).__code__.co_filename class TrivialRenderable(object): @@ -193,8 +193,8 @@ def test_unicode(self): An instance of L{unicode} is flattened to the UTF-8 representation of itself. """ - self.assertStringEqual(self.flatten(u'bytes<>&"\0'), 'bytes<>&"\0') - unich = u"\N{LATIN CAPITAL LETTER E WITH GRAVE}" + self.assertStringEqual(self.flatten('bytes<>&"\0'), 'bytes<>&"\0') + unich = "\N{LATIN CAPITAL LETTER E WITH GRAVE}" self.assertStringEqual(self.flatten(unich), unich.encode('utf-8')) @@ -203,7 +203,7 @@ def test_xml(self): An L{xml} instance is flattened to the UTF-8 representation of itself. """ self.assertStringEqual(self.flatten(xml("foo")), "foo") - unich = u"\N{LATIN CAPITAL LETTER E WITH GRAVE}" + unich = "\N{LATIN CAPITAL LETTER E WITH GRAVE}" self.assertStringEqual(self.flatten(xml(unich)), unich.encode('utf-8')) @@ -303,8 +303,8 @@ def test_unicodeTagName(self): A L{Tag} with a C{tagName} attribute which is C{unicode} instead of C{str} is flattened to an XML representation. """ - self.assertStringEqual(self.flatten(Tag(u'div')), "
") - self.assertStringEqual(self.flatten(Tag(u'div')['']), "
") + self.assertStringEqual(self.flatten(Tag('div')), "
") + self.assertStringEqual(self.flatten(Tag('div')['']), "
") def test_unicodeAttributeName(self): @@ -313,7 +313,7 @@ def test_unicodeAttributeName(self): is flattened to an XML representation. """ self.assertStringEqual( - self.flatten(Tag(u'div', {u'foo': 'bar'})), '
') + self.flatten(Tag('div', {'foo': 'bar'})), '
') def test_stringTagAttributes(self): @@ -820,7 +820,7 @@ def test_deeplyNestedList(self): significantly greater than the Python maximum recursion limit. """ obj = ["foo"] - for i in xrange(1000): + for i in range(1000): obj = [obj] self._nestingTest(obj, "foo") @@ -831,7 +831,7 @@ def test_deeplyNestedSlot(self): significantly greater than the Python maximum recursion limit. """ tag = div()[slot("foo-0")] - for i in xrange(1000): + for i in range(1000): tag.fillSlots("foo-" + str(i), slot("foo-" + str(i + 1))) tag.fillSlots("foo-1000", "bar") self._nestingTest(tag, "
bar
") @@ -844,7 +844,7 @@ def test_deeplyNestedTag(self): """ n = 1000 tag = div["foo"] - for i in xrange(n - 1): + for i in range(n - 1): tag = div[tag] self._nestingTest(tag, "
" * n + "foo" + "
" * n) @@ -855,7 +855,7 @@ def test_deeplyNestedRenderables(self): nesting significantly greater than the Python maximum recursion limit. """ obj = TrivialRenderable("foo") - for i in xrange(1000): + for i in range(1000): obj = TrivialRenderable(obj) self._nestingTest(obj, "foo") @@ -971,13 +971,13 @@ def test_unicode(self): """ self.assertEqual( str(FlattenerError( - RuntimeError("reason"), [u'abc\N{SNOWMAN}xyz'], [])), + RuntimeError("reason"), ['abc\N{SNOWMAN}xyz'], [])), "Exception while flattening:\n" " u'abc\\u2603xyz'\n" # Codepoint for SNOWMAN "RuntimeError: reason\n") self.assertEqual( str(FlattenerError( - RuntimeError("reason"), [u'01234567\N{SNOWMAN}9' * 10], + RuntimeError("reason"), ['01234567\N{SNOWMAN}9' * 10], [])), "Exception while flattening:\n" " u'01234567\\u2603901234567\\u26039<...>01234567\\u2603901234567" @@ -1048,7 +1048,7 @@ def g(): try: f() - except RuntimeError, exc: + except RuntimeError as exc: # Get the traceback, minus the info for *this* frame tbinfo = traceback.extract_tb(sys.exc_info()[2])[1:] else: @@ -1062,8 +1062,8 @@ def g(): " File \"%s\", line %d, in g\n" " raise RuntimeError(\"reason\")\n" "RuntimeError: reason\n" % ( - HERE, f.func_code.co_firstlineno + 1, - HERE, g.func_code.co_firstlineno + 1)) + HERE, f.__code__.co_firstlineno + 1, + HERE, g.__code__.co_firstlineno + 1)) @@ -1234,8 +1234,8 @@ def test_manySynchronousDeferreds(self): frames allowed by the Python recursion limit succeeds if all the L{Deferred}s have results already. """ - results = [str(i) for i in xrange(1000)] - deferreds = map(succeed, results) + results = [str(i) for i in range(1000)] + deferreds = list(map(succeed, results)) limit = sys.getrecursionlimit() sys.setrecursionlimit(100) try: diff --git a/nevow/test/test_nit.py b/nevow/test/test_nit.py index 799c99de..837d12ab 100644 --- a/nevow/test/test_nit.py +++ b/nevow/test/test_nit.py @@ -15,7 +15,7 @@ from nevow.livetrial.runner import TestFrameworkRoot from nevow.scripts import nit -MESSAGE = u'I am an error' +MESSAGE = 'I am an error' diff --git a/nevow/test/test_passobj.py b/nevow/test/test_passobj.py index a7a8e956..2625416d 100644 --- a/nevow/test/test_passobj.py +++ b/nevow/test/test_passobj.py @@ -65,7 +65,7 @@ def __init__(self): ] def someMethod(self, one, two): - print "ONE TWO", `one`, `two` + print("ONE TWO", repr(one), repr(two)) def frobber(self, frobber, frobee): return frobber.frobazz(frobee) @@ -193,7 +193,7 @@ def __str__(self): return "Breakpoint in file %s at line %s" % (self.fn, self.ln) breakpoints = BreakpointRemover() - for fn in debugInstance.breaks.keys(): + for fn in list(debugInstance.breaks.keys()): for lineno in debugInstance.breaks[fn]: breakpoints.append(BP(fn, lineno)) return breakpoints diff --git a/nevow/test/test_query.py b/nevow/test/test_query.py index 0b39c367..8c4737c6 100644 --- a/nevow/test/test_query.py +++ b/nevow/test/test_query.py @@ -172,7 +172,7 @@ def test_contextTagQuery(self): T.pattern = "outer" C = context.WovenContext(tag=T) new = IQ(C).onePattern('outer') - self.assertEquals(new.tagName, 'html') + self.assertEqual(new.tagName, 'html') def test_listNotEnough(self): P = flat.precompile(notEnough) @@ -189,11 +189,11 @@ def test_loaderNotEnough(self): class TestAll(testutil.TestCase): def verify(self, them): them = list(them) - self.assertEquals(len(them), 2) - self.assertEquals(them[0].tagName, 'div') - self.assertEquals(them[1].tagName, 'span') - self.assertEquals(them[0].attributes['bar'], 'one') - self.assertEquals(them[1].attributes['bar'], 'two') + self.assertEqual(len(them), 2) + self.assertEqual(them[0].tagName, 'div') + self.assertEqual(them[1].tagName, 'span') + self.assertEqual(them[0].attributes['bar'], 'one') + self.assertEqual(them[1].attributes['bar'], 'two') def testTagPatterns(self): self.verify( @@ -218,14 +218,14 @@ def verify(self, it): two = it(color="blue") three = it(color="green") four = it(color="orange") - self.assertEquals(one.attributes['color'], 'red') - self.assertEquals(one.attributes['bar'], 'one') - self.assertEquals(two.attributes['color'], 'blue') - self.assertEquals(two.attributes['bar'], 'two') - self.assertEquals(three.attributes['color'], 'green') - self.assertEquals(three.attributes['bar'], 'one') - self.assertEquals(four.attributes['color'], 'orange') - self.assertEquals(four.attributes['bar'], 'two') + self.assertEqual(one.attributes['color'], 'red') + self.assertEqual(one.attributes['bar'], 'one') + self.assertEqual(two.attributes['color'], 'blue') + self.assertEqual(two.attributes['bar'], 'two') + self.assertEqual(three.attributes['color'], 'green') + self.assertEqual(three.attributes['bar'], 'one') + self.assertEqual(four.attributes['color'], 'orange') + self.assertEqual(four.attributes['bar'], 'two') def testTagGenerators(self): self.verify( @@ -258,14 +258,14 @@ def testTagMissing(self): def testClonableDefault(self): orig = tags.p["Hello"] gen = IQ(flat.precompile(notEnough)).patternGenerator('foo', orig) - new = gen.next() - self.assertEquals(new.tagName, 'p') + new = next(gen) + self.assertEqual(new.tagName, 'p') self.assertNotIdentical(orig, new) def testNonClonableDefault(self): gen = IQ(flat.precompile(notEnough)).patternGenerator('foo', 'bar') - new = gen.next() - self.assertEquals(new, 'bar') + new = next(gen) + self.assertEqual(new, 'bar') def testXmlMissing(self): self.assertRaises(stan.NodeNotFound, IQ(stan.xml('hello')).patternGenerator, 'foo') @@ -277,5 +277,5 @@ def test_listOfTagPatternGenerator(self): the tag has a matching pattern special. """ patterns = IQ([tags.div(pattern="foo", bar="baz")]).patternGenerator("foo") - for i in xrange(3): + for i in range(3): self.assertEqual(patterns.next().attributes['bar'], "baz") diff --git a/nevow/test/test_rend.py b/nevow/test/test_rend.py index cd302119..feb25131 100644 --- a/nevow/test/test_rend.py +++ b/nevow/test/test_rend.py @@ -52,7 +52,7 @@ def test_simple(self): xhtml = '' r = rend.Page(docFactory=loaders.htmlstr(xhtml)) return deferredRender(r).addCallback( - lambda result: self.assertEquals(result, xhtml)) + lambda result: self.assertEqual(result, xhtml)) test_simple.suppress = [ SUPPRESS(message= r"\[v0.8\] htmlstr is deprecated because it's buggy. " @@ -66,7 +66,7 @@ class R(rend.Page): docFactory = loaders.htmlstr(xhtml) r = R() return deferredRender(r).addCallback( - lambda result: self.assertEquals(result, xhtml)) + lambda result: self.assertEqual(result, xhtml)) test_extend.suppress = [ SUPPRESS(message= r"\[v0.8\] htmlstr is deprecated because it's buggy. " @@ -85,7 +85,7 @@ def data_numbers(self, context, data): return ['one', 'two', 'three'] r = R() return deferredRender(r).addCallback( - lambda result: self.assertEquals( + lambda result: self.assertEqual( result, '')) test_data.suppress = [ @@ -120,7 +120,7 @@ def render_replace(self, context, data): r = R() return deferredRender(r).addCallback( - lambda result: self.assertEquals(result, 'abc')) + lambda result: self.assertEqual(result, 'abc')) test_render.suppress = [ SUPPRESS(message= r"\[v0.8\] htmlstr is deprecated because it's buggy. " @@ -151,7 +151,7 @@ def render_row(self, context, data): r = R() d = deferredRender(r) d.addCallback( - lambda result: self.assertEquals( + lambda result: self.assertEqual( result, '' '' @@ -176,7 +176,7 @@ def data_numbers(context, data): r = R() return deferredRender(r).addCallback( - lambda result: self.assertEquals(result, '
  • one
  • two
  • three
')) + lambda result: self.assertEqual(result, '
  • one
  • two
  • three
')) def test_stanRender(self): @@ -189,7 +189,7 @@ def render_replace(context, data): r = R() return deferredRender(r).addCallback( - lambda result: self.assertEquals(result, 'abc')) + lambda result: self.assertEqual(result, 'abc')) def test_stanDataAndRender(self): @@ -216,7 +216,7 @@ def render_row(context, data): r = R() return deferredRender(r).addCallback( - lambda result: self.assertEquals(result, '
EnglishFrench
EnglishFrench
oneun/une
twodeux
threetrois
')) + lambda result: self.assertEqual(result, '
EnglishFrench
oneun/une
twodeux
threetrois
')) def test_composite(self): @@ -232,7 +232,7 @@ def render_inner(self, context, data): ) r = R() return deferredRender(r).addCallback( - lambda result: self.assertEquals(result, '
')) + lambda result: self.assertEqual(result, '
')) def _testDocFactoryInStanTree(self, docFactory, expected): class Page(rend.Page): @@ -353,7 +353,7 @@ class Page(rend.Page): p = Page() return deferredRender(p).addCallback( lambda result: - self.assertEquals(result, 'test')) + self.assertEqual(result, 'test')) def test_component(self): """ @@ -381,7 +381,7 @@ class Page(rend.Page): page = Page() return deferredRender(page).addCallback( lambda result: - self.assertEquals(result, '

foo bar

')) + self.assertEqual(result, '

foo bar

')) def test_fragmentContext(self): # A fragment is remembered as the IRendererFactory. It must create a new context @@ -415,8 +415,8 @@ def render_after(self,context,data): result = Page().renderSynchronously() # print result - self.failIf("'foo' was not found" in result) - self.failIf("'after' was not found" in result) + self.assertFalse("'foo' was not found" in result) + self.assertFalse("'after' was not found" in result) def test_rendererNotFound(self): @@ -434,7 +434,7 @@ class Page(rend.Page): docFactory = loaders.stan(html(render=directive("notfound"))) page = Page() result = page.renderSynchronously() - self.assertEquals( + self.assertEqual( result, "The renderer named 'notfound' was not found in %s." % util.escapeToXML(repr(page))) @@ -453,7 +453,7 @@ class Page(rend.Page): docFactory = loaders.stan(html(render=directive("notfound dummy"))) page = Page() result = page.renderSynchronously() - self.assertEquals( + self.assertEqual( result, "The renderer named 'notfound' was not found in %s." % util.escapeToXML(repr(page))) @@ -502,7 +502,7 @@ class TestRenderFactory(unittest.TestCase): def test_dataRenderer(self): ctx = context.WovenContext() ctx.remember(rend.RenderFactory(), inevow.IRendererFactory) - self.assertEquals(flat.flatten(p(data='foo', render=directive('data')), ctx), '

foo

') + self.assertEqual(flat.flatten(p(data='foo', render=directive('data')), ctx), '

foo

') class TestConfigurableMixin(unittest.TestCase): def test_formRender(self): @@ -554,7 +554,7 @@ def test1(self, foo): ctx = context.WovenContext() result = FormPage().postForm(ctx, 'test1', {'foo': ['42']}) - return result.addCallback(lambda result: self.assertEquals(result, 42)) + return result.addCallback(lambda result: self.assertEqual(result, 42)) def test_formPostDeferred(self): class FormPage(rend.Page): @@ -564,7 +564,7 @@ def test1(self, foo): ctx = context.WovenContext() result = FormPage().postForm(ctx, 'test1', {'foo': ['42']}) - return result.addCallback(lambda result: self.assertEquals(result, 42)) + return result.addCallback(lambda result: self.assertEqual(result, 42)) def test_formPostFailure(self): class FormPage(rend.Page): @@ -649,7 +649,7 @@ class TestRenderString(unittest.TestCase): def test_simple(self): doc = div[p['foo'],p['bar']] return rend.Page(docFactory=loaders.stan(doc)).renderString().addCallback( - lambda result: self.assertEquals(result, '

foo

bar

')) + lambda result: self.assertEqual(result, '

foo

bar

')) def test_parentCtx(self): class IFoo(Interface): @@ -662,7 +662,7 @@ def render_foo(self, ctx, data): docFactory = loaders.stan(p[render_foo]) return Page().renderString(ctx).addCallback( lambda result: - self.assertEquals( + self.assertEqual( result, '

Hello!

' )) @@ -683,7 +683,7 @@ def render_bar(self, ctx, data): return ctx.tag.clear()[data+'bar'] return Page().renderString().addCallback( - lambda result: self.assertEquals(result, '

foobar

')) + lambda result: self.assertEqual(result, '

foobar

')) class TestRenderSynchronously(unittest.TestCase): @@ -692,7 +692,7 @@ def test_simple(self): doc = div[p['foo'],p['bar']] result = rend.Page(docFactory=loaders.stan(doc)).renderSynchronously() - self.assertEquals(result, '

foo

bar

') + self.assertEqual(result, '

foo

bar

') def test_parentCtx(self): class IFoo(Interface): @@ -703,7 +703,7 @@ class Page(rend.Page): def render_foo(self, ctx, data): return IFoo(ctx) docFactory = loaders.stan(p[render_foo]) - self.assertEquals(Page().renderSynchronously(ctx), '

Hello!

') + self.assertEqual(Page().renderSynchronously(ctx), '

Hello!

') def getResource(root, path): @@ -722,7 +722,7 @@ class Parent(rend.Page): p = Parent() p.putChild('child', Child()) return getResource(p, '/child').addCallback( - lambda r: self.failUnless(inevow.IResource.providedBy(r.tag))) + lambda r: self.assertTrue(inevow.IResource.providedBy(r.tag))) def test_resourceAttr(self): class Child(rend.Page): @@ -731,7 +731,7 @@ class Parent(rend.Page): child_child = Child() p = Parent() return getResource(p, '/child').addCallback( - lambda r: self.failUnless(inevow.IResource.providedBy(r.tag))) + lambda r: self.assertTrue(inevow.IResource.providedBy(r.tag))) def test_methodAttr(self): class Child(rend.Page): @@ -748,11 +748,11 @@ def _dotestparent(self, p): return defer.DeferredList([ getResource(p, '/now').addCallback( - lambda r: self.failUnless(inevow.IResource.providedBy(r.tag))), + lambda r: self.assertTrue(inevow.IResource.providedBy(r.tag))), getResource(p, '/defer').addCallback( - lambda r: self.failUnless(inevow.IResource.providedBy(r.tag)))], + lambda r: self.assertTrue(inevow.IResource.providedBy(r.tag)))], fireOnOneErrback=True) def test_childFactory(self): @@ -773,7 +773,7 @@ class Parent(rend.Page): child_child = twcgi.CGIScript('abc.cgi') p = Parent() return getResource(p, '/child').addCallback( - lambda r: self.failUnless(inevow.IResource.providedBy(r.tag))) + lambda r: self.assertTrue(inevow.IResource.providedBy(r.tag))) def test_noneChild(self): class Parent(rend.Page): @@ -785,10 +785,10 @@ def geyDynamicChild(self, name, request): return defer.DeferredList([ getResource(p, '/child').addCallback( - lambda r: self.failUnless(isinstance(r.tag, rend.FourOhFour))), + lambda r: self.assertTrue(isinstance(r.tag, rend.FourOhFour))), getResource(p, '/other').addCallback( - lambda r: self.failUnless(isinstance(r.tag, rend.FourOhFour)) + lambda r: self.assertTrue(isinstance(r.tag, rend.FourOhFour)) )], fireOnOneErrback=True) @@ -810,7 +810,7 @@ def child_child(self, ctx): page = Page() return getResource(page, '/child').addCallback( - lambda r: self.failUnless(inevow.IResource.providedBy(r.tag))) + lambda r: self.assertTrue(inevow.IResource.providedBy(r.tag))) def test_redirectToURL(self): redirectTarget = "http://example.com/bar" @@ -823,7 +823,7 @@ def doAssert(r): ## Render the redirect. r.tag.renderHTTP(r) req = inevow.IRequest(r) - self.assertEquals(req.redirected_to, redirectTarget) + self.assertEqual(req.redirected_to, redirectTarget) return getResource(page, '/url').addCallback(doAssert) @@ -836,7 +836,7 @@ def locateChild(self, ctx, segments): def dotest(r): r.tag.renderHTTP(r) - self.assertEquals(uchr, + self.assertEqual(uchr, inevow.IRequest(r).redirected_to) return getResource(page, '/url').addCallback(dotest) @@ -855,7 +855,7 @@ def child_foo(self, ctx): return getResource(page, '/foo').addCallback( lambda c: deferredRender(c.tag).addCallback( - lambda result: self.assertEquals(result, theString))) + lambda result: self.assertEqual(result, theString))) def test_freeformChildMixin_nonTrue(self): """Configurables that have c.__nonzero__()==False are accepted.""" @@ -872,15 +872,15 @@ def configurable_(self, ctx): D = getResource(page, '/foo') def x1(r): - self.failUnless(isinstance(r.tag, rend.FourOhFour)) + self.assertTrue(isinstance(r.tag, rend.FourOhFour)) D.addCallback(x1) def x2(ign): D2 = getResource(page, '/freeform_post!!foo') def x3(r): - self.failIf(isinstance(r.tag, rend.FourOhFour)) + self.assertFalse(isinstance(r.tag, rend.FourOhFour)) return deferredRender(r.tag).addCallback( - lambda result: self.assertEquals(result, 'You posted a form to foo')) + lambda result: self.assertEqual(result, 'You posted a form to foo')) D2.addCallback(x3) return D2 D.addCallback(x2) @@ -890,10 +890,10 @@ def x4(ign): D3 = getResource(page, '/freeform_post!!foo') def x5(r): - self.failIf(isinstance(r.tag, rend.FourOhFour)) + self.assertFalse(isinstance(r.tag, rend.FourOhFour)) return deferredRender(r.tag).addCallback( lambda result: - self.assertEquals(result, 'You posted a form to foo')) + self.assertEqual(result, 'You posted a form to foo')) return D3.addCallback(x5) D.addCallback(x4) return D @@ -906,19 +906,19 @@ def test_data(self): ctx.remember('foo', inevow.IData) tag = p(render=rend.data) - self.assertEquals(flat.flatten(tag, ctx), '

foo

') + self.assertEqual(flat.flatten(tag, ctx), '

foo

') ctx.remember('\xc2\xa3'.decode('utf-8'), inevow.IData) tag = p(render=rend.data) - self.assertEquals(flat.flatten(tag, ctx), '

\xc2\xa3

') + self.assertEqual(flat.flatten(tag, ctx), '

\xc2\xa3

') ctx.remember([1,2,3,4,5], inevow.IData) tag = p(render=rend.data) - self.assertEquals(flat.flatten(tag, ctx), '

12345

') + self.assertEqual(flat.flatten(tag, ctx), '

12345

') ctx.remember({'foo':'bar'}, inevow.IData) tag = p(data=directive('foo'), render=rend.data) - self.assertEquals(flat.flatten(tag, ctx), '

bar

') + self.assertEqual(flat.flatten(tag, ctx), '

bar

') class TestMacro(unittest.TestCase): @@ -960,7 +960,7 @@ def macro_content(self, ctx): p1_str = p1.renderSynchronously(ctx1) p2_str = p2.renderSynchronously(ctx2) - self.assertNotEquals(p1_str, p2_str) + self.assertNotEqual(p1_str, p2_str) def test_macroInsideSpecialScope(self): """http://divmod.org/trac/ticket/490 @@ -1000,5 +1000,5 @@ class Page2(Base): p1_str = p1.renderSynchronously(ctx1) p2_str = p2.renderSynchronously(ctx2) - self.assertEquals(p1_str, p2_str) + self.assertEqual(p1_str, p2_str) diff --git a/nevow/test/test_stan.py b/nevow/test/test_stan.py index b49840d2..934c0d3c 100644 --- a/nevow/test/test_stan.py +++ b/nevow/test/test_stan.py @@ -9,19 +9,19 @@ class TestProto(TestCase): def test_proto(self): tagName = "hello" proto = stan.Proto(tagName) - self.assertEquals(tagName, str(proto)) + self.assertEqual(tagName, str(proto)) def test_callCreatesTag(self): proto = stan.Proto("hello") tag = proto(world="1") - self.assertEquals(proto, tag.tagName) - self.assertEquals(tag.attributes['world'], '1') + self.assertEqual(proto, tag.tagName) + self.assertEqual(tag.attributes['world'], '1') def test_getItemCreatesTag(self): proto = stan.Proto("hello") tag = proto[proto] - self.assertEquals(proto, tag.tagName) - self.assertEquals(tag.children, [proto]) + self.assertEqual(proto, tag.tagName) + self.assertEqual(tag.children, [proto]) proto = stan.Proto("hello") @@ -35,11 +35,11 @@ def test_clone(self): tag.lineNumber = 6 tag.columnNumber = 12 clone = tag.clone() - self.assertEquals(clone.attributes['hello'], 'world') + self.assertEqual(clone.attributes['hello'], 'world') self.assertNotIdentical(clone.attributes, tag.attributes) - self.assertEquals(clone.children, ["How are you"]) + self.assertEqual(clone.children, ["How are you"]) self.assertNotIdentical(clone.children, tag.children) - self.assertEquals(tag.slotData, clone.slotData) + self.assertEqual(tag.slotData, clone.slotData) self.assertNotIdentical(tag.slotData, clone.slotData) self.assertEqual(clone.filename, "foo/bar") self.assertEqual(clone.lineNumber, 6) @@ -51,15 +51,15 @@ def test_clone(self): def test_clear(self): tag = proto["these are", "children", "cool"] tag.clear() - self.assertEquals(tag.children, []) + self.assertEqual(tag.children, []) def test_specials(self): tag = proto(data=1, render=str, remember="stuff", key="myKey", **{'pattern': "item"}) - self.assertEquals(tag.data, 1) - self.assertEquals(getattr(tag, 'render'), str) - self.assertEquals(tag.remember, "stuff") - self.assertEquals(tag.key, "myKey") - self.assertEquals(tag.pattern, "item") + self.assertEqual(tag.data, 1) + self.assertEqual(getattr(tag, 'render'), str) + self.assertEqual(tag.remember, "stuff") + self.assertEqual(tag.key, "myKey") + self.assertEqual(tag.pattern, "item") def test_visit(self): @@ -79,7 +79,7 @@ def visitor(t): root[firstChild, secondChild] secondChild[firstGrandchild, secondGrandchild, thirdGrandchild] stan.visit(root, visitor) - self.assertEquals( + self.assertEqual( visited, [root, firstChild, secondChild, firstGrandchild, secondGrandchild, thirdGrandchild]) @@ -97,10 +97,10 @@ def test_prefix(self): proto = stan.Proto('div') tag = proto() tag(_class='a') - self.assertEquals(tag.attributes, {'class': 'a'}) + self.assertEqual(tag.attributes, {'class': 'a'}) def test_suffix(self): proto = stan.Proto('div') tag = proto() tag(class_='a') - self.assertEquals(tag.attributes, {'class': 'a'}) + self.assertEqual(tag.attributes, {'class': 'a'}) diff --git a/nevow/test/test_static.py b/nevow/test/test_static.py index ef671ac7..ab4fe7bb 100644 --- a/nevow/test/test_static.py +++ b/nevow/test/test_static.py @@ -30,108 +30,108 @@ def setUp(self): def testBodyLength(self): self.request.received_headers['range'] = 'bytes=0-1999' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(len(r.v), 2000)) + lambda r: self.assertEqual(len(r.v), 2000)) def testBodyContent(self): self.request.received_headers['range'] = 'bytes=0-1999' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.v, 200 * '0123456789')) + lambda r: self.assertEqual(r.v, 200 * '0123456789')) def testContentLength(self): """Content-Length of a request is correct.""" self.request.received_headers['range'] = 'bytes=0-1999' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.headers['content-length'], '2000')) + lambda r: self.assertEqual(r.headers['content-length'], '2000')) def testContentRange(self): """Content-Range of a request is correct.""" self.request.received_headers['range'] = 'bytes=0-1999' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.headers.get('content-range'), + lambda r: self.assertEqual(r.headers.get('content-range'), 'bytes 0-1999/8000')) def testBodyLength_offset(self): self.request.received_headers['range'] = 'bytes=3-10' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(len(r.v), 8)) + lambda r: self.assertEqual(len(r.v), 8)) def testBodyContent_offset(self): self.request.received_headers['range'] = 'bytes=3-10' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.v, '34567890')) + lambda r: self.assertEqual(r.v, '34567890')) def testContentLength_offset(self): """Content-Length of a request is correct.""" self.request.received_headers['range'] = 'bytes=3-10' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.headers['content-length'], '8')) + lambda r: self.assertEqual(r.headers['content-length'], '8')) def testContentRange_offset(self): """Content-Range of a request is correct.""" self.request.received_headers['range'] = 'bytes=3-10' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.headers.get('content-range'), + lambda r: self.assertEqual(r.headers.get('content-range'), 'bytes 3-10/8000')) def testBodyLength_end(self): self.request.received_headers['range'] = 'bytes=7991-7999' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(len(r.v), 9)) + lambda r: self.assertEqual(len(r.v), 9)) def testBodyContent_end(self): self.request.received_headers['range'] = 'bytes=7991-7999' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.v, '123456789')) + lambda r: self.assertEqual(r.v, '123456789')) def testContentLength_end(self): self.request.received_headers['range'] = 'bytes=7991-7999' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.headers['content-length'], '9')) + lambda r: self.assertEqual(r.headers['content-length'], '9')) def testContentRange_end(self): self.request.received_headers['range'] = 'bytes=7991-7999' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.headers.get('content-range'), + lambda r: self.assertEqual(r.headers.get('content-range'), 'bytes 7991-7999/8000')) def testBodyLength_openEnd(self): self.request.received_headers['range'] = 'bytes=7991-' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(len(r.v), 9)) + lambda r: self.assertEqual(len(r.v), 9)) def testBodyContent_openEnd(self): self.request.received_headers['range'] = 'bytes=7991-' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.v, '123456789')) + lambda r: self.assertEqual(r.v, '123456789')) def testContentLength_openEnd(self): self.request.received_headers['range'] = 'bytes=7991-' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.headers['content-length'], '9')) + lambda r: self.assertEqual(r.headers['content-length'], '9')) def testContentRange_openEnd(self): self.request.received_headers['range'] = 'bytes=7991-' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.headers.get('content-range'), + lambda r: self.assertEqual(r.headers.get('content-range'), 'bytes 7991-7999/8000')) def testBodyLength_fullRange(self): self.request.received_headers['range'] = 'bytes=0-' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(len(r.v), 8000)) + lambda r: self.assertEqual(len(r.v), 8000)) def testBodyContent_fullRange(self): self.request.received_headers['range'] = 'bytes=0-' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.v, 800 * '0123456789')) + lambda r: self.assertEqual(r.v, 800 * '0123456789')) def testContentLength_fullRange(self): self.request.received_headers['range'] = 'bytes=0-' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.headers['content-length'], '8000')) + lambda r: self.assertEqual(r.headers['content-length'], '8000')) def testContentRange_fullRange(self): self.request.received_headers['range'] = 'bytes=0-' return deferredRender(self.file, self.request).addCallback( - lambda r: self.assertEquals(r.headers.get('content-range'), + lambda r: self.assertEqual(r.headers.get('content-range'), 'bytes 0-7999/8000')) diff --git a/nevow/test/test_tags.py b/nevow/test/test_tags.py index e589425b..4c2502d4 100644 --- a/nevow/test/test_tags.py +++ b/nevow/test/test_tags.py @@ -9,9 +9,9 @@ def test_directiveComparison(self): foo = tags.directive('foo') foo2 = tags.directive('foo') bar = tags.directive('bar') - self.assertEquals(foo, foo) - self.assertEquals(foo, foo2) - self.failIfEqual(foo, bar) + self.assertEqual(foo, foo) + self.assertEqual(foo, foo2) + self.assertNotEqual(foo, bar) def test_directiveHashing(self): @@ -21,8 +21,8 @@ def test_directiveHashing(self): foo = tags.directive('foo') foo2 = tags.directive('foo') bar = tags.directive('bar') - self.assertEquals(hash(foo), hash(foo2)) + self.assertEqual(hash(foo), hash(foo2)) # XXX What if 'foo' and 'bar' accidentally hash equal in some version # of Python? - self.failIfEqual(hash(foo), hash(bar)) + self.assertNotEqual(hash(foo), hash(bar)) diff --git a/nevow/test/test_testutil.py b/nevow/test/test_testutil.py index d9820e5b..54d77205 100644 --- a/nevow/test/test_testutil.py +++ b/nevow/test/test_testutil.py @@ -109,7 +109,7 @@ class _URLPage(Page): root.child('foo')) def _checkForUrl(result): - return self.assertEquals('http://localhost/foo', result) + return self.assertEqual('http://localhost/foo', result) return renderPage(_URLPage()).addCallback(_checkForUrl) @@ -206,7 +206,7 @@ def stubScript(testModule): result = TestResult() self.case.run(result) self.assertEqual(len(result.errors), 1) - self.assertEquals( + self.assertEqual( result.errors[0][1], 'Exception: JavaScript interpreter exited due to signal 11\n') diff --git a/nevow/test/test_url.py b/nevow/test/test_url.py index c373112f..1785eced 100755 --- a/nevow/test/test_url.py +++ b/nevow/test/test_url.py @@ -5,7 +5,7 @@ Tests for L{nevow.url}. """ -import urlparse, urllib +import urllib.parse, urllib.request, urllib.parse, urllib.error from nevow import context, url, inevow, util, loaders from nevow import tags @@ -88,7 +88,7 @@ def cloneURL(self, scheme, netloc, pathsegs, querysegs, fragment): class TestURL(TestCase): def test_fromString(self): urlpath = url.URL.fromString(theurl) - self.assertEquals(theurl, str(urlpath)) + self.assertEqual(theurl, str(urlpath)) def test_roundtrip(self): tests = ( @@ -108,34 +108,34 @@ def test_roundtrip(self): ) for test in tests: result = str(url.URL.fromString(test)) - self.assertEquals(test, result) + self.assertEqual(test, result) def test_fromRequest(self): request = FakeRequest(uri='/a/nice/path/?zot=23&zut', currentSegments=["a", "nice", "path", ""], headers={'host': 'www.foo.com:80'}) urlpath = url.URL.fromRequest(request) - self.assertEquals(theurl, str(urlpath)) + self.assertEqual(theurl, str(urlpath)) def test_fromContext(self): r = FakeRequest(uri='/a/b/c') urlpath = url.URL.fromContext(context.RequestContext(tag=r)) - self.assertEquals('http://localhost/', str(urlpath)) + self.assertEqual('http://localhost/', str(urlpath)) r.prepath = ['a'] urlpath = url.URL.fromContext(context.RequestContext(tag=r)) - self.assertEquals('http://localhost/a', str(urlpath)) + self.assertEqual('http://localhost/a', str(urlpath)) r = FakeRequest(uri='/a/b/c?foo=bar') r.prepath = ['a','b'] urlpath = url.URL.fromContext(context.RequestContext(tag=r)) - self.assertEquals('http://localhost/a/b?foo=bar', str(urlpath)) + self.assertEqual('http://localhost/a/b?foo=bar', str(urlpath)) def test_equality(self): urlpath = url.URL.fromString(theurl) - self.failUnlessEqual(urlpath, url.URL.fromString(theurl)) - self.failIfEqual(urlpath, url.URL.fromString('ftp://www.anotherinvaliddomain.com/foo/bar/baz/?zot=21&zut')) + self.assertEqual(urlpath, url.URL.fromString(theurl)) + self.assertNotEqual(urlpath, url.URL.fromString('ftp://www.anotherinvaliddomain.com/foo/bar/baz/?zot=21&zut')) def test_fragmentEquality(self): @@ -148,7 +148,7 @@ def test_fragmentEquality(self): def test_parent(self): urlpath = url.URL.fromString(theurl) - self.assertEquals("http://www.foo.com:80/a/nice/?zot=23&zut", + self.assertEqual("http://www.foo.com:80/a/nice/?zot=23&zut", str(urlpath.parent())) @@ -167,98 +167,98 @@ def test_path(self): def test_parentdir(self): urlpath = url.URL.fromString(theurl) - self.assertEquals("http://www.foo.com:80/a/nice/?zot=23&zut", + self.assertEqual("http://www.foo.com:80/a/nice/?zot=23&zut", str(urlpath.parentdir())) urlpath = url.URL.fromString('http://www.foo.com/a') - self.assertEquals("http://www.foo.com/", + self.assertEqual("http://www.foo.com/", str(urlpath.parentdir())) urlpath = url.URL.fromString('http://www.foo.com/a/') - self.assertEquals("http://www.foo.com/", + self.assertEqual("http://www.foo.com/", str(urlpath.parentdir())) urlpath = url.URL.fromString('http://www.foo.com/a/b') - self.assertEquals("http://www.foo.com/", + self.assertEqual("http://www.foo.com/", str(urlpath.parentdir())) urlpath = url.URL.fromString('http://www.foo.com/a/b/') - self.assertEquals("http://www.foo.com/a/", + self.assertEqual("http://www.foo.com/a/", str(urlpath.parentdir())) urlpath = url.URL.fromString('http://www.foo.com/a/b/c') - self.assertEquals("http://www.foo.com/a/", + self.assertEqual("http://www.foo.com/a/", str(urlpath.parentdir())) urlpath = url.URL.fromString('http://www.foo.com/a/b/c/') - self.assertEquals("http://www.foo.com/a/b/", + self.assertEqual("http://www.foo.com/a/b/", str(urlpath.parentdir())) urlpath = url.URL.fromString('http://www.foo.com/a/b/c/d') - self.assertEquals("http://www.foo.com/a/b/", + self.assertEqual("http://www.foo.com/a/b/", str(urlpath.parentdir())) urlpath = url.URL.fromString('http://www.foo.com/a/b/c/d/') - self.assertEquals("http://www.foo.com/a/b/c/", + self.assertEqual("http://www.foo.com/a/b/c/", str(urlpath.parentdir())) def test_parent_root(self): urlpath = url.URL.fromString('http://www.foo.com/') - self.assertEquals("http://www.foo.com/", + self.assertEqual("http://www.foo.com/", str(urlpath.parentdir())) - self.assertEquals("http://www.foo.com/", + self.assertEqual("http://www.foo.com/", str(urlpath.parentdir().parentdir())) def test_child(self): urlpath = url.URL.fromString(theurl) - self.assertEquals("http://www.foo.com:80/a/nice/path/gong?zot=23&zut", + self.assertEqual("http://www.foo.com:80/a/nice/path/gong?zot=23&zut", str(urlpath.child('gong'))) - self.assertEquals("http://www.foo.com:80/a/nice/path/gong%2F?zot=23&zut", + self.assertEqual("http://www.foo.com:80/a/nice/path/gong%2F?zot=23&zut", str(urlpath.child('gong/'))) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/gong%2Fdouble?zot=23&zut", str(urlpath.child('gong/double'))) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/gong%2Fdouble%2F?zot=23&zut", str(urlpath.child('gong/double/'))) def test_child_init_tuple(self): - self.assertEquals( + self.assertEqual( "http://www.foo.com/a/b/c", str(url.URL(netloc="www.foo.com", pathsegs=['a', 'b']).child("c"))) def test_child_init_root(self): - self.assertEquals( + self.assertEqual( "http://www.foo.com/c", str(url.URL(netloc="www.foo.com").child("c"))) def test_sibling(self): urlpath = url.URL.fromString(theurl) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/sister?zot=23&zut", str(urlpath.sibling('sister'))) # use an url without trailing '/' to check child removal theurl2 = "http://www.foo.com:80/a/nice/path?zot=23&zut" urlpath = url.URL.fromString(theurl2) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/sister?zot=23&zut", str(urlpath.sibling('sister'))) def test_curdir(self): urlpath = url.URL.fromString(theurl) - self.assertEquals(theurl, str(urlpath)) + self.assertEqual(theurl, str(urlpath)) # use an url without trailing '/' to check object removal theurl2 = "http://www.foo.com:80/a/nice/path?zot=23&zut" urlpath = url.URL.fromString(theurl2) - self.assertEquals("http://www.foo.com:80/a/nice/?zot=23&zut", + self.assertEqual("http://www.foo.com:80/a/nice/?zot=23&zut", str(urlpath.curdir())) def test_click(self): urlpath = url.URL.fromString(theurl) # a null uri should be valid (return here) - self.assertEquals("http://www.foo.com:80/a/nice/path/?zot=23&zut", + self.assertEqual("http://www.foo.com:80/a/nice/path/?zot=23&zut", str(urlpath.click(""))) # a simple relative path remove the query - self.assertEquals("http://www.foo.com:80/a/nice/path/click", + self.assertEqual("http://www.foo.com:80/a/nice/path/click", str(urlpath.click("click"))) # an absolute path replace path and query - self.assertEquals("http://www.foo.com:80/click", + self.assertEqual("http://www.foo.com:80/click", str(urlpath.click("/click"))) # replace just the query - self.assertEquals("http://www.foo.com:80/a/nice/path/?burp", + self.assertEqual("http://www.foo.com:80/a/nice/path/?burp", str(urlpath.click("?burp"))) # one full url to another should not generate '//' between netloc and pathsegs self.failIfIn("//foobar", str(urlpath.click('http://www.foo.com:80/foobar'))) @@ -266,13 +266,13 @@ def test_click(self): # from a url with no query clicking a url with a query, # the query should be handled properly u = url.URL.fromString('http://www.foo.com:80/me/noquery') - self.failUnlessEqual('http://www.foo.com:80/me/17?spam=158', + self.assertEqual('http://www.foo.com:80/me/17?spam=158', str(u.click('/me/17?spam=158'))) # Check that everything from the path onward is removed when the click link # has no path. u = url.URL.fromString('http://localhost/foo?abc=def') - self.failUnlessEqual(str(u.click('http://www.python.org')), 'http://www.python.org/') + self.assertEqual(str(u.click('http://www.python.org')), 'http://www.python.org/') def test_cloneUnchanged(self): @@ -383,146 +383,146 @@ def test_clickCollapse(self): ['http://localhost/a/b/c', 'd//e', 'http://localhost/a/b/d//e'], ] for start, click, result in tests: - self.assertEquals( + self.assertEqual( str(url.URL.fromString(start).click(click)), result ) def test_add(self): urlpath = url.URL.fromString(theurl) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=23&zut&burp", str(urlpath.add("burp"))) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=23&zut&burp=xxx", str(urlpath.add("burp", "xxx"))) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=23&zut&burp=xxx&zing", str(urlpath.add("burp", "xxx").add("zing"))) # note the inversion! - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=23&zut&zing&burp=xxx", str(urlpath.add("zing").add("burp", "xxx"))) # note the two values for the same name - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=23&zut&burp=xxx&zot=32", str(urlpath.add("burp", "xxx").add("zot", 32))) def test_add_noquery(self): # fromString is a different code path, test them both - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?foo=bar", str(url.URL.fromString("http://www.foo.com:80/a/nice/path/") .add("foo", "bar"))) - self.assertEquals( + self.assertEqual( "http://www.foo.com/?foo=bar", str(url.URL(netloc="www.foo.com").add("foo", "bar"))) def test_replace(self): urlpath = url.URL.fromString(theurl) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=32&zut", str(urlpath.replace("zot", 32))) # replace name without value with name/value and vice-versa - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot&zut=itworked", str(urlpath.replace("zot").replace("zut", "itworked"))) # Q: what happens when the query has two values and we replace? # A: we replace both values with a single one - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=32&zut", str(urlpath.add("zot", "xxx").replace("zot", 32))) def test_fragment(self): urlpath = url.URL.fromString(theurl) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=23&zut#hiboy", str(urlpath.anchor("hiboy"))) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=23&zut", str(urlpath.anchor())) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=23&zut", str(urlpath.anchor(''))) def test_clear(self): urlpath = url.URL.fromString(theurl) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zut", str(urlpath.clear("zot"))) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zot=23", str(urlpath.clear("zut"))) # something stranger, query with two values, both should get cleared - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/?zut", str(urlpath.add("zot", 1971).clear("zot"))) # two ways to clear the whole query - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/", str(urlpath.clear("zut").clear("zot"))) - self.assertEquals( + self.assertEqual( "http://www.foo.com:80/a/nice/path/", str(urlpath.clear())) def test_secure(self): - self.assertEquals(str(url.URL.fromString('http://localhost/').secure()), 'https://localhost/') - self.assertEquals(str(url.URL.fromString('http://localhost/').secure(True)), 'https://localhost/') - self.assertEquals(str(url.URL.fromString('https://localhost/').secure()), 'https://localhost/') - self.assertEquals(str(url.URL.fromString('https://localhost/').secure(False)), 'http://localhost/') - self.assertEquals(str(url.URL.fromString('http://localhost/').secure(False)), 'http://localhost/') - self.assertEquals(str(url.URL.fromString('http://localhost/foo').secure()), 'https://localhost/foo') - self.assertEquals(str(url.URL.fromString('http://localhost/foo?bar=1').secure()), 'https://localhost/foo?bar=1') - self.assertEquals(str(url.URL.fromString('http://localhost/').secure(port=443)), 'https://localhost/') - self.assertEquals(str(url.URL.fromString('http://localhost:8080/').secure(port=8443)), 'https://localhost:8443/') - self.assertEquals(str(url.URL.fromString('https://localhost:8443/').secure(False, 8080)), 'http://localhost:8080/') + self.assertEqual(str(url.URL.fromString('http://localhost/').secure()), 'https://localhost/') + self.assertEqual(str(url.URL.fromString('http://localhost/').secure(True)), 'https://localhost/') + self.assertEqual(str(url.URL.fromString('https://localhost/').secure()), 'https://localhost/') + self.assertEqual(str(url.URL.fromString('https://localhost/').secure(False)), 'http://localhost/') + self.assertEqual(str(url.URL.fromString('http://localhost/').secure(False)), 'http://localhost/') + self.assertEqual(str(url.URL.fromString('http://localhost/foo').secure()), 'https://localhost/foo') + self.assertEqual(str(url.URL.fromString('http://localhost/foo?bar=1').secure()), 'https://localhost/foo?bar=1') + self.assertEqual(str(url.URL.fromString('http://localhost/').secure(port=443)), 'https://localhost/') + self.assertEqual(str(url.URL.fromString('http://localhost:8080/').secure(port=8443)), 'https://localhost:8443/') + self.assertEqual(str(url.URL.fromString('https://localhost:8443/').secure(False, 8080)), 'http://localhost:8080/') def test_eq_same(self): u = url.URL.fromString('http://localhost/') - self.failUnless(u == u, "%r != itself" % u) + self.assertTrue(u == u, "%r != itself" % u) def test_eq_similar(self): u1 = url.URL.fromString('http://localhost/') u2 = url.URL.fromString('http://localhost/') - self.failUnless(u1 == u2, "%r != %r" % (u1, u2)) + self.assertTrue(u1 == u2, "%r != %r" % (u1, u2)) def test_eq_different(self): u1 = url.URL.fromString('http://localhost/a') u2 = url.URL.fromString('http://localhost/b') - self.failIf(u1 == u2, "%r != %r" % (u1, u2)) + self.assertFalse(u1 == u2, "%r != %r" % (u1, u2)) def test_eq_apples_vs_oranges(self): u = url.URL.fromString('http://localhost/') - self.failIf(u == 42, "URL must not equal a number.") - self.failIf(u == object(), "URL must not equal an object.") + self.assertFalse(u == 42, "URL must not equal a number.") + self.assertFalse(u == object(), "URL must not equal an object.") def test_ne_same(self): u = url.URL.fromString('http://localhost/') - self.failIf(u != u, "%r == itself" % u) + self.assertFalse(u != u, "%r == itself" % u) def test_ne_similar(self): u1 = url.URL.fromString('http://localhost/') u2 = url.URL.fromString('http://localhost/') - self.failIf(u1 != u2, "%r == %r" % (u1, u2)) + self.assertFalse(u1 != u2, "%r == %r" % (u1, u2)) def test_ne_different(self): u1 = url.URL.fromString('http://localhost/a') u2 = url.URL.fromString('http://localhost/b') - self.failUnless(u1 != u2, "%r == %r" % (u1, u2)) + self.assertTrue(u1 != u2, "%r == %r" % (u1, u2)) def test_ne_apples_vs_oranges(self): u = url.URL.fromString('http://localhost/') - self.failUnless(u != 42, "URL must differ from a number.") - self.failUnless(u != object(), "URL must be differ from an object.") + self.assertTrue(u != 42, "URL must differ from a number.") + self.assertTrue(u != object(), "URL must be differ from an object.") def test_parseEqualInParamValue(self): u = url.URL.fromString('http://localhost/?=x=x=x') - self.failUnless(u.query == ['=x=x=x']) - self.failUnless(str(u) == 'http://localhost/?=x%3Dx%3Dx') + self.assertTrue(u.query == ['=x=x=x']) + self.assertTrue(str(u) == 'http://localhost/?=x%3Dx%3Dx') u = url.URL.fromString('http://localhost/?foo=x=x=x&bar=y') - self.failUnless(u.query == ['foo=x=x=x', 'bar=y']) - self.failUnless(str(u) == 'http://localhost/?foo=x%3Dx%3Dx&bar=y') + self.assertTrue(u.query == ['foo=x=x=x', 'bar=y']) + self.assertTrue(str(u) == 'http://localhost/?foo=x%3Dx%3Dx&bar=y') class Serialization(TestCase): @@ -536,13 +536,13 @@ def testQuoting(self): u = url.URL(scheme, loc, path, query, fragment) s = flatten(url.URL(scheme, loc, path, query, fragment)) - parsedScheme, parsedLoc, parsedPath, parsedQuery, parsedFragment = urlparse.urlsplit(s) + parsedScheme, parsedLoc, parsedPath, parsedQuery, parsedFragment = urllib.parse.urlsplit(s) - self.assertEquals(scheme, parsedScheme) - self.assertEquals(loc, parsedLoc) - self.assertEquals('/' + '/'.join(map(lambda p: urllib.quote(p,safe=''),path)), parsedPath) - self.assertEquals(query, url.unquerify(parsedQuery)) - self.assertEquals(fragment, parsedFragment) + self.assertEqual(scheme, parsedScheme) + self.assertEqual(loc, parsedLoc) + self.assertEqual('/' + '/'.join([urllib.parse.quote(p,safe='') for p in path]), parsedPath) + self.assertEqual(query, url.unquerify(parsedQuery)) + self.assertEqual(fragment, parsedFragment) def test_slotQueryParam(self): original = 'http://foo/bar?baz=bamf' @@ -553,7 +553,7 @@ def fillIt(ctx, data): ctx.fillSlots('param', 5) return ctx.tag - self.assertEquals(flatten(tags.invisible(render=fillIt)[u]), original + '&toot=5') + self.assertEqual(flatten(tags.invisible(render=fillIt)[u]), original + '&toot=5') def test_childQueryParam(self): original = 'http://foo/bar' @@ -564,7 +564,7 @@ def fillIt(ctx, data): ctx.fillSlots('param', 'baz') return ctx.tag - self.assertEquals(flatten(tags.invisible(render=fillIt)[u]), original + '/baz') + self.assertEqual(flatten(tags.invisible(render=fillIt)[u]), original + '/baz') def test_strangeSegs(self): base = 'http://localhost/' @@ -572,35 +572,35 @@ def test_strangeSegs(self): (r'/foo/', '%2Ffoo%2F'), (r'c:\foo\bar bar', 'c%3A%5Cfoo%5Cbar%20bar'), (r'&<>', '%26%3C%3E'), - (u'!"\N{POUND SIGN}$%^&*()_+'.encode('utf-8'), '!%22%C2%A3%24%25%5E%26*()_%2B'), + ('!"\N{POUND SIGN}$%^&*()_+'.encode('utf-8'), '!%22%C2%A3%24%25%5E%26*()_%2B'), ) for test, result in tests: u = url.URL.fromString(base).child(test) - self.assertEquals(flatten(u), base+result) + self.assertEqual(flatten(u), base+result) def test_urlContent(self): u = url.URL.fromString('http://localhost/').child(r'') - self.assertEquals(flatten(tags.p[u]), '

http://localhost/%3Cc%3A%5Cfoo%5Cbar%26%3E

') + self.assertEqual(flatten(tags.p[u]), '

http://localhost/%3Cc%3A%5Cfoo%5Cbar%26%3E

') def test_urlAttr(self): u = url.URL.fromString('http://localhost/').child(r'') - self.assertEquals(flatten(tags.img(src=u)), '') + self.assertEqual(flatten(tags.img(src=u)), '') def test_urlSlot(self): u = url.URL.fromString('http://localhost/').child(r'') tag = tags.img(src=tags.slot('src')) tag.fillSlots('src', u) - self.assertEquals(flatten(tag), '') + self.assertEqual(flatten(tag), '') def test_urlXmlAttrSlot(self): u = url.URL.fromString('http://localhost/').child(r'') tag = tags.invisible[loaders.xmlstr('')] tag.fillSlots('src', u) - self.assertEquals(flatten(tag), '') + self.assertEqual(flatten(tag), '') def test_safe(self): u = url.URL.fromString('http://localhost/').child(r"foo-_.!*'()bar") - self.assertEquals(flatten(tags.p[u]), r"

http://localhost/foo-_.!*'()bar

") + self.assertEqual(flatten(tags.p[u]), r"

http://localhost/foo-_.!*'()bar

") def test_urlintagwithmultipleamps(self): """ @@ -610,11 +610,11 @@ def test_urlintagwithmultipleamps(self): The ampersand must be quoted for the attribute to be valid. """ tag = tags.invisible[tags.a(href=url.URL.fromString('http://localhost/').add('foo', 'bar').add('baz', 'spam'))] - self.assertEquals(flatten(tag), '') + self.assertEqual(flatten(tag), '') tag = tags.invisible[loaders.xmlstr('')] tag.fillSlots('href', url.URL.fromString('http://localhost/').add('foo', 'bar').add('baz', 'spam')) - self.assertEquals(flatten(tag), '') + self.assertEqual(flatten(tag), '') def test_rfc1808(self): @@ -623,7 +623,7 @@ def test_rfc1808(self): base = url.URL.fromString(rfc1808_relative_link_base) for link, result in rfc1808_relative_link_tests: #print link - self.failUnlessEqual(result, flatten(base.click(link))) + self.assertEqual(result, flatten(base.click(link))) test_rfc1808.todo = 'Many of these fail miserably at the moment; often with a / where there shouldn\'t be' @@ -632,9 +632,9 @@ def test_unicode(self): L{URLSerializer} should provide basic IRI (RFC 3987) support by encoding Unicode to UTF-8 before percent-encoding. """ - iri = u'http://localhost/expos\xe9?doppelg\xe4nger=Bryan O\u2019Sullivan#r\xe9sum\xe9' + iri = 'http://localhost/expos\xe9?doppelg\xe4nger=Bryan O\u2019Sullivan#r\xe9sum\xe9' uri = 'http://localhost/expos%C3%A9?doppelg%C3%A4nger=Bryan%20O%E2%80%99Sullivan#r%C3%A9sum%C3%A9' - self.assertEquals(flatten(url.URL.fromString(iri)), uri) + self.assertEqual(flatten(url.URL.fromString(iri)), uri) @@ -652,17 +652,19 @@ def renderResource(self, u): def test_urlRedirect(self): u = "http://localhost/" D = self.renderResource(url.URL.fromString(u)) - def after((html, redirected_to)): + def after(xxx_todo_changeme): + (html, redirected_to) = xxx_todo_changeme self.assertIn(u, html) - self.assertEquals(u, redirected_to) + self.assertEqual(u, redirected_to) return D.addCallback(after) def test_urlRedirectWithParams(self): D = self.renderResource(url.URL.fromString("http://localhost/").child('child').add('foo', 'bar')) - def after((html, redirected_to)): + def after(xxx_todo_changeme1): + (html, redirected_to) = xxx_todo_changeme1 self.assertIn("http://localhost/child?foo=bar", html) - self.assertEquals("http://localhost/child?foo=bar", redirected_to) + self.assertEqual("http://localhost/child?foo=bar", redirected_to) return D.addCallback(after) @@ -671,16 +673,18 @@ def test_deferredURLParam(self): url.URL.fromString("http://localhost/") .child(util.succeed('child')).add('foo',util.succeed('bar')) ) - def after((html, redirected_to)): + def after(xxx_todo_changeme2): + (html, redirected_to) = xxx_todo_changeme2 self.assertIn("http://localhost/child?foo=bar", html) - self.assertEquals("http://localhost/child?foo=bar", redirected_to) + self.assertEqual("http://localhost/child?foo=bar", redirected_to) return D.addCallback(after) def test_deferredURLOverlayParam(self): D = self.renderResource(url.here.child(util.succeed('child')).add('foo',util.succeed('bar'))) - def after((html, redirected_to)): + def after(xxx_todo_changeme3): + (html, redirected_to) = xxx_todo_changeme3 self.assertIn("http://localhost/child?foo=bar", html) - self.assertEquals("http://localhost/child?foo=bar", redirected_to) + self.assertEqual("http://localhost/child?foo=bar", redirected_to) return D.addCallback(after) diff --git a/nevow/test/test_utils.py b/nevow/test/test_utils.py index fed691ff..74a5dab6 100644 --- a/nevow/test/test_utils.py +++ b/nevow/test/test_utils.py @@ -30,8 +30,8 @@ def bar(self): return 'baz' expose(bar) - self.assertEquals(list(expose.exposedMethodNames(Foo())), ['bar']) - self.assertEquals(expose.get(Foo(), 'bar')(), 'baz') + self.assertEqual(list(expose.exposedMethodNames(Foo())), ['bar']) + self.assertEqual(expose.get(Foo(), 'bar')(), 'baz') def test_multipleExposeCalls(self): @@ -51,9 +51,9 @@ def quux(self): expose(quux) - self.assertEquals(list(expose.exposedMethodNames(Foo())), ['bar', 'quux']) - self.assertEquals(expose.get(Foo(), 'bar')(), 'baz') - self.assertEquals(expose.get(Foo(), 'quux')(), 'fooble') + self.assertEqual(list(expose.exposedMethodNames(Foo())), ['bar', 'quux']) + self.assertEqual(expose.get(Foo(), 'bar')(), 'baz') + self.assertEqual(expose.get(Foo(), 'quux')(), 'fooble') def test_multipleExposeArguments(self): @@ -72,9 +72,9 @@ def quux(self): expose(bar, quux) - self.assertEquals(list(expose.exposedMethodNames(Foo())), ['bar', 'quux']) - self.assertEquals(expose.get(Foo(), 'bar')(), 'baz') - self.assertEquals(expose.get(Foo(), 'quux')(), 'fooble') + self.assertEqual(list(expose.exposedMethodNames(Foo())), ['bar', 'quux']) + self.assertEqual(expose.get(Foo(), 'bar')(), 'baz') + self.assertEqual(expose.get(Foo(), 'quux')(), 'fooble') def test_inheritanceExpose(self): @@ -92,7 +92,7 @@ class Quux(Foo): def bar(self): return 'BAZ' - self.assertEquals(list(expose.exposedMethodNames(Quux())), []) + self.assertEqual(list(expose.exposedMethodNames(Quux())), []) self.assertRaises(UnexposedMethodError, expose.get, Quux(), 'bar') @@ -112,8 +112,8 @@ def bar(self): return 'smokey' expose(bar) - self.assertEquals(list(expose.exposedMethodNames(Quux())), ['bar']) - self.assertEquals(expose.get(Quux(), 'bar')(), 'smokey') + self.assertEqual(list(expose.exposedMethodNames(Quux())), ['bar']) + self.assertEqual(expose.get(Quux(), 'bar')(), 'smokey') def test_inheritanceExposeMore(self): @@ -137,12 +137,12 @@ def albert(self): return 'alligator' expose(smokey, pogo) - self.assertEquals(set(expose.exposedMethodNames(Quux())), set(['pogo', 'smokey', 'bar'])) - self.assertEquals(expose.get(Quux(), 'bar')(), 'baz') - self.assertEquals(expose.get(Quux(), 'smokey')(), 'stover') - self.assertEquals(expose.get(Quux(), 'pogo')(), 'kelly') + self.assertEqual(set(expose.exposedMethodNames(Quux())), set(['pogo', 'smokey', 'bar'])) + self.assertEqual(expose.get(Quux(), 'bar')(), 'baz') + self.assertEqual(expose.get(Quux(), 'smokey')(), 'stover') + self.assertEqual(expose.get(Quux(), 'pogo')(), 'kelly') self.assertRaises(UnexposedMethodError, expose.get, Quux(), 'albert') - self.assertEquals(Quux().albert(), 'alligator') + self.assertEqual(Quux().albert(), 'alligator') def test_multipleInheritanceExpose(self): @@ -167,9 +167,9 @@ def quux(self): pass expose(quux) - self.assertEquals(set(expose.exposedMethodNames(C())), set(['quux', 'foo', 'baz'])) - self.assertEquals(expose.get(C(), 'foo')(), 'bar') - self.assertEquals(expose.get(C(), 'baz')(), 'quux') + self.assertEqual(set(expose.exposedMethodNames(C())), set(['quux', 'foo', 'baz'])) + self.assertEqual(expose.get(C(), 'foo')(), 'bar') + self.assertEqual(expose.get(C(), 'baz')(), 'quux') def test_multipleInheritanceExposeWithoutSubclassCall(self): @@ -192,9 +192,9 @@ def baz(self): class C(A, B): pass - self.assertEquals(set(expose.exposedMethodNames(C())), set(['foo', 'baz'])) - self.assertEquals(expose.get(C(), 'foo')(), 'bar') - self.assertEquals(expose.get(C(), 'baz')(), 'quux') + self.assertEqual(set(expose.exposedMethodNames(C())), set(['foo', 'baz'])) + self.assertEqual(expose.get(C(), 'foo')(), 'bar') + self.assertEqual(expose.get(C(), 'baz')(), 'quux') def test_unexposedMethodInaccessable(self): @@ -224,8 +224,8 @@ def foo(self): return 'bar' expose(foo) - self.assertEquals(expose.get(A(), 'foo', None)(), 'bar') - self.assertEquals(expose.get(A(), 'bar', None), None) + self.assertEqual(expose.get(A(), 'foo', None)(), 'bar') + self.assertEqual(expose.get(A(), 'bar', None), None) def test_exposeReturnValue(self): @@ -268,11 +268,11 @@ def quux(self): return 'quux' expose(quux) - self.assertEquals( + self.assertEqual( set(expose.exposedMethodNames(Foo())), set(['bar', 'quux'])) - self.assertEquals(expose.get(Foo(), 'bar')(), 'baz') - self.assertEquals(expose.get(Foo(), 'quux')(), 'quux') + self.assertEqual(expose.get(Foo(), 'bar')(), 'baz') + self.assertEqual(expose.get(Foo(), 'quux')(), 'quux') @@ -282,7 +282,7 @@ def setUp(self): file(self.testFile, 'w').close() counter = count() - self.cache = CachedFile(self.testFile, lambda path: counter.next()) + self.cache = CachedFile(self.testFile, lambda path: next(counter)) def test_cache(self): """ @@ -341,7 +341,7 @@ def test_loaderException(self): def _loadMe(path, crashMe=False): if crashMe: raise Exception('It is an exception!') - return counter.next() + return next(counter) cf = CachedFile(self.testFile, _loadMe) diff --git a/nevow/testutil.py b/nevow/testutil.py index e78772ef..46427b28 100644 --- a/nevow/testutil.py +++ b/nevow/testutil.py @@ -116,7 +116,7 @@ def __init__(self, headers=None, args=None, avatar=None, self.site = FakeSite() self.received_headers = {} if headers: - for k, v in headers.iteritems(): + for k, v in headers.items(): self.received_headers[k.lower()] = v if cookies is not None: self.cookies = cookies @@ -472,7 +472,7 @@ def _runWithSigchild(self, f, *a, **kw): def run(self, result): try: self.checkDependencies() - except NotSupported, e: + except NotSupported as e: result.startTest(self) result.addSkip(self, str(e)) result.stopTest(self) @@ -553,7 +553,7 @@ def makeModule(contents=None): return fname return athena.CSSRegistry( - {u'TestCSSModuleDependencies': makeModule(), - u'TestCSSModuleDependencies.Dependor': makeModule( + {'TestCSSModuleDependencies': makeModule(), + 'TestCSSModuleDependencies.Dependor': makeModule( '// import TestCSSModuleDependencies.Dependee\n'), - u'TestCSSModuleDependencies.Dependee': makeModule()}) + 'TestCSSModuleDependencies.Dependee': makeModule()}) diff --git a/nevow/url.py b/nevow/url.py index 9bd73c0a..4a6fb2ae 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -7,8 +7,8 @@ """ import weakref -import urlparse -import urllib +import urllib.parse +import urllib.request, urllib.parse, urllib.error from zope.interface import implements @@ -22,9 +22,9 @@ def _uqf(query): for x in query.split('&'): if '=' in x: - yield tuple( [urllib.unquote_plus(s) for s in x.split('=', 1)] ) + yield tuple( [urllib.parse.unquote_plus(s) for s in x.split('=', 1)] ) elif x: - yield (urllib.unquote_plus(x), None) + yield (urllib.parse.unquote_plus(x), None) unquerify = lambda query: list(_uqf(query)) @@ -80,7 +80,7 @@ def get(self): # It is this particular set in order to match that used by # nevow.flat.flatstan.StringSerializer, so that url.path # will give something which is contained by flatten(url). - urllib.quote(seg, safe="-_.!*'()") for seg in self._qpathlist]) + urllib.parse.quote(seg, safe="-_.!*'()") for seg in self._qpathlist]) doc = """ The path portion of the URL. """ @@ -124,11 +124,11 @@ def cloneURL(self, scheme, netloc, pathsegs, querysegs, fragment): ## class methods used to build URL objects ## def fromString(klass, st): - scheme, netloc, path, query, fragment = urlparse.urlsplit(st) + scheme, netloc, path, query, fragment = urllib.parse.urlsplit(st) u = klass( scheme, netloc, - [urllib.unquote(seg) for seg in path.split('/')[1:]], - unquerify(query), urllib.unquote(fragment)) + [urllib.parse.unquote(seg) for seg in path.split('/')[1:]], + unquerify(query), urllib.parse.unquote(fragment)) return u fromString = classmethod(fromString) @@ -159,7 +159,7 @@ def fromContext(klass, context): def pathList(self, unquote=False, copy=True): result = self._qpathlist if unquote: - result = map(urllib.unquote, result) + result = list(map(urllib.parse.unquote, result)) if copy: result = result[:] return result @@ -241,7 +241,7 @@ def click(self, href): Return a path which is the URL where a browser would presumably take you if you clicked on a link with an 'href' as given. """ - scheme, netloc, path, query, fragment = urlparse.urlsplit(href) + scheme, netloc, path, query, fragment = urllib.parse.urlsplit(href) if (scheme, netloc, path, query, fragment) == ('', '', '', '', ''): return self @@ -252,7 +252,7 @@ def click(self, href): if path and path[0] == '/': path = path[1:] return self.cloneURL( - scheme, netloc, map(raw, path.split('/')), query, fragment) + scheme, netloc, list(map(raw, path.split('/'))), query, fragment) else: scheme = self.scheme @@ -274,7 +274,7 @@ def click(self, href): path = normURLPath(path) return self.cloneURL( - scheme, netloc, map(raw, path.split('/')), query, fragment) + scheme, netloc, list(map(raw, path.split('/'))), query, fragment) ## query manipulation ## @@ -308,7 +308,7 @@ def replace(self, name, value=None): if k == name: break i += 1 - q = filter(lambda x: x[0] != name, ql) + q = [x for x in ql if x[0] != name] q.insert(i, (name, value)) return self._pathMod(self.pathList(copy=False), q) @@ -317,8 +317,7 @@ def remove(self, name): """ return self._pathMod( self.pathList(copy=False), - filter( - lambda x: x[0] != name, self.queryList(False))) + [x for x in self.queryList(False) if x[0] != name]) def clear(self, name=None): """Remove all existing query arguments @@ -326,7 +325,7 @@ def clear(self, name=None): if name is None: q = [] else: - q = filter(lambda x: x[0] != name, self.queryList(False)) + q = [x for x in self.queryList(False) if x[0] != name] return self._pathMod(self.pathList(copy=False), q) ## scheme manipulation ## @@ -509,7 +508,7 @@ def URLSerializer(original, context): IRI standard (RFC 3987). """ def _maybeEncode(s): - if isinstance(s, unicode): + if isinstance(s, str): s = s.encode('utf-8') return s urlContext = WovenContext(parent=context, precompile=context.precompile, inURL=True) diff --git a/nevow/useragent.py b/nevow/useragent.py index ade65bb0..1eae6af7 100644 --- a/nevow/useragent.py +++ b/nevow/useragent.py @@ -28,10 +28,10 @@ class browsers(object): """ Namespace class for Browser identifiers. """ - GECKO = u'gecko' - INTERNET_EXPLORER = u'internet explorer' - WEBKIT = u'webkit' - OPERA = u'opera' + GECKO = 'gecko' + INTERNET_EXPLORER = 'internet explorer' + WEBKIT = 'webkit' + OPERA = 'opera' class UserAgent(object): @@ -97,7 +97,7 @@ def parse_WEBKIT(cls, agentString): end += 1 version = agentString[start + len(identifier):end] try: - version = map(int, version.split('.')) + version = list(map(int, version.split('.'))) except ValueError: pass else: @@ -113,7 +113,7 @@ def parse_OPERA(cls, agentString): if agentString.startswith(prefix): version = agentString[len(prefix):].split(None, 1)[0] try: - version = map(int, version.split('.')) + version = list(map(int, version.split('.'))) except ValueError: pass else: @@ -134,7 +134,7 @@ def parse_MSIE(cls, agentString): end = None version = agentString[len(prefix):end] try: - version = map(int, version.split('.')) + version = list(map(int, version.split('.'))) except ValueError: pass else: diff --git a/nevow/vhost.py b/nevow/vhost.py index f120ae30..bc612ef0 100644 --- a/nevow/vhost.py +++ b/nevow/vhost.py @@ -21,7 +21,7 @@ def getStyleSheet(self): return self.stylesheet def data_hostlist(self, context, data): - return self.nvh.hosts.keys() + return list(self.nvh.hosts.keys()) def render_hostlist(self, context, data): host=data @@ -115,7 +115,7 @@ def _getResourceForRequest(self, request): found. """ - while not self.hosts.has_key(host) and len(host.split('.')) > 1: + while host not in self.hosts and len(host.split('.')) > 1: host = '.'.join(host.split('.')[1:]) return (self.hosts.get(host, self.default) or rend.NotFound[0]) diff --git a/versioneer.py b/versioneer.py index 2cacf9b7..ec0e9291 100644 --- a/versioneer.py +++ b/versioneer.py @@ -466,19 +466,19 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False): if e.errno == errno.ENOENT: continue if verbose: - print("unable to run %s" % args[0]) + print(("unable to run %s" % args[0])) print(e) return None else: if verbose: - print("unable to find command, tried %s" % (commands,)) + print(("unable to find command, tried %s" % (commands,))) return None stdout = p.communicate()[0].strip() if sys.version >= '3': stdout = stdout.decode() if p.returncode != 0: if verbose: - print("unable to run %s (error)" % args[0]) + print(("unable to run %s (error)" % args[0])) return None return stdout @@ -530,15 +530,15 @@ def versions_from_expanded_variables(variables, tag_prefix, verbose=False): # "stabilization", as well as "HEAD" and "master". tags = set([r for r in refs if re.search(r'\d', r)]) if verbose: - print("discarding '%s', no digits" % ",".join(refs-tags)) + print(("discarding '%s', no digits" % ",".join(refs-tags))) if verbose: - print("likely tags: %s" % ",".join(sorted(tags))) + print(("likely tags: %s" % ",".join(sorted(tags)))) for ref in sorted(tags): # sorting will prefer e.g. "2.0" over "2.0rc1" if ref.startswith(tag_prefix): r = ref[len(tag_prefix):] if verbose: - print("picking %s" % r) + print(("picking %s" % r)) return { "version": r, "full": variables["full"].strip() } # no suitable tags, so we use the full revision id @@ -555,7 +555,7 @@ def versions_from_vcs(tag_prefix, root, verbose=False): if not os.path.exists(os.path.join(root, ".git")): if verbose: - print("no .git in %s" % root) + print(("no .git in %s" % root)) return {} GITS = ["git"] @@ -567,7 +567,7 @@ def versions_from_vcs(tag_prefix, root, verbose=False): return {} if not stdout.startswith(tag_prefix): if verbose: - print("tag '%s' doesn't start with prefix '%s'" % (stdout, tag_prefix)) + print(("tag '%s' doesn't start with prefix '%s'" % (stdout, tag_prefix))) return {} tag = stdout[len(tag_prefix):] stdout = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) @@ -585,8 +585,8 @@ def versions_from_parentdir(parentdir_prefix, root, verbose=False): dirname = os.path.basename(root) if not dirname.startswith(parentdir_prefix): if verbose: - print("guessing rootdir is '%s', but '%s' doesn't start with prefix '%s'" % - (root, dirname, parentdir_prefix)) + print(("guessing rootdir is '%s', but '%s' doesn't start with prefix '%s'" % + (root, dirname, parentdir_prefix))) return None return {"version": dirname[len(parentdir_prefix):], "full": ""} import os.path @@ -675,7 +675,7 @@ def write_to_version_file(filename, versions): f = open(filename, "w") f.write(SHORT_VERSION_PY % versions) f.close() - print("set %s to '%s'" % (filename, versions["version"])) + print(("set %s to '%s'" % (filename, versions["version"]))) def get_root(): try: @@ -706,25 +706,25 @@ def get_versions(default=DEFAULT, verbose=False): if variables: ver = versions_from_expanded_variables(variables, tag_prefix) if ver: - if verbose: print("got version from expanded variable %s" % ver) + if verbose: print(("got version from expanded variable %s" % ver)) return ver ver = versions_from_file(versionfile_abs) if ver: - if verbose: print("got version from file %s %s" % (versionfile_abs,ver)) + if verbose: print(("got version from file %s %s" % (versionfile_abs,ver))) return ver ver = versions_from_vcs(tag_prefix, root, verbose) if ver: - if verbose: print("got version from git %s" % ver) + if verbose: print(("got version from git %s" % ver)) return ver ver = versions_from_parentdir(parentdir_prefix, root, verbose) if ver: - if verbose: print("got version from parentdir %s" % ver) + if verbose: print(("got version from parentdir %s" % ver)) return ver - if verbose: print("got version from default %s" % ver) + if verbose: print(("got version from default %s" % ver)) return default def get_version(verbose=False): @@ -740,7 +740,7 @@ def finalize_options(self): pass def run(self): ver = get_version(verbose=True) - print("Version is currently: %s" % ver) + print(("Version is currently: %s" % ver)) class cmd_build(_build): @@ -750,7 +750,7 @@ def run(self): # now locate _version.py in the new build/ directory and replace it # with an updated value target_versionfile = os.path.join(self.build_lib, versionfile_build) - print("UPDATING %s" % target_versionfile) + print(("UPDATING %s" % target_versionfile)) os.unlink(target_versionfile) f = open(target_versionfile, "w") f.write(SHORT_VERSION_PY % versions) @@ -763,7 +763,7 @@ class cmd_build_exe(_build_exe): def run(self): versions = get_versions(verbose=True) target_versionfile = versionfile_source - print("UPDATING %s" % target_versionfile) + print(("UPDATING %s" % target_versionfile)) os.unlink(target_versionfile) f = open(target_versionfile, "w") f.write(SHORT_VERSION_PY % versions) @@ -791,7 +791,7 @@ def make_release_tree(self, base_dir, files): # now locate _version.py in the new base_dir directory (remembering # that it may be a hardlink) and replace it with an updated value target_versionfile = os.path.join(base_dir, versionfile_source) - print("UPDATING %s" % target_versionfile) + print(("UPDATING %s" % target_versionfile)) os.unlink(target_versionfile) f = open(target_versionfile, "w") f.write(SHORT_VERSION_PY % self._versioneer_generated_versions) @@ -812,7 +812,7 @@ def initialize_options(self): def finalize_options(self): pass def run(self): - print(" creating %s" % versionfile_source) + print((" creating %s" % versionfile_source)) f = open(versionfile_source, "w") f.write(LONG_VERSION_PY % {"DOLLAR": "$", "TAG_PREFIX": tag_prefix, @@ -827,12 +827,12 @@ def run(self): except EnvironmentError: old = "" if INIT_PY_SNIPPET not in old: - print(" appending to %s" % ipy) + print((" appending to %s" % ipy)) f = open(ipy, "a") f.write(INIT_PY_SNIPPET) f.close() else: - print(" %s unmodified" % ipy) + print((" %s unmodified" % ipy)) # Make sure both the top-level "versioneer.py" and versionfile_source # (PKG/_version.py, used by runtime code) are in MANIFEST.in, so @@ -859,8 +859,8 @@ def run(self): else: print(" 'versioneer.py' already in MANIFEST.in") if versionfile_source not in simple_includes: - print(" appending versionfile_source ('%s') to MANIFEST.in" % - versionfile_source) + print((" appending versionfile_source ('%s') to MANIFEST.in" % + versionfile_source)) f = open(manifest_in, "a") f.write("include %s\n" % versionfile_source) f.close() From 1a84e145d948fc40ffe08ed0762507391c019655 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 16:40:38 -0800 Subject: [PATCH 002/157] implements -> @implementer --- nevow/guard.py | 10 +++++----- nevow/i18n.py | 5 ++--- nevow/loaders.py | 15 ++++++--------- nevow/page.py | 5 ++--- nevow/query.py | 4 ++-- nevow/rend.py | 26 +++++++++----------------- nevow/stan.py | 5 ++--- nevow/static.py | 8 ++++---- nevow/test/livetest_athena.py | 5 ++--- nevow/test/test_appserver.py | 6 +++--- nevow/test/test_compression.py | 14 +++++--------- nevow/test/test_errorhandler.py | 7 +++---- nevow/test/test_flatstan.py | 5 +++-- nevow/test/test_guard.py | 13 +++++-------- nevow/test/test_i18n.py | 2 +- nevow/test/test_json.py | 4 ++-- nevow/test/test_newflat.py | 18 ++++++++---------- nevow/test/test_passobj.py | 16 ++++++---------- nevow/test/test_rend.py | 13 +++++++------ nevow/testutil.py | 11 ++++------- nevow/url.py | 5 ++--- nevow/vhost.py | 6 +++--- 22 files changed, 86 insertions(+), 117 deletions(-) diff --git a/nevow/guard.py b/nevow/guard.py index 08062088..91bbd4c0 100644 --- a/nevow/guard.py +++ b/nevow/guard.py @@ -18,7 +18,7 @@ from md5 import md5 import io -from zope.interface import implements +from zope.interface import implementer # Twisted Imports @@ -39,14 +39,13 @@ def _sessionCookie(): return md5("%s_%s" % (str(random.random()) , str(time.time()))).hexdigest() - +@implementer(inevow.ISession, inevow.IGuardSession) class GuardSession(components.Componentized): """A user's session with a system. This utility class contains no functionality, but is used to represent a session. """ - implements(inevow.ISession, inevow.IGuardSession) def __init__(self, guard, uid): """Initialize a session with a unique ID for that session. @@ -209,8 +208,8 @@ def urlToChild(ctx, *ar, **kw): def nomind(*args): return None +@implementer(inevow.IResource) class Forbidden(object): - implements(inevow.IResource) def locateChild(self, ctx, segments): return self @@ -221,6 +220,7 @@ def renderHTTP(self, ctx): return ("Forbidden" "

Forbidden

Request was forbidden.") +@implementer(inevow.IResource) class SessionWrapper: """ SessionWrapper @@ -241,7 +241,7 @@ class SessionWrapper: the browser is closed before the session timeout, both the session and the cookie go away. """ - implements(inevow.IResource) + sessionLifetime = 3600 sessionFactory = GuardSession diff --git a/nevow/i18n.py b/nevow/i18n.py index e2ae0a21..7aec1a23 100644 --- a/nevow/i18n.py +++ b/nevow/i18n.py @@ -1,4 +1,4 @@ -from zope.interface import implements +from zope.interface import implementer from nevow import inevow @@ -23,9 +23,8 @@ def languagesFactory(ctx): langs.sort(lambda a,b: cmp(b[0], a[0])) return [lang for quality, lang in langs] - +@implementer(inevow.II18NConfig) class I18NConfig(object): - implements(inevow.II18NConfig) def __init__(self, domain=None, diff --git a/nevow/loaders.py b/nevow/loaders.py index ada36f00..be5fad68 100644 --- a/nevow/loaders.py +++ b/nevow/loaders.py @@ -22,7 +22,7 @@ import warnings import os.path -from zope.interface import implements +from zope.interface import implementer from twisted.python.reflect import getClass from twisted.web import microdom @@ -32,11 +32,10 @@ from nevow.flat import flatsax from nevow.util import CachedFile - +@implementer(inevow.IDocFactory) class stan(object): """A stan tags document factory""" - implements(inevow.IDocFactory) stan = None pattern = None @@ -61,11 +60,10 @@ def load(self, ctx=None, preprocessors=()): return self._cache - +@implementer(inevow.IDocFactory) class htmlstr(object): """A document factory for HTML contained in a string""" - implements(inevow.IDocFactory) template = None pattern = None @@ -94,10 +92,10 @@ def load(self, ctx=None, preprocessors=()): self._cache = doc return self._cache +@implementer(inevow.IDocFactory) class htmlfile(object): """A document factory for an HTML disk template""" - implements(inevow.IDocFactory) template = None pattern = None @@ -131,9 +129,9 @@ def load(self, ctx=None, preprocessors=()): assert not preprocessors, "preprocessors not supported by htmlfile" return self._cache.load(ctx) +@implementer(inevow.IDocFactory) class xmlstr(object): - implements(inevow.IDocFactory) template = None pattern = None @@ -165,10 +163,9 @@ def load(self, ctx=None, preprocessors=()): self._cache = doc return self._cache - +@implementer(inevow.IDocFactory) class xmlfile(object): - implements(inevow.IDocFactory) template = None templateDir = None diff --git a/nevow/page.py b/nevow/page.py index 6828024c..ce8dff47 100644 --- a/nevow/page.py +++ b/nevow/page.py @@ -6,7 +6,7 @@ API Stability: Completely unstable. """ -from zope.interface import implements +from zope.interface import implementer from nevow.inevow import IRequest, IRenderable, IRendererFactory from nevow.errors import MissingRenderMethod, MissingDocumentFactory @@ -41,7 +41,7 @@ """) - +@implementer(inevow.IRenderable) class Element(object): """ Base for classes which can render part of a page. @@ -72,7 +72,6 @@ def items(self, request, tag): @ivar docFactory: The factory which will be used to load documents to return from C{render}. """ - implements(IRenderable) docFactory = None preprocessors = () diff --git a/nevow/query.py b/nevow/query.py index 1e140121..e5fa1b9d 100644 --- a/nevow/query.py +++ b/nevow/query.py @@ -6,10 +6,10 @@ import twisted.python.components as tpc from nevow import inevow, stan -from zope.interface import implements +from zope.interface import implementer +@implementer(inevow.IQ) class QueryContext(tpc.Adapter): - implements(inevow.IQ) def _locatePatterns(self, pattern, default, loop=True): if self.original.tag.pattern == pattern: diff --git a/nevow/rend.py b/nevow/rend.py index 15326794..882da105 100644 --- a/nevow/rend.py +++ b/nevow/rend.py @@ -22,7 +22,7 @@ import random import warnings -from zope.interface import implements, providedBy +from zope.interface import implementer, providedBy import twisted.python.components as tpc from twisted.python.reflect import qual, accumulateClassList @@ -53,9 +53,8 @@ def _getPreprocessors(inst): return preprocessors - +@implementer(inevow.IRendererFactory) class RenderFactory(object): - implements(inevow.IRendererFactory) def renderer(self, context, name): """Return a renderer with the given name. @@ -88,9 +87,8 @@ def renderer(self, context, name): render_xml = lambda self, context, data: context.tag.clear()[tags.xml(data)] render_data = lambda self, context, data_: data(context, data_) - +@implementer(inevow.IMacroFactory) class MacroFactory(object): - implements(inevow.IMacroFactory) def macro(self, ctx, name): """Return a macro with the given name. @@ -118,9 +116,8 @@ class DataNotFoundError(Exception): original attribute by the DataFactory. """ - +@implementer(inevow.IContainer) class DataFactory(object): - implements(inevow.IContainer) def child(self, context, n): args = [] @@ -177,7 +174,7 @@ def child_freeform_hand(self, ctx): return carryoverHand return inevow.IHand(inevow.ISession(ctx), None) - +@implementer(iformless.IConfigurable) class ConfigurableMixin(object): """ A sane L{IConfigurable} implementation for L{Fragment} and L{Page}. @@ -194,7 +191,6 @@ def foo(self, argName, anotherArg): assert isinstance(argName, str) assert isinstance(anotherArg, int) """ - implements(iformless.IConfigurable) def getBindingNames(self, ctx): """Expose bind_* methods and attributes on this class. @@ -258,13 +254,12 @@ def _callback(binding): return util.maybeDeferred(self.getBinding, ctx, bindingName).addCallback(_callback) - +@implementer(iformless.IConfigurableFactory) class ConfigurableFactory: """Locates configurables by looking for methods that start with configurable_ and end with the name of the configurable. The method should take a single arg (other than self) - the current context. """ - implements(iformless.IConfigurableFactory) def locateConfigurable(self, context, name): """formless.webform.renderForms calls locateConfigurable on the IConfigurableFactory @@ -363,7 +358,7 @@ def statusFactory(ctx): def originalFactory(ctx): return ctx.tag - +@implementer(inevow.IRenderer, inevow.IGettable) class Fragment(DataFactory, RenderFactory, MacroFactory, ConfigurableMixin): """ This class is deprecated because it relies on context objects @@ -371,7 +366,6 @@ class Fragment(DataFactory, RenderFactory, MacroFactory, ConfigurableMixin): @see: L{Element} """ - implements(inevow.IRenderer, inevow.IGettable) docFactory = None original = None @@ -512,13 +506,12 @@ def putChild(self, name, child): self.children = {} self.children[name] = child - +@implementer(inevow.IResource) class Page(Fragment, ConfigurableFactory, ChildLookupMixin): """A page is the main Nevow resource and renders a document loaded via the document factory (docFactory). """ - implements(inevow.IResource) buffered = False @@ -783,11 +776,10 @@ def data(context, data): """ return context.tag.clear()[data] - +@implementer(inevow.IResource) class FourOhFour: """A simple 404 (not found) page. """ - implements(inevow.IResource) notFound = "Page Not FoundSorry, but I couldn't find the object you requested." original = None diff --git a/nevow/stan.py b/nevow/stan.py index 86f915bd..93de0579 100644 --- a/nevow/stan.py +++ b/nevow/stan.py @@ -22,7 +22,7 @@ """ -from zope.interface import implements +from zope.interface import implementer from nevow import inevow @@ -200,7 +200,7 @@ def __repr__(self): self.inJSSingleQuoteString) - +@implementer(inevow.IQ) class Tag(object): """ Tag instances represent XML tags with a tag name, attributes, and @@ -224,7 +224,6 @@ class Tag(object): the XML file from which it was parsed. If it was not parsed from an XML file, C{None}. """ - implements(inevow.IQ) specials = ['data', 'render', 'remember', 'pattern', 'key', 'macro'] diff --git a/nevow/static.py b/nevow/static.py index 75e10c13..7b5ae5db 100644 --- a/nevow/static.py +++ b/nevow/static.py @@ -12,7 +12,7 @@ import warnings StringIO = cStringIO del cStringIO -from zope.interface import implements +from zope.interface import implementer try: from twisted.web.resource import NoResource, ForbiddenResource @@ -38,11 +38,11 @@ def isDangerous(path): return path == '..' or '/' in path or os.sep in path +@implementer(inevow.IResource) class Data: """ This is a static, in-memory resource. """ - implements(inevow.IResource) def __init__(self, data, type, expires=None): self.data = data @@ -152,6 +152,7 @@ def getTypeAndEncoding(filename, types, encodings, defaultType): type = types.get(ext, defaultType) return type, enc +@implementer(inevow.IResource) class File: """ File is a resource that represents a plain non-interpreted file @@ -170,7 +171,6 @@ class File: return the contents of /tmp/foo/bar.html . """ - implements(inevow.IResource) contentTypes = loadMimeTypes() @@ -412,8 +412,8 @@ def view_stopProducing(self, issuer): Inspired by Apache's mod_asis """ +@implementer(inevow.IResource) class ASISProcessor: - implements(inevow.IResource) def __init__(self, path, registry=None): self.path = path diff --git a/nevow/test/livetest_athena.py b/nevow/test/livetest_athena.py index 06669e26..1e5f7ba2 100644 --- a/nevow/test/livetest_athena.py +++ b/nevow/test/livetest_athena.py @@ -5,7 +5,7 @@ Browser integration tests for Athena. """ -from zope.interface import implements +from zope.interface import implementer from twisted.internet import defer @@ -167,12 +167,11 @@ def checkError(self, f): else: raise f - +@implementer(IAthenaTransportable) class CustomTransportable(object): """ A simple transportable object used to verify customization is possible. """ - implements(IAthenaTransportable) jsClass = 'Nevow.Athena.Tests.CustomTransportable' diff --git a/nevow/test/test_appserver.py b/nevow/test/test_appserver.py index 2accd3d0..e3899177 100644 --- a/nevow/test/test_appserver.py +++ b/nevow/test/test_appserver.py @@ -5,7 +5,7 @@ Tests for L{nevow.appserver}. """ -from zope.interface import implements +from zope.interface import implementer from io import StringIO from shlex import split @@ -24,8 +24,8 @@ from nevow.rend import Page from nevow.testutil import FakeRequest +@implementer(inevow.IResource) class Render: - implements(inevow.IResource) rendered = False @@ -81,8 +81,8 @@ def locateChild(self, context, segs): lambda result: self.assertIdentical(r, result.tag)) def test_cycle(self): + @implementer(inevow.IResource) class Resource(object): - implements(inevow.IResource) def locateChild(self, ctx, segments): if segments[0] == 'self': return self, segments diff --git a/nevow/test/test_compression.py b/nevow/test/test_compression.py index 7d19285d..8eaa5fb6 100644 --- a/nevow/test/test_compression.py +++ b/nevow/test/test_compression.py @@ -4,7 +4,7 @@ from io import StringIO from gzip import GzipFile -from zope.interface import implements +from zope.interface import implementer from twisted.trial.unittest import TestCase from twisted.internet.defer import succeed @@ -207,7 +207,7 @@ def test_finish(self): self.assertTrue(self.request.finished) - +@implementer(IResource) class TestResource(object): """ L{IResource} implementation for testing. @@ -218,7 +218,6 @@ class TestResource(object): @type segments: C{list} @ivar html: The data to return from C{renderHTTP}. """ - implements(IResource) lastRequest = None @@ -245,12 +244,11 @@ def renderHTTP(self, ctx): return self.html - +@implementer(IResource) class TestChildlessResource(object): """ L{IResource} implementation with no children. """ - implements(IResource) def locateChild(self, ctx, segments): """ @@ -259,12 +257,11 @@ def locateChild(self, ctx, segments): return NotFound - +@implementer(IResource) class TestDeferredResource(object): """ L{IResource} implementation with children. """ - implements(IResource) def locateChild(self, ctx, segments): """ @@ -282,12 +279,11 @@ class TestResourceWrapper(CompressingResourceWrapper): Subclass for testing purposes, just to create a new type. """ - +@implementer(IResource) class TestBrokenResource(object): """ L{IResource} implementation that returns garbage from C{locateChild}. """ - implements(IResource) def locateChild(self, ctx, segments): """ diff --git a/nevow/test/test_errorhandler.py b/nevow/test/test_errorhandler.py index 938b542e..d8024c5c 100644 --- a/nevow/test/test_errorhandler.py +++ b/nevow/test/test_errorhandler.py @@ -1,5 +1,5 @@ -from zope.interface import implements +from zope.interface import implementer from twisted.python import log from twisted.internet import defer from nevow import appserver, context, inevow, loaders, rend, tags as T, testutil @@ -9,9 +9,8 @@ class Root(rend.Page): docFactory = loaders.stan(T.html[T.p['Root']]) - +@implementer(inevow.ICanHandleNotFound) class NotFoundHandler(object): - implements(inevow.ICanHandleNotFound) html = 'NotFoundHandler' def renderHTTP_notFound(self, ctx): return self.html @@ -19,8 +18,8 @@ def renderHTTP_notFound(self, ctx): class BrokenException(Exception): pass +@implementer(inevow.ICanHandleNotFound) class BadNotFoundHandler(object): - implements(inevow.ICanHandleNotFound) html = 'NotFoundHandler' exceptionType = BrokenException exceptionMessage ='Error from BadNotFoundHandler' diff --git a/nevow/test/test_flatstan.py b/nevow/test/test_flatstan.py index 20d59e68..3e324c81 100644 --- a/nevow/test/test_flatstan.py +++ b/nevow/test/test_flatstan.py @@ -3,7 +3,7 @@ from twisted.internet import defer -from zope.interface import implements, Interface +from zope.interface import implementer, Interface from nevow import stan from nevow import context @@ -356,8 +356,9 @@ def checkContext(ctx, data): def test_nested_remember(self): class IFoo(Interface): pass + @implementer(IFoo) class Foo(str): - implements(IFoo) + pass def checkContext(ctx, data): self.assertEqual(ctx.locate(IFoo), Foo("inner")) diff --git a/nevow/test/test_guard.py b/nevow/test/test_guard.py index d8820f56..db346d84 100644 --- a/nevow/test/test_guard.py +++ b/nevow/test/test_guard.py @@ -7,7 +7,7 @@ import gc -from zope.interface import implements +from zope.interface import implementer from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse, AllowAnonymousAccess, ANONYMOUS from twisted.cred.portal import Portal, IRealm @@ -168,9 +168,8 @@ class SillyAnonymous(SillyPage): def renderHTTP(self, ctx): return 'No' - +@implementer(IRealm) class SillyRealm: - implements(IRealm) def __init__(self, anonymousAvatarFactory=SillyAnonymous, authenticatedAvatarFactory=SillyAvatar): @@ -242,8 +241,8 @@ def child_(self, ctx): return self def renderHTTP(self, ctx): raise RuntimeError("We weren't supposed to get here.") +@implementer(IRealm) class GetLoggedInRealm: - implements(IRealm) def requestAvatar(self, avatarId, mind, *interfaces): if avatarId == ANONYMOUS: @@ -530,9 +529,8 @@ def renderHTTP(self, context): class TrailingSlashAnonymous(TrailingSlashPage): def renderHTTP(self, ctx): return 'Anonymous %s' % self.original - + @implementer(IRealm) class TrailingSlashRealm: - implements(IRealm) def __init__(self, path): self.path = path @@ -575,9 +573,8 @@ def renderHTTP(self, context): class TrailingSlashAnonymous(TrailingSlashPage): def renderHTTP(self, ctx): return 'Anonymous %s' % self.original - + @implementer(IRealm) class TrailingSlashRealm: - implements(IRealm) def __init__(self, path): self.path = path diff --git a/nevow/test/test_i18n.py b/nevow/test/test_i18n.py index 7339e6e7..c9d66734 100644 --- a/nevow/test/test_i18n.py +++ b/nevow/test/test_i18n.py @@ -1,4 +1,4 @@ -from zope.interface import implements +from zope.interface import implementer from twisted.trial import unittest from io import StringIO diff --git a/nevow/test/test_json.py b/nevow/test/test_json.py index b9154c4f..add3d458 100644 --- a/nevow/test/test_json.py +++ b/nevow/test/test_json.py @@ -5,7 +5,7 @@ Tests for L{nevow.json}. """ -from zope.interface import implements +from zope.interface import implementer from nevow.inevow import IAthenaTransportable from nevow import json, rend, page, loaders, tags, athena, testutil @@ -264,12 +264,12 @@ def test_customSerialization(self): L{IAthenaTransportable.getInitialArguments} when passed an object which can be adapted to L{IAthenaTransportable}. """ + @implementer(IAthenaTransportable) class Transportable(object): """ Completely parameterized L{IAthenaTransportable} implementation so different data can be easily tested. """ - implements(IAthenaTransportable) def __init__(self, jsClass, initialArgs): self.jsClass = jsClass diff --git a/nevow/test/test_newflat.py b/nevow/test/test_newflat.py index 01fa96cb..ef5cca74 100644 --- a/nevow/test/test_newflat.py +++ b/nevow/test/test_newflat.py @@ -7,7 +7,7 @@ import sys, traceback -from zope.interface import implements +from zope.interface import implementer from twisted.trial.unittest import TestCase from twisted.internet.defer import Deferred, succeed @@ -35,7 +35,7 @@ # traceback for frames associated with functions defined in this file. HERE = (lambda: None).__code__.co_filename - +@implementer(IRenderable) class TrivialRenderable(object): """ An object which renders to a parameterized value. @@ -43,7 +43,6 @@ class TrivialRenderable(object): @ivar result: The object which will be returned by the render method. @ivar requests: A list of all the objects passed to the render method. """ - implements(IRenderable) def __init__(self, result): self.result = result @@ -58,7 +57,7 @@ def render(self, request): return self.result - +@implementer(IRenderable) class RenderRenderable(object): """ An object which renders to a parameterized value and has a render method @@ -70,7 +69,6 @@ class RenderRenderable(object): @ivar tag: The value which will be returned from C{render}. @ivar result: The value which will be returned from the render method. """ - implements(IRenderable) def __init__(self, renders, name, tag, result): self.renders = renders @@ -529,8 +527,8 @@ def test_renderAttributedNestedInRenderResult(self): replaced with the return value of the named renderer on the L{IRenderable} which had the render method which returned the L{Tag}. """ + @implementer(IRenderable) class TwoRenderers(object): - implements(IRenderable) def renderer(self, name): return getattr(self, name) @@ -573,8 +571,8 @@ def test_renderMethodReturnsInputTag(self): If a render method returns the tag it was passed, the tag is flattened as though it did not have a render directive. """ + @implementer(IRenderable) class IdempotentRenderable(object): - implements(IRenderable) def renderer(self, name): return getattr(self, name) @@ -919,8 +917,8 @@ def test_flattenExceptionStack(self): def broken(): raise RuntimeError("foo") + @implementer(IRenderable) class BrokenRenderable(object): - implements(IRenderable) def render(self, request): # insert another stack frame before the exception @@ -991,8 +989,8 @@ def test_renderable(self): the repr of that object is included in the string representation of the exception. """ + @implementer(IRenderable) class Renderable(object): - implements(IRenderable) def __repr__(self): return "renderable repr" @@ -1150,8 +1148,8 @@ def test_renderableException(self): """ class TestException(Exception): pass + @implementer(IRenderable) class BrokenRenderable(object): - implements(IRenderable) def render(self, request): raise TestException() diff --git a/nevow/test/test_passobj.py b/nevow/test/test_passobj.py index 2625416d..7649ae5c 100644 --- a/nevow/test/test_passobj.py +++ b/nevow/test/test_passobj.py @@ -2,14 +2,13 @@ # See LICENSE for details. import formless -from zope.interface import implements +from zope.interface import implementer class IBar(formless.TypedInterface): bar = formless.String() - +@implementer(IBar) class Bar: - implements(IBar) def __init__(self, bar): self.bar = bar @@ -21,9 +20,8 @@ def __str__(self): class IFrob(formless.TypedInterface): integer = formless.Integer() - +@implementer(IFrob) class Frob: - implements(IFrob) def __init__(self, integer): self.integer = integer @@ -54,9 +52,8 @@ def frobber(frobber=formless.Object(interface=IFrob), frobee=formless.Object(IFr someList = formless.List() - +@implementer(IObjectTest) class ObjectTester: - implements(IObjectTest) def __init__(self): self.someList = [ @@ -144,9 +141,8 @@ def compoundChecker( return formless.Object(label="The Answer", interface=formless.Integer) compoundChecker = formless.autocallable(compoundChecker) - +@implementer(IAnotherTest) class AnotherTest: - implements(IAnotherTest) def aBarMethod(self, abar): return "You passed me %s" % abar @@ -184,8 +180,8 @@ def remove(self, removal): del debugInstance.breaks[removal.fn] list.remove(self, removal) class Dummy(formless.TypedInterface): pass + @implementer(Dummy) class BP: - implements(Dummy) def __init__(self, fn, ln): self.fn=fn self.ln=ln diff --git a/nevow/test/test_rend.py b/nevow/test/test_rend.py index feb25131..2d668326 100644 --- a/nevow/test/test_rend.py +++ b/nevow/test/test_rend.py @@ -1,7 +1,7 @@ # Copyright (c) 2004 Divmod. # See LICENSE for details. -from zope.interface import implements, Interface +from zope.interface import implementer, Interface from twisted.internet import defer from twisted.trial import unittest @@ -589,15 +589,16 @@ def test1(self, foo): class IThing(formless.TypedInterface): foo = formless.String() +@implementer(IThing) class Thing: - implements(IThing) + pass + class TestLocateConfigurable(unittest.TestCase): def test_onSelf(self): - + @implementer(IThing) class Page(rend.Page): - implements(IThing) docFactory = loaders.stan(html[freeform.renderForms()]) page = Page() @@ -636,8 +637,8 @@ class IDeferredProperty(formless.TypedInterface): from nevow import util deferred = util.Deferred() deferred.callback('the default value') + @implementer(IDeferredProperty) class Implementation(object): - implements(IDeferredProperty) d = deferred return deferredRender(rend.Page(Implementation(), docFactory=loaders.stan(html[freeform.renderForms('original')]))).addCallback( @@ -859,8 +860,8 @@ def child_foo(self, ctx): def test_freeformChildMixin_nonTrue(self): """Configurables that have c.__nonzero__()==False are accepted.""" + @implementer(iformless.IConfigurable) class SimpleConf(object): - implements(iformless.IConfigurable) # mock mock def postForm(self, ctx, bindingName, args): return 'SimpleConf OK' diff --git a/nevow/testutil.py b/nevow/testutil.py index 46427b28..81d95ba8 100644 --- a/nevow/testutil.py +++ b/nevow/testutil.py @@ -6,7 +6,7 @@ from subprocess import PIPE, Popen -from zope.interface import implements +from zope.interface import implementer try: import subunit @@ -33,9 +33,8 @@ def __init__(self, site): class FakeSite: pass - +@implementer(inevow.ISession) class FakeSession(Componentized): - implements(inevow.ISession) def __init__(self, avatar): Componentized.__init__(self) self.avatar = avatar @@ -46,7 +45,7 @@ def getLoggedInRoot(self): fs = FakeSession(None) - +@implementer(inevow.IRequest) class FakeRequest(Componentized): """ Implementation of L{inevow.IRequest} which is convenient to use in unit @@ -65,7 +64,6 @@ class FakeRequest(Componentized): @ivar _appRootURL: C{None} or the object passed to L{rememberRootURL}. """ - implements(inevow.IRequest) fields = None failure = None @@ -285,7 +283,7 @@ def mktemp(self): return tempfile.mktemp() TestCase.mktemp = mktemp - +@implementer(inevow.IFormDefaults) class AccumulatingFakeRequest(FakeRequest): """ I am a fake IRequest that is also a stub implementation of @@ -294,7 +292,6 @@ class AccumulatingFakeRequest(FakeRequest): This class is named I{accumulating} for historical reasons only. You probably want to ignore this and use L{FakeRequest} instead. """ - implements(iformless.IFormDefaults) def __init__(self, *a, **kw): FakeRequest.__init__(self, *a, **kw) diff --git a/nevow/url.py b/nevow/url.py index 4a6fb2ae..6ef0e3ad 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -10,7 +10,7 @@ import urllib.parse import urllib.request, urllib.parse, urllib.error -from zope.interface import implements +from zope.interface import implementer from twisted.web.util import redirectTo @@ -585,7 +585,7 @@ def __setstate__(self, state): self.__dict__ = state self._objmap = weakref.WeakKeyDictionary() - +@implementer(inevow.IResource) class URLRedirectAdapter: """ Adapter for URL and URLOverlay instances that results in an HTTP @@ -610,7 +610,6 @@ def locateChild(self, ctx, segments): # Redirect to the URL of this resource return url.URL.fromContext(ctx) """ - implements(inevow.IResource) def __init__(self, original): self.original = original diff --git a/nevow/vhost.py b/nevow/vhost.py index bc612ef0..2a062b9f 100644 --- a/nevow/vhost.py +++ b/nevow/vhost.py @@ -2,7 +2,7 @@ # See LICENSE for details. from twisted.python import log -from zope.interface import implements +from zope.interface import implementer from nevow import loaders, rend, inevow from nevow.stan import directive from nevow import tags @@ -128,12 +128,12 @@ def locateChild(self, ctx, segments): resrc = self._getResourceForRequest(inevow.IRequest(ctx)) return resrc, segments +@implementer(inevow.IResource) class _VHostMonsterResourcePrepathCleaner: """VHostMonsterResource cannot modify request.prepath because the segments it needs to remove are not appended to prepath until *after* it returns the (resource,segments) tuple. """ - implements(inevow.IResource) def locateChild(self, ctx, segments): request = inevow.IRequest(ctx) request.prepath = request.prepath[3:] @@ -141,6 +141,7 @@ def locateChild(self, ctx, segments): _prepathCleaner = _VHostMonsterResourcePrepathCleaner() +@implementer(inevow.IResource) class VHostMonsterResource: """VHostMonster resource that helps to deploy a Nevow site behind a proxy. @@ -178,7 +179,6 @@ class VHostMonsterResource: host name they are contacting. This can lead to cookie stealing or cross site scripting attacks. Never expose /vhost to the Internet. """ - implements(inevow.IResource) def locateChild(self, ctx, segments): From 92586a1c99701b46ef6ae081d4f18a996e69faed Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:11:33 -0800 Subject: [PATCH 003/157] implements -> @implementer --- examples/blogengine/axiomstore.py | 4 +- examples/blogengine/frontend.py | 6 +-- examples/blogengine/smtpserver.py | 6 +-- examples/customform/customform.py | 4 +- examples/db/db.py | 6 +-- examples/formbuilder/formbuilder.py | 4 +- examples/formpost/formpost.py | 4 +- examples/formpost/formpost2.py | 4 +- examples/guarded/guarded.py | 4 +- examples/guarded/guarded2.py | 4 +- examples/image_uploader/images.py | 4 +- examples/image_uploader/imagination.py | 4 +- examples/irenderer/irenderer.py | 10 ++--- examples/irenderer/simple_irenderer.py | 7 +-- examples/logout_guard/logout_guard.py | 4 +- examples/logout_guard/logout_guard2.py | 4 +- examples/most_basic/most_basic.py | 8 ++-- examples/pastebin/pastebin/service.py | 13 +++--- examples/pastebin/pastebin/web/pages.py | 6 +-- examples/postit/store.py | 4 +- examples/todo/controller.py | 4 +- examples/todo/store.py | 4 +- examples/tree/tree.py | 4 +- examples/userdb/userdb.tac | 8 ++-- examples/with_axiom/powerups.py | 4 +- formless/annotate.py | 7 ++- formless/configurable.py | 4 +- formless/formutils.py | 6 +-- formless/processors.py | 22 +++++----- formless/test/test_freeform.py | 58 ++++++++++++++----------- formless/webform.py | 23 ++++------ nevow/accessors.py | 20 +++------ nevow/appserver.py | 15 +++---- nevow/athena.py | 18 +++----- nevow/blocks.py | 4 +- nevow/canvas.py | 5 +-- nevow/compression.py | 8 ++-- nevow/compy.py | 5 ++- 38 files changed, 157 insertions(+), 172 deletions(-) diff --git a/examples/blogengine/axiomstore.py b/examples/blogengine/axiomstore.py index ff954fe1..f9517b62 100644 --- a/examples/blogengine/axiomstore.py +++ b/examples/blogengine/axiomstore.py @@ -1,5 +1,5 @@ from iblogengine import IBlog -from zope.interface import implements +from zope.interface import implementer from axiom import item, store, attributes, sequence from epsilon.extime import Time @@ -24,8 +24,8 @@ def __init__(self, **kw): def setModified(self): self.modified = Time() +@implementer(IBlog) class Blog(item.Item, item.InstallableMixin): - implements(IBlog) typeName = "BlogengineBlog" schemaVersion = 1 diff --git a/examples/blogengine/frontend.py b/examples/blogengine/frontend.py index 70b05c98..4f09c914 100644 --- a/examples/blogengine/frontend.py +++ b/examples/blogengine/frontend.py @@ -1,5 +1,5 @@ from time import time as now -from zope.interface import implements, Interface +from zope.interface import implementer, Interface from twisted.web import xmlrpc from twisted.python.components import registerAdapter @@ -109,8 +109,8 @@ def child_thx(self, ctx): return Thx() ################################## +@implementer(IInsert) class NewEntry(BaseUI): - implements(IInsert) docFactory = loaders.stan( t.html[ @@ -150,8 +150,8 @@ class Thx(rend.Page): ]) #################################### +@implementer(IInsert) class Entry(UI): - implements(IInsert) def data_getEntries(self, ctx, data): return [data] diff --git a/examples/blogengine/smtpserver.py b/examples/blogengine/smtpserver.py index c8f1a6ad..e73ba33b 100644 --- a/examples/blogengine/smtpserver.py +++ b/examples/blogengine/smtpserver.py @@ -5,7 +5,7 @@ """ A toy email server. """ -from zope.interface import implements +from zope.interface import implementer from twisted.internet import defer from twisted.mail import smtp @@ -31,8 +31,8 @@ Content: CONTENT """ +@implementer(smtp.IMessageDelivery) class BlogMessageDelivery: - implements(smtp.IMessageDelivery) def __init__(self, store): self.store = store @@ -49,8 +49,8 @@ def validateTo(self, user): return lambda: BlogMessage(self.store) raise smtp.SMTPBadRcpt(user) +@implementer(smtp.IMessage) class BlogMessage: - implements(smtp.IMessage) def __init__(self, store): self.lines = [] diff --git a/examples/customform/customform.py b/examples/customform/customform.py index fdd669c5..a52b7204 100644 --- a/examples/customform/customform.py +++ b/examples/customform/customform.py @@ -4,7 +4,7 @@ #from twisted.application import internet, service #from twisted.web import static -from zope.interface import implements +from zope.interface import implementer from nevow import rend from nevow import url @@ -121,10 +121,10 @@ def doSomething( doSomething = annotate.autocallable(doSomething) +@implementer(ISomething) class Root(rend.Page): """Render a custom and normal form for an ISomething. """ - implements(ISomething) addSlash = True child_webform_css = webform.defaultCSS diff --git a/examples/db/db.py b/examples/db/db.py index 4d3b826f..44361974 100644 --- a/examples/db/db.py +++ b/examples/db/db.py @@ -1,5 +1,5 @@ -from zope.interface import implements +from zope.interface import implementer from nevow import inevow from nevow import loaders @@ -46,8 +46,8 @@ def addItem(newSubject=annotate.String()): addItem = annotate.autocallable(addItem) +@implementer(IAddItem) class DBBrowser(rend.Page): - implements(IAddItem) addSlash = True def addItem(self, newSubject): @@ -94,8 +94,8 @@ def setSubject(newSubject=annotate.String(label="Change Subject")): setSubject = annotate.autocallable(setSubject) +@implementer(IItemWithSubject) class DBItem(rend.Page): - implements(IItemWithSubject) addSlash=True def setSubject(self, newSubject): diff --git a/examples/formbuilder/formbuilder.py b/examples/formbuilder/formbuilder.py index 1f522aa3..f98aa8d8 100644 --- a/examples/formbuilder/formbuilder.py +++ b/examples/formbuilder/formbuilder.py @@ -1,6 +1,6 @@ ## formbuilder -from zope.interface import implements +from zope.interface import implementer from nevow import rend from nevow import loaders @@ -56,8 +56,8 @@ def clearForm(): clearForm = annotate.autocallable(clearForm) +@implementer(IFormBuilder) class FormBuilder(rend.Page): - implements(IFormBuilder) addSlash = True def __init__(self): diff --git a/examples/formpost/formpost.py b/examples/formpost/formpost.py index 66cd723b..e3deba20 100644 --- a/examples/formpost/formpost.py +++ b/examples/formpost/formpost.py @@ -1,6 +1,6 @@ # -*- python -*- -from zope.interface import implements +from zope.interface import implementer from nevow import loaders from nevow import rend @@ -14,8 +14,8 @@ class IMyForm(annotate.TypedInterface): foo = annotate.Integer() +@implementer(IMyForm) class FormPage(rend.Page): - implements(IMyForm) addSlash = True diff --git a/examples/formpost/formpost2.py b/examples/formpost/formpost2.py index 6612d6a3..4c2b32c8 100644 --- a/examples/formpost/formpost2.py +++ b/examples/formpost/formpost2.py @@ -1,6 +1,6 @@ # -*- python -*- -from zope.interface import implements +from zope.interface import implementer from nevow import loaders from nevow import rend @@ -40,8 +40,8 @@ def bar(baz=annotate.Integer(), bar = annotate.autocallable(bar) +@implementer(IMyForm) class Implementation(object): - implements(IMyForm) foo = 5 diff --git a/examples/guarded/guarded.py b/examples/guarded/guarded.py index f742a5c9..392b3372 100644 --- a/examples/guarded/guarded.py +++ b/examples/guarded/guarded.py @@ -1,5 +1,5 @@ -from zope.interface import implements +from zope.interface import implementer from twisted.cred import portal, checkers, credentials @@ -60,11 +60,11 @@ def noLogout(): return None +@implementer(portal.IRealm) class MyRealm: """A simple implementor of cred's IRealm. For web, this gives us the LoggedIn page. """ - implements(portal.IRealm) def requestAvatar(self, avatarId, mind, *interfaces): for iface in interfaces: diff --git a/examples/guarded/guarded2.py b/examples/guarded/guarded2.py index 16aab121..0d4fa28c 100644 --- a/examples/guarded/guarded2.py +++ b/examples/guarded/guarded2.py @@ -1,4 +1,4 @@ -from zope.interface import implements +from zope.interface import implementer from twisted.cred import portal, checkers, credentials @@ -60,11 +60,11 @@ def noLogout(): return None +@implementer(portal.IRealm) class MyRealm: """A simple implementor of cred's IRealm. For web, this gives us the LoggedIn page. """ - implements(portal.IRealm) def requestAvatar(self, avatarId, mind, *interfaces): for iface in interfaces: diff --git a/examples/image_uploader/images.py b/examples/image_uploader/images.py index 5ae3d676..3d6d442b 100644 --- a/examples/image_uploader/images.py +++ b/examples/image_uploader/images.py @@ -1,4 +1,4 @@ -from zope.interface import implements, Interface +from zope.interface import implementer, Interface from axiom import store, item from axiom.attributes import text, bytes @@ -12,8 +12,8 @@ class Image(item.Item): image = bytes() hash = text() +@implementer(IImages) class Application(item.Item, item.InstallableMixin): - implements(IImages) name = text() diff --git a/examples/image_uploader/imagination.py b/examples/image_uploader/imagination.py index e3099cf6..5bc1a77a 100644 --- a/examples/image_uploader/imagination.py +++ b/examples/image_uploader/imagination.py @@ -1,4 +1,4 @@ -from zope.interface import implements +from zope.interface import implementer from nevow import loaders, rend, tags as t, static, url from formless import webform, annotate @@ -43,9 +43,9 @@ def renderHTTP(self, ctx): return self.store.transact(super(TransactionalPage, self).renderHTTP, ctx) +@implementer(IInsert) class Root(TransactionalPage): child_webform_css = webform.defaultCSS - implements(IInsert) docFactory = loaders.stan( t.html[ diff --git a/examples/irenderer/irenderer.py b/examples/irenderer/irenderer.py index 61b69c22..a4b275db 100644 --- a/examples/irenderer/irenderer.py +++ b/examples/irenderer/irenderer.py @@ -6,7 +6,7 @@ import random -from zope.interface import implements, Interface +from zope.interface import implementer, Interface from twisted.python.components import registerAdapter, Adapter from nevow import inevow @@ -48,10 +48,10 @@ class IFullView(Interface): # Define the rendering adapters that do the real work of rendering an # object. +@implementer(inevow.IRenderer, ISummaryView) class PersonSummaryView(Adapter): """Render a summary of a Person. """ - implements(inevow.IRenderer, ISummaryView) def rend(self, data): return T.div(_class="summaryView person")[ T.a(href=['mailto:',self.original.email])[ @@ -59,10 +59,10 @@ def rend(self, data): ] ] +@implementer(inevow.IRenderer, IFullView) class PersonFullView(Adapter): """Render a full view of a Person. """ - implements(inevow.IRenderer, IFullView) def rend(self, data): attrs = ['firstName', 'lastName', 'email'] return T.div(_class="fullView person")[ @@ -73,19 +73,19 @@ def rend(self, data): ] ] +@implementer(inevow.IRenderer, ISummaryView) class BookmarkSummaryView(Adapter): """Render a summary of a Person. """ - implements(inevow.IRenderer, ISummaryView) def rend(self, data): return T.div(_class="summaryView bookmark")[ T.a(href=self.original.url)[self.original.name] ] +@implementer(inevow.IRenderer, IFullView) class BookmarkFullView(Adapter): """Render a full view of a Bookmark. """ - implements(inevow.IRenderer, IFullView) def rend(self, data): attrs = ['name', 'url'] return T.div(_class="fullView bookmark")[ diff --git a/examples/irenderer/simple_irenderer.py b/examples/irenderer/simple_irenderer.py index f5efc184..3b1f9dbf 100644 --- a/examples/irenderer/simple_irenderer.py +++ b/examples/irenderer/simple_irenderer.py @@ -1,4 +1,4 @@ -from zope.interface import implements +from zope.interface import implementer from twisted.python.components import registerAdapter, Adapter @@ -58,10 +58,11 @@ def __init__(self, name, url): self.name = name self.url = url + +@implementer(inevow.IRenderer) class PersonView(Adapter): """Render a full view of a Person. """ - implements(inevow.IRenderer) def rend(self, data): attrs = ['firstName', 'lastName', 'nickname'] return T.div(_class="View person")[ @@ -72,10 +73,10 @@ def rend(self, data): ] ] +@implementer(inevow.IRenderer) class BookmarkView(Adapter): """Render a full view of a Bookmark. """ - implements(inevow.IRenderer) def rend(self, data): attrs = ['name', 'url'] return T.div(_class="View bookmark")[ diff --git a/examples/logout_guard/logout_guard.py b/examples/logout_guard/logout_guard.py index bfc81175..40845ee6 100644 --- a/examples/logout_guard/logout_guard.py +++ b/examples/logout_guard/logout_guard.py @@ -3,7 +3,7 @@ """ # Some resource for our site -from zope.interface import implements +from zope.interface import implementer from nevow import guard from nevow import rend @@ -32,8 +32,8 @@ def __init__(self, request, credentials): self.request = request self.credentials = credentials +@implementer(IRealm) class MyRealm: - implements(IRealm) def requestAvatar(self, avatar_id, mind, *interfaces): if IResource in interfaces: diff --git a/examples/logout_guard/logout_guard2.py b/examples/logout_guard/logout_guard2.py index 68f20244..46ca50dc 100644 --- a/examples/logout_guard/logout_guard2.py +++ b/examples/logout_guard/logout_guard2.py @@ -7,7 +7,7 @@ # import random -from zope.interface import implements, Interface +from zope.interface import implementer, Interface from nevow import guard from nevow import rend @@ -68,8 +68,8 @@ def __init__(self, request, credentials): self.request = request self.credentials = credentials +@implementer(IRealm) class MyRealm: - implements(IRealm) def requestAvatar(self, avatar_id, mind, *interfaces): if IResource in interfaces: diff --git a/examples/most_basic/most_basic.py b/examples/most_basic/most_basic.py index 70947d1b..f78b6019 100644 --- a/examples/most_basic/most_basic.py +++ b/examples/most_basic/most_basic.py @@ -1,4 +1,4 @@ -from zope.interface import implements +from zope.interface import implementer from nevow import inevow @@ -15,8 +15,8 @@ # tuple of (page, remaining_segments) # if there is no page, and you want to display a 404 page, you will need to return # a None, () tuple. +@implementer(inevow.IResource) class Root(object): - implements(inevow.IResource) def locateChild(self, ctx, segments): # This locateChild is 'stupid' since it can only work if the tree of @@ -42,8 +42,8 @@ def renderHTTP(self, ctx): foo """ +@implementer(inevow.IResource) class Foo(object): - implements(inevow.IResource) def locateChild(self, ctx, segments): # segments is the remaining segments returned by the root locateChild @@ -58,8 +58,8 @@ def renderHTTP(self, ctx): baz """ +@implementer(inevow.IResource) class Baz(object): - implements(inevow.IResource) def locateChild(self, ctx, segments): return None, () def renderHTTP(self, ctx): diff --git a/examples/pastebin/pastebin/service.py b/examples/pastebin/pastebin/service.py index 816b42f0..9cb2dfed 100644 --- a/examples/pastebin/pastebin/service.py +++ b/examples/pastebin/pastebin/service.py @@ -1,7 +1,7 @@ import pickle as pickle import os.path import time -from zope.interface import implements +from zope.interface import implementer from twisted.application import service from twisted.python import log @@ -19,10 +19,9 @@ def __init__(self, oid, author, time): self.version = 0 +@implementer(interfaces.IPasteBin) class FSPasteBinService(service.Service): - implements(interfaces.IPasteBin) - def __init__(self, storageDir): self._dir = storageDir @@ -84,9 +83,9 @@ def stopService(self): f = file(self._makeFilename('index'), 'wb') pickle.dump(d, f, pickle.HIGHEST_PROTOCOL) -class Pasting(object): - - implements(pasting.IPasting) +@implementer(pasting.IPasting) +class Pasting(object): + def __init__(self, data): self._data = data @@ -103,9 +102,9 @@ def getHistory(self): return history +@implementer(pasting.IVersion) class Version: - implements(pasting.IVersion) def __init__(self, data): self._data = data diff --git a/examples/pastebin/pastebin/web/pages.py b/examples/pastebin/pastebin/web/pages.py index 251886d2..bc8ac659 100644 --- a/examples/pastebin/pastebin/web/pages.py +++ b/examples/pastebin/pastebin/web/pages.py @@ -1,6 +1,6 @@ from io import StringIO import time -from zope.interface import implements +from zope.interface import implementer from twisted.python import htmlizer from twisted.web import static @@ -107,8 +107,8 @@ def render_content(self, context, data): return tag +@implementer(IAddPasting) class RootPage(BasePage): - implements(IAddPasting) addSlash = True @@ -132,9 +132,9 @@ def addPasting(self, request, author, text): request.setComponent(iformless.IRedirectAfterPost, '/'+str(oid)) +@implementer(IEditPasting) class Pasting(BasePage): - implements(IEditPasting) contentTemplateFile = 'pasting.html' def __init__(self, pastebin, pastingOid, version=-1): diff --git a/examples/postit/store.py b/examples/postit/store.py index 5630ba06..accfa28f 100644 --- a/examples/postit/store.py +++ b/examples/postit/store.py @@ -1,4 +1,4 @@ -from zope.interface import implements, Interface +from zope.interface import implementer, Interface from axiom import item, store from axiom.attributes import text, timestamp @@ -18,8 +18,8 @@ class Post(item.Item): author = text() created = timestamp() +@implementer(IPostit) class Application(item.Item, item.InstallableMixin): - implements(IPostit) name = text() diff --git a/examples/todo/controller.py b/examples/todo/controller.py index 7316e476..1f24a669 100644 --- a/examples/todo/controller.py +++ b/examples/todo/controller.py @@ -1,4 +1,4 @@ -from zope.interface import implements +from zope.interface import implementer from nevow import rend, loaders, tags as t from formless import annotate, webform @@ -21,8 +21,8 @@ def update(ctx=annotate.Context(), pass update = annotate.autocallable(update, invisible=True) +@implementer(ITodo) class Root(rend.Page): - implements(ITodo) child_css = webform.defaultCSS diff --git a/examples/todo/store.py b/examples/todo/store.py index 021331f0..2c5c1b44 100644 --- a/examples/todo/store.py +++ b/examples/todo/store.py @@ -1,9 +1,9 @@ -from zope.interface import implements +from zope.interface import implementer import pgasync import itodo +@implementer(itodo.ITodos) class Todos(object): - implements(itodo.ITodos) def __init__(self, dbname, user, password, host): self.original = pgasync.ConnectionPool("pgasync", dbname=dbname, user=user, password=password, host=host) diff --git a/examples/tree/tree.py b/examples/tree/tree.py index d1f956f0..53002d0d 100644 --- a/examples/tree/tree.py +++ b/examples/tree/tree.py @@ -1,4 +1,4 @@ -from zope.interface import implements +from zope.interface import implementer from twisted.python.components import registerAdapter @@ -28,8 +28,8 @@ def addChild(name=annotate.String(required=True), pass addChild = annotate.autocallable(addChild) +@implementer(ITreeEdit) class TreeRenderer(rend.Page): - implements(ITreeEdit) addSlash = True docFactory = loaders.htmlstr(""" diff --git a/examples/userdb/userdb.tac b/examples/userdb/userdb.tac index d5f1d9ed..4ac24aa0 100644 --- a/examples/userdb/userdb.tac +++ b/examples/userdb/userdb.tac @@ -1,7 +1,7 @@ import string import urllib -from zope.interface import implements +from zope.interface import implementer from twisted.internet import defer from twisted.python import failure @@ -173,8 +173,8 @@ class NotLoggedIn(rend.Page): ] ]) +@implementer(ILogout) class Logout(rend.Page): - implements(ILogout) def logout(self, request): request.getSession().expire() @@ -182,8 +182,8 @@ class Logout(rend.Page): docFactory = loaders.stan(html[webform.renderForms()]) +@implementer(IEditUser, IDeleteUser) class UserPage(rend.Page): - implements(IEditUser, IDeleteUser) def __init__(self, user): rend.Page.__init__(self) @@ -295,8 +295,8 @@ class UserPage(rend.Page): ] ]) +@implementer(ICreateUser) class UserBrowserPage(rend.Page): - implements(ICreateUser) addSlash = True diff --git a/examples/with_axiom/powerups.py b/examples/with_axiom/powerups.py index f3264d56..312f674d 100644 --- a/examples/with_axiom/powerups.py +++ b/examples/with_axiom/powerups.py @@ -1,4 +1,4 @@ -from zope.interface import implements, Interface +from zope.interface import implementer, Interface from axiom import store, item, attributes @@ -12,8 +12,8 @@ class Book(item.Item): class ILibrary(Interface): pass +@implementer(ILibrary) class Library(item.Item, item.InstallableMixin): - implements(ILibrary) typeName = 'library' schemaVersion = 1 diff --git a/formless/annotate.py b/formless/annotate.py index 0b503618..6a69d991 100644 --- a/formless/annotate.py +++ b/formless/annotate.py @@ -10,7 +10,7 @@ import sys import inspect import warnings -from zope.interface import implements +from zope.interface import implementer from zope.interface.interface import InterfaceClass, Attribute from nevow import util @@ -359,8 +359,8 @@ def __repr__(self): +@implementer(iformless.IActionableType) class List(Object): - implements(iformless.IActionableType) complexType = True def __init__(self, actions=None, header='', footer='', separator='', *args, **kw): @@ -489,7 +489,7 @@ def autocallable(method, action=None, visible=False, **kw): ## what names are bound to what types ####################################### - +@implementer(iformless.IBinding) class Binding(object): """Bindings bind a Typed instance to a name. When TypedInterface is subclassed, the metaclass looks through the dict looking for all properties and methods. @@ -509,7 +509,6 @@ class Binding(object): Binding when it is constructed to keep track of what the method is supposed to return. """ - implements(iformless.IBinding) label = None description = '' diff --git a/formless/configurable.py b/formless/configurable.py index 6d12cce5..4c004937 100644 --- a/formless/configurable.py +++ b/formless/configurable.py @@ -1,7 +1,7 @@ # Copyright (c) 2004 Divmod. # See LICENSE for details. -from zope.interface import implements, providedBy +from zope.interface import implementer, providedBy from formless.iformless import IConfigurable, IActionableType, IBinding from formless.annotate import Argument, ElementBinding, GroupBinding, Object, TypedInterface @@ -9,8 +9,8 @@ from nevow import inevow from nevow.context import WovenContext +@implementer(IConfigurable) class Configurable(object): - implements(IConfigurable) bindingDict = None diff --git a/formless/formutils.py b/formless/formutils.py index 11f0dda9..88f29ee2 100644 --- a/formless/formutils.py +++ b/formless/formutils.py @@ -3,7 +3,7 @@ -from zope.interface import implements +from zope.interface import implementer from twisted.python import components @@ -85,11 +85,11 @@ def getAllDefaults(self, key): def clearAll(self): self.defaults = {} - +@implementer(iformless.IFormErrors) class FormErrors(components.Adapter): """An object which keeps track of which forms have which errors """ - implements(iformless.IFormErrors) + def __init__(self): self.errors = {} diff --git a/formless/processors.py b/formless/processors.py index 69f6904e..c77e77db 100644 --- a/formless/processors.py +++ b/formless/processors.py @@ -2,7 +2,7 @@ # See LICENSE for details. import warnings -from zope.interface import implements +from zope.interface import implementer from twisted.python import components @@ -31,9 +31,8 @@ def _(fail): else: return result - +@implementer(iformless.IInputProcessor) class ProcessGroupBinding(components.Adapter): - implements(iformless.IInputProcessor) def process(self, context, boundTo, data): ## THE SPEC: self.original.typedValue.iface.__spec__ @@ -79,8 +78,8 @@ def _finish(ignored): raise formless.ValidateError(failures, 'Error:', results) return DeferredList(waiters).addBoth(_finish) +@implementer(iformless.IInputProcessor) class ProcessMethodBinding(components.Adapter): - implements(iformless.IInputProcessor) def process(self, context, boundTo, data, autoConfigure = True): """Knows how to process a dictionary of lists @@ -117,8 +116,8 @@ def _except(e): boundTo, results) return results +@implementer(iformless.IInputProcessor) class ProcessPropertyBinding(components.Adapter): - implements(iformless.IInputProcessor) def process(self, context, boundTo, data, autoConfigure = True): """Knows how to process a dictionary of lists @@ -142,8 +141,8 @@ def process(self, context, boundTo, data, autoConfigure = True): raise formless.ValidateError({binding.name: e.reason}, e.reason, result) return result +@implementer(iformless.IInputProcessor) class ProcessTyped(components.Adapter): - implements(iformless.IInputProcessor) def process(self, context, boundTo, data): """data is a list of strings at this point @@ -168,8 +167,8 @@ def process(self, context, boundTo, data): warnings.warn('Typed.coerce takes two values now, the value to coerce and the configurable in whose context the coerce is taking place. %s %s' % (typed.__class__, typed)) return typed.coerce(val) +@implementer(iformless.IInputProcessor) class ProcessPassword(components.Adapter): - implements(iformless.IInputProcessor) def process(self, context, boundTo, data): """Password needs to look at two passwords in the data, @@ -201,22 +200,21 @@ def process(self, context, boundTo, data): warnings.warn('Typed.coerce takes two values now, the value to coerce and the configurable in whose context the coerce is taking place. %s %s' % (typed.__class__, typed)) return typed.coerce(data[0]) + +@implementer(iformless.IInputProcessor) class ProcessRequest(components.Adapter): - implements(iformless.IInputProcessor) def process(self, context, boundTo, data): return context.locate(inevow.IRequest) - +@implementer(iformless.IInputProcessor) class ProcessContext(components.Adapter): - implements(iformless.IInputProcessor) def process(self, context, boundTo, data): return context - +@implementer(iformless.IInputProcessor) class ProcessUpload(components.Adapter): - implements(iformless.IInputProcessor) def process(self, context, boundTo, data): diff --git a/formless/test/test_freeform.py b/formless/test/test_freeform.py index 9e088d0b..1093e91a 100644 --- a/formless/test/test_freeform.py +++ b/formless/test/test_freeform.py @@ -17,8 +17,8 @@ from nevow.test import test_flatstan +@implementer(iformless.IConfigurableFactory) class Base(test_flatstan.Base): - implements(iformless.IConfigurableFactory) synchronousLocateConfigurable = False @@ -68,9 +68,8 @@ class Complete(Base): def test_configureProperty(self): class IStupid(formless.TypedInterface): foo = formless.String() - + @implementer(IStupid) class StupidThing(configurable.Configurable): - implements(IStupid) def __init__(self): configurable.Configurable.__init__(self, None) @@ -92,8 +91,8 @@ def foo(bar=formless.String()): return formless.String() foo = formless.autocallable(foo) + @implementer(IDumb) class DumbThing(configurable.Configurable): - implements(IDumb) def foo(self, bar): return "baz" @@ -184,8 +183,8 @@ def test_2_renderWithObjectPropertyValues(self): class IDefaultProperty(formless.TypedInterface): default = formless.Integer(default=2) + @implementer(IDefaultProperty) class Foo(configurable.Configurable): - implements(IDefaultProperty) default = 54 def later(val): @@ -200,8 +199,9 @@ class IDefaultProperty(formless.TypedInterface): class Adaptee(object): default = 69 + @implementer(IDefaultProperty) class Bar(configurable.Configurable): - implements(IDefaultProperty) + pass def later(val): self.failIfSubstring('2', val) @@ -216,8 +216,9 @@ def aMethod(foo=formless.String(default="The foo")): aProperty = formless.String(default="The property") + @implementer(IBindingDefaults) class Implements(configurable.Configurable): - implements(IBindingDefaults) + pass def later(val): self.assertSubstring("The foo", val) @@ -233,8 +234,9 @@ def bMethod(foo=formless.String(default="NOTBAR")): aMethod = formless.autocallable(aMethod) bMethod = formless.autocallable(bMethod) + @implementer(IDynamicDefaults) class Implements(configurable.Configurable): - implements(IDynamicDefaults) + pass def later(val): self.assertSubstring("YESFOO", val) @@ -255,8 +257,9 @@ def aMethod(aString = formless.String()): return None aMethod = formless.autocallable(aMethod) + @implementer(ISimpleTypedInterface) class ANonConfigurable(object): # Not subclassing Configurable - implements(ISimpleTypedInterface) # But implements a TypedInterface + pass def later(val): self.assertSubstring('anInt', val) @@ -273,8 +276,8 @@ def password(pword = formless.Password(), integer=formless.Integer()): pass password = formless.autocallable(password) + @implementer(IAPasswordMethod) class APasswordImplementation(object): - implements(IAPasswordMethod) matched = False def password(self, pword, integer): self.matched = True @@ -296,8 +299,8 @@ def test_2_propertyFailed(self): class IAProperty(formless.TypedInterface): prop = formless.Integer() + @implementer(IAProperty) class Impl(object): - implements(IAProperty) prop = 5 theObj = Impl() @@ -325,8 +328,8 @@ def buriedAlive(): pass buriedAlive = formless.autocallable(buriedAlive) + @implementer(Outer) class Implementation(object): - implements(Outer) one = 1 two = 2 buckled = False @@ -373,8 +376,8 @@ def foo(abc=formless.String()): pass foo = formless.autocallable(foo) - class Impl: - implements(IFoo) + @implementer(IFoo) + class Impl: pass def later(val): self.assertSubstring('value="Foo"', val) @@ -389,8 +392,9 @@ def foo(abc=formless.String()): pass foo = formless.autocallable(foo, action='FooFooFoo') + @implementer(IFoo) class Impl: - implements(IFoo) + pass def later(val): self.assertSubstring('value="FooFooFoo"', val) @@ -405,8 +409,9 @@ def sig(abc=formless.String()): foo = formless.autocallable(sig) bar = formless.autocallable(sig, action='FooFooFOo') + @implementer(IFoo) class Impl: - implements(IFoo) + pass def later1(val): self.assertSubstring('value="Foo"', val) @@ -434,8 +439,8 @@ def theFunc(test=typedinst): pass theFunc = formless.autocallable(theFunc) + @implementer(IMyInterface) class Implementation(object): - implements(IMyInterface) called = False def theFunc(self, test): self.called = True @@ -455,8 +460,9 @@ def test_uneditable(self): class Uneditable(formless.TypedInterface): aProp = formless.String(description="the description", immutable=True) + @implementer(Uneditable) class Impl(object): - implements(Uneditable) + pass aProp = property(lambda self: "HELLO") @@ -477,8 +483,8 @@ def test_property(self): class IThing(formless.TypedInterface): foo = formless.Integer() + @implementer(IThing) class Thing: - implements(IThing) foo = 1 inst = Thing() @@ -504,8 +510,8 @@ class IMethod(formless.TypedInterface): def foo(): pass foo = formless.autocallable(foo) + @implementer(IMethod) class Method(object): - implements(IMethod) def foo(self): return returnResult @@ -543,8 +549,9 @@ def test_property(self): class ITest(formless.TypedInterface): foo = formless.String() + @implementer(ITest) class Impl: - implements(ITest) + pass impl = Impl() ctx = self.setupContext() @@ -578,8 +585,9 @@ def foo(foo = formless.String()): pass foo = formless.autocallable(foo) + @implementer(ITest) class Impl: - implements(ITest) + pass impl = Impl() ctx = self.setupContext() @@ -596,8 +604,8 @@ def test_property(self): class IThing(formless.TypedInterface): aString = formless.String(str=True) + @implementer(IThing) class Impl(object): - implements(IThing) aString = None inst = Impl() @@ -619,8 +627,8 @@ def choiceyFunc(arg = formless.Choice(["one", "two"], required=True)): pass choiceyFunc = formless.autocallable(choiceyFunc) + @implementer(IFormyThing class Impl(object): - implements(IFormyThing) def choiceyFunc(innerSelf, arg): self.called.append(arg) @@ -645,8 +653,8 @@ def meth(foo = formless.String()): pass meth = formless.autocallable(meth) + @implementer(ITest) class Impl: - implements(ITest) foo = 'fooFOOfoo' impl = Impl() diff --git a/formless/webform.py b/formless/webform.py index 7a71bf9a..bcf226e0 100644 --- a/formless/webform.py +++ b/formless/webform.py @@ -7,7 +7,7 @@ import warnings -from zope.interface import implements, Interface +from zope.interface import implementer, Interface from twisted.python import components @@ -25,18 +25,16 @@ defaultCSS = File(util.resource_filename('formless', 'freeform-default.css'), 'text/css') - +@implementer(inevow.IRenderer, iformless.ITypedRenderer) class DefaultRenderer(object): - implements(inevow.IRenderer, iformless.ITypedRenderer) complexType = False def rend(self, context, data): return StringRenderer(data) defaultBindingRenderer = DefaultRenderer() - +@implementer(inevow.IRenderer, iformless.ITypedRenderer) class BaseInputRenderer(components.Adapter): - implements(inevow.IRenderer, iformless.ITypedRenderer) complexType = False def rend(self, context, data): defaults = context.locate(iformless.IFormDefaults) @@ -176,25 +174,22 @@ class RadioRenderer(ChoiceRenderer): tags.input(type="radio", name=slot('name'), value=valToKey, render=isChecked)[ lambda c, d: iformless.ITyped(c).stringify(d)]]] - +@implementer(inevow.IRenderer, iformless.ITypedRenderer) class ObjectRenderer(components.Adapter): - implements(inevow.IRenderer, iformless.ITypedRenderer) complexType = True def rend(self, context, data): configurable = context.locate(iformless.IConfigurable) return getattr(configurable, data.name) - +@implementer(inevow.IRenderer, iformless.ITypedRenderer) class NullRenderer(components.Adapter): """Use a NullRenderer as the ITypedRenderer adapter when nothing should be included in the output. """ - implements(inevow.IRenderer, iformless.ITypedRenderer) def rend(self, context, data): return '' - +@implementer(inevow.IRenderer) class GroupBindingRenderer(components.Adapter): - implements(inevow.IRenderer) def rend(self, context, data): context.remember(data, iformless.IBinding) @@ -229,9 +224,8 @@ def generateBindings(): generateBindings(), tags.input(type="submit")]] - +@implementer(inevow.IRenderer) class BaseBindingRenderer(components.Adapter): - implements(inevow.IRenderer) isGrouped = False needsSkin = False @@ -359,9 +353,8 @@ def generateArguments(self, context, args): context.fillSlots( 'argument!!%s' % argument.name, pat ) yield pat - +@implementer(inevow.IRenderer) class ButtonRenderer(components.Adapter): - implements(inevow.IRenderer) def rend(self, context, data): return tags.input(id=keyToXMLID(context.key), type='submit', value=data.label, name=data.name, class_="freeform-button") diff --git a/nevow/accessors.py b/nevow/accessors.py index ac212595..78ca3e2e 100644 --- a/nevow/accessors.py +++ b/nevow/accessors.py @@ -12,7 +12,7 @@ methods found in the stan tree. """ -from zope.interface import implements +from zope.interface import implementer import twisted.python.components as tpc @@ -40,9 +40,8 @@ def convertToData(data, context): class NoAccessor(NotImplementedError): pass - +@implementer(IGettable) class DirectiveAccessor(tpc.Adapter): - implements(IGettable) def get(self, context): data = context.locate(IData) @@ -52,27 +51,24 @@ def get(self, context): child = container.child(context, self.original.name) return child - +@implementer(IGettable) class SlotAccessor(tpc.Adapter): - implements(IGettable) def get(self, context): return context.locateSlotData(self.original.name) - +@implementer(IGettable) class FunctionAccessor(tpc.Adapter): - implements(IGettable) def get(self, context): return self.original(context, context.locate(IData)) - +@implementer(IGettable) class DictionaryContainer(tpc.Adapter): - implements(IContainer) def child(self, context, name): return self.original[name] - +@implementer(IContainer) class ObjectContainer(tpc.Adapter): """Retrieve object attributes in response to a data directive; providing easy access to your application objects' attributes. @@ -104,7 +100,6 @@ class ObjectContainer(tpc.Adapter):
""" - implements(IContainer) def child(self, context, name): if name[:1] == '_': @@ -118,9 +113,8 @@ def intOrNone(s): except ValueError: return None - +@implementer(IContainer) class ListContainer(tpc.Adapter): - implements(IContainer) def child(self, context, name): if ':' in name: diff --git a/nevow/appserver.py b/nevow/appserver.py index c73d9c90..ab27d989 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -11,7 +11,7 @@ from collections import MutableMapping from urllib.parse import unquote -from zope.interface import implements, classImplements +from zope.interface import implementer, classImplements import twisted.python.components as tpc from twisted.web import server @@ -105,9 +105,8 @@ def has_key(self, key): return key in self - +@implementer(inevow.ICanHandleException) class UninformativeExceptionHandler: - implements(inevow.ICanHandleException) def renderHTTP_exception(self, ctx, reason): request = inevow.IRequest(ctx) @@ -121,9 +120,8 @@ def renderInlineException(self, context, reason): log.err(reason) return """
[[ERROR]]
""" - +@implementer(inevow.ICanHandleException) class DefaultExceptionHandler: - implements(inevow.ICanHandleException) def renderHTTP_exception(self, ctx, reason): log.err(reason) @@ -173,7 +171,7 @@ def processingFailed(reason, request, ctx): def defaultExceptionHandlerFactory(ctx): return DefaultExceptionHandler() - +@implementer(inevow.IRequest) class NevowRequest(tpc.Componentized, server.Request): """ A Request subclass which does additional @@ -195,7 +193,7 @@ class NevowRequest(tpc.Componentized, server.Request): lost) or not. C{False} until this happens, C{True} afterwards. @type _lostConnection: L{bool} """ - implements(inevow.IRequest) + fields = None _lostConnection = False @@ -475,9 +473,8 @@ def log(self, request): ## This should be moved somewhere else, it's cluttering up this module. - +@implementer(inevow.IResource) class OldResourceAdapter(object): - implements(inevow.IResource) # This is required to properly handle the interaction between # original.isLeaf and request.postpath, from which PATH_INFO is set in diff --git a/nevow/athena.py b/nevow/athena.py index 76241c4a..ab89f716 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -2,7 +2,7 @@ import itertools, os, re, warnings -from zope.interface import implements +from zope.interface import implementer from twisted.internet import defer, error, reactor from twisted.python import log, failure, context @@ -85,7 +85,7 @@ def activeChannel(request): request.write('') - +@implementer(inevow.IResource) class MappingResource(object): """ L{inevow.IResource} which looks up segments in a mapping between symbolic @@ -96,7 +96,7 @@ class MappingResource(object): 'Nevow.Athena') and C{str} instances which name files containing data which should be served in response. """ - implements(inevow.IResource) + def __init__(self, mapping): self.mapping = mapping @@ -251,7 +251,7 @@ class CSSModule(AthenaModule): _modules = {} - +@implementer(plugin.IPlugin, inevow.IJavascriptPackage) class JSPackage(object): """ A Javascript package. @@ -260,7 +260,6 @@ class JSPackage(object): @ivar mapping: Mapping between JS module names and C{str} representing filesystem paths containing their implementations. """ - implements(plugin.IPlugin, inevow.IJavascriptPackage) def __init__(self, mapping): self.mapping = mapping @@ -319,7 +318,7 @@ def _collectPackageBelow(baseDir, extension): return mapping - +@implementer(plugin.IPlugin, inevow.IJavascriptPackage) class AutoJSPackage(object): """ A L{inevow.IJavascriptPackage} implementation that scans an on-disk @@ -329,19 +328,17 @@ class AutoJSPackage(object): @ivar baseDir: A path to the root of a JavaScript packages/modules filesystem hierarchy. """ - implements(plugin.IPlugin, inevow.IJavascriptPackage) def __init__(self, baseDir): self.mapping = _collectPackageBelow(baseDir, 'js') - +@implementer(plugin.IPlugin, inevow.ICSSPackage) class AutoCSSPackage(object): """ Like L{AutoJSPackage}, but for CSS packages. Modules within this package can be referenced by L{LivePage.cssModule} or L{LiveElement.cssModule}. """ - implements(plugin.IPlugin, inevow.ICSSPackage) def __init__(self, baseDir): self.mapping = _collectPackageBelow(baseDir, 'css') @@ -549,9 +546,8 @@ def getJSFailure(exc, modules): return failure.Failure(JSException(text), exc_tb=buildTraceback(frames, modules)) - +@implementer(inevow.IResource) class LivePageTransport(object): - implements(inevow.IResource) def __init__(self, messageDeliverer, useActiveChannels=True): self.messageDeliverer = messageDeliverer diff --git a/nevow/blocks.py b/nevow/blocks.py index 26623a3b..38507a79 100644 --- a/nevow/blocks.py +++ b/nevow/blocks.py @@ -34,7 +34,7 @@ It doesn't appear to be possible to set the vertical-align in some cases in mozilla. """ -from zope.interface import implements +from zope.interface import implementer from nevow import static from nevow import inevow @@ -147,6 +147,7 @@ def __call__(self, **kw): line = _Blocks(tags.div, 'nevow-blocks-line') +@implementer(inevow.IRenderer) class collapser(object): """Render a fragment of html with a head and a body. The body can be in two states, expanded and collapsed. @@ -159,7 +160,6 @@ class collapser(object): and a div, and you can omit the visibility image if desired (js would have to change too) """ - implements(inevow.IRenderer) def __init__(self, headCollapsed, headExpanded, body, collapsed=True): self.headCollapsed = headCollapsed diff --git a/nevow/canvas.py b/nevow/canvas.py index 37916def..7c4a9e32 100755 --- a/nevow/canvas.py +++ b/nevow/canvas.py @@ -1,7 +1,7 @@ # Copyright (c) 2004 Divmod. # See LICENSE for details. -from zope.interface import implements +from zope.interface import implementer from twisted.internet import defer from twisted.python import log @@ -282,12 +282,11 @@ def depth(self): """ return 0 - +@implementer(inevow.IResource) class CanvasSocket(GroupBase): """An object which represents the client-side canvas. Defines APIs for drawing on the canvas. An instance of this class will be passed to your onload callback. """ - implements(inevow.IResource) groupName = 'canvas' diff --git a/nevow/compression.py b/nevow/compression.py index 8781259e..c3657725 100644 --- a/nevow/compression.py +++ b/nevow/compression.py @@ -4,7 +4,7 @@ """ from gzip import GzipFile -from zope.interface import implements +from zope.interface import implementer as implements from twisted.internet.defer import maybeDeferred, Deferred from twisted.internet.interfaces import IConsumer @@ -89,6 +89,7 @@ def _makeBase(): d[attrName] = _ProxyDescriptor(attrName) return type('_CompressionRequestWrapperBase', (object,), d) +@implements(IRequest) class CompressingRequestWrapper(_makeBase()): """ A request wrapper with support for transport encoding compression. @@ -100,7 +101,7 @@ class CompressingRequestWrapper(_makeBase()): @ivar compressLevel: the level of gzip compression to apply. @type compressLevel: C{int} """ - implements(IRequest) + encoding = 'gzip' compressLevel = 6 @@ -151,7 +152,7 @@ def finishRequest(self, success): self.underlying.finishRequest(success) - +@implements(IResource) class CompressingResourceWrapper(object): """ A resource wrapper with support for transport encoding compression. @@ -159,7 +160,6 @@ class CompressingResourceWrapper(object): @ivar underlying: the resource being wrapped. @type underlying: L{IResource} """ - implements(IResource) def __init__(self, underlying): self.underlying = underlying diff --git a/nevow/compy.py b/nevow/compy.py index 391a490f..8780952d 100644 --- a/nevow/compy.py +++ b/nevow/compy.py @@ -7,7 +7,7 @@ import warnings -from zope.interface import Interface, implements as zimplements, Attribute +from zope.interface import Interface, implementer as zimplements, Attribute from twisted.python.components import * @@ -46,8 +46,9 @@ class IComponentized(Interface): pass _Componentized = Componentized +@zimplements(IComponentized) class Componentized(_Componentized): - zimplements(IComponentized) + def __init__(self, adapterCache=None): _Componentized.__init__(self) From cda8e9a43be3e4a6af6d05ec722b22cae8396e27 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:13:51 -0800 Subject: [PATCH 004/157] implements -> @implementer --- formless/annotate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/formless/annotate.py b/formless/annotate.py index 6a69d991..d83033b3 100644 --- a/formless/annotate.py +++ b/formless/annotate.py @@ -70,6 +70,7 @@ def __str__(self): +@implementer(iformless.ITyped) class Typed(Attribute): """A typed value. Subclasses of Typed are constructed inside of TypedInterface class definitions to describe the types of properties, @@ -93,7 +94,6 @@ class Typed(Attribute): of the data from the browser and pass unicode strings to coerce. """ - implements(iformless.ITyped) complexType = False strip = False From 157e9e67133dfbd3d27d6306b520984a7b4d014c Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:15:24 -0800 Subject: [PATCH 005/157] [].sort(k)->[].stort(key=k) --- formless/annotate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/formless/annotate.py b/formless/annotate.py index d83033b3..5f500a33 100644 --- a/formless/annotate.py +++ b/formless/annotate.py @@ -813,8 +813,8 @@ def __new__(cls, name, bases, dct): ) for attacher in actionAttachers: attacher.attachActionBindings(possibleActions) - methods.sort(_sorter) - properties.sort(_sorter) + methods.sort(key=_sorter) + properties.sort(key=_sorter) cls.__spec__ = spec = methods + properties spec.sort(_sorter) cls.name = name From 82d04c7a1f8bee9d0310757acd6e32baf4289a9e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:15:45 -0800 Subject: [PATCH 006/157] [].sort(k)->[].stort(key=k) --- formless/annotate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/formless/annotate.py b/formless/annotate.py index 5f500a33..e9035a8a 100644 --- a/formless/annotate.py +++ b/formless/annotate.py @@ -816,7 +816,7 @@ def __new__(cls, name, bases, dct): methods.sort(key=_sorter) properties.sort(key=_sorter) cls.__spec__ = spec = methods + properties - spec.sort(_sorter) + spec.sort(key=_sorter) cls.name = name # because attributes "label" and "description" would become Properties, From 28985aa89074a488dc1fb45d5590b58ca31cf8a5 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:19:40 -0800 Subject: [PATCH 007/157] __builtin__ -> __builtins__ --- nevow/__init__.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/nevow/__init__.py b/nevow/__init__.py index 3b7119ef..e916f76a 100644 --- a/nevow/__init__.py +++ b/nevow/__init__.py @@ -21,8 +21,8 @@ # '__builtin__.instance method' instead of '__builtin__.instancemethod' # Workaround this error. def clean(o): - if o == '__builtin__.instancemethod' and sys.version_info < (2,3): - return '__builtin__.instance method' + if o == '__builtins__.instancemethod' and sys.version_info < (2,3): + return '__builtins__.instance method' return o @@ -51,9 +51,9 @@ def loadFlatteners(S): basic_adapters = """ formless.annotate.Group formless.annotate.MetaTypedInterface formless.iformless.ITyped -nevow.accessors.DictionaryContainer __builtin__.dict nevow.inevow.IContainer -nevow.accessors.ListContainer __builtin__.list nevow.inevow.IContainer -nevow.accessors.ListContainer __builtin__.tuple nevow.inevow.IContainer +nevow.accessors.DictionaryContainer __builtins__.dict nevow.inevow.IContainer +nevow.accessors.ListContainer __builtins__.list nevow.inevow.IContainer +nevow.accessors.ListContainer __builtins__.tuple nevow.inevow.IContainer nevow.accessors.FunctionAccessor __builtin__.function nevow.inevow.IGettable nevow.accessors.FunctionAccessor __builtin__.method nevow.inevow.IGettable @@ -109,7 +109,7 @@ def loadFlatteners(S): formless.webform.FormErrors nevow.testutil.FakeSession formless.iformless.IFormErrors nevow.appserver.OldResourceAdapter twisted.web.resource.IResource nevow.inevow.IResource -nevow.static.staticHTML __builtin__.str nevow.inevow.IResource +nevow.static.staticHTML __builtins__.str nevow.inevow.IResource nevow.appserver.sessionFactory nevow.context.RequestContext nevow.inevow.ISession nevow.rend.handFactory nevow.context.RequestContext nevow.inevow.IHand @@ -162,19 +162,19 @@ def loadFlatteners(S): nevow.flat.flatstan.CommentSerializer nevow.stan.Comment nevow.flat.flatstan.XmlSerializer nevow.stan.xml nevow.flat.flatstan.RawSerializer nevow.stan.raw -nevow.flat.flatstan.StringSerializer __builtin__.str -nevow.flat.flatstan.StringSerializer __builtin__.unicode -nevow.flat.flatstan.NoneWarningSerializer __builtin__.NoneType -nevow.flat.flatstan.StringCastSerializer __builtin__.int -nevow.flat.flatstan.StringCastSerializer __builtin__.float -nevow.flat.flatstan.StringCastSerializer __builtin__.long -nevow.flat.flatstan.BooleanSerializer __builtin__.bool -nevow.flat.flatstan.ListSerializer __builtin__.list -nevow.flat.flatstan.StringCastSerializer __builtin__.dict -nevow.flat.flatstan.ListSerializer __builtin__.tuple +nevow.flat.flatstan.StringSerializer __builtins__.str +nevow.flat.flatstan.StringSerializer __builtins__.bytes +nevow.flat.flatstan.NoneWarningSerializer __builtins__.NoneType +nevow.flat.flatstan.StringCastSerializer __builtins__.int +nevow.flat.flatstan.StringCastSerializer __builtins__.float +nevow.flat.flatstan.StringCastSerializer __builtins__.long +nevow.flat.flatstan.BooleanSerializer __builtins__.bool +nevow.flat.flatstan.ListSerializer __builtins__.list +nevow.flat.flatstan.StringCastSerializer __builtins__.dict +nevow.flat.flatstan.ListSerializer __builtins__.tuple nevow.flat.flatstan.ListSerializer __builtin__.generator nevow.flat.flatstan.FunctionSerializer __builtin__.function -nevow.flat.flatstan.FunctionSerializer __builtin__.type +nevow.flat.flatstan.FunctionSerializer __builtins__.type nevow.flat.flatstan.MethodSerializer __builtin__.instancemethod nevow.flat.flatstan.RendererSerializer nevow.inevow.IRenderer nevow.flat.flatstan.DirectiveSerializer nevow.stan.directive From e27eb1921aebbac8c7af92218a10f401f16dfd41 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:23:27 -0800 Subject: [PATCH 008/157] __builtin__ -> builtins --- nevow/__init__.py | 50 +++++++++++++++++++++++------------------------ nevow/util.py | 10 +++++----- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/nevow/__init__.py b/nevow/__init__.py index e916f76a..528c691e 100644 --- a/nevow/__init__.py +++ b/nevow/__init__.py @@ -18,11 +18,11 @@ from nevow.util import _namedAnyWithBuiltinTranslation # Python2.2 has a stupidity where instance methods have name -# '__builtin__.instance method' instead of '__builtin__.instancemethod' +# 'builtins.instance method' instead of 'builtins.instancemethod' # Workaround this error. def clean(o): - if o == '__builtins__.instancemethod' and sys.version_info < (2,3): - return '__builtins__.instance method' + if o == 'builtins.instancemethod' and sys.version_info < (2,3): + return 'builtins.instance method' return o @@ -51,13 +51,13 @@ def loadFlatteners(S): basic_adapters = """ formless.annotate.Group formless.annotate.MetaTypedInterface formless.iformless.ITyped -nevow.accessors.DictionaryContainer __builtins__.dict nevow.inevow.IContainer -nevow.accessors.ListContainer __builtins__.list nevow.inevow.IContainer -nevow.accessors.ListContainer __builtins__.tuple nevow.inevow.IContainer +nevow.accessors.DictionaryContainer builtins.dict nevow.inevow.IContainer +nevow.accessors.ListContainer builtins.list nevow.inevow.IContainer +nevow.accessors.ListContainer builtins.tuple nevow.inevow.IContainer -nevow.accessors.FunctionAccessor __builtin__.function nevow.inevow.IGettable -nevow.accessors.FunctionAccessor __builtin__.method nevow.inevow.IGettable -nevow.accessors.FunctionAccessor __builtin__.instancemethod nevow.inevow.IGettable +nevow.accessors.FunctionAccessor builtins.function nevow.inevow.IGettable +nevow.accessors.FunctionAccessor builtins.method nevow.inevow.IGettable +nevow.accessors.FunctionAccessor builtins.instancemethod nevow.inevow.IGettable nevow.accessors.DirectiveAccessor nevow.stan.directive nevow.inevow.IGettable nevow.accessors.SlotAccessor nevow.stan.slot nevow.inevow.IGettable nevow.accessors.SlotAccessor nevow.stan._PrecompiledSlot nevow.inevow.IGettable @@ -109,7 +109,7 @@ def loadFlatteners(S): formless.webform.FormErrors nevow.testutil.FakeSession formless.iformless.IFormErrors nevow.appserver.OldResourceAdapter twisted.web.resource.IResource nevow.inevow.IResource -nevow.static.staticHTML __builtins__.str nevow.inevow.IResource +nevow.static.staticHTML builtins.str nevow.inevow.IResource nevow.appserver.sessionFactory nevow.context.RequestContext nevow.inevow.ISession nevow.rend.handFactory nevow.context.RequestContext nevow.inevow.IHand @@ -134,7 +134,7 @@ def loadFlatteners(S): nevow.query.QueryContext nevow.context.WovenContext nevow.inevow.IQ nevow.query.QueryLoader nevow.inevow.IDocFactory nevow.inevow.IQ -nevow.query.QueryList __builtin__.list nevow.inevow.IQ +nevow.query.QueryList builtins.list nevow.inevow.IQ nevow.query.QuerySlot nevow.stan.slot nevow.inevow.IQ nevow.query.QuerySlot nevow.stan._PrecompiledSlot nevow.inevow.IQ nevow.query.QueryNeverFind nevow.stan.xml nevow.inevow.IQ @@ -162,20 +162,20 @@ def loadFlatteners(S): nevow.flat.flatstan.CommentSerializer nevow.stan.Comment nevow.flat.flatstan.XmlSerializer nevow.stan.xml nevow.flat.flatstan.RawSerializer nevow.stan.raw -nevow.flat.flatstan.StringSerializer __builtins__.str -nevow.flat.flatstan.StringSerializer __builtins__.bytes -nevow.flat.flatstan.NoneWarningSerializer __builtins__.NoneType -nevow.flat.flatstan.StringCastSerializer __builtins__.int -nevow.flat.flatstan.StringCastSerializer __builtins__.float -nevow.flat.flatstan.StringCastSerializer __builtins__.long -nevow.flat.flatstan.BooleanSerializer __builtins__.bool -nevow.flat.flatstan.ListSerializer __builtins__.list -nevow.flat.flatstan.StringCastSerializer __builtins__.dict -nevow.flat.flatstan.ListSerializer __builtins__.tuple -nevow.flat.flatstan.ListSerializer __builtin__.generator -nevow.flat.flatstan.FunctionSerializer __builtin__.function -nevow.flat.flatstan.FunctionSerializer __builtins__.type -nevow.flat.flatstan.MethodSerializer __builtin__.instancemethod +nevow.flat.flatstan.StringSerializer builtins.str +nevow.flat.flatstan.StringSerializer builtins.bytes +nevow.flat.flatstan.NoneWarningSerializer builtins.NoneType +nevow.flat.flatstan.StringCastSerializer builtins.int +nevow.flat.flatstan.StringCastSerializer builtins.float +nevow.flat.flatstan.StringCastSerializer builtins.long +nevow.flat.flatstan.BooleanSerializer builtins.bool +nevow.flat.flatstan.ListSerializer builtins.list +nevow.flat.flatstan.StringCastSerializer builtins.dict +nevow.flat.flatstan.ListSerializer builtins.tuple +nevow.flat.flatstan.ListSerializer builtins.generator +nevow.flat.flatstan.FunctionSerializer builtins.function +nevow.flat.flatstan.FunctionSerializer builtins.type +nevow.flat.flatstan.MethodSerializer builtins.instancemethod nevow.flat.flatstan.RendererSerializer nevow.inevow.IRenderer nevow.flat.flatstan.DirectiveSerializer nevow.stan.directive nevow.flat.flatstan.SlotSerializer nevow.stan.slot diff --git a/nevow/util.py b/nevow/util.py index b6c3636f..2557d86e 100644 --- a/nevow/util.py +++ b/nevow/util.py @@ -170,15 +170,15 @@ class _NamedAnyError(Exception): 'Internal error for when importing fails.' def _namedAnyWithBuiltinTranslation(name): - if name == '__builtin__.function': + if name == 'builtins.function': name='types.FunctionType' - elif name == '__builtin__.method': + elif name == 'builtins.method': return _RandomClazz # Hack - elif name == '__builtin__.instancemethod': + elif name == 'builtins.instancemethod': name='types.MethodType' - elif name == '__builtin__.NoneType': + elif name == 'builtins.NoneType': name='types.NoneType' - elif name == '__builtin__.generator': + elif name == 'builtins.generator': name='types.GeneratorType' return namedAny(name) From 7b7629d449807013683f83f8ec0b5566060b456e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:25:42 -0800 Subject: [PATCH 009/157] cStringIO -> io.StringIO --- nevow/static.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nevow/static.py b/nevow/static.py index 7b5ae5db..5b282f23 100644 --- a/nevow/static.py +++ b/nevow/static.py @@ -10,8 +10,7 @@ import io import traceback import warnings -StringIO = cStringIO -del cStringIO +from io import StringIO from zope.interface import implementer try: From 297b586bbf1cf191bf77d49b41be953bcd7bae84 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:31:46 -0800 Subject: [PATCH 010/157] remove FileTransfer (based on pb) --- nevow/static.py | 44 -------------------------------------------- 1 file changed, 44 deletions(-) diff --git a/nevow/static.py b/nevow/static.py index 5b282f23..c43a55a4 100644 --- a/nevow/static.py +++ b/nevow/static.py @@ -361,51 +361,7 @@ def createSimilarFile(self, path): return f -class FileTransfer(pb.Viewable): - """ - A class to represent the transfer of a file over the network. - """ - request = None - def __init__(self, file, size, request): - self.file = file - self.size = size - self.request = request - request.registerProducer(self, 0) - - def resumeProducing(self): - if not self.request: - return - data = self.file.read(min(abstract.FileDescriptor.bufferSize, self.size)) - if data: - self.request.write(data) - self.size -= len(data) - if self.size <= 0: - self.request.unregisterProducer() - self.request.finish() - self.request = None - - def pauseProducing(self): - pass - - def stopProducing(self): - self.file.close() - self.request = None - - # Remotely relay producer interface. - - def view_resumeProducing(self, issuer): - self.resumeProducing() - - def view_pauseProducing(self, issuer): - self.pauseProducing() - - def view_stopProducing(self, issuer): - self.stopProducing() - - - synchronized = ['resumeProducing', 'stopProducing'] -threadable.synchronize(FileTransfer) """I contain AsIsProcessor, which serves files 'As Is' Inspired by Apache's mod_asis From ba24e0eb72966765aa51e34f0262ff9d4eb5050d Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:32:33 -0800 Subject: [PATCH 011/157] remove FileTransfer (based on pb) --- nevow/static.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nevow/static.py b/nevow/static.py index c43a55a4..c19f0250 100644 --- a/nevow/static.py +++ b/nevow/static.py @@ -25,7 +25,6 @@ from twisted.protocols import http from twisted.python import threadable, log, components, filepath from twisted.internet import abstract -from twisted.spread import pb from twisted.python.util import InsensitiveDict from twisted.python.runtime import platformType From ab81fcf4d052830d32a3643b33ec579662a75eec Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:48:35 -0800 Subject: [PATCH 012/157] remove FileTransfer (based on pb) --- nevow/appserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/appserver.py b/nevow/appserver.py index ab27d989..c754132c 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -172,7 +172,7 @@ def defaultExceptionHandlerFactory(ctx): return DefaultExceptionHandler() @implementer(inevow.IRequest) -class NevowRequest(tpc.Componentized, server.Request): +class NevowRequest(server.Request, tpc.Componentized): """ A Request subclass which does additional processing if a form was POSTed. When a form is POSTed, From eff328b8a2e430fb8dd02fe8e6e399b847454a66 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:52:55 -0800 Subject: [PATCH 013/157] remove microdom use --- nevow/loaders.py | 68 ------------------------------------------------ 1 file changed, 68 deletions(-) diff --git a/nevow/loaders.py b/nevow/loaders.py index be5fad68..9c713b15 100644 --- a/nevow/loaders.py +++ b/nevow/loaders.py @@ -25,7 +25,6 @@ from zope.interface import implementer from twisted.python.reflect import getClass -from twisted.web import microdom from nevow import inevow from nevow import flat @@ -60,74 +59,7 @@ def load(self, ctx=None, preprocessors=()): return self._cache -@implementer(inevow.IDocFactory) -class htmlstr(object): - """A document factory for HTML contained in a string""" - - - template = None - pattern = None - beExtremelyLenient = True - _cache = None - - def __init__(self, template=None, pattern=None, beExtremelyLenient=None): - warnings.warn( - "[v0.8] htmlstr is deprecated because it's buggy. Please start using xmlfile and/or xmlstr.", - DeprecationWarning, - stacklevel=2) - if template is not None: - self.template = template - if pattern is not None: - self.pattern = pattern - if beExtremelyLenient is not None: - self.beExtremelyLenient = beExtremelyLenient - - def load(self, ctx=None, preprocessors=()): - assert not preprocessors, "preprocessors not supported by htmlstr" - if self._cache is None: - doc = microdom.parseString(self.template, beExtremelyLenient=self.beExtremelyLenient) - doc = flat.precompile(doc, ctx) - if self.pattern is not None: - doc = inevow.IQ(doc).onePattern(self.pattern) - self._cache = doc - return self._cache -@implementer(inevow.IDocFactory) -class htmlfile(object): - """A document factory for an HTML disk template""" - - - template = None - pattern = None - templateDir = '' - beExtremelyLenient = True - - def __init__(self, template=None, pattern=None, templateDir=None, beExtremelyLenient=None): - warnings.warn( - "[v0.8] htmlfile is deprecated because it's buggy. Please start using xmlfile and/or xmlstr.", - DeprecationWarning, - stacklevel=2) - if template is not None: - self.template = template - if pattern is not None: - self.pattern = pattern - if templateDir is not None: - self.templateDir = templateDir - if beExtremelyLenient is not None: - self.beExtremelyLenient = beExtremelyLenient - _filename = os.path.join(self.templateDir, self.template) - self._cache = CachedFile(_filename, self._reallyLoad) - - def _reallyLoad(self, path, ctx): - doc = microdom.parse(path, beExtremelyLenient=self.beExtremelyLenient) - doc = flat.precompile(doc, ctx) - if self.pattern is not None: - doc = inevow.IQ(doc).onePattern(self.pattern) - return doc - - def load(self, ctx=None, preprocessors=()): - assert not preprocessors, "preprocessors not supported by htmlfile" - return self._cache.load(ctx) @implementer(inevow.IDocFactory) class xmlstr(object): From 61afe428ba4fe285aa620dbb0a609350f09ffa77 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:54:08 -0800 Subject: [PATCH 014/157] inevow --- nevow/page.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/page.py b/nevow/page.py index ce8dff47..455557b6 100644 --- a/nevow/page.py +++ b/nevow/page.py @@ -17,7 +17,7 @@ from nevow.flat.ten import registerFlattener from nevow._flat import FlattenerError, _OldRendererFactory, _ctxForRequest from nevow._flat import deferflatten - +from nevow import inevow renderer = Expose( """ From c7d845430c0db968b60027899967f39cadf7571f Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:55:27 -0800 Subject: [PATCH 015/157] inevow->iformless --- nevow/testutil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/testutil.py b/nevow/testutil.py index 81d95ba8..e9aac724 100644 --- a/nevow/testutil.py +++ b/nevow/testutil.py @@ -283,7 +283,7 @@ def mktemp(self): return tempfile.mktemp() TestCase.mktemp = mktemp -@implementer(inevow.IFormDefaults) +@implementer(iformless.IFormDefaults) class AccumulatingFakeRequest(FakeRequest): """ I am a fake IRequest that is also a stub implementation of From 3884d2dce65337d609fb1032be78cfd81a2a50d3 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 17:57:14 -0800 Subject: [PATCH 016/157] remove microdom flatteners --- nevow/__init__.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/nevow/__init__.py b/nevow/__init__.py index 528c691e..9bc8c698 100644 --- a/nevow/__init__.py +++ b/nevow/__init__.py @@ -149,12 +149,6 @@ def loadFlatteners(S): flatteners = """ -nevow.flat.flatmdom.MicroDomDocumentSerializer twisted.web.microdom.Document -nevow.flat.flatmdom.MicroDomTextSerializer twisted.web.microdom.Text -nevow.flat.flatmdom.MicroDomCommentSerializer twisted.web.microdom.Comment -nevow.flat.flatmdom.MicroDomElementSerializer twisted.web.microdom.Element -nevow.flat.flatmdom.MicroDomEntityReferenceSerializer twisted.web.microdom.EntityReference -nevow.flat.flatmdom.MicroDomCDATASerializer twisted.web.microdom.CDATASection nevow.flat.flatstan.ProtoSerializer nevow.stan.Proto nevow.flat.flatstan.TagSerializer nevow.stan.Tag From 9e260ee3ec21b29b91e63f8f6fdd5acc4d25e630 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 18:00:59 -0800 Subject: [PATCH 017/157] create types.NoneType --- nevow/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nevow/__init__.py b/nevow/__init__.py index 9bc8c698..6483916b 100644 --- a/nevow/__init__.py +++ b/nevow/__init__.py @@ -2,6 +2,9 @@ # Copyright (c) 2004-2006 Divmod. # See LICENSE for details. +import types +types.NoneType=type(None) + from nevow._version import get_versions __version__ = get_versions()["version"] __version_info__ = tuple(int(part) for part in __version__.split("-", 1)[0].split(".")[:3]) @@ -158,7 +161,7 @@ def loadFlatteners(S): nevow.flat.flatstan.RawSerializer nevow.stan.raw nevow.flat.flatstan.StringSerializer builtins.str nevow.flat.flatstan.StringSerializer builtins.bytes -nevow.flat.flatstan.NoneWarningSerializer builtins.NoneType +nevow.flat.flatstan.NoneWarningSerializer types.NoneType nevow.flat.flatstan.StringCastSerializer builtins.int nevow.flat.flatstan.StringCastSerializer builtins.float nevow.flat.flatstan.StringCastSerializer builtins.long From 1acd8992bd0fc070c1ea78b6514beb5936ff5a19 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 18:03:22 -0800 Subject: [PATCH 018/157] remove long --- nevow/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nevow/__init__.py b/nevow/__init__.py index 6483916b..bf8b3e4c 100644 --- a/nevow/__init__.py +++ b/nevow/__init__.py @@ -164,7 +164,6 @@ def loadFlatteners(S): nevow.flat.flatstan.NoneWarningSerializer types.NoneType nevow.flat.flatstan.StringCastSerializer builtins.int nevow.flat.flatstan.StringCastSerializer builtins.float -nevow.flat.flatstan.StringCastSerializer builtins.long nevow.flat.flatstan.BooleanSerializer builtins.bool nevow.flat.flatstan.ListSerializer builtins.list nevow.flat.flatstan.StringCastSerializer builtins.dict From 882303f64a4098d92ee194ab1f7c7c281e9f7258 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 18:06:56 -0800 Subject: [PATCH 019/157] fix itertools --- nevow/__init__.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/nevow/__init__.py b/nevow/__init__.py index bf8b3e4c..d467bed2 100644 --- a/nevow/__init__.py +++ b/nevow/__init__.py @@ -155,7 +155,7 @@ def loadFlatteners(S): nevow.flat.flatstan.ProtoSerializer nevow.stan.Proto nevow.flat.flatstan.TagSerializer nevow.stan.Tag -nevow.flat.flatstan.EntitySerializer nevow.stan.Entity +nevow.flat.flatstan.EntitySerializer nevow.stan.Entity nevow.flat.flatstan.CommentSerializer nevow.stan.Comment nevow.flat.flatstan.XmlSerializer nevow.stan.xml nevow.flat.flatstan.RawSerializer nevow.stan.raw @@ -164,7 +164,7 @@ def loadFlatteners(S): nevow.flat.flatstan.NoneWarningSerializer types.NoneType nevow.flat.flatstan.StringCastSerializer builtins.int nevow.flat.flatstan.StringCastSerializer builtins.float -nevow.flat.flatstan.BooleanSerializer builtins.bool +nevow.flat.flatstan.BooleanSerializer builtins.bool nevow.flat.flatstan.ListSerializer builtins.list nevow.flat.flatstan.StringCastSerializer builtins.dict nevow.flat.flatstan.ListSerializer builtins.tuple @@ -191,11 +191,12 @@ def loadFlatteners(S): nevow.flat.flatstan.ListSerializer itertools.count nevow.flat.flatstan.ListSerializer itertools.cycle nevow.flat.flatstan.ListSerializer itertools.dropwhile -nevow.flat.flatstan.ListSerializer itertools.ifilter -nevow.flat.flatstan.ListSerializer itertools.ifilterfalse -nevow.flat.flatstan.ListSerializer itertools.imap -nevow.flat.flatstan.ListSerializer itertools.islice -nevow.flat.flatstan.ListSerializer itertools.izip +nevow.flat.flatstan.ListSerializer builtins.filter +nevow.flat.flatstan.ListSerializer itertools.filterfalse +nevow.flat.flatstan.ListSerializer builtins.map +nevow.flat.flatstan.ListSerializer builtins.slice +nevow.flat.flatstan.ListSerializer builtins.zip +nevow.flat.flatstan.ListSerializer builtins.range nevow.flat.flatstan.ListSerializer itertools.repeat nevow.flat.flatstan.ListSerializer itertools.starmap nevow.flat.flatstan.ListSerializer itertools.takewhile From 177bf23990848e2f02ef862a39700da89179ee66 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 18:15:41 -0800 Subject: [PATCH 020/157] fix _sorter --- examples/examples.tac | 13 +++++-------- formless/annotate.py | 4 ++-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/examples/examples.tac b/examples/examples.tac index 6656c364..c763248d 100644 --- a/examples/examples.tac +++ b/examples/examples.tac @@ -1,18 +1,15 @@ try: import zope.interface except ImportError: - print """ Please install ZopeInterface product from + print(""" Please install ZopeInterface product from http://www.zope.org/Products/ZopeInterface/ -to run Nevow """ +to run Nevow """) import sys sys.exit(1) from twisted.python import components import warnings -warnings.filterwarnings( - 'ignore', - category=components.ComponentsDeprecationWarning) from twisted.application import service, strports from twisted.python import util @@ -63,7 +60,7 @@ try: from athenademo import typeahead from athenademo import widgets from athenademo import benchmark -except ImportError, e: +except ImportError as e: if str(e).find('No module named') != -1: msg = """ Original error message: @@ -81,7 +78,7 @@ command: """ % str(e) raise Exception(msg) raise e -except AttributeError, e: +except AttributeError as e: if str(e).find("'module' object has no attribute") != -1: msg = """ Original error message: @@ -99,7 +96,7 @@ class Sources(rend.Page): def render_htmlizer(self, ctx, path): from twisted.python import htmlizer - from StringIO import StringIO + from io import StringIO output = StringIO() try: htmlizer.filter(open(path), output, writer=htmlizer.SmallerHTMLWriter) diff --git a/formless/annotate.py b/formless/annotate.py index e9035a8a..64aeb12f 100644 --- a/formless/annotate.py +++ b/formless/annotate.py @@ -620,8 +620,8 @@ def configure(self, boundTo, group): print("CONFIGURING GROUP BINDING", boundTo, group) -def _sorter(x, y): - return cmp(x.id, y.id) +def _sorter(x): + return x.id class _Marker(object): From fdb7d25476222bc1ae3d25b1c44f47b97c194965 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 19:17:12 -0800 Subject: [PATCH 021/157] --- examples/athenademo/calculator.py | 2 +- nevow/appserver.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/athenademo/calculator.py b/examples/athenademo/calculator.py index 996caf35..1ecd30df 100644 --- a/examples/athenademo/calculator.py +++ b/examples/athenademo/calculator.py @@ -138,7 +138,7 @@ def render_calculator(self, ctx, data): def main(): - log.startLogging(sys.stdout) + # log.startLogging(sys.stdout) site = NevowSite(CalculatorParentPage(calc=Calculator())) reactor.listenTCP(8080, site) reactor.run() diff --git a/nevow/appserver.py b/nevow/appserver.py index c754132c..a2b13f87 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -232,6 +232,7 @@ def process(self): # Resource Identification self.prepath = [] + print(unquote,self.path,type(self.path)) self.postpath = list(map(unquote, self.path[1:].split('/'))) self.sitepath = [] From cf0e2ba22c35a867aa6d41bafc8ab2fffc8aa671 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 19:20:35 -0800 Subject: [PATCH 022/157] --- nevow/appserver.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nevow/appserver.py b/nevow/appserver.py index a2b13f87..b5c88b56 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -232,8 +232,7 @@ def process(self): # Resource Identification self.prepath = [] - print(unquote,self.path,type(self.path)) - self.postpath = list(map(unquote, self.path[1:].split('/'))) + self.postpath = list(map(unquote, str(self.path[1:].split('/'), 'utf-8'))) self.sitepath = [] self.deferred = defer.Deferred() From cd96c018a6a48d49c6c1eb219e1943a3181a2b20 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 19:23:39 -0800 Subject: [PATCH 023/157] --- nevow/appserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/appserver.py b/nevow/appserver.py index b5c88b56..db0a1b56 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -232,7 +232,7 @@ def process(self): # Resource Identification self.prepath = [] - self.postpath = list(map(unquote, str(self.path[1:].split('/'), 'utf-8'))) + self.postpath = list(map(unquote, str(self.path[1:], 'utf-8').split('/'))) self.sitepath = [] self.deferred = defer.Deferred() From ed28cb39648510bea5aea8b54f7b0bba3d52d9be Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 21:42:32 -0800 Subject: [PATCH 024/157] fixed stupid 2to3 unicode issues --- examples/blogengine/frontend.py | 2 +- examples/http_auth/http_auth.py | 2 +- examples/postit/postit.py | 2 +- nevow/appserver.py | 6 +++--- nevow/athena.py | 6 +++--- nevow/compression.py | 2 +- nevow/static.py | 16 ++++++++-------- nevow/test/test_compression.py | 4 ++-- nevow/test/test_testutil.py | 4 ++-- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/examples/blogengine/frontend.py b/examples/blogengine/frontend.py index 4f09c914..0e94ce93 100644 --- a/examples/blogengine/frontend.py +++ b/examples/blogengine/frontend.py @@ -176,7 +176,7 @@ class Atom(BaseUI): docFactory = loaders.xmlfile('atom.xml') def beforeRender(self, ctx): - inevow.IRequest(ctx).setHeader("Content-Type", "application/application+xml; charset=UTF-8") + inevow.IRequest(ctx).setHeader(b"Content-Type", "application/application+xml; charset=UTF-8") def data_getFirstPost(self, ctx, data): for post in IBlog(IStore(ctx)).getPosts(1): diff --git a/examples/http_auth/http_auth.py b/examples/http_auth/http_auth.py index c607e1c2..fcfb6fb7 100644 --- a/examples/http_auth/http_auth.py +++ b/examples/http_auth/http_auth.py @@ -22,7 +22,7 @@ def renderHTTP(self, ctx): request = inevow.IRequest(ctx) username, password = request.getUser(), request.getPassword() if (username, password) == ('', ''): - request.setHeader('WWW-Authenticate', 'Basic realm="Whatever"') + request.setHeader(b'WWW-Authenticate', 'Basic realm="Whatever"') request.setResponseCode(http.UNAUTHORIZED) return "Authentication required." ## They provided a username and password, so let's let them in! horray diff --git a/examples/postit/postit.py b/examples/postit/postit.py index bae12949..75fcccbf 100644 --- a/examples/postit/postit.py +++ b/examples/postit/postit.py @@ -54,7 +54,7 @@ class Atom(Base): docFactory = loaders.xmlfile('atom.xml') def beforeRender(self, ctx): - inevow.IRequest(ctx).setHeader("Content-Type", "application/application+xml; charset=UTF-8") + inevow.IRequest(ctx).setHeader(b"Content-Type", "application/application+xml; charset=UTF-8") def data_getFirstPost(self, ctx, data): for post in IPostit(self.store).getPosts(1): diff --git a/nevow/appserver.py b/nevow/appserver.py index db0a1b56..3835ec88 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -226,9 +226,9 @@ def process(self): self.site = self.channel.site # set various default headers - self.setHeader('server', server.version) - self.setHeader('date', server.http.datetimeToString()) - self.setHeader('content-type', "text/html; charset=UTF-8") + self.setHeader(b'server', server.version) + self.setHeader(b'date', server.http.datetimeToString()) + self.setHeader(b'content-type', "text/html; charset=UTF-8") # Resource Identification self.prepath = [] diff --git a/nevow/athena.py b/nevow/athena.py index ab89f716..ea3f5c71 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -72,8 +72,8 @@ def neverEverCache(request): Set headers to indicate that the response to this request should never, ever be cached. """ - request.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate') - request.setHeader('Pragma', 'no-cache') + request.setHeader(b'Cache-Control', 'no-store, no-cache, must-revalidate') + request.setHeader(b'Pragma', 'no-cache') def activeChannel(request): @@ -81,7 +81,7 @@ def activeChannel(request): Mark this connection as a 'live' channel by setting the Connection: close header and flushing all headers immediately. """ - request.setHeader("Connection", "close") + request.setHeader(b"Connection", "close") request.write('') diff --git a/nevow/compression.py b/nevow/compression.py index c3657725..1703b64b 100644 --- a/nevow/compression.py +++ b/nevow/compression.py @@ -109,7 +109,7 @@ class CompressingRequestWrapper(_makeBase()): def __init__(self, underlying): self.underlying = underlying - self.setHeader('content-encoding', self.encoding) + self.setHeader(b'content-encoding', self.encoding) self._gzipFile = None # See setHeader docstring for more commentary. diff --git a/nevow/static.py b/nevow/static.py index c19f0250..fc363dca 100644 --- a/nevow/static.py +++ b/nevow/static.py @@ -64,10 +64,10 @@ def locateChild(self, ctx, segments): def renderHTTP(self, ctx): request = inevow.IRequest(ctx) - request.setHeader("content-type", self.type) - request.setHeader("content-length", str(len(self.data))) + request.setHeader(b"content-type", self.type) + request.setHeader(b"content-length", str(len(self.data))) if self.expires is not None: - request.setHeader("expires", + request.setHeader(b"expires", http.datetimeToString(self.time() + self.expires)) if request.method == "HEAD": return '' @@ -289,12 +289,12 @@ def renderHTTP(self, ctx): # size is the length of the part actually transmitted fsize = size = self.getFileSize() - request.setHeader('accept-ranges','bytes') + request.setHeader(b'accept-ranges','bytes') if self.type: - request.setHeader('content-type', self.type) + request.setHeader(b'content-type', self.type) if self.encoding: - request.setHeader('content-encoding', self.encoding) + request.setHeader(b'content-encoding', self.encoding) try: f = self.openForReading() @@ -324,13 +324,13 @@ def renderHTTP(self, ctx): else: end = fsize-1 request.setResponseCode(http.PARTIAL_CONTENT) - request.setHeader('content-range',"bytes %s-%s/%s" % ( + request.setHeader(b'content-range',"bytes %s-%s/%s" % ( str(start), str(end), str(fsize))) #content-length should be the actual size of the stuff we're #sending, not the full size of the on-server entity. size = 1 + end - int(start) - request.setHeader('content-length', str(size)) + request.setHeader(b'content-length', str(size)) except: traceback.print_exc(file=log.logfile) diff --git a/nevow/test/test_compression.py b/nevow/test/test_compression.py index 8eaa5fb6..8fb3b6c8 100644 --- a/nevow/test/test_compression.py +++ b/nevow/test/test_compression.py @@ -154,10 +154,10 @@ def test_contentLength(self): Content-Length header should be discarded when compression is in use. """ self.assertNotIn('content-length', self.request.headers) - self.wrapper.setHeader('content-length', 1234) + self.wrapper.setHeader(b'content-length', 1234) self.assertNotIn('content-length', self.request.headers) - self.request.setHeader('content-length', 1234) + self.request.setHeader(b'content-length', 1234) self.wrapper = CompressingRequestWrapper(self.request) self.assertNotIn('content-length', self.request.headers) diff --git a/nevow/test/test_testutil.py b/nevow/test/test_testutil.py index 54d77205..b0228c8c 100644 --- a/nevow/test/test_testutil.py +++ b/nevow/test/test_testutil.py @@ -75,7 +75,7 @@ def test_headers(self): """ host = 'divmod.com' req = FakeRequest() - req.setHeader('host', host) + req.setHeader(b'host', host) self.assertEqual(req.headers['host'], host) @@ -137,7 +137,7 @@ def test_headerSeparation(self): Test that they are handled separately. """ req = FakeRequest() - req.setHeader('foo', 'bar') + req.setHeader(b'foo', 'bar') self.assertNotIn('foo', req.received_headers) self.assertEqual(req.getHeader('foo'), None) req.received_headers['foo'] = 'bar' From 530cd29b5d974064677506905cba01ce145c25f2 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 21:44:34 -0800 Subject: [PATCH 025/157] --- nevow/appserver.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nevow/appserver.py b/nevow/appserver.py index 3835ec88..c30c2eb7 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -291,6 +291,9 @@ def _cbFinishRender(self, html, ctx): # No response can be sent at this point. pass elif isinstance(html, str): + self.write(html.encode('utf-8')) + self.finishRequest( True ) + elif isinstance(html, bytes): self.write(html) self.finishRequest( True ) elif html is errorMarker: From 84ab05e6fe75542eab9624dbcd7ed0b4b966774d Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:18:49 -0800 Subject: [PATCH 026/157] more stupid unicode issues --- nevow/appserver.py | 10 +++++----- nevow/util.py | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/nevow/appserver.py b/nevow/appserver.py index c30c2eb7..5e1b4242 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -127,11 +127,11 @@ def renderHTTP_exception(self, ctx, reason): log.err(reason) request = inevow.IRequest(ctx) request.setResponseCode(http.INTERNAL_SERVER_ERROR) - request.write("Exception") + request.write(b"Exception") from nevow import failure result = failure.formatFailure(reason) - request.write(''.join(flat.flatten(result))) - request.write("") + request.write(''.join(flat.flatten(result)).encode('utf-8')) + request.write(b"") request.finishRequest( False ) @@ -161,8 +161,8 @@ def processingFailed(reason, request, ctx): log.err() log.err("Original exception:", isErr=1) log.err(reason) - request.write("Internal Server Error") - request.write("

Internal Server Error

An error occurred rendering the requested page. Additionally, an error occurred rendering the error page.") + request.write(b"Internal Server Error") + request.write(b"

Internal Server Error

An error occurred rendering the requested page. Additionally, an error occurred rendering the error page.") request.finishRequest( False ) return errorMarker diff --git a/nevow/util.py b/nevow/util.py index 2557d86e..fcbaa1a9 100644 --- a/nevow/util.py +++ b/nevow/util.py @@ -3,6 +3,21 @@ import inspect, os.path +def toBytes(obj, codec='utf-8'): + if isinstance(obj, str): + return obj.encode(codec) + if isinstance(obj, bytes): + return obj + return str(obj).encode(codec) + +def unicode(obj, codec='utf-8'): + if isinstance(obj, str): + return obj + if isinstance(obj, bytes): + return obj.decode(codec) + return str(obj) + + class UnexposedMethodError(Exception): """ Raised on any attempt to get a method which has not been exposed. From 4b75ee1ba2e7ade7126c643d98640f58bdb1e384 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:23:19 -0800 Subject: [PATCH 027/157] more stupid unicode issues --- nevow/appserver.py | 6 +++--- nevow/url.py | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/nevow/appserver.py b/nevow/appserver.py index 5e1b4242..3f2e9785 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -5,7 +5,7 @@ """ A web application server built using twisted.web """ - +from nevow.utils import unicode, toBytes import cgi import warnings from collections import MutableMapping @@ -130,7 +130,7 @@ def renderHTTP_exception(self, ctx, reason): request.write(b"Exception") from nevow import failure result = failure.formatFailure(reason) - request.write(''.join(flat.flatten(result)).encode('utf-8')) + request.write(toBytes(''.join(flat.flatten(result)))) request.write(b"") request.finishRequest( False ) @@ -291,7 +291,7 @@ def _cbFinishRender(self, html, ctx): # No response can be sent at this point. pass elif isinstance(html, str): - self.write(html.encode('utf-8')) + self.write(toBytes(html)) self.finishRequest( True ) elif isinstance(html, bytes): self.write(html) diff --git a/nevow/url.py b/nevow/url.py index 6ef0e3ad..70f8e396 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -18,6 +18,7 @@ from nevow.stan import raw from nevow.flat import serialize from nevow.context import WovenContext +from nevow.utils import unicode, toBytes def _uqf(query): for x in query.split('&'): @@ -148,10 +149,11 @@ def fromContext(klass, context): '''Create a URL object that represents the current URL in the traversal process.''' request = inevow.IRequest(context) - uri = request.prePathURL() - if '?' in request.uri: - uri += '?' + request.uri.split('?')[-1] - return klass.fromString(uri) + request.prepath=[toBytes(i) for i in request.prepath] + uri = toBytes(request.prePathURL()) + if b'?' in toBytes(request.uri): + uri += b'?' + toBytes(request.uri).split(b'?')[-1] + return klass.fromString(unicode(uri)) fromContext = classmethod(fromContext) ## path manipulations ## From e43adc5b3df9ad917bd0cffb05afc6fa4cb589db Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:24:04 -0800 Subject: [PATCH 028/157] more stupid unicode issues --- nevow/appserver.py | 2 +- nevow/url.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nevow/appserver.py b/nevow/appserver.py index 3f2e9785..2a7581c6 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -5,7 +5,7 @@ """ A web application server built using twisted.web """ -from nevow.utils import unicode, toBytes +from nevow.util import unicode, toBytes import cgi import warnings from collections import MutableMapping diff --git a/nevow/url.py b/nevow/url.py index 70f8e396..1aaea79b 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -18,7 +18,7 @@ from nevow.stan import raw from nevow.flat import serialize from nevow.context import WovenContext -from nevow.utils import unicode, toBytes +from nevow.util import unicode, toBytes def _uqf(query): for x in query.split('&'): From edd33aeb23c0f08fbc62fb9f69018aeba7008c44 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:26:15 -0800 Subject: [PATCH 029/157] more stupid unicode issues --- nevow/guard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nevow/guard.py b/nevow/guard.py index 91bbd4c0..b5afa7cf 100644 --- a/nevow/guard.py +++ b/nevow/guard.py @@ -34,10 +34,10 @@ # Nevow imports from nevow import inevow, url, stan - +from nevow.util import unicode, toBytes def _sessionCookie(): - return md5("%s_%s" % (str(random.random()) , str(time.time()))).hexdigest() + return md5(toBytes("%s_%s" % (str(random.random()) , str(time.time())))).hexdigest() @implementer(inevow.ISession, inevow.IGuardSession) class GuardSession(components.Componentized): From 6751993b9480ef4433fc9859a5d1f94a9849723c Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:27:13 -0800 Subject: [PATCH 030/157] next is now a builtin function --- nevow/flat/twist.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nevow/flat/twist.py b/nevow/flat/twist.py index cec262e4..d8d417d6 100644 --- a/nevow/flat/twist.py +++ b/nevow/flat/twist.py @@ -21,13 +21,13 @@ def _drive(iterable, finished): it after those Deferreds fire. """ try: - next = next(iterable) + n = next(iterable) except StopIteration: finished.callback('') except: finished.errback() else: - deferred, returner = next + deferred, returner = n def cb(result): """ Pass the result of a Deferred on to the callable which is From fc3a1ecefcc627b7ab92ceaad84c9119f925bcf3 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:28:32 -0800 Subject: [PATCH 031/157] pass None context to render_liveglue --- nevow/flat/flatstan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/flatstan.py b/nevow/flat/flatstan.py index f56923e7..df680e66 100644 --- a/nevow/flat/flatstan.py +++ b/nevow/flat/flatstan.py @@ -227,7 +227,7 @@ def FunctionSerializer(original, context, nocontextfun=FunctionSerializer_nocont try: nocontext = nocontextfun(original) if nocontext is True: - result = original(data) + result = original(None, data) else: if nocontext is PASS_SELF: renderer = context.locate(IRenderer) From 366992ec29e39404662d2d7392e751b283cd26cf Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:30:28 -0800 Subject: [PATCH 032/157] more stupid unicode issues --- nevow/testutil.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nevow/testutil.py b/nevow/testutil.py index e9aac724..834d724b 100644 --- a/nevow/testutil.py +++ b/nevow/testutil.py @@ -24,6 +24,7 @@ from nevow import inevow, context, athena, loaders, tags, appserver from nevow.jsutil import findJavascriptInterpreter, generateTestScript +from nevow.util import unicode, toBytes class FakeChannel: def __init__(self, site): @@ -190,8 +191,8 @@ def prePathURL(self): @rtype: C{str}. """ - return 'http://%s/%s' % (self.getHeader('host') or 'localhost', - '/'.join(self.prepath)) + return 'http://%s/%s' % (unicode(self.getHeader('host')) or 'localhost', + unicode(b'/'.join(self.prepath))) def getClientIP(self): return '127.0.0.1' From d92f3f514890b54ecceac8c3bceb6cf0225efd49 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:31:42 -0800 Subject: [PATCH 033/157] more stupid unicode issues --- nevow/athena.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index ea3f5c71..d60e4379 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1390,9 +1390,9 @@ def _bootstraps(self, ctx): """ return [ ("Divmod.bootstrap", - [flat.flatten(self.transportRoot, ctx).decode("ascii")]), + [flat.flatten(self.transportRoot, ctx)]), ("Nevow.Athena.bootstrap", - [self.jsClass, self.clientID.decode('ascii')])] + [self.jsClass, self.clientID])] def _bootstrapCall(self, methodName, args): From 04bed308d68ebefd724c7a7e1a58a7b4b2665653 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:33:44 -0800 Subject: [PATCH 034/157] more stupid unicode issues --- nevow/json.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nevow/json.py b/nevow/json.py index 235a6485..2374adc8 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -13,6 +13,7 @@ from nevow.inevow import IAthenaTransportable from nevow import rend, page, _flat, tags +from nevow.util import unicode, toBytes class ParseError(ValueError): pass @@ -327,6 +328,6 @@ def serialize(obj=_undefined, **kw): obj = kw L = [] _serialize(obj, L.append, {}) - return ''.join(L) + return b''.join([toBytes(i) for i in L]) __all__ = ['parse', 'serialize'] From 1b129d6db2da8b277ae3884dd911f005ce132fa8 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:39:09 -0800 Subject: [PATCH 035/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index d60e4379..16303251 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1406,7 +1406,7 @@ def _bootstrapCall(self, methodName, args): arguments to the named method. """ return '%s(%s);' % ( - methodName, ', '.join([json.serialize(arg) for arg in args])) + methodName, unicode(b', '.join([json.serialize(arg) for arg in args]))) def child_jsmodule(self, ctx): From e3fce5651a4490721dd6b50b7d5b19565520b550 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:39:54 -0800 Subject: [PATCH 036/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 16303251..79e02041 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -12,7 +12,7 @@ from nevow import inevow, plugins, flat, _flat from nevow import rend, loaders, static from nevow import json, util, tags, guard, stan -from nevow.util import CachedFile +from nevow.util import CachedFile, unicode, toBytes from nevow.useragent import UserAgent, browsers from nevow.url import here, URL From 0859a14899443ede646ea2c3977428fd275f37e7 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:43:30 -0800 Subject: [PATCH 037/157] --- nevow/flat/flatstan.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nevow/flat/flatstan.py b/nevow/flat/flatstan.py index df680e66..e2984ff3 100644 --- a/nevow/flat/flatstan.py +++ b/nevow/flat/flatstan.py @@ -227,7 +227,10 @@ def FunctionSerializer(original, context, nocontextfun=FunctionSerializer_nocont try: nocontext = nocontextfun(original) if nocontext is True: - result = original(None, data) + if original.__code__.co_argcount==3: + result = original(context, data) + else: + result = original(data) else: if nocontext is PASS_SELF: renderer = context.locate(IRenderer) From cc073e650f278a367156d5e81d5509f1e4979a56 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:48:08 -0800 Subject: [PATCH 038/157] unicode issues + remove support for oldstyle classes --- nevow/athena.py | 3 ++- nevow/failure.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index 79e02041..33b1e607 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -299,7 +299,7 @@ def _collectPackageBelow(baseDir, extension): path = os.path.join(root, dir, '__init__.' + extension) if not os.path.exists(path): path = EMPTY - mapping[str(name, 'ascii')] = path + mapping[unicode(name, 'ascii')] = path _revMap[os.path.join(root, dir)] = name + '.' for fn in filenames: @@ -395,6 +395,7 @@ def getModuleForName(self, className): self._loadPlugins = False jsMod = className + print(398, jsMod, self.mapping) while jsMod: try: self.mapping[jsMod] diff --git a/nevow/failure.py b/nevow/failure.py index 7c5e9b40..1bb2e0fc 100644 --- a/nevow/failure.py +++ b/nevow/failure.py @@ -207,7 +207,6 @@ def htmlUnknown(u): htmlReprTypes = { dict: htmlDict, list: htmlList, - types.InstanceType: htmlInst, bytes: htmlString, types.FunctionType: htmlFunc, types.MethodType: htmlMeth, From ae8ddb3519218d81f2b56aa893594beacb4008a7 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:51:32 -0800 Subject: [PATCH 039/157] more stupid unicode issues --- nevow/athena.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index 33b1e607..b000c63f 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -314,7 +314,7 @@ def _collectPackageBelow(baseDir, extension): name = stem + fn[:-(len(extension) + 1)] path = os.path.join(root, fn) - mapping[str(name, 'ascii')] = path + mapping[unicode(name, 'ascii')] = path return mapping @@ -1314,7 +1314,7 @@ def removeLocalObject(self, objID): def callRemote(self, methodName, *args): requestID = 's2c%i' % (self._requestIDCounter(),) - message = ('call', (str(methodName, 'ascii'), requestID, args)) + message = ('call', (bytes(methodName, 'ascii'), requestID, args)) resultD = defer.Deferred() self._remoteCalls[requestID] = resultD self.addMessage(message) @@ -1406,8 +1406,8 @@ def _bootstrapCall(self, methodName, args): @param args: a list of objects that will be JSON-serialized as arguments to the named method. """ - return '%s(%s);' % ( - methodName, unicode(b', '.join([json.serialize(arg) for arg in args]))) + return b'%s(%s);' % ( + toBytes(methodName), (b', '.join([json.serialize(arg) for arg in args]))) def child_jsmodule(self, ctx): @@ -1474,7 +1474,7 @@ def _cbCall(result): ['%s: %s' % ( result.type.__name__.decode('ascii'), result.getErrorMessage().decode('ascii'))]) - message = ('respond', (str(requestId), success, result)) + message = ('respond', (unicode(requestId), success, result)) self.addMessage(message) result.addBoth(_cbCall) @@ -1631,14 +1631,14 @@ def _prepare(self, tag): C{self.page}, add this object to the page and fill the I{athena:id} slot with this object's Athena identifier. """ - assert isinstance(self.jsClass, str), "jsClass must be a unicode string" + assert isinstance(self.jsClass, bytes), "jsClass must be a unicode string" if self.page is None: raise OrphanedFragment(self) self._athenaID = self.page.addLocalObject(self) if self.page._didConnect: self.connectionMade() - tag.fillSlots('athena:id', str(self._athenaID)) + tag.fillSlots('athena:id', toBytes(self._athenaID)) def setFragmentParent(self, fragmentParent): From a009d4ff19d930fd4052cb8282af0d0b9c6aef73 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:52:54 -0800 Subject: [PATCH 040/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index b000c63f..330d14e6 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1363,7 +1363,7 @@ def getImportStan(self, moduleName): def render_liveglue(self, ctx, data): - bootstrapString = '\n'.join( + bootstrapString = b'\n'.join( [self._bootstrapCall(method, args) for method, args in self._bootstraps(ctx)]) return ctx.tag[ From e51161a6139eb18bc275de05544df87fd9b2e9b1 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:53:59 -0800 Subject: [PATCH 041/157] file -> open --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 330d14e6..109663ea 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -185,7 +185,7 @@ def _getDeps(self, jsFile): """ Calculate our dependencies given the path to our source. """ - depgen = self._extractImports(file(jsFile, 'rU')) + depgen = self._extractImports(open(jsFile, 'rU')) return self.packageDeps + list(dict.fromkeys(depgen).keys()) From 51ff2a45c3580d7d425e466dcce8216d67b052a0 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:55:13 -0800 Subject: [PATCH 042/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 109663ea..ea2092a0 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -177,7 +177,7 @@ def __repr__(self): def _extractImports(self, fileObj): s = fileObj.read() for m in self._importExpression.finditer(s): - yield self.getOrCreate(m.group(1).decode('ascii'), self.mapping) + yield self.getOrCreate(unicode(m.group(1), 'ascii'), self.mapping) From feba60f2a0db801ed0dfcea0315120be1c902abb Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:57:05 -0800 Subject: [PATCH 043/157] more stupid unicode issues --- nevow/flat/flatstan.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nevow/flat/flatstan.py b/nevow/flat/flatstan.py index e2984ff3..58475a8e 100644 --- a/nevow/flat/flatstan.py +++ b/nevow/flat/flatstan.py @@ -160,24 +160,24 @@ def StringSerializer(original, context): if context.inJS: original = _jsSingleQuoteQuote(original) if not context.inJSSingleQuoteString: - original = "'%s'" % (original, ) + original = b"'%s'" % (original, ) if context.isAttrib: - return original.replace("&", "&").replace("<", "<").replace(">", ">").replace('"', """) + return original.replace(b"&", "&").replace(b"<", b"<").replace(b">", b">").replace(b'"', b""") elif context.inJS: return original else: - return original.replace("&", "&").replace("<", "<").replace(">", ">") + return original.replace(b"&", b"&").replace(b"<", "<").replace(b">", ">") def NoneWarningSerializer(original, context): if context.isAttrib: ## We don't want the big red None warning inside a html attribute. Just leave it blank. - return '' + return b'' elif context.inURL: - return '' + return b'' elif context.inJS: - return '' - return 'None' + return b'' + return b'None' def StringCastSerializer(original, context): @@ -190,8 +190,8 @@ def StringCastSerializer(original, context): def BooleanSerializer(original, context): if context.inJS: if original: - return 'true' - return 'false' + return b'true' + return b'false' return str(original) From 1ab3b18963a4b38066e81ece0dbbe18e3b7206d5 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:58:11 -0800 Subject: [PATCH 044/157] more stupid unicode issues --- nevow/flat/flatstan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/flatstan.py b/nevow/flat/flatstan.py index 58475a8e..97549787 100644 --- a/nevow/flat/flatstan.py +++ b/nevow/flat/flatstan.py @@ -166,7 +166,7 @@ def StringSerializer(original, context): elif context.inJS: return original else: - return original.replace(b"&", b"&").replace(b"<", "<").replace(b">", ">") + return original.replace(b"&", b"&").replace(b"<", b"<").replace(b">", b">") def NoneWarningSerializer(original, context): From 60d2a209661a9994e15ed4d50c1cd095529f173c Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 22:59:22 -0800 Subject: [PATCH 045/157] more stupid unicode issues --- nevow/flat/flatstan.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/flat/flatstan.py b/nevow/flat/flatstan.py index 97549787..82725d74 100644 --- a/nevow/flat/flatstan.py +++ b/nevow/flat/flatstan.py @@ -152,6 +152,7 @@ def StringSerializer(original, context): # alphanumeric and a few punctation characters are valid. # Otherwise we use normal XML escaping rules but also replacing " # in an attribute because Nevow always uses "..." for values. + original=toBytes(original) if context.inURL: # The magic string "-_.!*'()" also appears in url.py. Thinking about # changing this? Change that, too. From ccf5bcbfd0d16e0d800cdc77fa20df773dae7a76 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:00:01 -0800 Subject: [PATCH 046/157] more stupid unicode issues --- nevow/flat/flatstan.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/flat/flatstan.py b/nevow/flat/flatstan.py index 82725d74..f0c9e60d 100644 --- a/nevow/flat/flatstan.py +++ b/nevow/flat/flatstan.py @@ -13,6 +13,7 @@ from nevow.flat import precompile, serialize from nevow.accessors import convertToData from nevow.context import WovenContext +from nevow.util import toBytes, unicode allowSingleton = ('img', 'br', 'hr', 'base', 'meta', 'link', 'param', 'area', 'input', 'col', 'basefont', 'isindex', 'frame') From a504c13c7608daa8f5e8f9a336bd634eb59e24ac Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:00:58 -0800 Subject: [PATCH 047/157] more stupid unicode issues --- nevow/flat/flatstan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/flatstan.py b/nevow/flat/flatstan.py index f0c9e60d..c53bc995 100644 --- a/nevow/flat/flatstan.py +++ b/nevow/flat/flatstan.py @@ -164,7 +164,7 @@ def StringSerializer(original, context): if not context.inJSSingleQuoteString: original = b"'%s'" % (original, ) if context.isAttrib: - return original.replace(b"&", "&").replace(b"<", b"<").replace(b">", b">").replace(b'"', b""") + return original.replace(b"&", b"&").replace(b"<", b"<").replace(b">", b">").replace(b'"', b""") elif context.inJS: return original else: From 2af728e5e3a92d475247f6c13d566778341cedf4 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:03:12 -0800 Subject: [PATCH 048/157] more stupid unicode issues --- nevow/flat/ten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index eed79033..2dace977 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -93,7 +93,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): break else: if straccum: - writer(tags.raw(''.join(straccum))) + writer(util.toBytes(tags.raw(''.join(straccum)))) del straccum[:] if shouldYieldItem is not None and shouldYieldItem(item): replacement = [] From 5ae9b69e589563ad2198a0bf7f5662ebab6d044e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:05:03 -0800 Subject: [PATCH 049/157] more stupid unicode issues --- examples/athenademo/calculator.py | 2 +- nevow/flat/ten.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/athenademo/calculator.py b/examples/athenademo/calculator.py index 1ecd30df..23a8d2fc 100644 --- a/examples/athenademo/calculator.py +++ b/examples/athenademo/calculator.py @@ -140,7 +140,7 @@ def render_calculator(self, ctx, data): def main(): # log.startLogging(sys.stdout) site = NevowSite(CalculatorParentPage(calc=Calculator())) - reactor.listenTCP(8080, site) + reactor.listenTCP(8081, site) reactor.run() diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index 2dace977..9079d4b1 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -79,6 +79,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): rest = [ iter([partialflatten(ctx, stan)]) ] straccum = [] while rest: + print(82) gen = rest.pop() for item in gen: if isinstance(item, str): From b38390ea58ce6d219609ea65662ff345c70fa140 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:06:22 -0800 Subject: [PATCH 050/157] more stupid unicode issues --- nevow/flat/ten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index 9079d4b1..5bf12086 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -79,7 +79,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): rest = [ iter([partialflatten(ctx, stan)]) ] straccum = [] while rest: - print(82) + print(82, straccum, rest) gen = rest.pop() for item in gen: if isinstance(item, str): From bb28ec1c4242f6cb0f50fc555a3d7ee490f5d969 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:07:07 -0800 Subject: [PATCH 051/157] more stupid unicode issues --- nevow/flat/ten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index 5bf12086..d0ee53ee 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -82,7 +82,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): print(82, straccum, rest) gen = rest.pop() for item in gen: - if isinstance(item, str): + if isinstance(item, bytes): straccum.append(item) elif isinstance(item, str): straccum.append(item.encode('utf8')) From 020dbd0e8aa847438fcef3af68511cc09f38e494 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:07:46 -0800 Subject: [PATCH 052/157] more stupid unicode issues --- nevow/flat/ten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index d0ee53ee..75762ad6 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -113,7 +113,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): break if straccum: - writer(tags.raw(''.join(straccum))) + writer(util.toBytes(tags.raw(''.join(straccum)))) def flatten(stan, ctx=None): From d80b10fa947b61be22c2c4d1670b0283f54ba4ef Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:08:52 -0800 Subject: [PATCH 053/157] more stupid unicode issues --- nevow/flat/ten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index 75762ad6..3dfe526c 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -113,7 +113,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): break if straccum: - writer(util.toBytes(tags.raw(''.join(straccum)))) + writer(util.toBytes(tags.raw(b''.join(straccum)))) def flatten(stan, ctx=None): From 61c40e256f4cfcc9e48129a065e48c0bc86d3bc8 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:09:27 -0800 Subject: [PATCH 054/157] more stupid unicode issues --- nevow/flat/ten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index 3dfe526c..bece57e3 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -127,7 +127,7 @@ def flatten(stan, ctx=None): ctx.remember(None, inevow.IData) result = [] list(iterflatten(stan, ctx, result.append)) - return tags.raw(''.join(result)) + return tags.raw(b''.join(result)) def precompile(stan, ctx=None): From 43f5ec88ef93f29c2f2947521c444233acf66a9d Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:10:52 -0800 Subject: [PATCH 055/157] more stupid unicode issues --- nevow/flat/ten.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index bece57e3..9086ab0c 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -79,7 +79,6 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): rest = [ iter([partialflatten(ctx, stan)]) ] straccum = [] while rest: - print(82, straccum, rest) gen = rest.pop() for item in gen: if isinstance(item, bytes): @@ -95,7 +94,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): else: if straccum: writer(util.toBytes(tags.raw(''.join(straccum)))) - del straccum[:] + straccum=[] if shouldYieldItem is not None and shouldYieldItem(item): replacement = [] yield item, replacement.append From 1ca9907b5c9c42387e14d525f92cfc51f7d61021 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:11:29 -0800 Subject: [PATCH 056/157] more stupid unicode issues --- nevow/flat/ten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index 9086ab0c..cc8fea2c 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -93,7 +93,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): break else: if straccum: - writer(util.toBytes(tags.raw(''.join(straccum)))) + writer(util.toBytes(tags.raw(b''.join(straccum)))) straccum=[] if shouldYieldItem is not None and shouldYieldItem(item): replacement = [] From f4e8b9df036b45d4500aa2fc911adb919f6a63b4 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:13:58 -0800 Subject: [PATCH 057/157] more stupid unicode issues --- nevow/athena.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index ea2092a0..1e55774e 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1521,8 +1521,8 @@ def _rewriteEventHandlerToAttribute(tag): name = info.attributes['event'].encode('ascii') handler = info.attributes['handler'] extraAttributes[name] = _handlerFormat % { - 'handler': json.serialize(handler.decode('ascii')), - 'event': json.serialize(name.decode('ascii'))} + 'handler': json.serialize(unicode(handler, 'ascii')), + 'event': json.serialize(unicode(name, 'ascii'))} tag(**extraAttributes) return tag From 24b13c991fb5c927eea8a1447fc646b978cfe2d0 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:19:14 -0800 Subject: [PATCH 058/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 1e55774e..d109e6be 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1520,7 +1520,7 @@ def _rewriteEventHandlerToAttribute(tag): info = tag.children.pop(i) name = info.attributes['event'].encode('ascii') handler = info.attributes['handler'] - extraAttributes[name] = _handlerFormat % { + extraAttributes[unicode(name)] = _handlerFormat % { 'handler': json.serialize(unicode(handler, 'ascii')), 'event': json.serialize(unicode(name, 'ascii'))} tag(**extraAttributes) From 165525cd78189e6e5fea1e061f77ba72c150a691 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:27:49 -0800 Subject: [PATCH 059/157] more stupid unicode issues --- nevow/query.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/query.py b/nevow/query.py index e5fa1b9d..8d91fe59 100644 --- a/nevow/query.py +++ b/nevow/query.py @@ -66,6 +66,7 @@ def onePattern(self, pattern): node = None for item in self.original: try: + print(69, type(item)) newNode = inevow.IQ(item).onePattern(pattern) except stan.NodeNotFound: continue From 6eee43d65ab8db1ca7152846b1b4ddeba8e13f57 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:29:00 -0800 Subject: [PATCH 060/157] more stupid unicode issues --- nevow/athena.py | 1 - nevow/query.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index d109e6be..f5d8d6a0 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -395,7 +395,6 @@ def getModuleForName(self, className): self._loadPlugins = False jsMod = className - print(398, jsMod, self.mapping) while jsMod: try: self.mapping[jsMod] diff --git a/nevow/query.py b/nevow/query.py index 8d91fe59..7ff2a90d 100644 --- a/nevow/query.py +++ b/nevow/query.py @@ -4,7 +4,7 @@ """inevow.IQ adapter implementations. """ import twisted.python.components as tpc - +from nevow.util import unicode from nevow import inevow, stan from zope.interface import implementer @@ -67,7 +67,7 @@ def onePattern(self, pattern): for item in self.original: try: print(69, type(item)) - newNode = inevow.IQ(item).onePattern(pattern) + newNode = inevow.IQ(unicode(item)).onePattern(pattern) except stan.NodeNotFound: continue else: From e7d052c86d06ea507aaee32f0c72ca712016f6e2 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:30:41 -0800 Subject: [PATCH 061/157] more stupid unicode issues --- nevow/query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/query.py b/nevow/query.py index 7ff2a90d..55309ea4 100644 --- a/nevow/query.py +++ b/nevow/query.py @@ -66,7 +66,7 @@ def onePattern(self, pattern): node = None for item in self.original: try: - print(69, type(item)) + print(69, type(item), item) newNode = inevow.IQ(unicode(item)).onePattern(pattern) except stan.NodeNotFound: continue From a59b36ab80be66263dc4063846271a9da483ea15 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:31:51 -0800 Subject: [PATCH 062/157] more stupid unicode issues --- nevow/flat/ten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index cc8fea2c..f52b95b5 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -112,7 +112,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): break if straccum: - writer(util.toBytes(tags.raw(b''.join(straccum)))) + writer(util.toBytes((b''.join(straccum)))) def flatten(stan, ctx=None): From ddf6a3b6fcfa312a10319206bbc5d96a6eae92aa Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:33:22 -0800 Subject: [PATCH 063/157] more stupid unicode issues --- nevow/flat/ten.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index f52b95b5..e87c62bf 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -112,7 +112,8 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): break if straccum: - writer(util.toBytes((b''.join(straccum)))) + print(115, b''.join(straccum)) + writer(tags.raw(b''.join(straccum))) def flatten(stan, ctx=None): From 10d1566e4894ad7cb09795317fda66c0524cdd96 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:35:03 -0800 Subject: [PATCH 064/157] more stupid unicode issues --- nevow/flat/ten.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index e87c62bf..69da7cda 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -113,7 +113,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): if straccum: print(115, b''.join(straccum)) - writer(tags.raw(b''.join(straccum))) + writer(tags.raw(b''.join(flatten(straccum)))) def flatten(stan, ctx=None): From d73d2ae11045d150ab31e6151e3567ab4139bd7c Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:41:38 -0800 Subject: [PATCH 065/157] more stupid unicode issues --- nevow/flat/ten.py | 3 +-- nevow/stan.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/nevow/flat/ten.py b/nevow/flat/ten.py index 69da7cda..5a5e754b 100644 --- a/nevow/flat/ten.py +++ b/nevow/flat/ten.py @@ -112,8 +112,7 @@ def iterflatten(stan, ctx, writer, shouldYieldItem=None): break if straccum: - print(115, b''.join(straccum)) - writer(tags.raw(b''.join(flatten(straccum)))) + writer(tags.raw(b''.join([i for i in straccum]))) def flatten(stan, ctx=None): diff --git a/nevow/stan.py b/nevow/stan.py index 93de0579..8246cfd5 100644 --- a/nevow/stan.py +++ b/nevow/stan.py @@ -63,7 +63,7 @@ def __repr__(self): return '' % self.content -class raw(str): +class raw(bytes): """Raw content marker. Raw content is never altered in any way. It is a sequence of bytes that will From 2a496d9d23b791e20df643ac5a51e02ba8dcc0f6 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:42:43 -0800 Subject: [PATCH 066/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index 1aaea79b..dab2aa0f 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -128,7 +128,7 @@ def fromString(klass, st): scheme, netloc, path, query, fragment = urllib.parse.urlsplit(st) u = klass( scheme, netloc, - [urllib.parse.unquote(seg) for seg in path.split('/')[1:]], + [urllib.parse.unquote(toBytes(seg)) for seg in path.split('/')[1:]], unquerify(query), urllib.parse.unquote(fragment)) return u fromString = classmethod(fromString) From ae2b929b5940d28d381a8307506364634635233a Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:43:46 -0800 Subject: [PATCH 067/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index dab2aa0f..ecb7b033 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -128,7 +128,7 @@ def fromString(klass, st): scheme, netloc, path, query, fragment = urllib.parse.urlsplit(st) u = klass( scheme, netloc, - [urllib.parse.unquote(toBytes(seg)) for seg in path.split('/')[1:]], + [urllib.parse.unquote(toBytes(seg)) for seg in toBytes(path).split(b'/')[1:]], unquerify(query), urllib.parse.unquote(fragment)) return u fromString = classmethod(fromString) From e9f37407a07d476d042b19c98e7ef1516415bc7d Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:44:39 -0800 Subject: [PATCH 068/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index ecb7b033..5b8d6942 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -129,7 +129,7 @@ def fromString(klass, st): u = klass( scheme, netloc, [urllib.parse.unquote(toBytes(seg)) for seg in toBytes(path).split(b'/')[1:]], - unquerify(query), urllib.parse.unquote(fragment)) + unquerify(toBytes(query)), urllib.parse.unquote(toBytes(fragment))) return u fromString = classmethod(fromString) From a08b17712522bd207a4d400919bc296ba40d488e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:45:55 -0800 Subject: [PATCH 069/157] more stupid unicode issues --- nevow/url.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/url.py b/nevow/url.py index 5b8d6942..8cd274c2 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -128,6 +128,7 @@ def fromString(klass, st): scheme, netloc, path, query, fragment = urllib.parse.urlsplit(st) u = klass( scheme, netloc, + print(131, [toBytes(seg) for seg in toBytes(path).split(b'/')[1:]]) [urllib.parse.unquote(toBytes(seg)) for seg in toBytes(path).split(b'/')[1:]], unquerify(toBytes(query)), urllib.parse.unquote(toBytes(fragment))) return u From 8bd38752cf698802f77cbe536a4b7460a45ebfdc Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:46:44 -0800 Subject: [PATCH 070/157] more stupid unicode issues --- nevow/url.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index 8cd274c2..f891eef2 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -126,9 +126,10 @@ def cloneURL(self, scheme, netloc, pathsegs, querysegs, fragment): def fromString(klass, st): scheme, netloc, path, query, fragment = urllib.parse.urlsplit(st) + print(131, [toBytes(seg) for seg in toBytes(path).split(b'/')[1:]]) u = klass( scheme, netloc, - print(131, [toBytes(seg) for seg in toBytes(path).split(b'/')[1:]]) + [urllib.parse.unquote(toBytes(seg)) for seg in toBytes(path).split(b'/')[1:]], unquerify(toBytes(query)), urllib.parse.unquote(toBytes(fragment))) return u From 2a4b5d8cf2c1d271d84239e92ec072fd2fbc36be Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:47:56 -0800 Subject: [PATCH 071/157] more stupid unicode issues --- nevow/url.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nevow/url.py b/nevow/url.py index f891eef2..e025b150 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -126,11 +126,11 @@ def cloneURL(self, scheme, netloc, pathsegs, querysegs, fragment): def fromString(klass, st): scheme, netloc, path, query, fragment = urllib.parse.urlsplit(st) - print(131, [toBytes(seg) for seg in toBytes(path).split(b'/')[1:]]) + print(131, [urllib.parse.unquote(toBytes(seg)) for seg in toBytes(path).split(b'/')[1:]]) u = klass( scheme, netloc, - [urllib.parse.unquote(toBytes(seg)) for seg in toBytes(path).split(b'/')[1:]], + [ for seg in toBytes(path).split(b'/')[1:]], unquerify(toBytes(query)), urllib.parse.unquote(toBytes(fragment))) return u fromString = classmethod(fromString) From edb5ce2f7ad598658f670fcda441639ed3d22b2b Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:48:21 -0800 Subject: [PATCH 072/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index e025b150..d0807fba 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -130,7 +130,7 @@ def fromString(klass, st): u = klass( scheme, netloc, - [ for seg in toBytes(path).split(b'/')[1:]], + [urllib.parse.unquote(toBytes(seg)) for seg in toBytes(path).split(b'/')[1:]], unquerify(toBytes(query)), urllib.parse.unquote(toBytes(fragment))) return u fromString = classmethod(fromString) From d4ab53c8c5198eefec37d2d66497dc0d58cfed46 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:50:18 -0800 Subject: [PATCH 073/157] more stupid unicode issues --- nevow/url.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nevow/url.py b/nevow/url.py index d0807fba..525c5687 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -126,11 +126,10 @@ def cloneURL(self, scheme, netloc, pathsegs, querysegs, fragment): def fromString(klass, st): scheme, netloc, path, query, fragment = urllib.parse.urlsplit(st) - print(131, [urllib.parse.unquote(toBytes(seg)) for seg in toBytes(path).split(b'/')[1:]]) u = klass( scheme, netloc, - [urllib.parse.unquote(toBytes(seg)) for seg in toBytes(path).split(b'/')[1:]], + [urllib.parse.unquote(unicode(seg)) for seg in unicode(path).split('/')[1:]], unquerify(toBytes(query)), urllib.parse.unquote(toBytes(fragment))) return u fromString = classmethod(fromString) From cbf82e3c4cf3e1c27fdf52d48ea18ca88d2255a8 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:51:38 -0800 Subject: [PATCH 074/157] more stupid unicode issues --- nevow/url.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/url.py b/nevow/url.py index 525c5687..22b4a2a3 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -21,6 +21,7 @@ from nevow.util import unicode, toBytes def _uqf(query): + query=unicode(query) for x in query.split('&'): if '=' in x: yield tuple( [urllib.parse.unquote_plus(s) for s in x.split('=', 1)] ) From 64ad9d2af85f15d076e9d76192bc0229b7e6388b Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:52:22 -0800 Subject: [PATCH 075/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index 22b4a2a3..0aa3b14e 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -131,7 +131,7 @@ def fromString(klass, st): scheme, netloc, [urllib.parse.unquote(unicode(seg)) for seg in unicode(path).split('/')[1:]], - unquerify(toBytes(query)), urllib.parse.unquote(toBytes(fragment))) + unquerify(toBytes(query)), urllib.parse.unquote(unicode(fragment))) return u fromString = classmethod(fromString) From 53e74bd340c53311e9319e55eaa441632c60ca34 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:53:54 -0800 Subject: [PATCH 076/157] more stupid unicode issues --- nevow/json.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nevow/json.py b/nevow/json.py index 2374adc8..36f88bdf 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -267,6 +267,8 @@ def _serialize(obj, w, seen): w('false') elif isinstance(obj, (int, float)): w(str(obj)) + elif isinstance(obj, bytes): + obj=unicode(obj) elif isinstance(obj, str): w('"') w(stringEncode(obj)) From b80a0567ef3a428a5a2d9ea8ed7df9021ee3da8e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:55:21 -0800 Subject: [PATCH 077/157] more stupid unicode issues --- nevow/athena.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index f5d8d6a0..ceac5a88 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1357,7 +1357,12 @@ def getCSSModuleURL(self, moduleName): def getImportStan(self, moduleName): moduleDef = jsModuleDeclaration(moduleName); - return [tags.script(type='text/javascript')[tags.raw(moduleDef)], + + t=tags.script(type='text/javascript') + r=tags.raw(moduleDef) + t[r] + + return [t, tags.script(type='text/javascript', src=self.getJSModuleURL(moduleName))] From 8c261788c500581f38f9abbb7b4b68a9b6af380e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:55:59 -0800 Subject: [PATCH 078/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index ceac5a88..3c4b1187 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1359,7 +1359,7 @@ def getImportStan(self, moduleName): moduleDef = jsModuleDeclaration(moduleName); t=tags.script(type='text/javascript') - r=tags.raw(moduleDef) + r=tags.raw(toBytes(moduleDef)) t[r] return [t, From c28a65586f07a6fa877928e6906ab1727a1570c2 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 10 Feb 2016 23:59:45 -0800 Subject: [PATCH 079/157] more stupid unicode issues --- nevow/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/__init__.py b/nevow/__init__.py index d467bed2..5b955e20 100644 --- a/nevow/__init__.py +++ b/nevow/__init__.py @@ -142,6 +142,7 @@ def loadFlatteners(S): nevow.query.QuerySlot nevow.stan._PrecompiledSlot nevow.inevow.IQ nevow.query.QueryNeverFind nevow.stan.xml nevow.inevow.IQ nevow.query.QueryNeverFind nevow.stan.raw nevow.inevow.IQ +nevow.query.QueryNeverFind builtins.bytes nevow.inevow.IQ nevow.query.QueryNeverFind nevow.stan.directive nevow.inevow.IQ # I18N From 7ceadfcc66d6fb8002888f55c379f80d654be0c4 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:00:51 -0800 Subject: [PATCH 080/157] more stupid unicode issues --- nevow/query.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nevow/query.py b/nevow/query.py index 55309ea4..b38fea0f 100644 --- a/nevow/query.py +++ b/nevow/query.py @@ -66,8 +66,7 @@ def onePattern(self, pattern): node = None for item in self.original: try: - print(69, type(item), item) - newNode = inevow.IQ(unicode(item)).onePattern(pattern) + newNode = inevow.IQ(item).onePattern(pattern) except stan.NodeNotFound: continue else: From 597b83d81ae3bfcd3b19556221319ca563cc0578 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:01:43 -0800 Subject: [PATCH 081/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 3c4b1187..fd4db4f7 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1635,7 +1635,7 @@ def _prepare(self, tag): C{self.page}, add this object to the page and fill the I{athena:id} slot with this object's Athena identifier. """ - assert isinstance(self.jsClass, bytes), "jsClass must be a unicode string" + assert isinstance(self.jsClass, str), "jsClass must be a unicode string" if self.page is None: raise OrphanedFragment(self) From cd47c6282572a51f23b338cbb167891799be325a Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:06:18 -0800 Subject: [PATCH 082/157] more stupid unicode issues --- nevow/_flat.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/_flat.py b/nevow/_flat.py index 08fe9ffa..a7940641 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -408,6 +408,7 @@ def flatten(request, root, inAttribute, inXML): """ stack = [_flatten(request, root, [], None, inAttribute, inXML)] while stack: + print(411,stack) try: # In Python 2.5, after an exception, a generator's gi_frame is # None. From 5ee8bc7e5a6c898e87eafdf13ec59000a3704e74 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:07:43 -0800 Subject: [PATCH 083/157] more stupid unicode issues --- nevow/_flat.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nevow/_flat.py b/nevow/_flat.py index a7940641..e70ddadb 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -412,6 +412,8 @@ def flatten(request, root, inAttribute, inXML): try: # In Python 2.5, after an exception, a generator's gi_frame is # None. + if not hasattr(stack[-1], 'gi_frame'): + raise StopIteration(); frame = stack[-1].gi_frame element = next(stack[-1]) except StopIteration: From 7117eadf3553259ae8d5fa7e79fa41b4c47bc8de Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:08:53 -0800 Subject: [PATCH 084/157] more stupid unicode issues --- nevow/_flat.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/nevow/_flat.py b/nevow/_flat.py index e70ddadb..c2d57c4f 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -268,29 +268,29 @@ def _flatten(request, root, slotData, renderFactory, inAttribute, inXML): False, True): yield element else: - yield '<' + yield b'<' if isinstance(root.tagName, str): tagName = root.tagName.encode('ascii') else: - tagName = str(root.tagName) + tagName = toBytes(root.tagName) yield tagName for k, v in sorted(root.attributes.items()): if isinstance(k, str): k = k.encode('ascii') - yield " " + k + "=\"" + yield b" " + k + b"=\"" for element in _flatten(request, v, slotData, renderFactory, True, True): yield element - yield "\"" + yield b"\"" if root.children or tagName not in allowSingleton: - yield '>' + yield b'>' for element in _flatten(request, root.children, slotData, renderFactory, False, True): yield element - yield '' + yield b'' else: - yield ' />' + yield b' />' else: if isinstance(root.render, directive): rendererName = root.render.name From 4cd76c360e70a7e23c2c1344e600460cca858e3a Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:11:22 -0800 Subject: [PATCH 085/157] more stupid unicode issues --- nevow/_flat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/_flat.py b/nevow/_flat.py index c2d57c4f..ca8ba082 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -426,7 +426,7 @@ def flatten(request, root, inAttribute, inXML): roots.append(frame.f_locals['root']) raise FlattenerError(e, roots, extract_tb(exc_info()[2])) else: - if type(element) is str: + if type(element) is bytes: yield element elif isinstance(element, Deferred): def cbx(xxx_todo_changeme): From 87314056ad48e35399e67e3923dc536b28a3457d Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:14:38 -0800 Subject: [PATCH 086/157] more stupid unicode issues --- nevow/_flat.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/nevow/_flat.py b/nevow/_flat.py index ca8ba082..1b961c93 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -412,8 +412,6 @@ def flatten(request, root, inAttribute, inXML): try: # In Python 2.5, after an exception, a generator's gi_frame is # None. - if not hasattr(stack[-1], 'gi_frame'): - raise StopIteration(); frame = stack[-1].gi_frame element = next(stack[-1]) except StopIteration: From e492e74b321df351f2fa87bc67cd32250b216131 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:22:57 -0800 Subject: [PATCH 087/157] more stupid unicode issues --- nevow/_flat.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nevow/_flat.py b/nevow/_flat.py index 1b961c93..348227b2 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -61,14 +61,14 @@ def _formatRoot(self, obj): @return: A string representation of C{obj}. @rtype: L{str} """ - if isinstance(obj, str): + if isinstance(obj, bytes): # It's somewhat unlikely that there will ever be a str in the roots # list. However, something like a MemoryError during a str.replace # call (eg, replacing " with ") could possibly cause this. # Likewise, UTF-8 encoding a unicode string to a byte string might # fail like this. if len(obj) > 40: - if isinstance(obj, str): + if isinstance(obj, bytes): prefix = 1 else: prefix = 2 @@ -237,18 +237,18 @@ def _flatten(request, root, slotData, renderFactory, inAttribute, inXML): root = root.tag if isinstance(root, raw): - root = str(root) + root = toBytes(root) if inAttribute: - root = root.replace('"', '"') + root = root.replace(b'"', b'"') yield root elif isinstance(root, Proto): - root = str(root) + root = toBytes(root) if root: if root in allowSingleton: - yield '<' + root + ' />' + yield b'<' + root + b' />' else: - yield '<' + root + '>' - elif isinstance(root, str): + yield b'<' + root + b'>' + elif isinstance(root, bytes): yield escapedData(root, inAttribute, inXML) elif isinstance(root, slot): slotValue = _getSlotValue(root.name, slotData) @@ -467,7 +467,7 @@ def _flattensome(state, write, schedule, result): except: result.errback() else: - if type(element) is str: + if type(element) is bytes: write(element) continue else: From cc0cf7e99d58abf6be973720efc64c8a14a6ca2b Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:24:42 -0800 Subject: [PATCH 088/157] more stupid unicode issues --- nevow/_flat.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nevow/_flat.py b/nevow/_flat.py index 348227b2..4ee02432 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -149,12 +149,12 @@ def escapedData(data, inAttribute, inXML): @return: The quoted form of C{data}. """ if inXML or inAttribute: - data = data.replace('&', '&' - ).replace('<', '<' - ).replace('>', '>') + data = toBytes(data).replace(b'&', b'&' + ).replace(b'<', b'<' + ).replace(b'>', b'>') if inAttribute: - data = data.replace('"', '"') - return data + data = toBytes(data).replace(b'"', b'"') + return toBytes(data) From 5a738ea01ffc0376c72879182de1e3356ff81f6e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:25:42 -0800 Subject: [PATCH 089/157] more stupid unicode issues --- nevow/_flat.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/_flat.py b/nevow/_flat.py index 4ee02432..e38e4455 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -31,6 +31,7 @@ from nevow.flat import flattenFactory from nevow.flat.ten import getFlattener from nevow.tags import raw +from nevow.util import unicode, toBytes class FlattenerError(Exception): From f6f980894c89c7e22272b01660ddb0a9a2b0966b Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:26:53 -0800 Subject: [PATCH 090/157] more stupid unicode issues --- nevow/_flat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/_flat.py b/nevow/_flat.py index e38e4455..f1c380c1 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -425,7 +425,7 @@ def flatten(request, root, inAttribute, inXML): roots.append(frame.f_locals['root']) raise FlattenerError(e, roots, extract_tb(exc_info()[2])) else: - if type(element) is bytes: + if isinstance(element, bytes): yield element elif isinstance(element, Deferred): def cbx(xxx_todo_changeme): From f27fc1dbc315213a0c5bb588c191b1eb253d81f7 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:31:20 -0800 Subject: [PATCH 091/157] more stupid unicode issues --- nevow/_flat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/_flat.py b/nevow/_flat.py index f1c380c1..55e76376 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -468,7 +468,7 @@ def _flattensome(state, write, schedule, result): except: result.errback() else: - if type(element) is bytes: + if isinstance(element, bytes): write(element) continue else: From d5e2c89d6bd366cf210dd531c64455b67b7d7156 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:33:25 -0800 Subject: [PATCH 092/157] more stupid unicode issues --- nevow/_flat.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nevow/_flat.py b/nevow/_flat.py index 55e76376..59fc0be2 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -409,7 +409,6 @@ def flatten(request, root, inAttribute, inXML): """ stack = [_flatten(request, root, [], None, inAttribute, inXML)] while stack: - print(411,stack) try: # In Python 2.5, after an exception, a generator's gi_frame is # None. From c3e0ee4c8e504833df0b278e22765d1cd87eb6e2 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:35:34 -0800 Subject: [PATCH 093/157] more stupid unicode issues --- nevow/static.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nevow/static.py b/nevow/static.py index fc363dca..f4056920 100644 --- a/nevow/static.py +++ b/nevow/static.py @@ -338,9 +338,7 @@ def renderHTTP(self, ctx): return '' # return data - FileTransfer(f, size, request) - # and make sure the connection doesn't get closed - return request.deferred + return f.read() def redirect(self, request): return redirectTo(addSlash(request), request) From c40b23d43ddeee7edbbabda537e6e39384ff30f8 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:38:24 -0800 Subject: [PATCH 094/157] more stupid unicode issues --- nevow/appserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/appserver.py b/nevow/appserver.py index 2a7581c6..4fc32192 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -130,7 +130,7 @@ def renderHTTP_exception(self, ctx, reason): request.write(b"Exception") from nevow import failure result = failure.formatFailure(reason) - request.write(toBytes(''.join(flat.flatten(result)))) + request.write(toBytes(b''.join(flat.flatten(result)))) request.write(b"") request.finishRequest( False ) From 769164d430c11ec90c188b284e2331b3d3b7a758 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:39:35 -0800 Subject: [PATCH 095/157] more stupid unicode issues --- nevow/appserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/appserver.py b/nevow/appserver.py index 4fc32192..3ed2169b 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -130,7 +130,7 @@ def renderHTTP_exception(self, ctx, reason): request.write(b"Exception") from nevow import failure result = failure.formatFailure(reason) - request.write(toBytes(b''.join(flat.flatten(result)))) + request.write(toBytes(b''.join((toBytes(i) for i in flat.flatten(result))))) request.write(b"") request.finishRequest( False ) From 7832ff88490ba899ee39fae81488125541a9298c Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:40:18 -0800 Subject: [PATCH 096/157] more stupid unicode issues --- nevow/appserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/appserver.py b/nevow/appserver.py index 3ed2169b..273da5ce 100644 --- a/nevow/appserver.py +++ b/nevow/appserver.py @@ -130,7 +130,7 @@ def renderHTTP_exception(self, ctx, reason): request.write(b"Exception") from nevow import failure result = failure.formatFailure(reason) - request.write(toBytes(b''.join((toBytes(i) for i in flat.flatten(result))))) + request.write(flat.flatten(result)) request.write(b"") request.finishRequest( False ) From de20dd2dacb14d2da0a24ff7fe1424bbdb6eb1c8 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:41:10 -0800 Subject: [PATCH 097/157] more stupid unicode issues --- nevow/url.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/url.py b/nevow/url.py index 0aa3b14e..bc3b6421 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -144,6 +144,7 @@ def fromRequest(klass, request): uri = request.prePathURL() if '?' in request.uri: uri += '?' + request.uri.split('?')[-1] + print(147, klass.fromString(uri)) return klass.fromString(uri) fromRequest = classmethod(fromRequest) From 51ba698f1ea2f139b18119d18b86e4119f8d02e7 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:43:26 -0800 Subject: [PATCH 098/157] more stupid unicode issues --- nevow/athena.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/athena.py b/nevow/athena.py index fd4db4f7..35feb605 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -909,6 +909,7 @@ def _getRequiredModules(self, memo): the page before this Fragment's widget can be instantiated. modules are accessible. """ + print(912, getJSModuleURL(dep.name)) return [ (dep.name, self.page.getJSModuleURL(dep.name)) for dep From 35b39f23ec02c4af86e467d03a3589335c0c2180 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:43:51 -0800 Subject: [PATCH 099/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 35feb605..c6025dc7 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -909,7 +909,7 @@ def _getRequiredModules(self, memo): the page before this Fragment's widget can be instantiated. modules are accessible. """ - print(912, getJSModuleURL(dep.name)) + print(912, self.page.getJSModuleURL(dep.name)) return [ (dep.name, self.page.getJSModuleURL(dep.name)) for dep From c1ebc041072127573d6e9d3081bfc8dc9f8ac5b4 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:45:19 -0800 Subject: [PATCH 100/157] more stupid unicode issues --- nevow/athena.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index c6025dc7..06a21f3d 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -909,7 +909,8 @@ def _getRequiredModules(self, memo): the page before this Fragment's widget can be instantiated. modules are accessible. """ - print(912, self.page.getJSModuleURL(dep.name)) + for i in self._getModuleForClass().allDependencies(memo): + print(913, self.page.getJSModuleURL(i.name)) return [ (dep.name, self.page.getJSModuleURL(dep.name)) for dep From f92e008f59ef58c63d42939d4ee8e024b65da3ea Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:47:53 -0800 Subject: [PATCH 101/157] more stupid unicode issues --- nevow/athena.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nevow/athena.py b/nevow/athena.py index 06a21f3d..497168fb 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -395,9 +395,12 @@ def getModuleForName(self, className): self._loadPlugins = False jsMod = className + while jsMod: + print(398, jsMod) try: self.mapping[jsMod] + print(403, self.mapping[jsMod]) except KeyError: if '.' not in jsMod: break From a45fa024897bfdaab7dc61e0b2b7a51c3a6c7d79 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:48:52 -0800 Subject: [PATCH 102/157] more stupid unicode issues --- nevow/athena.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/athena.py b/nevow/athena.py index 497168fb..ed74fbf6 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -401,6 +401,7 @@ def getModuleForName(self, className): try: self.mapping[jsMod] print(403, self.mapping[jsMod]) + print(404, JSModule.getOrCreate(jsMod, self.mapping)) except KeyError: if '.' not in jsMod: break From af9c80a9a64845323cf781a4cfef05c8a33fa04a Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:51:49 -0800 Subject: [PATCH 103/157] more stupid unicode issues --- nevow/athena.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nevow/athena.py b/nevow/athena.py index ed74fbf6..96c1d4a6 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1346,6 +1346,8 @@ def notifyOnDisconnect(self): def getJSModuleURL(self, moduleName): + print(1349, self.jsModuleRoot) + print(1350, self.jsModuleRoot.child('')) return self.jsModuleRoot.child(moduleName) From e2ed60da2b6f1ad45038d5163852a9d91b242dd2 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:53:09 -0800 Subject: [PATCH 104/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 96c1d4a6..291240c8 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1241,7 +1241,7 @@ def renderHTTP(self, ctx): if not self._supportedBrowser(request): request.write(self.renderUnsupported(ctx)) return '' - + print(1244,URL.fromString(flat.flatten(here, ctx))) self._becomeLive(URL.fromString(flat.flatten(here, ctx))) neverEverCache(request) From d9c73a3e9fa2d448f73c98a9628b3719921f948c Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:54:11 -0800 Subject: [PATCH 105/157] more stupid unicode issues --- nevow/athena.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/athena.py b/nevow/athena.py index 291240c8..296814a7 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1241,6 +1241,7 @@ def renderHTTP(self, ctx): if not self._supportedBrowser(request): request.write(self.renderUnsupported(ctx)) return '' + print(1244,here) print(1244,URL.fromString(flat.flatten(here, ctx))) self._becomeLive(URL.fromString(flat.flatten(here, ctx))) From 3548dc97168919ef45f3c3da8d536aa52b92bc66 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:56:15 -0800 Subject: [PATCH 106/157] more stupid unicode issues --- nevow/url.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nevow/url.py b/nevow/url.py index bc3b6421..34b1b382 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -550,12 +550,14 @@ def URLOverlaySerializer(original, context): yield original else: url = original.urlaccessor(context) + print(553,url) for (cmd, args, kw) in original.dolater: url = getattr(url, cmd)(*args, **kw) req = context.locate(inevow.IRequest) for key in original._keep: for value in req.args.get(key, []): url = url.add(key, value) + print(560,url) yield serialize(url, context) From 54590b4981fdf8ff66b81f005e3868b8766aef02 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:57:48 -0800 Subject: [PATCH 107/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index 34b1b382..43f4c8eb 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -557,7 +557,7 @@ def URLOverlaySerializer(original, context): for key in original._keep: for value in req.args.get(key, []): url = url.add(key, value) - print(560,url) + print(560,url, serialize(url, context)) yield serialize(url, context) From 9d8850c05db61717d00301b319a1373815d24624 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 00:58:22 -0800 Subject: [PATCH 108/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index 43f4c8eb..104537ac 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -557,7 +557,7 @@ def URLOverlaySerializer(original, context): for key in original._keep: for value in req.args.get(key, []): url = url.add(key, value) - print(560,url, serialize(url, context)) + print(560,url, list(serialize(url, context))) yield serialize(url, context) From 58d95edae7a7c98a4a9b6a735796f0c911c8e18e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:00:35 -0800 Subject: [PATCH 109/157] more stupid unicode issues --- nevow/url.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/nevow/url.py b/nevow/url.py index 104537ac..17cce07d 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -550,15 +550,13 @@ def URLOverlaySerializer(original, context): yield original else: url = original.urlaccessor(context) - print(553,url) for (cmd, args, kw) in original.dolater: url = getattr(url, cmd)(*args, **kw) req = context.locate(inevow.IRequest) for key in original._keep: for value in req.args.get(key, []): url = url.add(key, value) - print(560,url, list(serialize(url, context))) - yield serialize(url, context) + yield b''.join(serialize(url, context)) ## This is totally unfinished and doesn't work yet. From 8dbcd374e3186226896870b287eba639342ddbb7 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:02:01 -0800 Subject: [PATCH 110/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index 17cce07d..3685e6e9 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -556,7 +556,7 @@ def URLOverlaySerializer(original, context): for key in original._keep: for value in req.args.get(key, []): url = url.add(key, value) - yield b''.join(serialize(url, context)) + yield toBytes(''.join(serialize(url, context))) ## This is totally unfinished and doesn't work yet. From a296c70948a450fc4e80848731d8daedc7447955 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:03:33 -0800 Subject: [PATCH 111/157] more stupid unicode issues --- nevow/url.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nevow/url.py b/nevow/url.py index 3685e6e9..10e9c58c 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -127,11 +127,13 @@ def cloneURL(self, scheme, netloc, pathsegs, querysegs, fragment): def fromString(klass, st): scheme, netloc, path, query, fragment = urllib.parse.urlsplit(st) + print(130, st) u = klass( scheme, netloc, [urllib.parse.unquote(unicode(seg)) for seg in unicode(path).split('/')[1:]], unquerify(toBytes(query)), urllib.parse.unquote(unicode(fragment))) + print(135, u) return u fromString = classmethod(fromString) From cd43f58a1ea98336e2d5dee7e62da3477bd2760e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:05:22 -0800 Subject: [PATCH 112/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index 10e9c58c..539dd61f 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -131,7 +131,7 @@ def fromString(klass, st): u = klass( scheme, netloc, - [urllib.parse.unquote(unicode(seg)) for seg in unicode(path).split('/')[1:]], + b''.join([urllib.parse.unquote(unicode(seg)) for seg in unicode(path).split('/')[1:]]), unquerify(toBytes(query)), urllib.parse.unquote(unicode(fragment))) print(135, u) return u From b2203e2283fa82c42383f55e851065785253a2a4 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:05:56 -0800 Subject: [PATCH 113/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index 539dd61f..b69cf017 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -131,7 +131,7 @@ def fromString(klass, st): u = klass( scheme, netloc, - b''.join([urllib.parse.unquote(unicode(seg)) for seg in unicode(path).split('/')[1:]]), + toBytes(''.join([urllib.parse.unquote(unicode(seg)) for seg in unicode(path).split('/')[1:]])), unquerify(toBytes(query)), urllib.parse.unquote(unicode(fragment))) print(135, u) return u From 2e1b9983bb4e3033ca37c45920093ed7d00bbfb8 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:07:05 -0800 Subject: [PATCH 114/157] more stupid unicode issues --- nevow/url.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nevow/url.py b/nevow/url.py index b69cf017..f1262350 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -182,6 +182,8 @@ def child(self, path): """Construct a url where the given path segment is a child of this url """ l = self.pathList() + if not l: + l=[path] if l[-1] == '': l[-1] = path else: From d5d1cfe18e0780cdc2ed2d8c455cf75c07883f7e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:09:19 -0800 Subject: [PATCH 115/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index f1262350..f7b661c1 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -127,7 +127,7 @@ def cloneURL(self, scheme, netloc, pathsegs, querysegs, fragment): def fromString(klass, st): scheme, netloc, path, query, fragment = urllib.parse.urlsplit(st) - print(130, st) + print(130, scheme, netloc, path, query, fragment) u = klass( scheme, netloc, From d5305db685ec231789df4d01849bd2078e63e489 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:11:45 -0800 Subject: [PATCH 116/157] more stupid unicode issues --- nevow/url.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/url.py b/nevow/url.py index f7b661c1..29f9c711 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -374,6 +374,7 @@ def anchor(self, anchor=None): ## object protocol override ## def __str__(self): + print(377,flat.flatten(self)) return str(flat.flatten(self)) def __repr__(self): From ec0562af1dd941bf1973d3d6fb3e19e0716143b4 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:14:47 -0800 Subject: [PATCH 117/157] more stupid unicode issues --- nevow/url.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/nevow/url.py b/nevow/url.py index 29f9c711..e1fa67a7 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -524,29 +524,29 @@ def _maybeEncode(s): urlContext = WovenContext(parent=context, precompile=context.precompile, inURL=True) if original.scheme: # TODO: handle Unicode (see #2409) - yield "%s://%s" % (original.scheme, original.netloc) + yield b"%s://%s" % (toBytes(original.scheme), toBytes(original.netloc)) for pathsegment in original._qpathlist: - yield '/' + yield b'/' yield serialize(_maybeEncode(pathsegment), urlContext) query = original._querylist if query: - yield '?' + yield b'?' first = True for key, value in query: if not first: # xhtml can't handle unescaped '&' if context.isAttrib is True: - yield '&' + yield b'&' else: - yield '&' + yield b'&' else: first = False yield serialize(_maybeEncode(key), urlContext) if value is not None: - yield '=' + yield b'=' yield serialize(_maybeEncode(value), urlContext) if original.fragment: - yield "#" + yield b"#" yield serialize(_maybeEncode(original.fragment), urlContext) From 02393895b2fba16aae6d8737a75ac4c3480734ff Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:15:22 -0800 Subject: [PATCH 118/157] more stupid unicode issues --- nevow/url.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/url.py b/nevow/url.py index e1fa67a7..0a08f352 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -561,7 +561,7 @@ def URLOverlaySerializer(original, context): for key in original._keep: for value in req.args.get(key, []): url = url.add(key, value) - yield toBytes(''.join(serialize(url, context))) + yield toBytes(b''.join(serialize(url, context))) ## This is totally unfinished and doesn't work yet. From e03d7caec31a8d74be33d13d9ed1907418675e68 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:16:26 -0800 Subject: [PATCH 119/157] more stupid unicode issues --- nevow/json.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nevow/json.py b/nevow/json.py index 36f88bdf..92d70390 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -62,15 +62,15 @@ def group(self, num): return self.matched string = StringTokenizer() -identifier = re.compile(r'[A-Za-z_][A-Za-z_0-9]*') -colon = re.compile(r':') -comma = re.compile(r',') -true = re.compile(r'true') -false = re.compile(r'false') -null = re.compile(r'null') -undefined = re.compile(r'undefined') -floatNumber = re.compile(r'-?([1-9][0-9]*|0)(\.[0-9]+)([eE][-+]?[0-9]+)?') -longNumber = re.compile(r'-?([1-9][0-9]*|0)([eE][-+]?[0-9]+)?') +identifier = re.compile(br'[A-Za-z_][A-Za-z_0-9]*') +colon = re.compile(br':') +comma = re.compile(br',') +true = re.compile(br'true') +false = re.compile(br'false') +null = re.compile(br'null') +undefined = re.compile(br'undefined') +floatNumber = re.compile(br'-?([1-9][0-9]*|0)(\.[0-9]+)([eE][-+]?[0-9]+)?') +longNumber = re.compile(br'-?([1-9][0-9]*|0)([eE][-+]?[0-9]+)?') class StringToken(str): pass From 19db1e2a096ab672899e3183b95e3c127a011831 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:19:26 -0800 Subject: [PATCH 120/157] more stupid unicode issues --- nevow/athena.py | 4 ---- nevow/json.py | 44 ++++++++++++++++++++++---------------------- nevow/url.py | 4 ---- 3 files changed, 22 insertions(+), 30 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index 296814a7..82aed251 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1241,8 +1241,6 @@ def renderHTTP(self, ctx): if not self._supportedBrowser(request): request.write(self.renderUnsupported(ctx)) return '' - print(1244,here) - print(1244,URL.fromString(flat.flatten(here, ctx))) self._becomeLive(URL.fromString(flat.flatten(here, ctx))) neverEverCache(request) @@ -1347,8 +1345,6 @@ def notifyOnDisconnect(self): def getJSModuleURL(self, moduleName): - print(1349, self.jsModuleRoot) - print(1350, self.jsModuleRoot.child('')) return self.jsModuleRoot.child(moduleName) diff --git a/nevow/json.py b/nevow/json.py index 92d70390..b12250e8 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -19,16 +19,16 @@ class ParseError(ValueError): pass whitespace = re.compile( - r'(' - r'[\r\n\t\ ]+' - r'|/\*.*?\*/' - r'|//[^\n]*[\n]' - r')' + br'(' + br'[\r\n\t\ ]+' + br'|/\*.*?\*/' + br'|//[^\n]*[\n]' + br')' , re.VERBOSE + re.DOTALL) -openBrace = re.compile(r'{') -closeBrace = re.compile(r'}') -openSquare = re.compile(r'\[') -closeSquare = re.compile(r'\]') +openBrace = re.compile(br'{') +closeBrace = re.compile(br'}') +openSquare = re.compile(br'\[') +closeSquare = re.compile(br'\]') class StringTokenizer(object): """ @@ -36,12 +36,12 @@ class StringTokenizer(object): """ def match(self, s): - if not s.startswith('"'): + if not s.startswith(b'"'): return None bits = [] - SLASH = "\\" + SLASH = b"\\" IT = iter(s) bits = [next(IT)] @@ -52,8 +52,8 @@ def match(self, s): bits.append(next(IT)) except StopIteration: return None - if char == '"': - self.matched = ''.join(bits) + if char == b'"': + self.matched = b''.join(bits) return self return None @@ -82,8 +82,8 @@ class WhitespaceToken(object): pass def jsonlong(s): - if 'e' in s: - m, e = list(map(int, s.split('e', 1))) + if b'e' in s: + m, e = list(map(int, s.split(b'e', 1))) else: m, e = int(s), 0 return m * 10 ** e @@ -130,10 +130,10 @@ def accept(want, tokens): raise ParseError("Unexpected %r, %s expected" % (t , want)) def parseValue(tokens): - if tokens[0] == '{': + if tokens[0] == b'{': return parseObject(tokens) - if tokens[0] == '[': + if tokens[0] == b'[': return parseList(tokens) if tokens[0] in (True, False, None): @@ -149,11 +149,11 @@ def parseValue(tokens): _stringExpr = re.compile( - r'(?:\\x(?P[a-fA-F0-9]{2})) # Match hex-escaped unicode' '\n' - r'|' '\n' - r'(?:\\u(?P[a-fA-F0-9]{4})) # Match hex-escaped high unicode' '\n' - r'|' '\n' - r'(?P\\[fbntr\\"]) # Match escaped control characters' '\n', + br'(?:\\x(?P[a-fA-F0-9]{2})) # Match hex-escaped unicode' '\n' + br'|' '\n' + br'(?:\\u(?P[a-fA-F0-9]{4})) # Match hex-escaped high unicode' '\n' + br'|' '\n' + br'(?P\\[fbntr\\"]) # Match escaped control characters' '\n', re.VERBOSE) _controlMap = { diff --git a/nevow/url.py b/nevow/url.py index 0a08f352..b89e33ff 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -127,13 +127,11 @@ def cloneURL(self, scheme, netloc, pathsegs, querysegs, fragment): def fromString(klass, st): scheme, netloc, path, query, fragment = urllib.parse.urlsplit(st) - print(130, scheme, netloc, path, query, fragment) u = klass( scheme, netloc, toBytes(''.join([urllib.parse.unquote(unicode(seg)) for seg in unicode(path).split('/')[1:]])), unquerify(toBytes(query)), urllib.parse.unquote(unicode(fragment))) - print(135, u) return u fromString = classmethod(fromString) @@ -146,7 +144,6 @@ def fromRequest(klass, request): uri = request.prePathURL() if '?' in request.uri: uri += '?' + request.uri.split('?')[-1] - print(147, klass.fromString(uri)) return klass.fromString(uri) fromRequest = classmethod(fromRequest) @@ -374,7 +371,6 @@ def anchor(self, anchor=None): ## object protocol override ## def __str__(self): - print(377,flat.flatten(self)) return str(flat.flatten(self)) def __repr__(self): From 62cabd7d407ff7ce4c0e2a585ff5fa1ba6e2c7ff Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:20:18 -0800 Subject: [PATCH 121/157] more stupid unicode issues --- nevow/json.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nevow/json.py b/nevow/json.py index b12250e8..eb200aa3 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -149,11 +149,11 @@ def parseValue(tokens): _stringExpr = re.compile( - br'(?:\\x(?P[a-fA-F0-9]{2})) # Match hex-escaped unicode' '\n' - br'|' '\n' - br'(?:\\u(?P[a-fA-F0-9]{4})) # Match hex-escaped high unicode' '\n' - br'|' '\n' - br'(?P\\[fbntr\\"]) # Match escaped control characters' '\n', + br'(?:\\x(?P[a-fA-F0-9]{2})) # Match hex-escaped unicode' b'\n' + br'|' b'\n' + br'(?:\\u(?P[a-fA-F0-9]{4})) # Match hex-escaped high unicode' b'\n' + br'|' b'\n' + br'(?P\\[fbntr\\"]) # Match escaped control characters' b'\n', re.VERBOSE) _controlMap = { From b1e08ae66ac1090ce60720ba0fe08502e6e33480 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:21:10 -0800 Subject: [PATCH 122/157] more stupid unicode issues --- nevow/json.py | 62 +++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/nevow/json.py b/nevow/json.py index eb200aa3..36f88bdf 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -19,16 +19,16 @@ class ParseError(ValueError): pass whitespace = re.compile( - br'(' - br'[\r\n\t\ ]+' - br'|/\*.*?\*/' - br'|//[^\n]*[\n]' - br')' + r'(' + r'[\r\n\t\ ]+' + r'|/\*.*?\*/' + r'|//[^\n]*[\n]' + r')' , re.VERBOSE + re.DOTALL) -openBrace = re.compile(br'{') -closeBrace = re.compile(br'}') -openSquare = re.compile(br'\[') -closeSquare = re.compile(br'\]') +openBrace = re.compile(r'{') +closeBrace = re.compile(r'}') +openSquare = re.compile(r'\[') +closeSquare = re.compile(r'\]') class StringTokenizer(object): """ @@ -36,12 +36,12 @@ class StringTokenizer(object): """ def match(self, s): - if not s.startswith(b'"'): + if not s.startswith('"'): return None bits = [] - SLASH = b"\\" + SLASH = "\\" IT = iter(s) bits = [next(IT)] @@ -52,8 +52,8 @@ def match(self, s): bits.append(next(IT)) except StopIteration: return None - if char == b'"': - self.matched = b''.join(bits) + if char == '"': + self.matched = ''.join(bits) return self return None @@ -62,15 +62,15 @@ def group(self, num): return self.matched string = StringTokenizer() -identifier = re.compile(br'[A-Za-z_][A-Za-z_0-9]*') -colon = re.compile(br':') -comma = re.compile(br',') -true = re.compile(br'true') -false = re.compile(br'false') -null = re.compile(br'null') -undefined = re.compile(br'undefined') -floatNumber = re.compile(br'-?([1-9][0-9]*|0)(\.[0-9]+)([eE][-+]?[0-9]+)?') -longNumber = re.compile(br'-?([1-9][0-9]*|0)([eE][-+]?[0-9]+)?') +identifier = re.compile(r'[A-Za-z_][A-Za-z_0-9]*') +colon = re.compile(r':') +comma = re.compile(r',') +true = re.compile(r'true') +false = re.compile(r'false') +null = re.compile(r'null') +undefined = re.compile(r'undefined') +floatNumber = re.compile(r'-?([1-9][0-9]*|0)(\.[0-9]+)([eE][-+]?[0-9]+)?') +longNumber = re.compile(r'-?([1-9][0-9]*|0)([eE][-+]?[0-9]+)?') class StringToken(str): pass @@ -82,8 +82,8 @@ class WhitespaceToken(object): pass def jsonlong(s): - if b'e' in s: - m, e = list(map(int, s.split(b'e', 1))) + if 'e' in s: + m, e = list(map(int, s.split('e', 1))) else: m, e = int(s), 0 return m * 10 ** e @@ -130,10 +130,10 @@ def accept(want, tokens): raise ParseError("Unexpected %r, %s expected" % (t , want)) def parseValue(tokens): - if tokens[0] == b'{': + if tokens[0] == '{': return parseObject(tokens) - if tokens[0] == b'[': + if tokens[0] == '[': return parseList(tokens) if tokens[0] in (True, False, None): @@ -149,11 +149,11 @@ def parseValue(tokens): _stringExpr = re.compile( - br'(?:\\x(?P[a-fA-F0-9]{2})) # Match hex-escaped unicode' b'\n' - br'|' b'\n' - br'(?:\\u(?P[a-fA-F0-9]{4})) # Match hex-escaped high unicode' b'\n' - br'|' b'\n' - br'(?P\\[fbntr\\"]) # Match escaped control characters' b'\n', + r'(?:\\x(?P[a-fA-F0-9]{2})) # Match hex-escaped unicode' '\n' + r'|' '\n' + r'(?:\\u(?P[a-fA-F0-9]{4})) # Match hex-escaped high unicode' '\n' + r'|' '\n' + r'(?P\\[fbntr\\"]) # Match escaped control characters' '\n', re.VERBOSE) _controlMap = { From 0e4308ba8490807552ac81e99e6beb66f40344d6 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:21:47 -0800 Subject: [PATCH 123/157] more stupid unicode issues --- nevow/json.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/json.py b/nevow/json.py index 36f88bdf..9548a25e 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -227,7 +227,7 @@ def parse(s): """ Return the object represented by the JSON-encoded string C{s}. """ - tokens = tokenise(s) + tokens = tokenise(unicode(s)) value, tokens = parseValue(tokens) if tokens: raise ParseError("Unexpected %r" % tokens[0]) From b737a6774206a0e06aa94fd5ce289c490006bc7f Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:24:16 -0800 Subject: [PATCH 124/157] more stupid unicode issues --- nevow/athena.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/athena.py b/nevow/athena.py index 82aed251..8a6c51eb 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -903,6 +903,7 @@ def _getModuleForClass(self): Get a L{JSModule} object for the class specified by this object's jsClass string. """ + print(906, jsDeps.getModuleForClass(self.jsClass)) return jsDeps.getModuleForClass(self.jsClass) From 5f145083c3c502e5beada9da61ae03a625d503ea Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:25:35 -0800 Subject: [PATCH 125/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 8a6c51eb..3cfb18c1 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -903,7 +903,7 @@ def _getModuleForClass(self): Get a L{JSModule} object for the class specified by this object's jsClass string. """ - print(906, jsDeps.getModuleForClass(self.jsClass)) + print(906, self.page.getJSModuleURL(jsDeps.getModuleForClass(self.jsClass).name)) return jsDeps.getModuleForClass(self.jsClass) From f1960b1b6bd5b7c7a39073f5558b6efb93228c45 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:28:48 -0800 Subject: [PATCH 126/157] more stupid unicode issues --- nevow/athena.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nevow/athena.py b/nevow/athena.py index 3cfb18c1..d300ac6e 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1376,6 +1376,9 @@ def render_liveglue(self, ctx, data): bootstrapString = b'\n'.join( [self._bootstrapCall(method, args) for method, args in self._bootstraps(ctx)]) + print(1379, [self.getImportStan(jsDeps.getModuleForName(name).name) + for (name, url) + in self._getRequiredModules(self._jsDepsMemo)]) return ctx.tag[ self.getStylesheetStan(self._getRequiredCSSModules(self._cssDepsMemo)), From a6677e5eabb3eb054ca61e9a0189e99882b1cfe6 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:30:22 -0800 Subject: [PATCH 127/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index d300ac6e..fe549984 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1376,7 +1376,7 @@ def render_liveglue(self, ctx, data): bootstrapString = b'\n'.join( [self._bootstrapCall(method, args) for method, args in self._bootstraps(ctx)]) - print(1379, [self.getImportStan(jsDeps.getModuleForName(name).name) + print(1379, [name, url for (name, url) in self._getRequiredModules(self._jsDepsMemo)]) return ctx.tag[ From adedf839bbfc969547d031ab7d38a1adcbf40879 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:31:11 -0800 Subject: [PATCH 128/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index fe549984..589ebe4a 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1376,7 +1376,7 @@ def render_liveglue(self, ctx, data): bootstrapString = b'\n'.join( [self._bootstrapCall(method, args) for method, args in self._bootstraps(ctx)]) - print(1379, [name, url + print(1379, [(name, url) for (name, url) in self._getRequiredModules(self._jsDepsMemo)]) return ctx.tag[ From fa1131a10eb97c2f937701240a657eeb34ed8ecd Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:32:29 -0800 Subject: [PATCH 129/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 589ebe4a..7da62bbe 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1376,7 +1376,7 @@ def render_liveglue(self, ctx, data): bootstrapString = b'\n'.join( [self._bootstrapCall(method, args) for method, args in self._bootstraps(ctx)]) - print(1379, [(name, url) + print(1379, [flatten(url) for (name, url) in self._getRequiredModules(self._jsDepsMemo)]) return ctx.tag[ From 64700bd136231548edd7dcde660391c82f49542d Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:35:00 -0800 Subject: [PATCH 130/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 7da62bbe..a27e441b 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1376,7 +1376,7 @@ def render_liveglue(self, ctx, data): bootstrapString = b'\n'.join( [self._bootstrapCall(method, args) for method, args in self._bootstraps(ctx)]) - print(1379, [flatten(url) + print(1379, [flat.flatten(url) for (name, url) in self._getRequiredModules(self._jsDepsMemo)]) return ctx.tag[ From 4c2ade1cbe2d3ad6eeb0511145dc2be9ce7e565f Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:44:31 -0800 Subject: [PATCH 131/157] more stupid unicode issues --- nevow/athena.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nevow/athena.py b/nevow/athena.py index a27e441b..e1a32f8f 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1346,6 +1346,7 @@ def notifyOnDisconnect(self): def getJSModuleURL(self, moduleName): + print(1349, moduleName) return self.jsModuleRoot.child(moduleName) From fd9bdf13434027aac4bdd15350dbd2d6cca16feb Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:45:26 -0800 Subject: [PATCH 132/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index e1a32f8f..eefa0ced 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1346,7 +1346,7 @@ def notifyOnDisconnect(self): def getJSModuleURL(self, moduleName): - print(1349, moduleName) + print(1349, self.jsModuleRoot.child(moduleName), flat.flatten(self.jsModuleRoot.child(moduleName))) return self.jsModuleRoot.child(moduleName) From f31326326971693b62a28049b6b4243a47026164 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:47:01 -0800 Subject: [PATCH 133/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index eefa0ced..00acc367 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1346,7 +1346,7 @@ def notifyOnDisconnect(self): def getJSModuleURL(self, moduleName): - print(1349, self.jsModuleRoot.child(moduleName), flat.flatten(self.jsModuleRoot.child(moduleName))) + print(1349, moduleName, self.jsModuleRoot.child(moduleName), flat.flatten(self.jsModuleRoot.child(moduleName))) return self.jsModuleRoot.child(moduleName) From dd16b22b2396961d0a4fbc8c04923d81fd1d4c05 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:52:00 -0800 Subject: [PATCH 134/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 00acc367..fbd2371e 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1370,7 +1370,7 @@ def getImportStan(self, moduleName): t[r] return [t, - tags.script(type='text/javascript', src=self.getJSModuleURL(moduleName))] + tags.script(type='text/javascript', src=flat.flatten(self.getJSModuleURL(moduleName)))] def render_liveglue(self, ctx, data): From 113f393f3e2760f3688beb4eefe76cbed4844493 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:54:13 -0800 Subject: [PATCH 135/157] more stupid unicode issues --- nevow/athena.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index fbd2371e..497168fb 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -401,7 +401,6 @@ def getModuleForName(self, className): try: self.mapping[jsMod] print(403, self.mapping[jsMod]) - print(404, JSModule.getOrCreate(jsMod, self.mapping)) except KeyError: if '.' not in jsMod: break @@ -903,7 +902,6 @@ def _getModuleForClass(self): Get a L{JSModule} object for the class specified by this object's jsClass string. """ - print(906, self.page.getJSModuleURL(jsDeps.getModuleForClass(self.jsClass).name)) return jsDeps.getModuleForClass(self.jsClass) @@ -1242,6 +1240,7 @@ def renderHTTP(self, ctx): if not self._supportedBrowser(request): request.write(self.renderUnsupported(ctx)) return '' + self._becomeLive(URL.fromString(flat.flatten(here, ctx))) neverEverCache(request) @@ -1346,7 +1345,6 @@ def notifyOnDisconnect(self): def getJSModuleURL(self, moduleName): - print(1349, moduleName, self.jsModuleRoot.child(moduleName), flat.flatten(self.jsModuleRoot.child(moduleName))) return self.jsModuleRoot.child(moduleName) @@ -1370,16 +1368,13 @@ def getImportStan(self, moduleName): t[r] return [t, - tags.script(type='text/javascript', src=flat.flatten(self.getJSModuleURL(moduleName)))] + tags.script(type='text/javascript', src=self.getJSModuleURL(moduleName))] def render_liveglue(self, ctx, data): bootstrapString = b'\n'.join( [self._bootstrapCall(method, args) for method, args in self._bootstraps(ctx)]) - print(1379, [flat.flatten(url) - for (name, url) - in self._getRequiredModules(self._jsDepsMemo)]) return ctx.tag[ self.getStylesheetStan(self._getRequiredCSSModules(self._cssDepsMemo)), From 51b28e984d72e31b3c6b73109095373a6b5763fe Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:54:54 -0800 Subject: [PATCH 136/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 497168fb..c1e05f95 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1368,7 +1368,7 @@ def getImportStan(self, moduleName): t[r] return [t, - tags.script(type='text/javascript', src=self.getJSModuleURL(moduleName))] + tags.script(type='text/javascript', src=flat.flatten(self.getJSModuleURL(moduleName)))] def render_liveglue(self, ctx, data): From 9322b640da66e0ac042577ed38b1e3ace782caa8 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:56:41 -0800 Subject: [PATCH 137/157] more stupid unicode issues --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index c1e05f95..b52722c4 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1515,7 +1515,7 @@ def action_close(self, ctx): handler = stan.Proto('athena:handler') -_handlerFormat = "return Nevow.Athena.Widget.handleEvent(this, %(event)s, %(handler)s);" +_handlerFormat = b"return Nevow.Athena.Widget.handleEvent(this, %(event)s, %(handler)s);" def _rewriteEventHandlerToAttribute(tag): """ From b9b91dc95e4ebb2cef927832392eae4714ad9b96 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:57:54 -0800 Subject: [PATCH 138/157] more stupid unicode issues --- nevow/athena.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index b52722c4..f551fb7b 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1530,8 +1530,8 @@ def _rewriteEventHandlerToAttribute(tag): name = info.attributes['event'].encode('ascii') handler = info.attributes['handler'] extraAttributes[unicode(name)] = _handlerFormat % { - 'handler': json.serialize(unicode(handler, 'ascii')), - 'event': json.serialize(unicode(name, 'ascii'))} + b'handler': json.serialize(bytes(handler, 'ascii')), + b'event': json.serialize(bytes(name, 'ascii'))} tag(**extraAttributes) return tag From 32ed80e8f4d6a7080f6bae0937d97177571b0417 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:58:53 -0800 Subject: [PATCH 139/157] more stupid unicode issues --- nevow/athena.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index f551fb7b..17df462e 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1529,9 +1529,12 @@ def _rewriteEventHandlerToAttribute(tag): info = tag.children.pop(i) name = info.attributes['event'].encode('ascii') handler = info.attributes['handler'] - extraAttributes[unicode(name)] = _handlerFormat % { - b'handler': json.serialize(bytes(handler, 'ascii')), - b'event': json.serialize(bytes(name, 'ascii'))} + kw={ + b'handler': json.serialize(unicode(handler, 'ascii')), + b'event': json.serialize(unicode(name, 'ascii'))} + print(1535,kw) + + extraAttributes[unicode(name)] = _handlerFormat % kw tag(**extraAttributes) return tag From 900b237efdc77c12716c03cf5ef5f97bacff25fd Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 01:59:50 -0800 Subject: [PATCH 140/157] more stupid unicode issues --- nevow/json.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/json.py b/nevow/json.py index 9548a25e..0684ef89 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -179,7 +179,7 @@ def _stringSub(m): def parseString(tokens): if type(tokens[0]) is not StringToken: raise ParseError("Unexpected %r" % tokens[0]) - s = _stringExpr.sub(_stringSub, tokens.pop(0)[1:-1].decode('utf-8')) + s = _stringExpr.sub(_stringSub, tokens.pop(0)[1:-1]) return s, tokens From 24a2f1f9cc23d159209adc2def8736d88dc15b93 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Thu, 11 Feb 2016 14:59:01 -0800 Subject: [PATCH 141/157] remove debugging prints --- examples/athenademo/calculator.py | 2 +- nevow/athena.py | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/examples/athenademo/calculator.py b/examples/athenademo/calculator.py index 23a8d2fc..6ccabcd9 100644 --- a/examples/athenademo/calculator.py +++ b/examples/athenademo/calculator.py @@ -138,7 +138,7 @@ def render_calculator(self, ctx, data): def main(): - # log.startLogging(sys.stdout) + log.startLogging(sys.stdout) site = NevowSite(CalculatorParentPage(calc=Calculator())) reactor.listenTCP(8081, site) reactor.run() diff --git a/nevow/athena.py b/nevow/athena.py index 17df462e..4bf3711d 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -397,10 +397,8 @@ def getModuleForName(self, className): jsMod = className while jsMod: - print(398, jsMod) try: self.mapping[jsMod] - print(403, self.mapping[jsMod]) except KeyError: if '.' not in jsMod: break @@ -912,8 +910,6 @@ def _getRequiredModules(self, memo): the page before this Fragment's widget can be instantiated. modules are accessible. """ - for i in self._getModuleForClass().allDependencies(memo): - print(913, self.page.getJSModuleURL(i.name)) return [ (dep.name, self.page.getJSModuleURL(dep.name)) for dep @@ -1532,7 +1528,6 @@ def _rewriteEventHandlerToAttribute(tag): kw={ b'handler': json.serialize(unicode(handler, 'ascii')), b'event': json.serialize(unicode(name, 'ascii'))} - print(1535,kw) extraAttributes[unicode(name)] = _handlerFormat % kw tag(**extraAttributes) From 6e4abb8b9b636f01a60b3d867b610cb43de7a9a8 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Fri, 4 Mar 2016 13:55:18 -0800 Subject: [PATCH 142/157] hacks to make more parts run on py3 --- examples/examples.tac | 17 +++-------------- examples/tree/tree.py | 2 +- nevow/flat/ten.py | 2 +- nevow/rend.py | 2 +- nevow/url.py | 14 ++++++++++---- 5 files changed, 16 insertions(+), 21 deletions(-) diff --git a/examples/examples.tac b/examples/examples.tac index c763248d..14b9bd27 100644 --- a/examples/examples.tac +++ b/examples/examples.tac @@ -41,8 +41,6 @@ try: from manualform import manualform from guarded import guarded from guarded import guarded2 - from xul import xul_nevow - from liveanimal import liveanimal from most_basic import most_basic from http_auth import http_auth from logout_guard import logout_guard @@ -53,8 +51,6 @@ try: from macros import macros from i18n import i18n, xmli18n from cal import cal - from tabbed import tabbed - from progress import progress from athenademo import calculator from athenademo import typeahead @@ -94,15 +90,12 @@ class Sources(rend.Page): def __init__(self, path, _): rend.Page.__init__(self, path) - def render_htmlizer(self, ctx, path): + def render_htmlizer(self, ctx, path): from twisted.python import htmlizer from io import StringIO output = StringIO() - try: - htmlizer.filter(open(path), output, writer=htmlizer.SmallerHTMLWriter) - except AttributeError: - output = StringIO("""Starting after Nevow 0.4.1 Twisted -2.0 is a required dependency. Please install it""") + print(97,path) + htmlizer.filter(open(path), output, writer=htmlizer.SmallerHTMLWriter) return tags.xml(output.getvalue()) docFactory = loaders.stan( @@ -143,9 +136,7 @@ class Examples(rend.Page): manualform=manualform.Page(), guarded=guarded.createResource(), guarded2=guarded2.createResource(), - xul_nevow=xul_nevow.createResource(), advanced_manualform=advanced_manualform.Page(), - liveanimal=liveanimal.createResource(), http_auth=http_auth.AuthorizationRequired(), most_basic=most_basic.root, logout_guard=logout_guard.createResource(), @@ -155,8 +146,6 @@ class Examples(rend.Page): i18n=i18n.createResource(), xmli18n=xmli18n.createResource(), calendar=cal.Calendar(), - tabbed=tabbed.TabbedPage(), - progress=progress.createResource(), fragments=fragments.Root(), macros=macros.Root(), typeahead=typeahead.DataEntry(), diff --git a/examples/tree/tree.py b/examples/tree/tree.py index 53002d0d..fdcb771b 100644 --- a/examples/tree/tree.py +++ b/examples/tree/tree.py @@ -31,7 +31,7 @@ def addChild(name=annotate.String(required=True), @implementer(ITreeEdit) class TreeRenderer(rend.Page): addSlash = True - docFactory = loaders.htmlstr(""" + docFactory = loaders.xmlstr(""" Tree Editor

Date: Tue, 22 Mar 2016 17:07:04 -0700 Subject: [PATCH 143/157] more stuff to support py3 --- nevow/athena.py | 12 +++++++----- nevow/url.py | 14 ++++---------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index 4bf3711d..cd0bf863 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1314,7 +1314,9 @@ def removeLocalObject(self, objID): def callRemote(self, methodName, *args): requestID = 's2c%i' % (self._requestIDCounter(),) - message = ('call', (bytes(methodName, 'ascii'), requestID, args)) + if isinstance(methodName, bytes): + methodName=methodName.decode('utf-8') + message = ('call', (methodName, requestID, args)) resultD = defer.Deferred() self._remoteCalls[requestID] = resultD self.addMessage(message) @@ -1477,9 +1479,9 @@ def _cbCall(result): result = ( 'Divmod.Error', ['%s: %s' % ( - result.type.__name__.decode('ascii'), - result.getErrorMessage().decode('ascii'))]) - message = ('respond', (unicode(requestId), success, result)) + result.type.__name__, + result.getErrorMessage())]) + message = ('respond', (str(requestId), success, result)) self.addMessage(message) result.addBoth(_cbCall) @@ -1794,7 +1796,7 @@ def callRemote(self, methodName, *varargs): return self.page.callRemote( "Nevow.Athena.callByAthenaID", self._athenaID, - str(methodName, 'ascii'), + methodName, varargs) diff --git a/nevow/url.py b/nevow/url.py index fb314c98..b89e33ff 100644 --- a/nevow/url.py +++ b/nevow/url.py @@ -166,8 +166,6 @@ def pathList(self, unquote=False, copy=True): result = list(map(urllib.parse.unquote, result)) if copy: result = result[:] - if isinstance(result, (str, bytes)): - return [result] return result def sibling(self, path): @@ -255,13 +253,12 @@ def click(self, href): return self query = unquerify(query) - if isinstance(path, bytes): - path=path.decode('charmap') + if scheme: if path and path[0] == '/': path = path[1:] return self.cloneURL( - scheme, netloc, list(map(raw, path.encode('charmap').split(b'/'))), query, fragment) + scheme, netloc, list(map(raw, path.split('/'))), query, fragment) else: scheme = self.scheme @@ -560,7 +557,7 @@ def URLOverlaySerializer(original, context): for key in original._keep: for value in req.args.get(key, []): url = url.add(key, value) - yield toBytes(b''.join([toBytes(b) for b in serialize(url, context)])) + yield toBytes(b''.join(serialize(url, context))) ## This is totally unfinished and doesn't work yet. @@ -633,12 +630,9 @@ def renderHTTP(self, ctx): bits = [] def flattened(spam): # Join the bits to make a complete URL. - print(635) - u = (b''.join([bytes(b) for b in bits])) + u = ''.join(bits) # It might also be relative so resolve it against the current URL # and flatten it again. - print(639, u) u = flat.flatten(URL.fromContext(ctx).click(u), ctx) - print(639, u) return redirectTo(u, inevow.IRequest(ctx)) return flat.flattenFactory(self.original, ctx, bits.append, flattened) From 72e25c2c96fd4371acf315993fe52cf4ad5948a2 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Tue, 22 Mar 2016 21:07:50 -0700 Subject: [PATCH 144/157] more stuff to support py3 --- nevow/_flat.py | 4 ++++ nevow/athena.py | 14 +++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/nevow/_flat.py b/nevow/_flat.py index 59fc0be2..142ac91e 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -409,6 +409,8 @@ def flatten(request, root, inAttribute, inXML): """ stack = [_flatten(request, root, [], None, inAttribute, inXML)] while stack: + if isinstance(stack[-1], str): + yield stack.pop(-1) try: # In Python 2.5, after an exception, a generator's gi_frame is # None. @@ -424,6 +426,8 @@ def flatten(request, root, inAttribute, inXML): roots.append(frame.f_locals['root']) raise FlattenerError(e, roots, extract_tb(exc_info()[2])) else: + if isinstance(element, str): + yield element.encode('utf-8') if isinstance(element, bytes): yield element elif isinstance(element, Deferred): diff --git a/nevow/athena.py b/nevow/athena.py index cd0bf863..2953f4b6 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -89,14 +89,14 @@ def activeChannel(request): class MappingResource(object): """ L{inevow.IResource} which looks up segments in a mapping between symbolic - names and the files they correspond to. + names and the files they correspond to. @type mapping: C{dict} @ivar mapping: A map between symbolic, requestable names (eg, 'Nevow.Athena') and C{str} instances which name files containing data which should be served in response. """ - + def __init__(self, mapping): self.mapping = mapping @@ -395,7 +395,7 @@ def getModuleForName(self, className): self._loadPlugins = False jsMod = className - + while jsMod: try: self.mapping[jsMod] @@ -1360,11 +1360,11 @@ def getCSSModuleURL(self, moduleName): def getImportStan(self, moduleName): moduleDef = jsModuleDeclaration(moduleName); - + t=tags.script(type='text/javascript') r=tags.raw(toBytes(moduleDef)) t[r] - + return [t, tags.script(type='text/javascript', src=flat.flatten(self.getJSModuleURL(moduleName)))] @@ -1530,7 +1530,7 @@ def _rewriteEventHandlerToAttribute(tag): kw={ b'handler': json.serialize(unicode(handler, 'ascii')), b'event': json.serialize(unicode(name, 'ascii'))} - + extraAttributes[unicode(name)] = _handlerFormat % kw tag(**extraAttributes) return tag @@ -1688,7 +1688,7 @@ def _flatten(self, what): # different module from whence nevow.athena and nevow.testutil could # import it. -exarkun from nevow.testutil import FakeRequest - return "".join(_flat.flatten(FakeRequest(), what, False, False)) + return b"".join((toBytes(i) for i in _flat.flatten(FakeRequest(), what, False, False))) def _structured(self): From 72ba79b91c5c84e767d2027140a1560dd33bc1f7 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Tue, 22 Mar 2016 22:33:11 -0700 Subject: [PATCH 145/157] more stuff to support py3 --- nevow/_flat.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/nevow/_flat.py b/nevow/_flat.py index 142ac91e..55b782a8 100644 --- a/nevow/_flat.py +++ b/nevow/_flat.py @@ -344,10 +344,10 @@ def _flatten(request, root, slotData, renderFactory, inAttribute, inXML): lambda ign: None) def cbFlattened(result): synchronous.append(None) - return (result, (str(s) for s in results)) + return (result, (toBytes(s) for s in results)) flattened.addCallback(cbFlattened) if synchronous: - yield ''.join(map(str, results)) + yield b''.join(map(toBytes, results)) else: yield flattened else: @@ -409,8 +409,6 @@ def flatten(request, root, inAttribute, inXML): """ stack = [_flatten(request, root, [], None, inAttribute, inXML)] while stack: - if isinstance(stack[-1], str): - yield stack.pop(-1) try: # In Python 2.5, after an exception, a generator's gi_frame is # None. @@ -428,7 +426,7 @@ def flatten(request, root, inAttribute, inXML): else: if isinstance(element, str): yield element.encode('utf-8') - if isinstance(element, bytes): + elif isinstance(element, bytes): yield element elif isinstance(element, Deferred): def cbx(xxx_todo_changeme): From 859cabc28205f8255ce3b98b24a811c49801e6e4 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 30 Mar 2016 10:04:50 -0700 Subject: [PATCH 146/157] extend timeout --- examples/athenademo/calculator.html | 4 ++++ examples/athenademo/calculator.js | 3 +++ examples/athenademo/calculator.py | 16 ++++++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/examples/athenademo/calculator.html b/examples/athenademo/calculator.html index e730d2d9..dec26e72 100644 --- a/examples/athenademo/calculator.html +++ b/examples/athenademo/calculator.html @@ -23,6 +23,10 @@ +
test
+ +
hello world
+ diff --git a/examples/athenademo/calculator.js b/examples/athenademo/calculator.js index 32842030..63b178a6 100644 --- a/examples/athenademo/calculator.js +++ b/examples/athenademo/calculator.js @@ -6,6 +6,9 @@ CalculatorDemo.Calculator.methods( /** * Handle click events on any of the calculator buttons. */ + function subclicked(self, node){ + alert(10); + }, function buttonClicked(self, node) { var symbol = node.value; d = self.callRemote("buttonClicked", symbol); diff --git a/examples/athenademo/calculator.py b/examples/athenademo/calculator.py index 6ccabcd9..2fb5dd5b 100644 --- a/examples/athenademo/calculator.py +++ b/examples/athenademo/calculator.py @@ -14,6 +14,7 @@ from nevow.athena import LivePage, LiveElement, expose from nevow.loaders import xmlfile from nevow.appserver import NevowSite +from nevow.page import renderer # Handy helper for finding external resources nearby. sibling = FilePath(__file__).sibling @@ -69,6 +70,13 @@ def buttonClicked(self, symbol): return self.expression +class SubCal(LiveElement): + docFactory = xmlfile(sibling('calculator.html').path, 'subcalcPattern') + + jsClass = u"CalculatorDemo.Calculator" + def __init__(self, par): + self.setFragmentParent(par) + class CalculatorElement(LiveElement): """ @@ -86,7 +94,7 @@ class CalculatorElement(LiveElement): """ docFactory = xmlfile(sibling('calculator.html').path, 'CalculatorPattern') - jsClass = "CalculatorDemo.Calculator" + jsClass = u"CalculatorDemo.Calculator" validSymbols = '0123456789/*-=+.C' @@ -94,7 +102,10 @@ def __init__(self, calc): LiveElement.__init__(self) self.calc = calc - + @renderer + def subcalc(self, *args): + return SubCal(self) + def buttonClicked(self, symbol): """ Accept a symbol from the browser, perform input validation on it, @@ -135,6 +146,7 @@ def render_calculator(self, ctx, data): c.setFragmentParent(self) return c + def main(): From 5d0e7a4f609b889f7d4a1d260e255e3b65306f87 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 30 Mar 2016 10:05:50 -0700 Subject: [PATCH 147/157] extend timeout --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 2953f4b6..86df13bd 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1021,7 +1021,7 @@ class LivePage(rend.Page, _HasJSClass, _HasCSSModule): # proxies) then deferreds returned from notifyOnDisconnect() will be # errbacked with ConnectionLost, and the LivePage will be removed from the # factory's cache, and then likely garbage collected. - TRANSPORTLESS_DISCONNECT_TIMEOUT = 30 + TRANSPORTLESS_DISCONNECT_TIMEOUT = 300 # This is the amount of time that each 'transport' request will remain open # to the server. Although the underlying transport, i.e. the conceptual From f2dd5265fe48da9c43d92ac6fa79e416db63d1e2 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Fri, 24 Jun 2016 13:35:42 -0700 Subject: [PATCH 148/157] explicitly pass event object for firefox --- nevow/athena.py | 2 +- nevow/js/Nevow/Athena/__init__.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index 86df13bd..83f3966d 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1513,7 +1513,7 @@ def action_close(self, ctx): handler = stan.Proto('athena:handler') -_handlerFormat = b"return Nevow.Athena.Widget.handleEvent(this, %(event)s, %(handler)s);" +_handlerFormat = b"return Nevow.Athena.Widget.handleEvent(this, %(event)s, %(handler)s, event);" def _rewriteEventHandlerToAttribute(tag): """ diff --git a/nevow/js/Nevow/Athena/__init__.js b/nevow/js/Nevow/Athena/__init__.js index 520658ca..6fedb999 100644 --- a/nevow/js/Nevow/Athena/__init__.js +++ b/nevow/js/Nevow/Athena/__init__.js @@ -1178,8 +1178,8 @@ Nevow.Athena.Widget.methods( * http://www.bazon.net/mishoo/articles.epl?art_id=824 */ Nevow.Athena.Widget._makeEventHandler = function (domEventName, methodName) { - return function () { - return Nevow.Athena.Widget.handleEvent(this, domEventName, methodName); + return function (e) { + return Nevow.Athena.Widget.handleEvent(this, domEventName, methodName, e); }; }; @@ -1216,7 +1216,7 @@ Nevow.Athena.Widget.dispatchEvent = function (widget, eventName, handlerName, ca * queue to allow multiple messages from the event handler to be batched up * into a single request. */ -Nevow.Athena.Widget.handleEvent = function handleEvent(node, eventName, handlerName) { +Nevow.Athena.Widget.handleEvent = function handleEvent(node, eventName, handlerName, event) { var widget = Nevow.Athena.Widget.get(node); var method = widget[handlerName]; var result = false; @@ -1226,7 +1226,7 @@ Nevow.Athena.Widget.handleEvent = function handleEvent(node, eventName, handlerN result = Nevow.Athena.Widget.dispatchEvent( widget, eventName, handlerName, function() { - return method.call(widget, node); + return method.call(widget, node, event); }); } return result; From 2d96fc24fdbcea3fb42392a21181d9edc2227082 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Tue, 28 Jun 2016 18:06:43 -0700 Subject: [PATCH 149/157] guess at file encoding --- nevow/athena.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index 83f3966d..68ca370c 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -12,7 +12,7 @@ from nevow import inevow, plugins, flat, _flat from nevow import rend, loaders, static from nevow import json, util, tags, guard, stan -from nevow.util import CachedFile, unicode, toBytes +from nevow.util import CachedFile, unicode, toBytes, getEncoding from nevow.useragent import UserAgent, browsers from nevow.url import here, URL @@ -185,7 +185,7 @@ def _getDeps(self, jsFile): """ Calculate our dependencies given the path to our source. """ - depgen = self._extractImports(open(jsFile, 'rU')) + depgen = self._extractImports(open(jsFile, 'rU', encoding=getEncoding(jsFile))) return self.packageDeps + list(dict.fromkeys(depgen).keys()) @@ -1513,7 +1513,7 @@ def action_close(self, ctx): handler = stan.Proto('athena:handler') -_handlerFormat = b"return Nevow.Athena.Widget.handleEvent(this, %(event)s, %(handler)s, event);" +_handlerFormat = b"return Nevow.Athena.Widget.handleEvent(this, %(event)s, %(handler)s);" def _rewriteEventHandlerToAttribute(tag): """ From a15e8dfed75ddcfa9485b0d146cffe1023cba09d Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Tue, 28 Jun 2016 18:13:57 -0700 Subject: [PATCH 150/157] guess at file encoding --- nevow/util.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/nevow/util.py b/nevow/util.py index fcbaa1a9..4a86f694 100644 --- a/nevow/util.py +++ b/nevow/util.py @@ -244,3 +244,12 @@ def load(self, *args, **kwargs): self._mtime = currentTime return self._cachedObj + + +def getEncoding(path): + with subprocess.Popen(['file', '-b', '--mime-encoding', path], stdout=subprocess.PIPE) as t: + t.wait() + encoding = t.stdout.read().strip().decode('charmap') + if encoding == 'binary': + encoding = 'charmap' + return encoding From d9daae231750d9697161d0071f84a2a46cafa06d Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Tue, 28 Jun 2016 18:16:39 -0700 Subject: [PATCH 151/157] guess at file encoding --- nevow/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/util.py b/nevow/util.py index 4a86f694..8e7986ac 100644 --- a/nevow/util.py +++ b/nevow/util.py @@ -1,7 +1,7 @@ # Copyright (c) 2004 Divmod. # See LICENSE for details. -import inspect, os.path +import inspect, os.path, subprocess def toBytes(obj, codec='utf-8'): if isinstance(obj, str): From 48e6370acee9798f886b2dbbc399d78b2d3c6490 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Wed, 29 Jun 2016 14:00:41 -0700 Subject: [PATCH 152/157] add event to event handlers --- nevow/athena.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nevow/athena.py b/nevow/athena.py index 68ca370c..897ddcfa 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -1513,7 +1513,7 @@ def action_close(self, ctx): handler = stan.Proto('athena:handler') -_handlerFormat = b"return Nevow.Athena.Widget.handleEvent(this, %(event)s, %(handler)s);" +_handlerFormat = b"return Nevow.Athena.Widget.handleEvent(this, %(event)s, %(handler)s, event);" def _rewriteEventHandlerToAttribute(tag): """ From 7e1664023aab31859bd870ba8f9324b811b434a2 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Mon, 17 Oct 2016 14:40:53 -0700 Subject: [PATCH 153/157] more py3 fixes --- nevow/dirlist.py | 2 +- nevow/flat/flatstan.py | 3 ++- nevow/static.py | 18 +++++++++--------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/nevow/dirlist.py b/nevow/dirlist.py index 27f657b4..33651b3e 100644 --- a/nevow/dirlist.py +++ b/nevow/dirlist.py @@ -80,7 +80,7 @@ def data_listing(self, context, data): def data_header(self, context, data): request = context.locate(inevow.IRequest) - return "Directory listing for %s" % urllib.parse.unquote(request.uri) + return "Directory listing for %s" % urllib.parse.unquote(request.uri.decode('ascii')) def render_tableLink(self, context, data): return tags.a(href=data['link'])[data['linktext']] diff --git a/nevow/flat/flatstan.py b/nevow/flat/flatstan.py index c53bc995..1a44900d 100644 --- a/nevow/flat/flatstan.py +++ b/nevow/flat/flatstan.py @@ -229,7 +229,8 @@ def FunctionSerializer(original, context, nocontextfun=FunctionSerializer_nocont try: nocontext = nocontextfun(original) if nocontext is True: - if original.__code__.co_argcount==3: + if hasattr(original, '__code__') and (original.__code__.co_argcount == 3 or ( + original.__code__.co_argcount == 2 and original.__code__.co_varnames[0] != 'self')): result = original(context, data) else: result = original(data) diff --git a/nevow/static.py b/nevow/static.py index f4056920..c047180b 100644 --- a/nevow/static.py +++ b/nevow/static.py @@ -78,10 +78,10 @@ def staticHTML(someString): def addSlash(request): - return "http%s://%s%s/" % ( - request.isSecure() and 's' or '', - request.getHeader("host"), - (string.split(request.uri,'?')[0])) + return b"http%s://%s%s/" % ( + request.isSecure() and b's' or b'', + request.getHeader("host").encode('ascii'), + (bytes.split(request.uri, b'?')[0])) class Registry(components.Componentized): """ @@ -289,7 +289,7 @@ def renderHTTP(self, ctx): # size is the length of the part actually transmitted fsize = size = self.getFileSize() - request.setHeader(b'accept-ranges','bytes') + request.setHeader(b'accept-ranges', 'bytes') if self.type: request.setHeader(b'content-type', self.type) @@ -313,10 +313,10 @@ def renderHTTP(self, ctx): if range is not None: # This is a request for partial data... - bytesrange = string.split(range, '=') + bytesrange = range.split('=') assert bytesrange[0] == 'bytes',\ "Syntactically invalid http range header!" - start, end = string.split(bytesrange[1],'-') + start, end = bytesrange[1].split('-') if start: f.seek(int(start)) if end: @@ -324,8 +324,8 @@ def renderHTTP(self, ctx): else: end = fsize-1 request.setResponseCode(http.PARTIAL_CONTENT) - request.setHeader(b'content-range',"bytes %s-%s/%s" % ( - str(start), str(end), str(fsize))) + request.setHeader(b'content-range', "bytes %s-%i/%i" % ( + start, end, fsize)) #content-length should be the actual size of the stuff we're #sending, not the full size of the on-server entity. size = 1 + end - int(start) From 026f7b1049a353ef739c8e1c2978b1fa7d2dc1fb Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Mon, 3 Jul 2017 20:21:57 -0700 Subject: [PATCH 154/157] Update loaders.py Add support for FilePath --- nevow/loaders.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/nevow/loaders.py b/nevow/loaders.py index 9c713b15..2478b700 100644 --- a/nevow/loaders.py +++ b/nevow/loaders.py @@ -24,6 +24,7 @@ import os.path from zope.interface import implementer +from twisted.python.filepath import FilePath from twisted.python.reflect import getClass from nevow import inevow @@ -31,6 +32,7 @@ from nevow.flat import flatsax from nevow.util import CachedFile + @implementer(inevow.IDocFactory) class stan(object): """A stan tags document factory""" @@ -40,13 +42,6 @@ class stan(object): pattern = None _cache = None - def __init__(self, stan=None, pattern=None): - if stan is not None: - self.stan = stan - if pattern is not None: - self.pattern = pattern - - def load(self, ctx=None, preprocessors=()): if self._cache is None: stan = [self.stan] @@ -59,6 +54,13 @@ def load(self, ctx=None, preprocessors=()): return self._cache + def __init__(self, stan=None, pattern=None): + if stan is not None: + self.stan = stan + if pattern is not None: + self.pattern = pattern + + @implementer(inevow.IDocFactory) @@ -108,10 +110,14 @@ class xmlfile(object): def __init__(self, template=None, pattern=None, templateDir=None, ignoreDocType=None, ignoreComment=None): self._cache = {} if template is not None: + if isinstance(template, FilePath): + template = template.path self.template = template if pattern is not None: self.pattern = pattern if templateDir is not None: + if isinstance(templateDir, FilePath): + templateDir = templateDir.path self.templateDir = templateDir if ignoreDocType is not None: self.ignoreDocType = ignoreDocType From 8351539e3bdf25aab33fe7cb1b48adc1bb5d651e Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Mon, 3 Jul 2017 20:22:33 -0700 Subject: [PATCH 155/157] Update athena.py --- nevow/athena.py | 177 ++++++++++++------------------------------------ 1 file changed, 45 insertions(+), 132 deletions(-) diff --git a/nevow/athena.py b/nevow/athena.py index 897ddcfa..2d9203ab 100644 --- a/nevow/athena.py +++ b/nevow/athena.py @@ -36,7 +36,6 @@ """) - class OrphanedFragment(Exception): """ Raised when an operation requiring a parent is attempted on an unattached @@ -44,7 +43,6 @@ class OrphanedFragment(Exception): """ - class LivePageError(Exception): """ Base exception for LivePage errors. @@ -52,7 +50,6 @@ class LivePageError(Exception): jsClass = 'Divmod.Error' - class NoSuchMethod(LivePageError): """ Raised when an attempt is made to invoke a method which is not defined or @@ -66,7 +63,6 @@ def __init__(self, objectID, methodName): LivePageError.__init__(self, objectID, methodName) - def neverEverCache(request): """ Set headers to indicate that the response to this request should never, @@ -97,15 +93,12 @@ class MappingResource(object): which should be served in response. """ - def __init__(self, mapping): self.mapping = mapping - def renderHTTP(self, ctx): return rend.FourOhFour() - def resourceFactory(self, fileName): """ Retrieve an L{inevow.IResource} which will render the contents of @@ -113,7 +106,6 @@ def resourceFactory(self, fileName): """ return static.File(fileName) - def locateChild(self, ctx, segments): try: impl = self.mapping[segments[0]] @@ -123,7 +115,6 @@ def locateChild(self, ctx, segments): return self.resourceFactory(impl), [] - def _dependencyOrdered(coll, memo): """ @type coll: iterable of modules @@ -135,7 +126,6 @@ def _dependencyOrdered(coll, memo): """ - class AthenaModule(object): """ A representation of a chunk of stuff in a file which can depend on other @@ -155,8 +145,8 @@ def getOrCreate(cls, name, mapping): return cls._modules[name] mod = cls._modules[name] = cls(name, mapping) return mod - getOrCreate = classmethod(getOrCreate) + getOrCreate = classmethod(getOrCreate) def __init__(self, name, mapping): self.name = name @@ -168,19 +158,16 @@ def __init__(self, name, mapping): self._cache = CachedFile(self.mapping[self.name], self._getDeps) - def __repr__(self): return '%s(%r)' % (self.__class__.__name__, self.name,) - _importExpression = re.compile('^// import (.+)$', re.MULTILINE) + def _extractImports(self, fileObj): s = fileObj.read() for m in self._importExpression.finditer(s): yield self.getOrCreate(unicode(m.group(1), 'ascii'), self.mapping) - - def _getDeps(self, jsFile): """ Calculate our dependencies given the path to our source. @@ -188,14 +175,12 @@ def _getDeps(self, jsFile): depgen = self._extractImports(open(jsFile, 'rU', encoding=getEncoding(jsFile))) return self.packageDeps + list(dict.fromkeys(depgen).keys()) - def dependencies(self): """ Return a list of names of other JavaScript modules we depend on. """ return self._cache.load() - def allDependencies(self, memo=None): """ Return the transitive closure of dependencies, including this module. @@ -235,13 +220,11 @@ def _insertDep(dependent): return ordered - class JSModule(AthenaModule): """ L{AthenaModule} subclass for dealing with Javascript modules. """ - _modules= {} - + _modules = {} class CSSModule(AthenaModule): @@ -265,7 +248,6 @@ def __init__(self, mapping): self.mapping = mapping - def _collectPackageBelow(baseDir, extension): """ Assume a filesystem package hierarchy starting at C{baseDir}. Collect all @@ -344,7 +326,6 @@ def __init__(self, baseDir): self.mapping = _collectPackageBelow(baseDir, 'css') - def allJavascriptPackages(): """ Return a dictionary mapping JavaScript module names to local filenames @@ -358,7 +339,6 @@ def allJavascriptPackages(): return d - def allCSSPackages(): """ Like L{allJavascriptPackages}, but for CSS packages. @@ -369,7 +349,6 @@ def allCSSPackages(): return d - class JSDependencies(object): """ Keeps track of which JavaScript files depend on which other @@ -385,7 +364,6 @@ def __init__(self, mapping=None): else: self.mapping = mapping - def getModuleForName(self, className): """ Return the L{JSModule} most likely to define the given name. @@ -406,17 +384,18 @@ def getModuleForName(self, className): else: return JSModule.getOrCreate(jsMod, self.mapping) raise RuntimeError("Unknown class: %r" % (className,)) + getModuleForClass = getModuleForName jsDeps = JSDependencies() - class CSSRegistry(object): """ Keeps track of a set of CSS modules. """ + def __init__(self, mapping=None): if mapping is None: mapping = {} @@ -426,7 +405,6 @@ def __init__(self, mapping=None): self.mapping = mapping self._loadPlugins = loadPlugins - def getModuleForName(self, moduleName): """ Turn a CSS module name into an L{AthenaModule}. @@ -444,8 +422,8 @@ def getModuleForName(self, moduleName): raise RuntimeError('Unknown CSS module: %r' % (moduleName,)) return CSSModule.getOrCreate(moduleName, self.mapping) -_theCSSRegistry = CSSRegistry() +_theCSSRegistry = CSSRegistry() class JSException(Exception): @@ -454,21 +432,21 @@ class JSException(Exception): """ - class JSCode(object): """ Class for mock code objects in mock JS frames. """ + def __init__(self, name, filename): self.co_name = name self.co_filename = filename - class JSFrame(object): """ Class for mock frame objects in JS client-side traceback wrappers. """ + def __init__(self, func, fname, ln): self.f_back = None self.f_locals = {} @@ -477,19 +455,18 @@ def __init__(self, func, fname, ln): self.f_lineno = ln - class JSTraceback(object): """ Class for mock traceback objects representing client-side JavaScript tracebacks. """ + def __init__(self, frame, ln): self.tb_frame = frame self.tb_lineno = ln self.tb_next = None - def parseStack(stack): """ Extract function name, file name, and line number information from the @@ -513,7 +490,6 @@ def parseStack(stack): return frames - def buildTraceback(frames, modules): """ Build a chain of mock traceback objects from a serialized Error (or other @@ -533,7 +509,6 @@ def buildTraceback(frames, modules): return first - def getJSFailure(exc, modules): """ Convert a serialized client-side exception to a Failure. @@ -549,16 +524,13 @@ def getJSFailure(exc, modules): @implementer(inevow.IResource) class LivePageTransport(object): - def __init__(self, messageDeliverer, useActiveChannels=True): self.messageDeliverer = messageDeliverer self.useActiveChannels = useActiveChannels - def locateChild(self, ctx, segments): return rend.NotFound - def renderHTTP(self, ctx): req = inevow.IRequest(ctx) neverEverCache(req) @@ -574,7 +546,6 @@ def renderHTTP(self, ctx): return response - class LivePageFactory: noisy = True @@ -618,6 +589,7 @@ class ConnectionLost(Exception): CLOSE = 'close' UNLOAD = 'unload' + class ReliableMessageDelivery(object): """ A reliable message delivery abstraction over a possibly unreliable transport. @@ -653,11 +625,12 @@ class ReliableMessageDelivery(object): _stopped = False _connected = False - outgoingAck = -1 # sequence number which has been acknowledged - # by this end of the connection. + outgoingAck = -1 # sequence number which has been acknowledged + # by this end of the connection. - outgoingSeq = -1 # sequence number of the next message to be - # added to the outgoing queue. + outgoingSeq = -1 # sequence number of the next message to be + + # added to the outgoing queue. def __init__(self, livePage, @@ -678,33 +651,27 @@ def __init__(self, self.connectionMade = connectionMade self.connectionLost = connectionLost - def _connectTimedOut(self): self._transportlessTimeoutCall = None self.connectionLost(failure.Failure(ConnectFailed("Timeout"))) - def _transportlessTimedOut(self): self._transportlessTimeoutCall = None self.connectionLost(failure.Failure(ConnectionLost("Timeout"))) - def _idleTimedOut(self): output, timeout = self.outputs.pop(0) if not self.outputs: self._transportlessTimeoutCall = self.scheduler(self.transportlessTimeout, self._transportlessTimedOut) output([self.outgoingAck, []]) - def _sendMessagesToOutput(self, output): log.msg(athena_send_messages=True, count=len(self.messages)) output([self.outgoingAck, self.messages]) - def pause(self): self._paused += 1 - def _trySendMessages(self): """ If we have pending messages and there is an available transport, then @@ -717,7 +684,6 @@ def _trySendMessages(self): self._transportlessTimeoutCall = self.scheduler(self.transportlessTimeout, self._transportlessTimedOut) self._sendMessagesToOutput(output) - def unpause(self): """ Decrement the pause counter and if the resulting state is not still @@ -728,7 +694,6 @@ def unpause(self): self._trySendMessages() self._flushOutputs() - def addMessage(self, msg): if self._stopped: return @@ -742,7 +707,6 @@ def addMessage(self, msg): self._transportlessTimeoutCall = self.scheduler(self.transportlessTimeout, self._transportlessTimedOut) self._sendMessagesToOutput(output) - def addOutput(self, output): if self._transportlessTimeoutCall is not None: self._transportlessTimeoutCall.cancel() @@ -756,7 +720,6 @@ def addOutput(self, output): else: self.outputs.append((output, self.scheduler(self.idleTimeout, self._idleTimedOut))) - def close(self): assert not self._stopped, "Cannot multiply stop ReliableMessageDelivery" self.addMessage((CLOSE, [])) @@ -770,7 +733,6 @@ def close(self): self._transportlessTimeoutCall.cancel() self._transportlessTimeoutCall = None - def _unregisterDeferredAsOutputChannel(self, deferred): for i in range(len(self.outputs)): if self.outputs[i][0].__self__ is deferred: @@ -782,7 +744,6 @@ def _unregisterDeferredAsOutputChannel(self, deferred): if not self.outputs: self._transportlessTimeoutCall = self.scheduler(self.transportlessTimeout, self._transportlessTimedOut) - def _createOutputDeferred(self): """ Create a new deferred, attaching it as an output. If the current @@ -796,7 +757,6 @@ def _createOutputDeferred(self): self._flushOutputs() return d - def _flushOutputs(self): """ Use up all except for one output. @@ -814,7 +774,6 @@ def _flushOutputs(self): timeout.cancel() output([self.outgoingAck, []]) - def basketCaseReceived(self, ctx, basketCase): """ This is called when some random JSON data is received from an HTTP @@ -885,6 +844,7 @@ def basketCaseReceived(self, ctx, basketCase): BOOTSTRAP_STATEMENT = ("eval(document.getElementById('" + BOOTSTRAP_NODE_ID + "').getAttribute('payload'));") + class _HasJSClass(object): """ A utility to share some code between the L{LivePage}, L{LiveElement}, and @@ -902,7 +862,6 @@ def _getModuleForClass(self): """ return jsDeps.getModuleForClass(self.jsClass) - def _getRequiredModules(self, memo): """ Return a list of two-tuples containing module names and URLs at which @@ -917,7 +876,6 @@ def _getRequiredModules(self, memo): if self.page._shouldInclude(dep.name)] - def jsModuleDeclaration(name): """ Generate Javascript for a module declaration. @@ -928,7 +886,6 @@ def jsModuleDeclaration(name): return '%s%s = {"__name__": "%s"};' % (var, name, name) - class _HasCSSModule(object): """ C{cssModule}-handling code common to L{LivePage}, L{LiveElement} and @@ -937,6 +894,7 @@ class _HasCSSModule(object): @ivar cssModule: A CSS module name. @type cssModule: C{unicode} or C{NoneType} """ + def _getRequiredCSSModules(self, memo): """ Return a list of CSS module URLs. @@ -951,7 +909,6 @@ def _getRequiredCSSModules(self, memo): for dep in module.allDependencies(memo) if self.page._shouldIncludeCSSModule(dep.name)] - def getStylesheetStan(self, modules): """ Get some stan which will include the given modules. @@ -966,7 +923,6 @@ def getStylesheetStan(self, modules): for url in modules] - class LivePage(rend.Page, _HasJSClass, _HasCSSModule): """ A resource which can receive messages from and send messages to the client @@ -1048,7 +1004,6 @@ class LivePage(rend.Page, _HasJSClass, _HasCSSModule): tags.body[ 'Your browser is not supported by the Athena toolkit.']]) - def __init__(self, iface=None, rootObject=None, jsModules=None, jsModuleRoot=None, transportRoot=None, cssModules=None, cssModuleRoot=None, *a, **kw): @@ -1074,14 +1029,12 @@ def __init__(self, iface=None, rootObject=None, jsModules=None, self._jsDepsMemo = {} self._cssDepsMemo = {} - def _shouldInclude(self, moduleName): if moduleName not in self._includedModules: self._includedModules.append(moduleName) return True return False - def _shouldIncludeCSSModule(self, moduleName): """ Figure out whether the named CSS module has already been included. @@ -1095,7 +1048,6 @@ def _shouldIncludeCSSModule(self, moduleName): return True return False - # Child lookup may be dependent on the application state # represented by a LivePage. In this case, it is preferable to # dispatch child lookup on the same LivePage instance as performed @@ -1109,11 +1061,9 @@ def locateChild(self, ctx, segments): else: return client, segments[1:] - def child___athena_private__(self, ctx): return _thePrivateAthenaResource - # A note on timeout/disconnect logic: whenever a live client goes from some # transports to no transports, a timer starts; whenever it goes from no # transports to some transports, the timer is stopped; if the timer ever @@ -1152,7 +1102,6 @@ def _becomeLive(self, location): self.addLocalObject(self) - def _supportedBrowser(self, request): """ Determine whether a known-unsupported browser is making a request. @@ -1175,7 +1124,6 @@ def _supportedBrowser(self, request): return agent.version >= requiredVersion return True - def renderUnsupported(self, ctx): """ Render a notification to the user that his user agent is @@ -1187,7 +1135,6 @@ def renderUnsupported(self, ctx): """ return flat.flatten(self.unsupportedBrowserLoader.load()) - def renderHTTP(self, ctx): """ Attach this livepage to its transport, and render it and all of its @@ -1244,7 +1191,6 @@ def renderHTTP(self, ctx): return json.serialize(self.clientID.decode("ascii")) return rend.Page.renderHTTP(self, ctx) - def _connectionMade(self): """ Invoke connectionMade on all attached widgets. @@ -1253,7 +1199,6 @@ def _connectionMade(self): widget.connectionMade() self._didConnect = True - def _disconnected(self, reason): """ Callback invoked when the L{ReliableMessageDelivery} is disconnected. @@ -1278,13 +1223,11 @@ def _disconnected(self, reason): widget.connectionLost(reason) self.factory.removeClient(self.clientID) - def connectionMade(self): """ Callback invoked when the transport is first connected. """ - def connectionLost(self, reason): """ Callback invoked when the transport is disconnected. @@ -1294,13 +1237,11 @@ def connectionLost(self, reason): Override this. """ - def addLocalObject(self, obj): objID = self._localObjectIDCounter() self._localObjects[objID] = obj return objID - def removeLocalObject(self, objID): """ Remove an object from the page's mapping of IDs that can receive @@ -1311,22 +1252,19 @@ def removeLocalObject(self, objID): """ del self._localObjects[objID] - def callRemote(self, methodName, *args): requestID = 's2c%i' % (self._requestIDCounter(),) if isinstance(methodName, bytes): - methodName=methodName.decode('utf-8') + methodName = methodName.decode('utf-8') message = ('call', (methodName, requestID, args)) resultD = defer.Deferred() self._remoteCalls[requestID] = resultD self.addMessage(message) return resultD - def addMessage(self, message): self._messageDeliverer.addMessage(message) - def notifyOnDisconnect(self): """ Return a Deferred which will fire or errback when this LivePage is @@ -1341,11 +1279,9 @@ def notifyOnDisconnect(self): self._disconnectNotifications.append(d) return d - def getJSModuleURL(self, moduleName): return self.jsModuleRoot.child(moduleName) - def getCSSModuleURL(self, moduleName): """ Return a URL rooted a L{cssModuleRoot} from which the CSS module named @@ -1357,18 +1293,16 @@ def getCSSModuleURL(self, moduleName): """ return self.cssModuleRoot.child(moduleName) - def getImportStan(self, moduleName): moduleDef = jsModuleDeclaration(moduleName); - t=tags.script(type='text/javascript') - r=tags.raw(toBytes(moduleDef)) + t = tags.script(type='text/javascript') + r = tags.raw(toBytes(moduleDef)) t[r] return [t, tags.script(type='text/javascript', src=flat.flatten(self.getJSModuleURL(moduleName)))] - def render_liveglue(self, ctx, data): bootstrapString = b'\n'.join( [self._bootstrapCall(method, args) for @@ -1387,7 +1321,6 @@ def render_liveglue(self, ctx, data): BOOTSTRAP_STATEMENT] ] - def _bootstraps(self, ctx): """ Generate a list of 2-tuples of (methodName, arguments) representing the @@ -1402,7 +1335,6 @@ def _bootstraps(self, ctx): ("Nevow.Athena.bootstrap", [self.jsClass, self.clientID])] - def _bootstrapCall(self, methodName, args): """ Generate a string to call a 'bootstrap' function in an Athena JavaScript @@ -1416,19 +1348,17 @@ def _bootstrapCall(self, methodName, args): return b'%s(%s);' % ( toBytes(methodName), (b', '.join([json.serialize(arg) for arg in args]))) - def child_jsmodule(self, ctx): return MappingResource(self.jsModules.mapping) - def child_cssmodule(self, ctx): """ Return a L{MappingResource} wrapped around L{cssModules}. """ return MappingResource(self.cssModules.mapping) - _transportResource = None + def child_transport(self, ctx): if self._transportResource is None: self._transportResource = LivePageTransport( @@ -1436,13 +1366,11 @@ def child_transport(self, ctx): self.useActiveChannels) return self._transportResource - def locateMethod(self, ctx, methodName): if methodName in self.iface: return getattr(self.rootObject, methodName) raise AttributeError(methodName) - def liveTransportMessageReceived(self, ctx, xxx_todo_changeme): """ A message was received from the reliable transport layer. Process it by @@ -1453,7 +1381,6 @@ def liveTransportMessageReceived(self, ctx, xxx_todo_changeme): method = getattr(self, 'action_' + action) method(ctx, *args) - def action_call(self, ctx, requestId, method, objectID, args, kwargs): """ Handle a remote call initiated by the client. @@ -1465,6 +1392,7 @@ def action_call(self, ctx, requestId, method, objectID, args, kwargs): result = defer.fail(NoSuchMethod(objectID, method)) else: result = defer.maybeDeferred(func, *args, **kwargs) + def _cbCall(result): success = True if isinstance(result, failure.Failure): @@ -1479,12 +1407,12 @@ def _cbCall(result): result = ( 'Divmod.Error', ['%s: %s' % ( - result.type.__name__, - result.getErrorMessage())]) + result.type.__name__, + result.getErrorMessage())]) message = ('respond', (str(requestId), success, result)) self.addMessage(message) - result.addBoth(_cbCall) + result.addBoth(_cbCall) def action_respond(self, ctx, responseId, success, result): """ @@ -1496,13 +1424,11 @@ def action_respond(self, ctx, responseId, success, result): else: callDeferred.errback(getJSFailure(result, self.jsModules.mapping)) - def action_noop(self, ctx): """ Handle noop, used to initialise and ping the live transport. """ - def action_close(self, ctx): """ The client is going away. Clean up after them. @@ -1511,10 +1437,10 @@ def action_close(self, ctx): self._disconnected(error.ConnectionDone("Connection closed")) - handler = stan.Proto('athena:handler') _handlerFormat = b"return Nevow.Athena.Widget.handleEvent(this, %(event)s, %(handler)s, event);" + def _rewriteEventHandlerToAttribute(tag): """ Replace athena:handler children of the given tag with attributes on the tag @@ -1527,7 +1453,7 @@ def _rewriteEventHandlerToAttribute(tag): info = tag.children.pop(i) name = info.attributes['event'].encode('ascii') handler = info.attributes['handler'] - kw={ + kw = { b'handler': json.serialize(unicode(handler, 'ascii')), b'event': json.serialize(unicode(name, 'ascii'))} @@ -1610,15 +1536,17 @@ def get(self): if self.fragmentParent is not None: self._page = self.fragmentParent.page return self._page + def set(self, value): self._page = value + doc = """ The L{LivePage} instance which is the topmost container of this fragment. """ return get, set, None, doc - page = property(*page()) + page = property(*page()) def getInitialArguments(self): """ @@ -1633,7 +1561,6 @@ def getInitialArguments(self): """ return () - def _prepare(self, tag): """ Check for clearly incorrect settings of C{self.jsClass} and @@ -1649,7 +1576,6 @@ def _prepare(self, tag): self.connectionMade() tag.fillSlots('athena:id', toBytes(self._athenaID)) - def setFragmentParent(self, fragmentParent): """ Sets the L{LiveFragment} (or L{LivePage}) which is the logical parent @@ -1676,7 +1602,6 @@ def setFragmentParent(self, fragmentParent): self.page = fragmentParent.page fragmentParent.liveFragmentChildren.append(self) - def _flatten(self, what): """ Synchronously flatten C{what} and return the result as a C{str}. @@ -1690,7 +1615,6 @@ def _flatten(self, what): from nevow.testutil import FakeRequest return b"".join((toBytes(i) for i in _flat.flatten(FakeRequest(), what, False, False))) - def _structured(self): """ Retrieve an opaque object which may be usable to construct the @@ -1714,13 +1638,14 @@ def _structured(self): 'requiredCSSModules': requiredCSSModules}, self._flatten, tags.div(xmlns="http://www.w3.org/1999/xhtml")[self]).decode('utf-8') + print(1641, children) del children[0] self._structuredCache = { 'requiredModules': [(name, flat.flatten(url).decode('utf-8')) - for (name, url) in requiredModules], + for (name, url) in requiredModules], 'requiredCSSModules': [flat.flatten(url).decode('utf-8') - for url in requiredCSSModules], + for url in requiredCSSModules], 'class': self.jsClass, 'id': self._athenaID, 'initArguments': tuple(self.getInitialArguments()), @@ -1728,7 +1653,6 @@ def _structured(self): 'children': children} return self._structuredCache - def liveElement(self, request, tag): """ Render framework-level boilerplate for making sure the Widget for this @@ -1745,9 +1669,9 @@ def liveElement(self, request, tag): # This will only be set if _structured() is being run. if context.get('children') is not None: context.get('children').append({ - 'class': self.jsClass, - 'id': self._athenaID, - 'initArguments': self.getInitialArguments()}) + 'class': self.jsClass, + 'id': self._athenaID, + 'initArguments': self.getInitialArguments()}) context.get('requiredModules').extend(requiredModules) context.get('requiredCSSModules').extend(requiredCSSModules) return tag @@ -1773,25 +1697,22 @@ def liveElement(self, request, tag): # Okay, application stuff, plus metadata tag, - ) - renderer(liveElement) + ) + renderer(liveElement) def render_liveFragment(self, ctx, data): return self.liveElement(inevow.IRequest(ctx), ctx.tag) - def getImportStan(self, moduleName): return self.page.getImportStan(moduleName) - def locateMethod(self, ctx, methodName): remoteMethod = expose.get(self, methodName, None) if remoteMethod is None: raise AttributeError(self, methodName) return remoteMethod - def callRemote(self, methodName, *varargs): return self.page.callRemote( "Nevow.Athena.callByAthenaID", @@ -1799,7 +1720,6 @@ def callRemote(self, methodName, *varargs): methodName, varargs) - def _athenaDetachServer(self): """ Locally remove this from its parent. @@ -1818,8 +1738,8 @@ def _athenaDetachServer(self): if page._didConnect: self.connectionLost(ConnectionLost('Detached')) self.detached() - expose(_athenaDetachServer) + expose(_athenaDetachServer) def detach(self): """ @@ -1836,7 +1756,6 @@ def detach(self): d.addCallback(lambda ign: self._athenaDetachServer()) return d - def detached(self): """ Application-level callback invoked when L{detach} succeeds or when the @@ -1848,7 +1767,6 @@ def detached(self): Override this. """ - def connectionMade(self): """ Callback invoked when the transport is first available to this widget. @@ -1856,7 +1774,6 @@ def connectionMade(self): Override this. """ - def connectionLost(self, reason): """ Callback invoked once the transport is no longer available to this @@ -1868,7 +1785,6 @@ def connectionLost(self, reason): """ - class LiveFragment(_LiveMixin, rend.Fragment): """ This class is deprecated because it relies on context objects @@ -1876,13 +1792,13 @@ class LiveFragment(_LiveMixin, rend.Fragment): @see: L{LiveElement} """ + def __init__(self, *a, **kw): super(LiveFragment, self).__init__(*a, **kw) warnings.warn("[v0.10] LiveFragment has been superceded by LiveElement.", category=DeprecationWarning, stacklevel=2) - def rend(self, context, data): """ Hook into the rendering process in order to check preconditions and @@ -1894,8 +1810,6 @@ def rend(self, context, data): return context - - class LiveElement(_LiveMixin, Element): """ Base-class for a portion of a LivePage. When being rendered, a LiveElement @@ -1984,6 +1898,7 @@ def someMethod(self, ...): syntax as is provided for Javascript modules. """ + def render(self, request): """ Hook into the rendering process in order to check preconditions and @@ -1995,7 +1910,6 @@ def render(self, request): return document - class IntrospectionFragment(LiveFragment): """ Utility for developers which provides detailed information about @@ -2006,10 +1920,9 @@ class IntrospectionFragment(LiveFragment): docFactory = loaders.stan( tags.span(render=tags.directive('liveFragment'))[ - tags.a( - href="#DEBUG_ME", - class_='toggle-debug')["Debug"]]) - + tags.a( + href="#DEBUG_ME", + class_='toggle-debug')["Debug"]]) __all__ = [ @@ -2032,4 +1945,4 @@ class IntrospectionFragment(LiveFragment): # Decorators 'expose', 'handler', - ] +] From dc6884287cf6435c3992bd39164f7d0fb8da27f8 Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Mon, 3 Jul 2017 20:23:49 -0700 Subject: [PATCH 156/157] Update json.py --- nevow/json.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nevow/json.py b/nevow/json.py index 0684ef89..49021a49 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -294,8 +294,10 @@ def _serialize(obj, w, seen): w(',') w('}') elif isinstance(obj, (athena.LiveFragment, athena.LiveElement)): + print(297, obj) _serialize(obj._structured(), w, seen) elif isinstance(obj, (rend.Fragment, page.Element)): + print(299, obj) wrapper = tags.div(xmlns="http://www.w3.org/1999/xhtml") w('"') w(stringEncode( From 69c7a64832a176955af5534febf5a405c511b5eb Mon Sep 17 00:00:00 2001 From: Logan Perkins Date: Mon, 3 Jul 2017 20:24:46 -0700 Subject: [PATCH 157/157] Update json.py --- nevow/json.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/nevow/json.py b/nevow/json.py index 49021a49..0684ef89 100644 --- a/nevow/json.py +++ b/nevow/json.py @@ -294,10 +294,8 @@ def _serialize(obj, w, seen): w(',') w('}') elif isinstance(obj, (athena.LiveFragment, athena.LiveElement)): - print(297, obj) _serialize(obj._structured(), w, seen) elif isinstance(obj, (rend.Fragment, page.Element)): - print(299, obj) wrapper = tags.div(xmlns="http://www.w3.org/1999/xhtml") w('"') w(stringEncode(
0